#166435 - Echo49 - Sun Feb 08, 2009 6:19 am
I couldn't find a FIFO example in devkitpro/examples. Does anyone know where to find examples utilising custom FIFO channels?
Code: |
#define MakeID( a, b, c, d ) ( ( d << 24 ) | ( c << 16 ) | ( b << 8 ) | a ) void Fifo_Arm7MusicService( int Count, void* Userdata ) { u32 Data[ 6 ]; if ( Count ) { fifoGetDatamsg( FIFO_USER_01, Count, ( u8* ) Data ); switch ( Data[ 0 ] ) { case MakeID( 'M', 'O', 'P', 'L' ): { MakeOPL( ); break; } case MakeID( 'P', 'L', 'A', 'Y' ): { StartMusic( Data[ 1 ] ); break; } case MakeID( 'S', 'T', 'O', 'P' ): { StopMusic( ); break; } case MakeID( 'B', 'U', 'F', 'R' ): { RingBufferSize = Data[ 1 ]; RingBuffer = ( short* ) Data[ 2 ]; SampleBufferSize = Data[ 3 ]; SampleBuffer = ( short* ) Data[ 4 ]; if ( ! RingBuffer || ! SampleBuffer ) Noise( ); break; } default: break; }; } } //--------------------------------------------------------------------------------- int main() { //--------------------------------------------------------------------------------- //while ((*(vuint8*)0x04000240 & 0x02) == 0); fake_heap_start = ( char* ) 0x06000000; fake_heap_end = ( char* ) 0x06020000; irqInit(); fifoInit(); // read User Settings from firmware readUserSettings(); // Start the RTC tracking IRQ initClockIRQ(); SetYtrigger(80); //installWifiFIFO(); installSoundFIFO(); //mmInstall(FIFO_MAXMOD); installSystemFIFO(); // Music system fifo callbacks fifoSetDatamsgHandler( FIFO_USER_01, Fifo_Arm7MusicService, NULL ); irqSet(IRQ_VCOUNT, VcountHandler); irqSet(IRQ_VBLANK, VblankHandler); irqEnable( IRQ_VBLANK | IRQ_VCOUNT ); while ( 1 ) { swiWaitForVBlank( ); if ( StartPlayingMusic == 1 ) { StartPlayingMusic = 0; // Enter play loop PlayTheTune( ); } } // Keep the ARM7 mostly idle //while (1) swiWaitForVBlank(); } |
Code: |
#define MakeID( a, b, c, d ) ( ( d << 24 ) | ( c << 16 ) | ( b << 8 ) | a ) #define Arm7RingBufferSize ( 8192 * sizeof( u16 ) ) #define Arm7SampleBufferSize ( 11025 * sizeof( u16 ) ) int Arm7_MakeOPL( void ) { u32 Outgoing[ 1 ] = { MakeID( 'M', 'O', 'P', 'L' ) }; fifoSendDatamsg( FIFO_USER_01, sizeof( Outgoing ), ( u8* ) Outgoing ); return 1; } void Arm7_StartMusic( u8* MusicBase ) { u32 Outgoing[ 2 ] = { MakeID( 'P', 'L', 'A', 'Y' ), ( u32 ) MusicBase }; fifoSendDatamsg( FIFO_USER_01, sizeof( Outgoing ), ( u8* ) Outgoing ); } void Arm7_StopMusic( void ) { u32 Outgoing[ 1 ] = { MakeID( 'S', 'T', 'O', 'P' ) }; fifoSendDatamsg( FIFO_USER_01, sizeof( Outgoing ), ( u8* ) Outgoing ); } void Arm7_GiveBuffers( void ) { u32 Outgoing[ 5 ] = { MakeID( 'B', 'U', 'F', 'R' ), Arm7RingBufferSize, 0, Arm7SampleBufferSize, 0 }; Outgoing[ 2 ] = ( u32 ) malloc( Arm7RingBufferSize ); Outgoing[ 4 ] = ( u32 ) malloc( Arm7SampleBufferSize ); fifoSendDatamsg( FIFO_USER_01, sizeof( Outgoing ), ( u8* ) Outgoing ); } |