예제 #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);
}
예제 #2
0
bool cda_audio::play(int bufnum) {
    if (!active) {
        return false;
    }

    uae_s16 *p = (uae_s16*)(buffers[bufnum]);
    for (int i = 0; i < num_sectors * sectorsize / 4; i++) {
        p[i * 2 + 0] = p[i * 2 + 0] * volume[0] / 32768;
        p[i * 2 + 1] = p[i * 2 + 1] * volume[1] / 32768;
    }

    if (g_audio_callback) {
        int len = num_sectors * sectorsize;
#ifdef WORDS_BIGENDIAN
        int8_t *d = (int8_t *) p;
        int8_t temp = 0;
        for (int i = 0; i < len; i += 2) {
            temp = d[i + 1];
            d[i + 1] = d[i];
            d[i] = temp;
        }
#endif
        buffer_ids[bufnum] = g_audio_callback(3, p, len);
    }
    else {
        buffer_ids[bufnum] = 0;
    }

#if 0
    mBufferDone[bufnum] = 0;
#endif
    return true;

}
예제 #3
0
static void *audio_thread(void *cda_pointer) {
    cda_audio *cda = (cda_audio *) cda_pointer;

    int bufnum = 0;
    while (!cda->mStopThread) {
        if (g_amiga_paused) {
            Sleep(10);
            continue;
        }
        if (cda->mBufferDone[bufnum]) {
            // waiting for buffer to become ready to play
            Sleep(1);
            continue;
        }

        uae_s16 *p = (uae_s16*)(cda->buffers[bufnum]);
        if (g_audio_callback) {
            for (int i = 0; i < cda->num_sectors; i++) {
                g_audio_callback(3, p, 2352);
                p += (2352 / 2);
                // FIXME: use a clock here as well, to time the sleeps
                // better..
                Sleep(1000 * 2352.0 / BYTES_PER_SEC);
            }
        }

        cda->mBufferDone[bufnum] = 1;
        bufnum = !bufnum;
    }
    write_log("end of cdda thread\n");
    return NULL;
}
예제 #4
0
bool cda_audio::isplaying(int bufnum)
{
	if (!active || !playing)
		return false;
	if (buffer_ids[bufnum] == 0) {
		return false;
	}
	return g_audio_callback(3, NULL, buffer_ids[bufnum]);
}
예제 #5
0
파일: audio.cpp 프로젝트: adurdin/fs-uae
static void send_sound (struct sound_data *sd, uae_u16 *sndbuffer)
{
#if 0
	if (savestate_state)
		return;
	if (sd->paused)
		return;
	if (sd->softvolume >= 0) {
		uae_s16 *p = (uae_s16*)sndbuffer;
		for (int i = 0; i < sd->sndbufsize / 2; i++) {
			p[i] = p[i] * sd->softvolume / 32768;
		}
	}
#endif
	if (g_audio_callback) {
		g_audio_callback(0, (int16_t *) paula_sndbuffer, paula_sndbufsize);
	}
}
예제 #6
0
void cda_audio::wait(int bufnum) {
    if (!active || !playing) {
        return;
    }

    if (buffer_ids[bufnum] == 0) {
        return;
    }

    // calling g_audio_callback with NULL parameter to check status
    while (!g_audio_callback(3, NULL, buffer_ids[bufnum])) {
        Sleep (10);
    }

#if 0
    while (!mBufferDone[bufnum]) {
        Sleep (10);
    }
#endif
}
예제 #7
0
파일: audio.cpp 프로젝트: adurdin/fs-uae
void restart_sound_buffer(void)
{
    if (g_audio_callback) {
        g_audio_callback(2, NULL, 0);
    }
}
예제 #8
0
파일: audio.cpp 프로젝트: adurdin/fs-uae
void pause_sound_buffer (void)
{
    if (g_audio_callback) {
        g_audio_callback(1, NULL, 0);
    }
}