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)
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];
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);
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];
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;
CSND_ChnSetBlock(chn, 1, paddr1, size);
}
- CSND_ChnSetVol(chn, 0xFFFF, 0xFFFF);
-
return csndExecChnCmds(true);
}