comparison render_sdl.c @ 1574:ade5b8148caa

Fix sync to audio option
author Michael Pavone <pavone@retrodev.com>
date Mon, 30 Apr 2018 23:54:52 -0700
parents a051d8ee4528
children ea7d5ced2415
comparison
equal deleted inserted replaced
1573:a051d8ee4528 1574:ade5b8148caa
150 150
151 static mix_func mix; 151 static mix_func mix;
152 152
153 static void audio_callback(void * userdata, uint8_t *byte_stream, int len) 153 static void audio_callback(void * userdata, uint8_t *byte_stream, int len)
154 { 154 {
155 //int16_t * stream = (int16_t *)byte_stream;
156 //int samples = len/(sizeof(int16_t)*2);
157 uint8_t num_populated; 155 uint8_t num_populated;
158 memset(byte_stream, 0, len); 156 memset(byte_stream, 0, len);
159 SDL_LockMutex(audio_mutex); 157 SDL_LockMutex(audio_mutex);
160 do { 158 do {
161 num_populated = 0; 159 num_populated = 0;
164 if (audio_sources[i]->front_populated) { 162 if (audio_sources[i]->front_populated) {
165 num_populated++; 163 num_populated++;
166 } 164 }
167 } 165 }
168 if (!quitting && num_populated < num_audio_sources) { 166 if (!quitting && num_populated < num_audio_sources) {
167 fflush(stdout);
169 SDL_CondWait(audio_ready, audio_mutex); 168 SDL_CondWait(audio_ready, audio_mutex);
170 } 169 }
171 } while(!quitting && num_populated < num_audio_sources); 170 } while(!quitting && num_populated < num_audio_sources);
172 if (!quitting) { 171 if (!quitting) {
173 for (uint8_t i = 0; i < num_audio_sources; i++) 172 for (uint8_t i = 0; i < num_audio_sources; i++)
262 double alpha = ret->dt / (ret->dt + rc); 261 double alpha = ret->dt / (ret->dt + rc);
263 ret->lowpass_alpha = (int32_t)(((double)0x10000) * alpha); 262 ret->lowpass_alpha = (int32_t)(((double)0x10000) * alpha);
264 ret->buffer_pos = 0; 263 ret->buffer_pos = 0;
265 ret->buffer_fraction = 0; 264 ret->buffer_fraction = 0;
266 ret->last_left = ret->last_right = 0; 265 ret->last_left = ret->last_right = 0;
267 ret->read_start = ret->read_end = 0; 266 ret->read_start = 0;
268 ret->mask = alloc_size-1; 267 ret->read_end = sync_to_audio ? buffer_samples * channels : 0;
268 ret->mask = sync_to_audio ? 0xFFFFFFFF : alloc_size-1;
269 }
270 if (sync_to_audio && SDL_GetAudioStatus() == SDL_AUDIO_PAUSED) {
271 SDL_PauseAudio(0);
269 } 272 }
270 return ret; 273 return ret;
271 } 274 }
272 275
273 void render_pause_source(audio_source *src) 276 void render_pause_source(audio_source *src)
359 362
360 void render_put_mono_sample(audio_source *src, int16_t value) 363 void render_put_mono_sample(audio_source *src, int16_t value)
361 { 364 {
362 value = lowpass_sample(src, src->last_left, value); 365 value = lowpass_sample(src, src->last_left, value);
363 src->buffer_fraction += src->buffer_inc; 366 src->buffer_fraction += src->buffer_inc;
367 uint32_t base = sync_to_audio ? 0 : src->read_end;
364 while (src->buffer_fraction > BUFFER_INC_RES) 368 while (src->buffer_fraction > BUFFER_INC_RES)
365 { 369 {
366 src->buffer_fraction -= BUFFER_INC_RES; 370 src->buffer_fraction -= BUFFER_INC_RES;
367 interp_sample(src, src->last_left, value); 371 interp_sample(src, src->last_left, value);
368 372
369 if (((src->buffer_pos - src->read_end) & src->mask) >= sync_samples) { 373 if (((src->buffer_pos - base) & src->mask) >= sync_samples) {
370 do_audio_ready(src); 374 do_audio_ready(src);
371 } 375 }
372 src->buffer_pos &= src->mask; 376 src->buffer_pos &= src->mask;
373 } 377 }
374 src->last_left = value; 378 src->last_left = value;
377 void render_put_stereo_sample(audio_source *src, int16_t left, int16_t right) 381 void render_put_stereo_sample(audio_source *src, int16_t left, int16_t right)
378 { 382 {
379 left = lowpass_sample(src, src->last_left, left); 383 left = lowpass_sample(src, src->last_left, left);
380 right = lowpass_sample(src, src->last_right, right); 384 right = lowpass_sample(src, src->last_right, right);
381 src->buffer_fraction += src->buffer_inc; 385 src->buffer_fraction += src->buffer_inc;
386 uint32_t base = sync_to_audio ? 0 : src->read_end;
382 while (src->buffer_fraction > BUFFER_INC_RES) 387 while (src->buffer_fraction > BUFFER_INC_RES)
383 { 388 {
384 src->buffer_fraction -= BUFFER_INC_RES; 389 src->buffer_fraction -= BUFFER_INC_RES;
385 390
386 interp_sample(src, src->last_left, left); 391 interp_sample(src, src->last_left, left);
387 interp_sample(src, src->last_right, right); 392 interp_sample(src, src->last_right, right);
388 393
389 if (((src->buffer_pos - src->read_end) & src->mask)/2 >= sync_samples) { 394 if (((src->buffer_pos - base) & src->mask)/2 >= sync_samples) {
390 do_audio_ready(src); 395 do_audio_ready(src);
391 } 396 }
392 src->buffer_pos &= src->mask; 397 src->buffer_pos &= src->mask;
393 } 398 }
394 src->last_left = left; 399 src->last_left = left;
1203 } 1208 }
1204 } 1209 }
1205 source_frame = 0; 1210 source_frame = 0;
1206 source_frame_count = frame_repeat[0]; 1211 source_frame_count = frame_repeat[0];
1207 //sync samples with audio thread approximately every 8 lines 1212 //sync samples with audio thread approximately every 8 lines
1208 sync_samples = 8 * sample_rate / (source_hz * (VID_PAL ? 313 : 262)); 1213 sync_samples = sync_to_audio ? buffer_samples : 8 * sample_rate / (source_hz * (VID_PAL ? 313 : 262));
1209 max_repeat++; 1214 max_repeat++;
1210 min_buffered = (((float)max_repeat * (float)sample_rate/(float)source_hz)/* / (float)buffer_samples*/);// + 0.9999; 1215 min_buffered = (((float)max_repeat * (float)sample_rate/(float)source_hz)/* / (float)buffer_samples*/);// + 0.9999;
1211 //min_buffered *= buffer_samples; 1216 //min_buffered *= buffer_samples;
1212 printf("Min samples buffered before audio start: %d\n", min_buffered); 1217 printf("Min samples buffered before audio start: %d\n", min_buffered);
1213 max_adjust = BASE_MAX_ADJUST / source_hz; 1218 max_adjust = BASE_MAX_ADJUST / source_hz;