// Originally by David Raingeard
// GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)
// Rewritten by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who When What
+// --- ---------- -------------------------------------------------------------
+// JLH 01/16/2010 Created this log ;-)
//
// Need to set up defaults that the BIOS sets for the SSI here in DACInit()... !!! FIX !!!
// work correctly...! Perhaps just need to set up SSI stuff so BUTCH doesn't get
// confused...
+// ALSO: Need to implement some form of proper locking to replace the clusterfuck
+// that is the current spinlock implementation. Since the DSP is a separate
+// entity, could we get away with running it in the sound IRQ?
+
+// ALSO: It may be a good idea to physically separate the left and right buffers
+// to prevent things like the DSP filling only one side and such. Do such
+// mono modes exist on the Jag? Seems to according to Super Burnout.
+
+#include "dac.h"
+
#include "SDL.h"
-#include "m68k.h"
+//#include "gui.h"
#include "jaguar.h"
+#include "log.h"
+#include "m68k.h"
+//#include "memory.h"
#include "settings.h"
-#include "dac.h"
//#define DEBUG_DAC
// Global variables
-uint16 lrxd, rrxd; // I2S ports (into Jaguar)
+//uint16 lrxd, rrxd; // I2S ports (into Jaguar)
// Local variables
// We can get away with using native endian here because we can tell SDL to use the native
// endian when looking at the sample buffer, i.e., no need to worry about it.
-static uint16 * DACBuffer;
+static uint16 DACBuffer[BUFFER_SIZE];
static uint8 SCLKFrequencyDivider = 19; // Default is roughly 22 KHz (20774 Hz in NTSC mode)
/*static*/ uint16 serialMode = 0;
//
void DACInit(void)
{
- memory_malloc_secure((void **)&DACBuffer, BUFFER_SIZE * sizeof(uint16), "DAC buffer");
+// memory_malloc_secure((void **)&DACBuffer, BUFFER_SIZE * sizeof(uint16), "DAC buffer");
+// DACBuffer = (uint16 *)memory_malloc(BUFFER_SIZE * sizeof(uint16), "DAC buffer");
desired.freq = GetCalculatedFrequency(); // SDL will do conversion on the fly, if it can't get the exact rate. Nice!
desired.format = AUDIO_S16SYS; // This uses the native endian (for portability)...
SDL_CloseAudio();
}
- memory_free(DACBuffer);
+// memory_free(DACBuffer);
WriteLog("DAC: Done.\n");
}
}
//
-// Calculate the frequency of SCLK * 32 using the divider
+// Calculate the freq9uency of SCLK * 32 using the divider
//
int GetCalculatedFrequency(void)
{
WriteLog("LTail=%X, LHead=%X, BUFFER_SIZE-1=%X\n", LeftFIFOTailPtr, LeftFIFOHeadPtr, BUFFER_SIZE - 1);
WriteLog("RTail=%X, RHead=%X, BUFFER_SIZE-1=%X\n", RightFIFOTailPtr, RightFIFOHeadPtr, BUFFER_SIZE - 1);
WriteLog("From while: Tail=%X, Head=%X", (LeftFIFOTailPtr + 2) & (BUFFER_SIZE - 1), LeftFIFOHeadPtr);
- log_done();
- exit(0);
+// LogDone();
+// exit(0);
+#warning "Reimplement GUICrashGracefully!"
+// GUICrashGracefully("Stuck in left DAC spinlock!");
+ return;
}
}//*/
RTail=DB, RHead=60D9, BUFFER_SIZE-1=FFFF
From while: Tail=60DA, Head=60D8
*/
+#warning Spinlock problem--!!! FIX !!!
+#warning Odd: The right FIFO is empty, but the left FIFO is full!
// Spin until buffer has been drained (for too fast processors!)...
uint32 spin = 0;
while (((RightFIFOTailPtr + 2) & (BUFFER_SIZE - 1)) == RightFIFOHeadPtr)//;
WriteLog("LTail=%X, LHead=%X, BUFFER_SIZE-1=%X\n", LeftFIFOTailPtr, LeftFIFOHeadPtr, BUFFER_SIZE - 1);
WriteLog("RTail=%X, RHead=%X, BUFFER_SIZE-1=%X\n", RightFIFOTailPtr, RightFIFOHeadPtr, BUFFER_SIZE - 1);
WriteLog("From while: Tail=%X, Head=%X", (RightFIFOTailPtr + 2) & (BUFFER_SIZE - 1), RightFIFOHeadPtr);
- log_done();
- exit(0);
+// LogDone();
+// exit(0);
+#warning "Reimplement GUICrashGracefully!"
+// GUICrashGracefully("Stuck in right DAC spinlock!");
+ return;
}
}//*/
{
if (SDL_OpenAudio(&desired, NULL) < 0) // NULL means SDL guarantees what we want
{
+// This is bad, Bad, BAD !!! DON'T ABORT BECAUSE WE DIDN'T GET OUR FREQ! !!! FIX !!!
+#warning !!! FIX !!! Aborting because of SDL audio problem is bad!
WriteLog("DAC: Failed to initialize SDL sound: %s.\nDesired freq: %u\nShutting down!\n", SDL_GetError(), desired.freq);
- log_done();
- exit(1);
+// LogDone();
+// exit(1);
+#warning "Reimplement GUICrashGracefully!"
+// GUICrashGracefully("Failed to initialize SDL sound!");
+ return;
}
}
else if (offset == RRXD + 2)
return rrxd;
- return 0xFFFF; // May need SSTAT as well... (but may be a Jaguar II only feature)
+ return 0xFFFF; // May need SSTAT as well... (but may be a Jaguar II only feature)
}