Mercurial > repos > blastem
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; |