static void ogg_add_callback(int voice) { if (!ogg_thread_running) { ASND_StopVoice(0); return; } if (private_ogg.flag & 128) return; // Ogg is paused if (private_ogg.pcm_indx >= READ_SAMPLES) { if (ASND_AddVoice(0, (void *) private_ogg.pcmout[private_ogg.pcmout_pos], private_ogg.pcm_indx << 1) == 0) { private_ogg.pcmout_pos ^= 1; private_ogg.pcm_indx = 0; private_ogg.flag = 0; LWP_ThreadSignal(oggplayer_queue); } } else { if (private_ogg.flag & 64) { private_ogg.flag &= ~64; LWP_ThreadSignal(oggplayer_queue); } } }
static void dma_callback(void) { g_audio->dma_busy = g_audio->dma_next; g_audio->dma_next = (g_audio->dma_next + 1) & (BLOCKS - 1); DCFlushRange(g_audio->data[g_audio->dma_next], CHUNK_SIZE); AUDIO_InitDMA((u32)g_audio->data[g_audio->dma_next], CHUNK_SIZE); LWP_ThreadSignal(g_audio->cond); }
static void switch_buffers(void) { AUDIO_StopDMA(); cur_buffer ^= 1; AUDIO_InitDMA((u32)buffer[cur_buffer], buffer_size[cur_buffer]); AUDIO_StartDMA(); LWP_ThreadSignal(audio_queue); }
static void dma_callback(void) { gx_audio_t *wa = (gx_audio_t*)gx_audio_data; // erase last chunk to avoid repeating audio memset(wa->data[wa->dma_busy], 0, CHUNK_SIZE); wa->dma_busy = wa->dma_next; wa->dma_next = (wa->dma_next + 1) & (BLOCKS - 1); DCFlushRange(wa->data[wa->dma_next], CHUNK_SIZE); AUDIO_InitDMA((uint32_t)wa->data[wa->dma_next], CHUNK_SIZE); LWP_ThreadSignal(wa->cond); }
static void audio_switch_buffers() { sb_hw = (sb_hw + 1) % SFX_BUFFERS; AUDIO_InitDMA((u32) sound_buffer[sb_hw], SFX_THREAD_FRAG_SIZE); LWP_ThreadSignal(sfx_queue); }
void ThreadSignal() { LWP_ThreadSignal(ThreadQueue); };