Files
snes9xgx/source/ngc/audio.cpp
dborth 850b301978 [What Was New 003 - July 25, 2008]
- added: alphabetical file sorting
- added: background logo/backdrop + nicer menus
- added: scrolling in ROM selector
- fixed: switching between pal/ntsc ROMS doesn't mess up timings
- fixed: GC controller config works now
- fixed: freeze autoloading on ROM load
- fixed: zipped ROMS should now load in a reasonable time
- fixed: precompiled dols for autosaving to various locations (see readme)
- changed: GC default quickload slot (to sd) (thanks kerframil)
- changed: default load/save dirs are now "/snes9x/roms" and 
           "/snes9x/saves/"  (thanks kerframil)
- changed: Classic X and Y defaults aren't switched
- changed: if autosave is enabled, it doesn't ask to save SRAM 
           anymore. It is saved in the background.
- updated README
2008-10-16 01:50:21 +00:00

105 lines
2.0 KiB
C++

/****************************************************************************
* Snes9x 1.50
*
* Nintendo Gamecube Audio
*
* Audio is fixed to 32Khz/16bit/Stereo
*
* softdev July 2006
****************************************************************************/
#include <gccore.h>
#include <ogcsys.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "snes9x.h"
#include "memmap.h"
#include "debug.h"
#include "cpuexec.h"
#include "ppu.h"
#include "apu.h"
#include "display.h"
#include "gfx.h"
#include "soundux.h"
#include "spc700.h"
#include "spc7110.h"
#include "controls.h"
#include "video.h"
#include "ftfont.h"
/*** Double buffered audio ***/
#define AUDIOBUFFER 2048
static unsigned char soundbuffer[2][AUDIOBUFFER]
__attribute__ ((__aligned__ (32)));
static int whichab = 0; /*** Audio buffer flip switch ***/
extern int ConfigRequested;
#define AUDIOSTACK 16384
lwpq_t audioqueue;
lwp_t athread;
static uint8 astack[AUDIOSTACK];
/**
* Audio Threading
*/
static void *
AudioThread (void *arg)
{
LWP_InitQueue (&audioqueue);
while (1)
{
whichab ^= 1;
if (ConfigRequested)
memset (soundbuffer[whichab], 0, AUDIOBUFFER);
else
{
so.samples_mixed_so_far = so.play_position = 0;
S9xMixSamples (soundbuffer[whichab], AUDIOBUFFER >> 1);
}
LWP_ThreadSleep (audioqueue);
}
return NULL;
}
/**
* MixSamples
* This continually calls S9xMixSamples On each DMA Completion
*/
static void
GCMixSamples ()
{
AUDIO_StopDMA ();
DCFlushRange (soundbuffer[whichab], AUDIOBUFFER);
AUDIO_InitDMA ((u32) soundbuffer[whichab], AUDIOBUFFER);
AUDIO_StartDMA ();
LWP_ThreadSignal (audioqueue);
}
/**
* InitGCAudio
*/
void
InitGCAudio ()
{
AUDIO_SetDSPSampleRate (AI_SAMPLERATE_32KHZ);
AUDIO_RegisterDMACallback (GCMixSamples);
LWP_CreateThread (&athread, AudioThread, NULL, astack, AUDIOSTACK, 80);
}
/**
* AudioStart
*
* Called to kick off the Audio Queue
*/
void
AudioStart ()
{
GCMixSamples ();
}