use struct for channel status array

This commit is contained in:
Dave Murphy 2015-01-02 22:41:48 +00:00
parent 39605bc6e2
commit abfb15af1b
2 changed files with 22 additions and 12 deletions

View File

@ -1,30 +1,40 @@
#pragma once #pragma once
#include <3ds/types.h>
#define CSND_SHAREDMEM_DEFAULT 0x10004000 #define CSND_SHAREDMEM_DEFAULT 0x10004000
typedef enum{ typedef enum{
CSND_LOOP_DISABLE, CSND_LOOP_DISABLE,
CSND_LOOP_ENABLE CSND_LOOP_ENABLE
} CSND_LOOPING; } CSND_LOOPING;
typedef enum{ typedef enum{
CSND_ENCODING_PCM8, CSND_ENCODING_PCM8,
CSND_ENCODING_PCM16, CSND_ENCODING_PCM16,
CSND_ENCODING_IMA_ADPCM, CSND_ENCODING_IMA_ADPCM,
CSND_ENCODING_PSG//"3 = PSG, similar to DS?" CSND_ENCODING_PSG//"3 = PSG, similar to DS?"
} CSND_ENCODING; } 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 //See here regarding CSND shared-mem commands, etc: http://3dbrew.org/wiki/CSND_Shared_Memory
Result CSND_initialize(u32* sharedMem); Result CSND_initialize(u32* sharedMem);
Result CSND_shutdown(); 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); 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_setchannel_playbackstate(u32 channel, u32 value);
void CSND_sharedmemtype0_cmd0(u32 channel, u32 value); void CSND_sharedmemtype0_cmd0(u32 channel, u32 value);
void CSND_writesharedmem_cmdtype0(u16 cmdid, u8 *cmdparams); void CSND_writesharedmem_cmdtype0(u16 cmdid, u8 *cmdparams);
Result CSND_sharedmemtype0_cmdupdatestate(int waitdone); 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); Result CSND_getchannelstate_isplaying(u32 entryindex, u8 *status);

View File

@ -301,14 +301,14 @@ Result CSND_playsound(u32 channel, u32 looping, u32 encoding, u32 samplerate, u3
return CSND_sharedmemtype0_cmdupdatestate(0); 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; Result ret=0;
if((ret = CSND_sharedmemtype0_cmdupdatestate(1))!=0)return ret; if((ret = CSND_sharedmemtype0_cmdupdatestate(1))!=0)return ret;
memcpy(out, &CSND_sharedmem[(CSND_sharedmem_cmdblocksize+8 + entryindex*0xc) >> 2], 0xc); memcpy(out, &CSND_sharedmem[(CSND_sharedmem_cmdblocksize+8 + entryindex*0xc) >> 2], 0xc);
out[2] -= 0x0c000000; out->position -= 0x0c000000;
return 0; return 0;
} }
@ -316,12 +316,12 @@ Result CSND_getchannelstate(u32 entryindex, u32 *out)
Result CSND_getchannelstate_isplaying(u32 entryindex, u8 *status) Result CSND_getchannelstate_isplaying(u32 entryindex, u8 *status)
{ {
Result ret; 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; if(ret!=0)return ret;
*status = entry[0] & 0xff; *status = entry.state;
return 0; return 0;
} }