# HG changeset patch # User Michael Pavone # Date 1525157692 25200 # Node ID ade5b8148caac32c60ba0195beef9878ac3c116d # Parent a051d8ee4528b2048bbe36414aad4b365b21598b Fix sync to audio option diff -r a051d8ee4528 -r ade5b8148caa render_sdl.c --- a/render_sdl.c Fri Apr 27 20:08:47 2018 -0700 +++ b/render_sdl.c Mon Apr 30 23:54:52 2018 -0700 @@ -152,8 +152,6 @@ static void audio_callback(void * userdata, uint8_t *byte_stream, int len) { - //int16_t * stream = (int16_t *)byte_stream; - //int samples = len/(sizeof(int16_t)*2); uint8_t num_populated; memset(byte_stream, 0, len); SDL_LockMutex(audio_mutex); @@ -166,6 +164,7 @@ } } if (!quitting && num_populated < num_audio_sources) { + fflush(stdout); SDL_CondWait(audio_ready, audio_mutex); } } while(!quitting && num_populated < num_audio_sources); @@ -264,8 +263,12 @@ ret->buffer_pos = 0; ret->buffer_fraction = 0; ret->last_left = ret->last_right = 0; - ret->read_start = ret->read_end = 0; - ret->mask = alloc_size-1; + ret->read_start = 0; + ret->read_end = sync_to_audio ? buffer_samples * channels : 0; + ret->mask = sync_to_audio ? 0xFFFFFFFF : alloc_size-1; + } + if (sync_to_audio && SDL_GetAudioStatus() == SDL_AUDIO_PAUSED) { + SDL_PauseAudio(0); } return ret; } @@ -361,12 +364,13 @@ { value = lowpass_sample(src, src->last_left, value); src->buffer_fraction += src->buffer_inc; + uint32_t base = sync_to_audio ? 0 : src->read_end; while (src->buffer_fraction > BUFFER_INC_RES) { src->buffer_fraction -= BUFFER_INC_RES; interp_sample(src, src->last_left, value); - if (((src->buffer_pos - src->read_end) & src->mask) >= sync_samples) { + if (((src->buffer_pos - base) & src->mask) >= sync_samples) { do_audio_ready(src); } src->buffer_pos &= src->mask; @@ -379,6 +383,7 @@ left = lowpass_sample(src, src->last_left, left); right = lowpass_sample(src, src->last_right, right); src->buffer_fraction += src->buffer_inc; + uint32_t base = sync_to_audio ? 0 : src->read_end; while (src->buffer_fraction > BUFFER_INC_RES) { src->buffer_fraction -= BUFFER_INC_RES; @@ -386,7 +391,7 @@ interp_sample(src, src->last_left, left); interp_sample(src, src->last_right, right); - if (((src->buffer_pos - src->read_end) & src->mask)/2 >= sync_samples) { + if (((src->buffer_pos - base) & src->mask)/2 >= sync_samples) { do_audio_ready(src); } src->buffer_pos &= src->mask; @@ -1205,7 +1210,7 @@ source_frame = 0; source_frame_count = frame_repeat[0]; //sync samples with audio thread approximately every 8 lines - sync_samples = 8 * sample_rate / (source_hz * (VID_PAL ? 313 : 262)); + sync_samples = sync_to_audio ? buffer_samples : 8 * sample_rate / (source_hz * (VID_PAL ? 313 : 262)); max_repeat++; min_buffered = (((float)max_repeat * (float)sample_rate/(float)source_hz)/* / (float)buffer_samples*/);// + 0.9999; //min_buffered *= buffer_samples;