From 671ea5f555527cd6614fda301f5573558c291c29 Mon Sep 17 00:00:00 2001 From: fincs Date: Sat, 3 Jan 2015 14:30:18 +0100 Subject: [PATCH] Add CSND_ChnSetDuty() --- libctru/include/3ds/services/csnd.h | 24 +++++++++++++++++++----- libctru/source/services/csnd.c | 16 +++++++++++++--- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/libctru/include/3ds/services/csnd.h b/libctru/include/3ds/services/csnd.h index 9d34d13..4c20f6f 100644 --- a/libctru/include/3ds/services/csnd.h +++ b/libctru/include/3ds/services/csnd.h @@ -8,11 +8,11 @@ typedef enum { - CSND_ENCODING_PCM8, - CSND_ENCODING_PCM16, - CSND_ENCODING_ADPCM, // IMA-ADPCM - CSND_ENCODING_PSG, // Similar to DS? -} CSND_ENCODING; + CSND_ENCODING_PCM8 = 0, + CSND_ENCODING_PCM16, + CSND_ENCODING_ADPCM, // IMA-ADPCM + CSND_ENCODING_PSG, // Similar to DS? +}; #define SOUND_CHANNEL(n) ((u32)(n) & 0x1F) #define SOUND_FORMAT(n) ((u32)(n) << 12) @@ -30,6 +30,19 @@ enum SOUND_ENABLE = BIT(14), }; +// Duty cycles for a PSG channel +enum +{ + DutyCycle_0 = 7, /*!< 0.0% duty cycle */ + DutyCycle_12 = 0, /*!< 12.5% duty cycle */ + DutyCycle_25 = 1, /*!< 25.0% duty cycle */ + DutyCycle_37 = 2, /*!< 37.5% duty cycle */ + DutyCycle_50 = 3, /*!< 50.0% duty cycle */ + DutyCycle_62 = 4, /*!< 62.5% duty cycle */ + DutyCycle_75 = 5, /*!< 75.0% duty cycle */ + DutyCycle_87 = 6 /*!< 87.5% duty cycle */ +}; + typedef union { u32 value[3]; @@ -62,6 +75,7 @@ void CSND_ChnSetPlayState(u32 channel, u32 value); void CSND_ChnSetBlock(u32 channel, int block, u32 physaddr, u32 size); void CSND_ChnSetVol(u32 channel, u16 left, u16 right); void CSND_ChnSetTimer(u32 channel, u32 timer); +void CSND_ChnSetDuty(u32 channel, u32 duty); void CSND_ChnConfig(u32 flags, u32 physaddr0, u32 physaddr1, u32 totalbytesize); Result CSND_UpdateChnInfo(bool waitDone); diff --git a/libctru/source/services/csnd.c b/libctru/source/services/csnd.c index bea23fd..8d97a6b 100644 --- a/libctru/source/services/csnd.c +++ b/libctru/source/services/csnd.c @@ -260,6 +260,18 @@ void CSND_ChnSetTimer(u32 channel, u32 timer) csndWriteChnCmd(0x8, (u8*)&cmdparams); } +void CSND_ChnSetDuty(u32 channel, u32 duty) +{ + u32 cmdparams[0x18>>2]; + + memset(cmdparams, 0, 0x18); + + cmdparams[0] = channel & 0x1f; + cmdparams[1] = duty; + + csndWriteChnCmd(0x7, (u8*)&cmdparams); +} + void CSND_ChnConfig(u32 flags, u32 physaddr0, u32 physaddr1, u32 totalbytesize) { u32 cmdparams[0x18>>2]; @@ -267,7 +279,7 @@ void CSND_ChnConfig(u32 flags, u32 physaddr0, u32 physaddr1, u32 totalbytesize) memset(cmdparams, 0, 0x18); cmdparams[0] = flags; - cmdparams[1] = 0; // Unknown + cmdparams[1] = 0x7FFF7FFF; // Volume cmdparams[2] = 0; // Unknown cmdparams[3] = physaddr0; cmdparams[4] = physaddr1; @@ -314,8 +326,6 @@ Result csndChnPlaySound(int chn, u32 flags, u32 sampleRate, void* data0, void* d CSND_ChnSetBlock(chn, 1, paddr1, size); } - CSND_ChnSetVol(chn, 0xFFFF, 0xFFFF); - return csndExecChnCmds(true); }