static int play(void *data, int remaining, int flags) { int processed = 0; int samples = BUFFER_SIZE / (sizeof(s16) * HW_CHANNELS); s16 *source = (s16 *)data; while (remaining >= request_size && get_space() >= request_size) { copy_channels((s16 *)buffers[buffer_fill], source, samples, processed, remaining); DCStoreRangeNoSync(buffers[buffer_fill], BUFFER_SIZE); buffer_fill = (buffer_fill + 1) % BUFFER_COUNT; processed += request_size; source += request_size / sizeof(s16); buffered += BUFFER_SIZE; remaining -= request_size; } if ((flags & AOPLAY_FINAL_CHUNK) && remaining > 0) { samples = remaining / (sizeof(s16) * HW_CHANNELS); memset(buffers[buffer_fill], 0, BUFFER_SIZE); copy_channels((s16 *)buffers[buffer_fill], source, samples, processed, 0); DCStoreRangeNoSync(buffers[buffer_fill], BUFFER_SIZE); buffer_fill = (buffer_fill + 1) % BUFFER_COUNT; processed += remaining; buffered += BUFFER_SIZE; } if (!playing)// && buffered > request_size) { playing = true; switch_buffers(); AUDIO_StartDMA(); } return processed; }
void stp_channel_convert(const stp_vars_t *v, unsigned *zero_mask) { if (input_has_special_channels(v)) generate_special_channels(v); else if (output_has_gloss(v) && !input_needs_splitting(v)) copy_channels(v); if (output_needs_gcr(v)) do_gcr(v); if (input_needs_splitting(v)) split_channels(v, zero_mask); else scale_channels(v, zero_mask); (void) limit_ink(v); (void) generate_gloss(v, zero_mask); }