diff --git a/libctru/include/ctr/CSND.h b/libctru/include/ctr/CSND.h index 3909cdc..408d1da 100644 --- a/libctru/include/ctr/CSND.h +++ b/libctru/include/ctr/CSND.h @@ -1,18 +1,30 @@ #ifndef CSND_H #define CSND_H +//See here regarding CSND shared-mem commands, etc: http://3dbrew.org/wiki/CSND_Shared_Memory + #define CSND_SHAREDMEM_DEFAULT 0x10004000 -//See here regarding CSND shared-mem commands, etc: http://3dbrew.org/wiki/CSND_Shared_Memory +typedef enum{ + CSND_LOOP_DISABLE, + CSND_LOOP_ENABLE +} CSND_LOOPING; + +typedef enum{ + CSND_ENCODING_PCM8, + CSND_ENCODING_PCM16, + CSND_ENCODING_IMA_ADPCM, + CSND_ENCODING_PSG//"3 = PSG, similar to DS?" +} CSND_ENCODING; Result CSND_initialize(u32* sharedMem); Result CSND_shutdown(); -Result CSND_playsound(u32 channel, u32 looping, u32 encoding, u32 samplerate, u32 *vaddr0, u32 *vaddr1, u32 totalbytesize, u32 unk0, u32 unk1); -void CSND_setchannel_playbackstate(u32 channel, u32 value); -void CSND_sharedmemtype0_cmd0(u32 channel, u32 value); -void CSND_writesharedmem_cmdtype0(u16 cmdid, u8 *cmdparams); -Result CSND_sharedmemtype0_cmdupdatestate(int waitdone); +Result CSND_playsound(u32 channel, CSND_LOOPING looping, CSND_ENCODING encoding, u32 samplerate, u32 *vaddr0, u32 *vaddr1, u32 totalbytesize, u32 unk0, u32 unk1);//vaddr0 is the initial virtual-address of the audio-data. vaddr1 is the audio-data virtual-address used for looping, when playback is restarted for looping. +void CSND_setchannel_playbackstate(u32 channel, u32 value);//value0 = pause playback, value1 = resume playback. +void CSND_sharedmemtype0_cmd0(u32 channel, u32 value);//value1 = start playback. value0 = stop playback, and reset the CSND registers for this channel. +void CSND_writesharedmem_cmdtype0(u16 cmdid, u8 *cmdparams);//This can be used to use arbitary CSND shared-memory commands. +Result CSND_sharedmemtype0_cmdupdatestate(int waitdone);//This must be used after using CSND shared-memory commands in order for those commands to be processed. CSND_playsound() and CSND_getchannelstate() use this automatically. Result CSND_getchannelstate(u32 entryindex, u32 *out); Result CSND_getchannelstate_isplaying(u32 entryindex, u8 *status); diff --git a/libctru/source/CSND.c b/libctru/source/CSND.c index f911b36..cb40db4 100644 --- a/libctru/source/CSND.c +++ b/libctru/source/CSND.c @@ -232,7 +232,7 @@ void CSND_sharedmemtype0_cmd8(u32 channel, u32 samplerate) CSND_writesharedmem_cmdtype0(0x8, (u8*)&cmdparams); } -void CSND_sharedmemtype0_cmde(u32 channel, u32 looping, u32 encoding, u32 samplerate, u32 unk0, u32 unk1, u32 physaddr0, u32 physaddr1, u32 totalbytesize) +void CSND_sharedmemtype0_cmde(u32 channel, CSND_LOOPING looping, CSND_ENCODING encoding, u32 samplerate, u32 unk0, u32 unk1, u32 physaddr0, u32 physaddr1, u32 totalbytesize) { u32 val; u32 cmdparams[0x18>>2]; @@ -241,8 +241,8 @@ void CSND_sharedmemtype0_cmde(u32 channel, u32 looping, u32 encoding, u32 sample cmdparams[0] = channel & 0x1f; cmdparams[0] |= (unk0 & 0xf) << 6; - if(!looping)cmdparams[0] |= 2 << 10; - if(looping)cmdparams[0] |= 1 << 10; + if(looping==CSND_LOOP_DISABLE)cmdparams[0] |= 2 << 10; + if(looping==CSND_LOOP_ENABLE)cmdparams[0] |= 1 << 10; cmdparams[0] |= (encoding & 3) << 12; cmdparams[0] |= (unk1 & 3) << 14; @@ -282,7 +282,7 @@ Result CSND_sharedmemtype0_cmdupdatestate(int waitdone) return 0; } -Result CSND_playsound(u32 channel, u32 looping, u32 encoding, u32 samplerate, u32 *vaddr0, u32 *vaddr1, u32 totalbytesize, u32 unk0, u32 unk1) +Result CSND_playsound(u32 channel, CSND_LOOPING looping, CSND_ENCODING encoding, u32 samplerate, u32 *vaddr0, u32 *vaddr1, u32 totalbytesize, u32 unk0, u32 unk1) { u32 physaddr0 = 0; u32 physaddr1 = 0; @@ -292,7 +292,7 @@ Result CSND_playsound(u32 channel, u32 looping, u32 encoding, u32 samplerate, u3 CSND_sharedmemtype0_cmde(channel, looping, encoding, samplerate, unk0, unk1, physaddr0, physaddr1, totalbytesize); CSND_sharedmemtype0_cmd8(channel, samplerate); - if(looping)CSND_sharedmemtype0_cmd3(channel, physaddr0, totalbytesize); + if(looping==CSND_LOOP_ENABLE)CSND_sharedmemtype0_cmd3(channel, physaddr0, totalbytesize); CSND_sharedmemtype0_cmd8(channel, samplerate); CSND_sharedmemtype0_cmd9(channel, 0xffff); CSND_setchannel_playbackstate(channel, 1);