aboutsummaryrefslogtreecommitdiff
path: root/libpsn00b/include/psxspu.h
diff options
context:
space:
mode:
Diffstat (limited to 'libpsn00b/include/psxspu.h')
-rw-r--r--libpsn00b/include/psxspu.h39
1 files changed, 31 insertions, 8 deletions
diff --git a/libpsn00b/include/psxspu.h b/libpsn00b/include/psxspu.h
index cf78e3d..cdc3ac7 100644
--- a/libpsn00b/include/psxspu.h
+++ b/libpsn00b/include/psxspu.h
@@ -73,6 +73,20 @@ typedef struct _SpuCommonAttr {
SpuExtAttr cd, ext;
} SpuCommonAttr;
+/* Macros */
+
+#define getSPUAddr(addr) ((uint16_t) (((addr) + 7) / 8))
+#define getSPUSampleRate(rate) ((uint16_t) (((rate) * (1 << 12)) / 44100))
+
+#define getSPUADSR(ar, dr, sr, rr, sl) ( \
+ (sl) | \
+ ((dr) << 4) | \
+ ((ar) << 8) | \
+ ((rr) << 16) | \
+ ((sr) << 22) | \
+ (1 << 30) \
+)
+
/* "Useless" macros for official SDK compatibility */
#define SpuSetCommonMasterVolume(left, right) \
@@ -87,21 +101,29 @@ typedef struct _SpuCommonAttr {
((enable) ? (SPU_CTRL |= 0x0002) : (SPU_CTRL &= 0xfffd))
#define SpuSetReverbAddr(addr) \
- (SPU_REVERB_ADDR = ((addr) + 7) / 8)
+ (SPU_REVERB_ADDR = getSPUAddr(addr))
#define SpuSetIRQAddr(addr) \
- (SPU_IRQ_ADDR = ((addr) + 7) / 8)
+ (SPU_IRQ_ADDR = getSPUAddr(addr))
#define SpuSetVoiceVolume(ch, left, right) \
(SPU_CH_VOL_L(ch) = (left), SPU_CH_VOL_R(ch) = (right))
#define SpuSetVoicePitch(ch, pitch) \
(SPU_CH_FREQ(ch) = (pitch))
#define SpuSetVoiceStartAddr(ch, addr) \
- (SPU_CH_ADDR(ch) = ((addr) + 7) / 8)
-#define SpuSetVoiceADSR(ch, ar, dr, sr, rr, sl) \
- (SPU_CH_ADSR(ch) = ((sl)) | ((dr) << 4) | ((ar) << 8) | ((rr) << 16) | ((sr) << 22) | (1 << 30))
+ (SPU_CH_ADDR(ch) = getSPUAddr(addr))
+#define SpuSetVoiceADSR(ch, ar, dr, sr, rr, sl) ( \
+ SPU_CH_ADSR1(ch) = (sl) | ((dr) << 4) | ((ar) << 8), \
+ SPU_CH_ADSR2(ch) = (rr) | ((sr) << 6) | (1 << 14) \
+)
#define SpuSetKey(enable, voice_bit) \
- ((enable) ? (SPU_KEY_ON = (voice_bit)) : (SPU_KEY_OFF = (voice_bit)))
+ ((enable) ? ( \
+ SPU_KEY_ON1 = (uint16_t) (voice_bit), \
+ SPU_KEY_ON2 = (uint16_t) ((voice_bit) >> 16) \
+ ) : ( \
+ SPU_KEY_OFF1 = (uint16_t) (voice_bit), \
+ SPU_KEY_OFF2 = (uint16_t) ((voice_bit) >> 16) \
+ ))
/* Public API */
@@ -111,8 +133,9 @@ extern "C" {
void SpuInit(void);
-void SpuRead(uint32_t *data, size_t size);
-void SpuWrite(const uint32_t *data, size_t size);
+size_t SpuRead(uint32_t *data, size_t size);
+size_t SpuWrite(const uint32_t *data, size_t size);
+size_t SpuWritePartly(const uint32_t *data, size_t size);
SPU_TransferMode SpuSetTransferMode(SPU_TransferMode mode);
uint32_t SpuSetTransferStartAddr(uint32_t addr);
int SpuIsTransferCompleted(int mode);