diff --git a/libctru/include/3ds/services/csnd.h b/libctru/include/3ds/services/csnd.h index f607955..84201c9 100644 --- a/libctru/include/3ds/services/csnd.h +++ b/libctru/include/3ds/services/csnd.h @@ -1,30 +1,40 @@ #pragma once +#include <3ds/types.h> + #define CSND_SHAREDMEM_DEFAULT 0x10004000 typedef enum{ - CSND_LOOP_DISABLE, - CSND_LOOP_ENABLE + 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_PCM8, + CSND_ENCODING_PCM16, + CSND_ENCODING_IMA_ADPCM, + CSND_ENCODING_PSG//"3 = PSG, similar to DS?" } CSND_ENCODING; +struct CSND_CHANNEL_STATUS { + u8 state; + u8 pad[3]; + u32 unknown; + u32 position; +} ALIGN(4); + //See here regarding CSND shared-mem commands, etc: http://3dbrew.org/wiki/CSND_Shared_Memory Result CSND_initialize(u32* sharedMem); Result CSND_shutdown(); +u32 CSND_convertsamplerate(u32 samplerate); 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_getchannelstate(u32 entryindex, u32 *out); +Result CSND_getchannelstate(u32 entryindex, struct CSND_CHANNEL_STATUS *out); Result CSND_getchannelstate_isplaying(u32 entryindex, u8 *status); diff --git a/libctru/source/services/csnd.c b/libctru/source/services/csnd.c index 52f95ec..d118329 100644 --- a/libctru/source/services/csnd.c +++ b/libctru/source/services/csnd.c @@ -301,14 +301,14 @@ Result CSND_playsound(u32 channel, u32 looping, u32 encoding, u32 samplerate, u3 return CSND_sharedmemtype0_cmdupdatestate(0); } -Result CSND_getchannelstate(u32 entryindex, u32 *out) +Result CSND_getchannelstate(u32 entryindex, struct CSND_CHANNEL_STATUS *out) { Result ret=0; if((ret = CSND_sharedmemtype0_cmdupdatestate(1))!=0)return ret; memcpy(out, &CSND_sharedmem[(CSND_sharedmem_cmdblocksize+8 + entryindex*0xc) >> 2], 0xc); - out[2] -= 0x0c000000; + out->position -= 0x0c000000; return 0; } @@ -316,12 +316,12 @@ Result CSND_getchannelstate(u32 entryindex, u32 *out) Result CSND_getchannelstate_isplaying(u32 entryindex, u8 *status) { Result ret; - u32 entry[0xc>>2]; + struct CSND_CHANNEL_STATUS entry; - ret = CSND_getchannelstate(entryindex, entry); + ret = CSND_getchannelstate(entryindex, &entry); if(ret!=0)return ret; - *status = entry[0] & 0xff; + *status = entry.state; return 0; }