diff --git a/audio/audio_driver.c b/audio/audio_driver.c index 5f8b0d6e22..d40bbde015 100644 --- a/audio/audio_driver.c +++ b/audio/audio_driver.c @@ -740,44 +740,7 @@ void audio_driver_frame_is_reverse(void) audio_data.rewind_size - audio_data.rewind_ptr); } -void audio_monitor_adjust_system_rates(void) -{ - float timing_skew; - settings_t *settings = config_get_ptr(); - const struct retro_system_timing *info = NULL; - struct retro_system_av_info *av_info = video_viewport_get_system_av_info(); - - if (av_info) - info = (const struct retro_system_timing*)&av_info->timing; - if (!info || info->sample_rate <= 0.0) - return; - - timing_skew = fabs(1.0f - info->fps / settings->video.refresh_rate); - audio_data.in_rate = info->sample_rate; - - if (timing_skew <= settings->audio.max_timing_skew) - audio_data.in_rate *= (settings->video.refresh_rate / info->fps); - - RARCH_LOG("Set audio input rate to: %.2f Hz.\n", - audio_data.in_rate); -} - -/** - * audio_monitor_set_refresh_rate: - * - * Sets audio monitor refresh rate to new value. - **/ -void audio_monitor_set_refresh_rate(void) -{ - settings_t *settings = config_get_ptr(); - - double new_src_ratio = (double)settings->audio.out_rate / - audio_data.in_rate; - - audio_data.orig_src_ratio = new_src_ratio; - audio_data.src_ratio = new_src_ratio; -} void audio_driver_set_buffer_size(size_t bufsize) { @@ -816,6 +779,29 @@ void audio_driver_callback_set_state(bool state) } } +static void audio_monitor_adjust_system_rates(void) +{ + float timing_skew; + settings_t *settings = config_get_ptr(); + const struct retro_system_timing *info = NULL; + struct retro_system_av_info *av_info = video_viewport_get_system_av_info(); + + if (av_info) + info = (const struct retro_system_timing*)&av_info->timing; + + if (!info || info->sample_rate <= 0.0) + return; + + timing_skew = fabs(1.0f - info->fps / settings->video.refresh_rate); + audio_data.in_rate = info->sample_rate; + + if (timing_skew <= settings->audio.max_timing_skew) + audio_data.in_rate *= (settings->video.refresh_rate / info->fps); + + RARCH_LOG("Set audio input rate to: %.2f Hz.\n", + audio_data.in_rate); +} + bool audio_driver_ctl(enum rarch_audio_ctl_state state, void *data) { driver_t *driver = driver_get_ptr(); @@ -831,6 +817,18 @@ bool audio_driver_ctl(enum rarch_audio_ctl_state state, void *data) return init_audio(); case RARCH_AUDIO_CTL_DEINIT: return uninit_audio(); + case RARCH_AUDIO_CTL_MONITOR_ADJUST_SYSTEM_RATES: + audio_monitor_adjust_system_rates(); + return true; + case RARCH_AUDIO_CTL_MONITOR_SET_REFRESH_RATE: + { + double new_src_ratio = (double)settings->audio.out_rate / + audio_data.in_rate; + + audio_data.orig_src_ratio = new_src_ratio; + audio_data.src_ratio = new_src_ratio; + } + return true; case RARCH_AUDIO_CTL_MUTE_TOGGLE: if (!driver->audio_data || !driver->audio_active) return false; diff --git a/audio/audio_driver.h b/audio/audio_driver.h index aa66f32d84..5066830e61 100644 --- a/audio/audio_driver.h +++ b/audio/audio_driver.h @@ -79,6 +79,9 @@ enum rarch_audio_ctl_state RARCH_AUDIO_CTL_DEINIT, RARCH_AUDIO_CTL_START, RARCH_AUDIO_CTL_STOP, + /* Sets audio monitor refresh rate to new value. */ + RARCH_AUDIO_CTL_MONITOR_SET_REFRESH_RATE, + RARCH_AUDIO_CTL_MONITOR_ADJUST_SYSTEM_RATES, RARCH_AUDIO_CTL_MUTE_TOGGLE, RARCH_AUDIO_CTL_ALIVE }; @@ -155,14 +158,6 @@ void audio_driver_callback(void); void audio_driver_callback_set_state(bool state); -void audio_monitor_adjust_system_rates(void); - -/** - * audio_monitor_set_refresh_rate: - * - * Sets audio monitor refresh rate to new value. - **/ -void audio_monitor_set_refresh_rate(void); extern audio_driver_t audio_rsound; extern audio_driver_t audio_oss; diff --git a/driver.c b/driver.c index b38dea5904..ae3c9fc90c 100644 --- a/driver.c +++ b/driver.c @@ -232,7 +232,7 @@ static void driver_adjust_system_rates(void) rarch_system_info_t *system = rarch_system_info_get_ptr(); driver_t *driver = driver_get_ptr(); - audio_monitor_adjust_system_rates(); + audio_driver_ctl(RARCH_AUDIO_CTL_MONITOR_ADJUST_SYSTEM_RATES, NULL); video_driver_ctl(RARCH_DISPLAY_CTL_MONITOR_ADJUST_SYSTEM_RATES, NULL); if (!driver->video_data) @@ -255,7 +255,7 @@ static void driver_adjust_system_rates(void) void driver_set_refresh_rate(float hz) { video_monitor_set_refresh_rate(hz); - audio_monitor_set_refresh_rate(); + audio_driver_ctl(RARCH_AUDIO_CTL_MONITOR_SET_REFRESH_RATE, NULL); driver_adjust_system_rates(); }