From eebd7bbeeac26ee42b99b8203baa23a25eb9e2c1 Mon Sep 17 00:00:00 2001 From: Zoran Vuckovic Date: Wed, 24 May 2017 16:25:36 +0200 Subject: [PATCH] Change shared-mode settings --- audio/drivers/wasapi.c | 15 +++++++++++---- config.def.h | 6 +++--- configuration.c | 6 +++--- configuration.h | 8 ++++---- intl/msg_hash_us.h | 2 +- menu/menu_displaylist.c | 2 +- menu/menu_setting.c | 28 ++++++++++++++++++++++++---- 7 files changed, 47 insertions(+), 20 deletions(-) diff --git a/audio/drivers/wasapi.c b/audio/drivers/wasapi.c index e0f14abca7..2acea1a24e 100644 --- a/audio/drivers/wasapi.c +++ b/audio/drivers/wasapi.c @@ -505,10 +505,11 @@ static void *wasapi_init(const char *dev_id, unsigned rate, unsigned latency, HRESULT hr; bool com_initialized = false; UINT32 frame_count = 0; + REFERENCE_TIME dev_period = 0; BYTE *dest = NULL; settings_t *settings = config_get_ptr(); bool float_format = settings->bools.audio_wasapi_float_format; - unsigned sh_buffer_length = settings->uints.audio_wasapi_sh_buffer_length; + int sh_buffer_length = settings->ints.audio_wasapi_sh_buffer_length; wasapi_t *w = (wasapi_t*)calloc(1, sizeof(wasapi_t)); w->exclusive = settings->bools.audio_wasapi_exclusive_mode; @@ -545,6 +546,14 @@ static void *wasapi_init(const char *dev_id, unsigned rate, unsigned latency, } else if (sh_buffer_length) { + if (sh_buffer_length < 0) + { + hr = w->client->lpVtbl->GetDevicePeriod(w->client, &dev_period, NULL); + WASAPI_HR_CHECK(hr, "IAudioClient::GetDevicePeriod", goto error); + + sh_buffer_length = dev_period * rate / 10000000; + } + w->buffer = fifo_new(sh_buffer_length * w->frame_size); WASAPI_CHECK(w->buffer, "Out of memory", goto error); @@ -963,11 +972,9 @@ static size_t wasapi_write_avail(void *wh) static size_t wasapi_buffer_size(void *wh) { wasapi_t *w = (wasapi_t*)wh; - settings_t *settings = config_get_ptr(); - unsigned sh_buffer_length = settings->uints.audio_wasapi_sh_buffer_length; if (!w->exclusive && w->buffer) - return sh_buffer_length * w->frame_size; + return w->buffer->size; return w->engine_buffer_size; } diff --git a/config.def.h b/config.def.h index fcf0f5847b..8d4d5ca063 100644 --- a/config.def.h +++ b/config.def.h @@ -416,9 +416,9 @@ static const float audio_volume = 0.0; #ifdef HAVE_WASAPI /* WASAPI defaults */ -static const bool wasapi_exclusive_mode = true; -static const bool wasapi_float_format = false; -static const unsigned wasapi_sh_buffer_length = 0; +static const bool wasapi_exclusive_mode = true; +static const bool wasapi_float_format = false; +static const int wasapi_sh_buffer_length = -16; /* auto */ #endif /* MISC */ diff --git a/configuration.c b/configuration.c index a854ecc032..d501b2332f 100644 --- a/configuration.c +++ b/configuration.c @@ -1356,9 +1356,6 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings, #endif SETTING_UINT("bundle_assets_extract_version_current", &settings->uints.bundle_assets_extract_version_current, true, 0, false); SETTING_UINT("bundle_assets_extract_last_version", &settings->uints.bundle_assets_extract_last_version, true, 0, false); -#ifdef HAVE_WASAPI - SETTING_UINT("audio_wasapi_sh_buffer_length", &settings->uints.audio_wasapi_sh_buffer_length, true, wasapi_sh_buffer_length, false); -#endif *size = count; @@ -1374,6 +1371,9 @@ static struct config_int_setting *populate_settings_int(settings_t *settings, in #ifdef HAVE_NETWORKING SETTING_INT("netplay_check_frames", &settings->ints.netplay_check_frames, true, netplay_check_frames, false); #endif +#ifdef HAVE_WASAPI + SETTING_INT("audio_wasapi_sh_buffer_length", &settings->ints.audio_wasapi_sh_buffer_length, true, wasapi_sh_buffer_length, false); +#endif *size = count; diff --git a/configuration.h b/configuration.h index 223cc80685..078ea977b2 100644 --- a/configuration.h +++ b/configuration.h @@ -245,6 +245,10 @@ typedef struct settings int location_update_interval_ms; int location_update_interval_distance; int state_slot; + +#ifdef HAVE_WASAPI + int audio_wasapi_sh_buffer_length; +#endif } ints; struct @@ -311,10 +315,6 @@ typedef struct settings unsigned camera_width; unsigned camera_height; - -#ifdef HAVE_WASAPI - unsigned audio_wasapi_sh_buffer_length; /* in frames (0 disables buffering) */ -#endif } uints; struct diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 6e21a58b72..86af23eb4a 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -2267,7 +2267,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_WASAPI_SH_BUFFER_LENGTH, - "The audio buffer length when using the WASAPI driver in shared mode." + "The intermediate buffer length (in frames) when using the WASAPI driver in shared mode." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_SYNC, diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index c0c4da7595..e77c4c701d 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -5525,7 +5525,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_AUDIO_WASAPI_SH_BUFFER_LENGTH, - PARSE_ONLY_UINT, false); + PARSE_ONLY_INT, false); #endif info->need_refresh = true; diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 38aa55bf6b..8144d7ddcd 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -174,6 +174,24 @@ static void setting_get_string_representation_uint_custom_viewport_height(void * *setting->value.target.unsigned_integer); } +#ifdef HAVE_WASAPI +static void setting_get_string_representation_int_audio_wasapi_sh_buffer_length(void *data, + char *s, size_t len) +{ + rarch_setting_t *setting = (rarch_setting_t*)data; + if (!setting) + return; + + if (*setting->value.target.integer > 0) + snprintf(s, len, "%d", + *setting->value.target.integer); + else if (*setting->value.target.integer == 0) + strlcpy(s, "0 (Off)", len); + else + strlcpy(s, "Auto", len); +} +#endif + static int setting_uint_action_left_custom_viewport_width(void *data, bool wraparound) { video_viewport_t vp; @@ -4011,12 +4029,12 @@ static bool setting_append_list( parent_group, general_write_handler, general_read_handler, - SD_FLAG_ADVANCED + SD_FLAG_NONE ); - CONFIG_UINT( + CONFIG_INT( list, list_info, - &settings->uints.audio_wasapi_sh_buffer_length, + &settings->ints.audio_wasapi_sh_buffer_length, MENU_ENUM_LABEL_AUDIO_WASAPI_SH_BUFFER_LENGTH, MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_SH_BUFFER_LENGTH, wasapi_sh_buffer_length, @@ -4025,8 +4043,10 @@ static bool setting_append_list( parent_group, general_write_handler, general_read_handler); - menu_settings_list_current_add_range(list, list_info, 0, 1024, 16.0, true, true); + menu_settings_list_current_add_range(list, list_info, -16.0f, 0.0f, 16.0f, true, false); settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED); + (*list)[list_info->index - 1].get_string_representation = + &setting_get_string_representation_int_audio_wasapi_sh_buffer_length; } #endif