diff --git a/audio/audio_defines.h b/audio/audio_defines.h index ca2a8e162a..d68a6beee9 100644 --- a/audio/audio_defines.h +++ b/audio/audio_defines.h @@ -21,8 +21,6 @@ RETRO_BEGIN_DECLS -#define AUDIO_CHUNK_SIZE_BLOCKING 512 - /* So we don't get complete line-noise when fast-forwarding audio. */ #define AUDIO_CHUNK_SIZE_NONBLOCKING 2048 @@ -33,11 +31,7 @@ RETRO_BEGIN_DECLS #define AUDIO_MIXER_MAX_SYSTEM_STREAMS (AUDIO_MIXER_MAX_STREAMS + 8) -/* Fastforward timing calculations running average samples. Helps with a -consistent pitch when fast-forwarding. */ -#define AUDIO_FF_EXP_AVG_SAMPLES 16 - -/* do not define more than (MAX_SYSTEM_STREAMS - MAX_STREAMS) */ +/* Do not define more than (MAX_SYSTEM_STREAMS - MAX_STREAMS) */ enum audio_mixer_system_slot { AUDIO_MIXER_SYSTEM_SLOT_OK = AUDIO_MIXER_MAX_STREAMS, diff --git a/audio/audio_driver.c b/audio/audio_driver.c index 88048cc0f9..073283266c 100644 --- a/audio/audio_driver.c +++ b/audio/audio_driver.c @@ -59,6 +59,12 @@ #include "../tasks/task_content.h" #include "../verbosity.h" +#define AUDIO_CHUNK_SIZE_BLOCKING 512 + +/* Fastforward timing calculations running average samples. Helps with + * a consistent pitch when fast-forwarding. */ +#define AUDIO_FF_EXP_AVG_SAMPLES 16 + #define MENU_SOUND_FORMATS "ogg|mod|xm|s3m|mp3|flac|wav" /* Converts decibels to voltage gain. returns voltage gain value. */ @@ -199,20 +205,13 @@ const char *config_get_audio_driver_options(void) return char_list_new_special(STRING_LIST_AUDIO_DRIVERS, NULL); } -unsigned audio_driver_get_sample_size(void) -{ - audio_driver_state_t *audio_st = &audio_driver_st; - return (audio_st->flags & AUDIO_FLAG_USE_FLOAT) ? sizeof(float) : sizeof(int16_t); -} - #ifdef HAVE_TRANSLATE /* TODO/FIXME - Doesn't currently work. Fix this. */ bool audio_driver_is_ai_service_speech_running(void) { #ifdef HAVE_AUDIOMIXER enum audio_mixer_state res = audio_driver_mixer_get_stream_state(10); - bool ret = (res == AUDIO_STREAM_STATE_NONE) || (res == AUDIO_STREAM_STATE_STOPPED); - if (!ret) + if (!((res == AUDIO_STREAM_STATE_NONE) || (res == AUDIO_STREAM_STATE_STOPPED))) return true; #endif return false; @@ -235,7 +234,7 @@ static bool audio_driver_free_devices_list(void) } #ifdef DEBUG -static void report_audio_buffer_statistics(void) +static void audio_driver_report_audio_buffer_statistics(void) { audio_statistics_t audio_stats; audio_stats.samples = 0; @@ -269,7 +268,6 @@ static void audio_driver_deinit_resampler(void) audio_st->resampler_quality = RESAMPLER_QUALITY_DONTCARE; } - static bool audio_driver_deinit_internal(bool audio_enable) { audio_driver_state_t *audio_st = &audio_driver_st; @@ -314,7 +312,7 @@ static bool audio_driver_deinit_internal(bool audio_enable) audio_driver_dsp_filter_free(); #endif #ifdef DEBUG - report_audio_buffer_statistics(); + audio_driver_report_audio_buffer_statistics(); #endif return true; @@ -392,8 +390,7 @@ bool audio_driver_find_driver(const char *audio_drv, * @param is_slowmotion True if the core is currently running in slow motion. * @param is_fastmotion True if the core is currently running in fast-forward. **/ -static void audio_driver_flush( - audio_driver_state_t *audio_st, +static void audio_driver_flush(audio_driver_state_t *audio_st, float slowmotion_ratio, const int16_t *data, size_t samples, bool is_slowmotion, bool is_fastforward) @@ -410,41 +407,46 @@ static void audio_driver_flush( convert_s16_to_float(audio_st->input_data, data, samples, audio_volume_gain); - /* The resampler operates on floating-point frames, - * so we gotta convert the input first */ + /* The resampler operates on floating-point frames, + * so we have to convert the input first */ src_data.data_in = audio_st->input_data; src_data.input_frames = samples >> 1; + /* Remember, we allocated buffers that are twice as big as needed. * (see audio_driver_init) */ #ifdef HAVE_DSP_FILTER + /* If we want to process our audio for reasons besides resampling... */ if (audio_st->dsp) - { /* If we want to process our audio for reasons besides resampling... */ + { struct retro_dsp_data dsp_data; dsp_data.input = audio_st->input_data; dsp_data.input_frames = (unsigned)(samples >> 1); dsp_data.output = NULL; dsp_data.output_frames = 0; + /* Initialize the DSP input/output. - * Our DSP implementations generally operate directly on the input buffer, - * so the output/output_frames attributes here are zero; - * the DSP filter will set them to useful values, - * most likely to be the same as the inputs. */ + * Our DSP implementations generally operate directly on the + * input buffer, so the output/output_frames attributes here are zero; + * the DSP filter will set them to useful values, most likely to be + * the same as the inputs. */ retro_dsp_filter_process(audio_st->dsp, &dsp_data); + /* If the DSP filter succeeded... */ if (dsp_data.output) - { /* If the DSP filter succeeded... */ + { + /* Then let's pass the DSP's output to the resampler's input */ src_data.data_in = dsp_data.output; src_data.input_frames = dsp_data.output_frames; - /* Then let's pass the DSP's output to the resampler's input */ } } #endif src_data.data_out = audio_st->output_samples_buf; + /* Now the resampler will write to the driver state's scratch buffer */ /* Count samples. */ @@ -462,10 +464,8 @@ static void audio_driver_flush( double direction = (double)delta_mid / half_size; double adjust = 1.0 + audio_st->rate_control_delta * direction; - audio_st->free_samples_buf[write_idx] - = avail; - audio_st->source_ratio_current - = audio_st->source_ratio_original * adjust; + audio_st->free_samples_buf[write_idx] = avail; + audio_st->src_ratio_curr = audio_st->src_ratio_orig * adjust; #if 0 if (verbosity_is_enabled()) @@ -474,14 +474,14 @@ static void audio_driver_flush( (unsigned)(100 - (avail * 100) / audio_st->buffer_size)); RARCH_LOG_OUTPUT("[Audio]: New rate: %lf, Orig rate: %lf\n", - audio_st->source_ratio_current, - audio_st->source_ratio_original); + audio_st->src_ratio_curr, + audio_st->src_ratio_orig); } #endif } } - src_data.ratio = audio_st->source_ratio_current; + src_data.ratio = audio_st->src_ratio_curr; if (is_slowmotion) src_data.ratio *= slowmotion_ratio; @@ -520,8 +520,7 @@ static void audio_driver_flush( audio_st->last_flush_time = flush_time; } - audio_st->resampler->process( - audio_st->resampler_data, &src_data); + audio_st->resampler->process(audio_st->resampler_data, &src_data); #ifdef HAVE_AUDIOMIXER if (audio_st->flags & AUDIO_FLAG_MIXER_ACTIVE) @@ -722,8 +721,8 @@ bool audio_driver_init_internal(void *settings_data, bool audio_cb_inited) audio_driver_st.input = settings->uints.audio_output_sample_rate; } - audio_driver_st.source_ratio_original = - audio_driver_st.source_ratio_current = + audio_driver_st.src_ratio_orig = + audio_driver_st.src_ratio_curr = (double)settings->uints.audio_output_sample_rate / audio_driver_st.input; if (!string_is_empty(settings->arrays.audio_resampler)) @@ -740,7 +739,7 @@ bool audio_driver_init_internal(void *settings_data, bool audio_cb_inited) &audio_driver_st.resampler, audio_driver_st.resampler_ident, audio_driver_st.resampler_quality, - audio_driver_st.source_ratio_original)) + audio_driver_st.src_ratio_orig)) { RARCH_ERR("Failed to initialize resampler \"%s\".\n", audio_driver_st.resampler_ident); diff --git a/audio/audio_driver.h b/audio/audio_driver.h index 676744798a..cd0ca5606d 100644 --- a/audio/audio_driver.h +++ b/audio/audio_driver.h @@ -169,8 +169,8 @@ typedef struct audio_driver typedef struct { - double source_ratio_original; - double source_ratio_current; + double src_ratio_orig; + double src_ratio_curr; uint64_t free_samples_count; @@ -320,17 +320,6 @@ bool audio_driver_start(bool is_shutdown); bool audio_driver_stop(void); -/** - * If you need to query the size of audio samples, - * use this function instead of checking the flags directly. - * - * @return The size of a single audio sample in bytes, - * as determined by the presence of the \c AUDIO_FLAG_USE_FLOAT flag. - * Will currently return either 2 (for \c uint16_t) or 4 (for \c float), - * although this may change if we add support for more sample types. - */ -unsigned audio_driver_get_sample_size(void); - #ifdef HAVE_TRANSLATE /* TODO/FIXME - Doesn't currently work. Fix this. */ bool audio_driver_is_ai_service_speech_running(void); @@ -344,9 +333,7 @@ bool audio_driver_is_ai_service_speech_running(void); **/ bool audio_compute_buffer_statistics(audio_statistics_t *stats); -bool audio_driver_init_internal( - void *settings_data, - bool audio_cb_inited); +bool audio_driver_init_internal(void *data, bool audio_cb_inited); bool audio_driver_deinit(void); diff --git a/audio/microphone_driver.c b/audio/microphone_driver.c index f3f7dc3d11..75b11efba2 100644 --- a/audio/microphone_driver.c +++ b/audio/microphone_driver.c @@ -79,11 +79,12 @@ bool microphone_driver_start(void) microphone_driver_state_t *mic_st = &mic_driver_st; retro_microphone_t *microphone = &mic_st->microphone; + /* If there's an opened microphone that the core turned on... */ if (microphone->flags & MICROPHONE_FLAG_ACTIVE) - { /* If there's an opened microphone that the core turned on... */ - + { + /* If this microphone was requested before the driver was ready...*/ if (microphone->flags & MICROPHONE_FLAG_PENDING) - { /* If this microphone was requested before the driver was ready...*/ + { retro_assert(microphone->microphone_context == NULL); /* The microphone context shouldn't have been created yet */ @@ -102,8 +103,9 @@ bool microphone_driver_start(void) * what if the player just unplugged their mic? */ } } + /* The microphone was already created, so let's just unpause it */ else - { /* The mic was already created, so let's just unpause it */ + { microphone_driver_set_mic_state(microphone, true); RARCH_DBG("[Microphone]: Started a microphone that was enabled when the driver was last stopped.\n"); @@ -117,18 +119,16 @@ bool microphone_driver_stop(void) { microphone_driver_state_t *mic_st = &mic_driver_st; retro_microphone_t *microphone = &mic_st->microphone; - bool result = true; - if ((microphone->flags & MICROPHONE_FLAG_ACTIVE) - && (microphone->flags & MICROPHONE_FLAG_ENABLED) + /* If there's an opened microphone that the core + * turned on and received... */ + if ( (microphone->flags & MICROPHONE_FLAG_ACTIVE) + && (microphone->flags & MICROPHONE_FLAG_ENABLED) && !(microphone->flags & MICROPHONE_FLAG_PENDING)) - { /* If there's an opened microphone that the core turned on and received... */ - - result = mic_st->driver->stop_mic(mic_st->driver_context, microphone->microphone_context); - } + return mic_st->driver->stop_mic(mic_st->driver_context, + microphone->microphone_context); /* If the mic is pending, then we don't need to do anything. */ - - return result; + return true; } /** @@ -388,14 +388,14 @@ static bool mic_driver_open_mic_internal(retro_microphone_t* microphone) && mic_driver->mic_use_float(mic_st->driver_context, microphone->microphone_context)) microphone->flags |= MICROPHONE_FLAG_USE_FLOAT; - microphone->original_ratio = (double)microphone->effective_params.rate / microphone->actual_params.rate; + microphone->orig_ratio = (double)microphone->effective_params.rate / microphone->actual_params.rate; if (!retro_resampler_realloc( µphone->resampler_data, µphone->resampler, mic_st->resampler_ident, mic_st->resampler_quality, - microphone->original_ratio)) + microphone->orig_ratio)) { RARCH_ERR("[Microphone]: Failed to initialize resampler \"%s\".\n", mic_st->resampler_ident); goto error; diff --git a/audio/microphone_driver.h b/audio/microphone_driver.h index 3997911b1e..0104932565 100644 --- a/audio/microphone_driver.h +++ b/audio/microphone_driver.h @@ -190,7 +190,7 @@ struct retro_microphone * The ratio of the core-requested sample rate to the device's opened sample rate. * If this is (almost) equal to 1, then resampling will be skipped. */ - double original_ratio; + double orig_ratio; }; /** diff --git a/retroarch.c b/retroarch.c index 3aace49722..45fa014cb1 100644 --- a/retroarch.c +++ b/retroarch.c @@ -2,7 +2,7 @@ * Copyright (C) 2010-2014 - Hans-Kristian Arntzen * Copyright (C) 2011-2021 - Daniel De Matteis * Copyright (C) 2012-2015 - Michael Lelli - * Copyright (C) 2014-2017 - Jean-Andr� Santoni + * Copyright (C) 2014-2017 - Jean-Andr Santoni * Copyright (C) 2016-2019 - Brad Parker * * RetroArch is free software: you can redistribute it and/or modify it under the terms @@ -1979,8 +1979,8 @@ bool driver_ctl(enum driver_ctl_state state, void *data) video_monitor_set_refresh_rate(*hz); /* Sets audio monitor rate to new value. */ - audio_st->source_ratio_original = - audio_st->source_ratio_current = + audio_st->src_ratio_orig = + audio_st->src_ratio_curr = (double)audio_output_sample_rate / audio_st->input; driver_adjust_system_rates(runloop_st, video_st, settings);