Beispiel #1
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 (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);
}
Beispiel #2
0
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;
}
Beispiel #3
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;
}
Beispiel #4
0
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);
	}
}