void finish_sound_buffer (void) { if (currprefs.turbo_emulation) return; #ifdef DRIVESOUND driveclick_mix ((uae_s16*)paula_sndbuffer, paula_sndbufsize / 2, currprefs.dfxclickchannelmask); #endif if (!have_sound) return; if (statuscnt > 0) { statuscnt--; if (statuscnt == 0) gui_data.sndbuf_status = 0; } if (gui_data.sndbuf_status == 3) gui_data.sndbuf_status = 0; /* static int get_audio_buffer_fill() { return g_audio_buffer_queue_size * SYS_BUFFER_BYTES + g_audio_buffer_pos; } */ if (g_audio_callback) { g_audio_callback((int16_t *) paula_sndbuffer, paula_sndbufsize); } //uae_sem_post (&data_available_sem); //uae_sem_wait (&callback_done_sem); }
void finish_sound_buffer (void) { if (currprefs.turbo_emulation) return; #ifdef DRIVESOUND driveclick_mix ((int16_t*)paula_sndbuffer, paula_sndbufsize / 2, currprefs.dfxclickchannelmask); #endif if (!have_sound) return; if (statuscnt > 0) { statuscnt--; if (statuscnt == 0) gui_data.sndbuf_status = 0; } if (gui_data.sndbuf_status == 3) gui_data.sndbuf_status = 0; }
void finish_sound_buffer (void) { if (currprefs.turbo_emulation) return; #ifdef DRIVESOUND driveclick_mix ((uae_s16 *) paula_sndbuffer, paula_sndbufsize / 2, currprefs.dfxclickchannelmask); #endif if (!have_sound) return; if (gui_data.sndbuf_status == 3) gui_data.sndbuf_status = 0; /* Doing a busy wait to stall the emulator if it's ahead. */ /* TODO(cstefansen): Determine if audio busy wait can be avoided. Using * semaphores has been observed to degrade performance severely. */ while (!ready_to_swap) { } ready_to_swap = 0; uae_u16 *temp = paula_sndbuffer; paula_sndbuffer = paula_sndbuffer_front_buffer; paula_sndbuffer_front_buffer = temp; }
void finish_sound_buffer (void) { static unsigned long tframe; int bufsize = (uae_u8*)paula_sndbufpt - (uae_u8*)paula_sndbuffer; if (currprefs.turbo_emulation) { paula_sndbufpt = paula_sndbuffer; return; } if (currprefs.sound_stereo_swap_paula) { if (get_audio_nativechannels (currprefs.sound_stereo) == 2 || get_audio_nativechannels (currprefs.sound_stereo) == 4) channelswap((uae_s16*)paula_sndbuffer, bufsize / 2); else if (get_audio_nativechannels (currprefs.sound_stereo) == 6) channelswap6((uae_s16*)paula_sndbuffer, bufsize / 2); } #ifdef DRIVESOUND driveclick_mix ((uae_s16*)paula_sndbuffer, paula_sndbufsize / 2, currprefs.dfxclickchannelmask); #endif // must be after driveclick_mix paula_sndbufpt = paula_sndbuffer; #ifdef AVIOUTPUT if (avioutput_enabled && avioutput_audio) { AVIOutput_WriteAudio((uae_u8*)paula_sndbuffer, bufsize); if (avioutput_nosoundsync) sound_setadjust(0); } if (avioutput_enabled && (!avioutput_framelimiter || avioutput_nosoundoutput)) return; #endif if (!have_sound) return; #if 0 // we got buffer that was not full (recording active). Need special handling. if (bufsize < sdp->sndbufsize && !extrasndbuf) { extrasndbufsize = sdp->sndbufsize; extrasndbuf = xcalloc(uae_u8, sdp->sndbufsize); extrasndbuffered = 0; } #endif static int statuscnt; if (statuscnt > 0 && tframe != timeframes) { tframe = timeframes; statuscnt--; if (statuscnt == 0) gui_data.sndbuf_status = 0; } if (gui_data.sndbuf_status == 3) gui_data.sndbuf_status = 0; if (extrasndbuf) { int size = extrasndbuffered + bufsize; int copied = 0; if (size > extrasndbufsize) { copied = extrasndbufsize - extrasndbuffered; memcpy(extrasndbuf + extrasndbuffered, paula_sndbuffer, copied); send_sound(sdp, (uae_u16*)extrasndbuf); extrasndbuffered = 0; } memcpy(extrasndbuf + extrasndbuffered, (uae_u8*)paula_sndbuffer + copied, bufsize - copied); extrasndbuffered += bufsize - copied; } else { send_sound(sdp, paula_sndbuffer); } }