]> Chaos Git - corbenik/ctrulib.git/commitdiff
Add CSND_ChnSetDuty()
authorfincs <fincs.alt1@gmail.com>
Sat, 3 Jan 2015 13:30:18 +0000 (14:30 +0100)
committerfincs <fincs.alt1@gmail.com>
Tue, 20 Jan 2015 16:55:24 +0000 (17:55 +0100)
libctru/include/3ds/services/csnd.h
libctru/source/services/csnd.c

index 9d34d139c281037f839f14a4036647fdfa495a18..4c20f6f13e8a715df1f7aa936580b3b8cddecc77 100644 (file)
@@ -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);
index bea23fd0ffa9a29def1bfc1acaff553ceb88dd07..8d97a6bd958de228d03aadf7e07697d1177bb9e7 100644 (file)
@@ -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);
 }