void stopsound() { SCHANNEL_CR(0)=0; SCHANNEL_CR(1)=0; SCHANNEL_CR(2)=0; SCHANNEL_CR(3)=0; SCHANNEL_CR(4)=0; SCHANNEL_CR(5)=0; SCHANNEL_CR(6)=0; SCHANNEL_CR(7)=0; SCHANNEL_CR(8)=0; SCHANNEL_CR(10)=0; TIMER0_CR = 0; TIMER1_CR = 0; }
void SoundEngine::initStreaming(int timerChannel) { memset(buffer, 0, sizeof buffer); bufferIndex = 0; /* * Next timer tick will populate the first half of the buffer * (bufferIndex=0) but by the time we get there, the audio * hardware will already be started on the second half. We want * the sound hardware and Timer 0 to stay synchronized, so that * they're always operating on opposite halves of 'buffer'. */ timerStart(timerChannel, ClockDivider_256, timerFreqToTicks_256(SAMPLE_RATE / SAMPLES_PER_FRAME), timerCallback); /* * Start playing a circular sound buffer that holds 2 frames. */ SCHANNEL_SOURCE(CHANNEL_PCSPEAKER) = (uint32_t) &buffer[0]; SCHANNEL_REPEAT_POINT(CHANNEL_PCSPEAKER) = 0; SCHANNEL_LENGTH(CHANNEL_PCSPEAKER) = BUFFER_SIZE / sizeof(uint32_t); SCHANNEL_TIMER(CHANNEL_PCSPEAKER) = SOUND_FREQ(SAMPLE_RATE); SCHANNEL_CR(CHANNEL_PCSPEAKER) = SCHANNEL_ENABLE | SOUND_VOL(127) | SOUND_PAN(64) | SOUND_REPEAT | SOUND_FORMAT_8BIT; }
//--------------------------------------------------------------------------------- void startSound(int sampleRate, const void* data, u32 bytes, u8 channel, u8 vol, u8 pan, u8 format) { //--------------------------------------------------------------------------------- SCHANNEL_TIMER(channel) = SOUND_FREQ(sampleRate); SCHANNEL_SOURCE(channel) = (u32)data; SCHANNEL_LENGTH(channel) = bytes >> 2 ; SCHANNEL_CR(channel) = SCHANNEL_ENABLE | SOUND_ONE_SHOT | SOUND_VOL(vol) | SOUND_PAN(pan) | (format==1?SOUND_8BIT:SOUND_16BIT); }
void stopAllSounds(void) { int count; for (count = 0; count < 16; count++) SCHANNEL_CR(count) = 0; }
//--------------------------------------------------------------------------------- s32 getFreeSoundChannel() { //--------------------------------------------------------------------------------- int i; for (i=0; i<16; i++) { if ( (SCHANNEL_CR(i) & SCHANNEL_ENABLE) == 0 ) return i; } return -1; }
void restartsound(int ch) { chan = ch; SCHANNEL_CR(0)=SCHANNEL_ENABLE|SOUND_REPEAT |SOUND_VOL(0x3F)|SOUND_PAN(0x40)|SOUND_FORMAT_16BIT; SCHANNEL_CR(1)=SCHANNEL_ENABLE|SOUND_REPEAT |SOUND_VOL(0x3F)|SOUND_PAN(0x40)|SOUND_FORMAT_16BIT; SCHANNEL_CR(2)=SCHANNEL_ENABLE|SOUND_REPEAT |SOUND_VOL(0x3F)|SOUND_PAN(0x40)|SOUND_FORMAT_16BIT; SCHANNEL_CR(3)=SCHANNEL_ENABLE|SOUND_REPEAT |SOUND_VOL(0x2F)|SOUND_PAN(0x40)|SOUND_FORMAT_16BIT; SCHANNEL_CR(4)=SCHANNEL_ENABLE|SOUND_REPEAT |SOUND_VOL(0x7F)|SOUND_PAN(0x40)|SOUND_FORMAT_16BIT; SCHANNEL_CR(5)=SCHANNEL_ENABLE|SOUND_REPEAT |SOUND_VOL(0x60)|SOUND_PAN(0x40)|SOUND_FORMAT_16BIT; SCHANNEL_CR(6)=SCHANNEL_ENABLE|SOUND_REPEAT |SOUND_VOL(0x7F)|SOUND_PAN(0x40)|SOUND_FORMAT_16BIT; SCHANNEL_CR(7)=SCHANNEL_ENABLE|SOUND_REPEAT |SOUND_VOL(0x7F)|SOUND_PAN(0x40)|SOUND_FORMAT_16BIT; SCHANNEL_CR(8)=SCHANNEL_ENABLE|SOUND_REPEAT |SOUND_VOL(0x7F)|SOUND_PAN(0x40)|SOUND_FORMAT_16BIT; SCHANNEL_CR(10)=SCHANNEL_ENABLE|SOUND_REPEAT |SOUND_VOL(0x7F)|SOUND_PAN(0x40)|SOUND_FORMAT_8BIT; TIMER0_CR = TIMER_ENABLE; TIMER1_CR = TIMER_CASCADE | TIMER_IRQ_REQ | TIMER_ENABLE; }
s32 getFreeSoundChannel() { int i; for(i=1; i<16; i++) // channel 0 is reserved for music { if ( (SCHANNEL_CR(i) & SCHANNEL_ENABLE) == 0 ) return i; } return -1; }
void initsound() { int i; powerOn(POWER_SOUND); REG_SOUNDCNT = SOUND_ENABLE | SOUND_VOL(0x7F); for(i = 0; i < 16; i++) { SCHANNEL_CR(i) = 0; } SCHANNEL_SOURCE(0)=(u32)&buffer[0]; SCHANNEL_SOURCE(1)=(u32)&buffer[2*MIXBUFSIZE]; SCHANNEL_SOURCE(2)=(u32)&buffer[4*MIXBUFSIZE]; SCHANNEL_SOURCE(3)=(u32)&buffer[6*MIXBUFSIZE]; SCHANNEL_SOURCE(4)=(u32)&buffer[8*MIXBUFSIZE]; SCHANNEL_SOURCE(5)=(u32)&buffer[10*MIXBUFSIZE]; SCHANNEL_SOURCE(6)=(u32)&buffer[12*MIXBUFSIZE]; SCHANNEL_SOURCE(7)=(u32)&buffer[14*MIXBUFSIZE]; SCHANNEL_SOURCE(8)=(u32)&buffer[16*MIXBUFSIZE]; SCHANNEL_SOURCE(10)=(u32)&buffer[18*MIXBUFSIZE]; SCHANNEL_TIMER(0)=-0x2b9; SCHANNEL_TIMER(1)=-0x2b9; SCHANNEL_TIMER(2)=-0x2b9; SCHANNEL_TIMER(3)=-0x2b9; SCHANNEL_TIMER(4)=-0x2b9; SCHANNEL_TIMER(5)=-0x2b9; SCHANNEL_TIMER(6)=-0x2b9; SCHANNEL_TIMER(7)=-0x2b9; SCHANNEL_TIMER(8)=-0x2b9; SCHANNEL_TIMER(10)=-0x2b9; SCHANNEL_LENGTH(0)=MIXBUFSIZE; SCHANNEL_LENGTH(1)=MIXBUFSIZE; SCHANNEL_LENGTH(2)=MIXBUFSIZE; SCHANNEL_LENGTH(3)=MIXBUFSIZE; SCHANNEL_LENGTH(4)=MIXBUFSIZE; SCHANNEL_LENGTH(5)=MIXBUFSIZE; SCHANNEL_LENGTH(6)=MIXBUFSIZE; SCHANNEL_LENGTH(7)=MIXBUFSIZE; SCHANNEL_LENGTH(8)=MIXBUFSIZE; SCHANNEL_LENGTH(10)=MIXBUFSIZE / 2; SCHANNEL_REPEAT_POINT(0) = 0; SCHANNEL_REPEAT_POINT(1) = 0; SCHANNEL_REPEAT_POINT(2) = 0; SCHANNEL_REPEAT_POINT(3) = 0; SCHANNEL_REPEAT_POINT(4) = 0; SCHANNEL_REPEAT_POINT(5) = 0; SCHANNEL_REPEAT_POINT(6) = 0; SCHANNEL_REPEAT_POINT(1) = 0; SCHANNEL_REPEAT_POINT(8) = 0; SCHANNEL_REPEAT_POINT(10) = 0; TIMER0_DATA = -0x572; TIMER1_DATA = 0x10000 - MIXBUFSIZE; memset(buffer, 0, sizeof(buffer)); memset(IPC_PCMDATA, 0, 512); }
void startSound(int sampleRate, const void* data, uint32 bytes, u8 channel, u8 vol, u8 pan, u8 format) { SCHANNEL_TIMER(channel) = SOUND_FREQ(sampleRate); SCHANNEL_SOURCE(channel) = (u32)data; SCHANNEL_LENGTH(channel) = bytes >> 2; u32 form = 0; switch(format) { case 0: form = SOUND_FORMAT_16BIT; break; case 1: form = SOUND_FORMAT_8BIT; break; case 2: form = SOUND_FORMAT_ADPCM; break; } SCHANNEL_CR(channel) = SCHANNEL_ENABLE | SOUND_ONE_SHOT | SOUND_VOL(vol) | SOUND_PAN(pan) | form; }
bool is_channel_enabled(int c) { return (SCHANNEL_CR(c) & SCHANNEL_ENABLE); }
void ds_adjustchannel(int channel, int vol, int pan) { SCHANNEL_CR(channel) = SCHANNEL_ENABLE | SOUND_ONE_SHOT | SOUND_VOL(vol) | SOUND_PAN(pan) | (SOUND_FORMAT_8BIT); }
extern "C" void ds_stopsound(int channel) { SCHANNEL_CR(channel) = 0; }