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 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 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; }