aboutsummaryrefslogtreecommitdiff
path: root/examples/sound/cdstream/stream.c
diff options
context:
space:
mode:
authorspicyjpeg <thatspicyjpeg@gmail.com>2024-01-08 19:15:28 +0100
committerspicyjpeg <thatspicyjpeg@gmail.com>2024-01-08 19:15:28 +0100
commita149dc9e3b84922a7e52d31e9a56f255a5597dff (patch)
tree8f30aacab5d7e0d2569e821c2d3b83c6e703b81e /examples/sound/cdstream/stream.c
parentdd85f9f993427ae69ab905486f8ef372d3960664 (diff)
downloadpsn00bsdk-a149dc9e3b84922a7e52d31e9a56f255a5597dff.tar.gz
Fix examples, update submodules and CI script
Diffstat (limited to 'examples/sound/cdstream/stream.c')
-rw-r--r--examples/sound/cdstream/stream.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/examples/sound/cdstream/stream.c b/examples/sound/cdstream/stream.c
index 624b6e1..9dfc9ba 100644
--- a/examples/sound/cdstream/stream.c
+++ b/examples/sound/cdstream/stream.c
@@ -29,7 +29,7 @@
/* Private utilities */
-static volatile Stream_Context *_active_ctx = (void *) 0;
+static volatile Stream_Context *volatile _active_ctx = (void *) 0;
static Stream_Time _default_timer_function(void) {
return VSync(-1);
@@ -42,7 +42,7 @@ static int _get_default_timer_rate(void) {
/* Interrupt handlers */
static void _spu_irq_handler(void) {
- Stream_Context *ctx = _active_ctx;
+ volatile Stream_Context *ctx = _active_ctx;
// Acknowledge the interrupt to ensure it can be triggered again. The only
// way to do this is actually to disable the interrupt entirely; we'll
@@ -90,13 +90,13 @@ static void _spu_irq_handler(void) {
// both channels' loop addresses to make them "jump" to the new buffers,
// rather than actually looping when they encounter the loop flag at the end
// of the currently playing buffers.
- uint32_t offset = 0;
uint32_t address =
ctx->config.spu_address + (ctx->db_active ? ctx->chunk_size : 0);
int sample_rate = ctx->new_sample_rate;
ctx->config.sample_rate = sample_rate;
+ SpuSetTransferStartAddr(address);
SPU_IRQ_ADDR = getSPUAddr(address);
for (uint32_t ch = 0, mask = ctx->config.channel_mask; mask; ch++, mask >>= 1) {
@@ -104,15 +104,14 @@ static void _spu_irq_handler(void) {
continue;
SPU_CH_FREQ (ch) = getSPUSampleRate(sample_rate);
- SPU_CH_LOOP_ADDR(ch) = getSPUAddr(address + offset);
- offset += ctx->config.interleave;
+ SPU_CH_LOOP_ADDR(ch) = getSPUAddr(address);
+ address += ctx->config.interleave;
// Make sure this channel's data ends with an appropriate loop flag.
//ptr[offset - 15] |= 0x03;
}
// Start uploading the next chunk to the SPU.
- SpuSetTransferStartAddr(address);
SpuWrite((const uint32_t *) ptr, ctx->chunk_size);
}
@@ -186,6 +185,9 @@ bool Stream_Start(Stream_Context *ctx, bool resume) {
int sample_rate = ctx->new_sample_rate;
ctx->config.sample_rate = sample_rate;
+ // Disable the IRQ as we're going to call spu_irq_handler() manually (due to
+ // finicky SPU timings).
+ SPU_CTRL &= ~(1 << 6);
SpuSetKey(0, ctx->config.channel_mask);
for (uint32_t ch = 0, mask = ctx->config.channel_mask; mask; ch++, mask >>= 1) {
@@ -200,14 +202,14 @@ bool Stream_Start(Stream_Context *ctx, bool resume) {
address += ctx->config.interleave;
}
- _spu_irq_handler();
SpuSetKey(1, ctx->config.channel_mask);
+ _spu_irq_handler();
return true;
}
bool Stream_Stop(void) {
- Stream_Context *ctx = _active_ctx;
+ volatile Stream_Context *ctx = _active_ctx;
if (!ctx)
return false;