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); }
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; }
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; }
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]); }
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); } }
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 }
void restart_sound_buffer(void) { if (g_audio_callback) { g_audio_callback(2, NULL, 0); } }
void pause_sound_buffer (void) { if (g_audio_callback) { g_audio_callback(1, NULL, 0); } }