Merge pull request #6444 from Dwedit/original_suggestion

Functions to suspend and resume audio and video, and environment function for core to query status of enabled/disabled audio and video
This commit is contained in:
Twinaphex 2018-03-24 09:54:47 +01:00 committed by GitHub
commit 473d978d78
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 78 additions and 2 deletions

View File

@ -183,6 +183,8 @@ static void *audio_driver_resampler_data = NULL;
static const audio_driver_t *current_audio = NULL;
static void *audio_driver_context_audio_data = NULL;
static bool audio_suspended = false;
enum resampler_quality audio_driver_get_resampler_quality(void)
{
settings_t *settings = config_get_ptr();
@ -581,8 +583,8 @@ static void audio_driver_flush(const int16_t *data, size_t samples)
runloop_get_status(&is_paused, &is_idle, &is_slowmotion,
&is_perfcnt_enable);
if ( is_paused ||
!audio_driver_active ||
if ( is_paused ||
!audio_driver_active ||
!audio_driver_input_data ||
!audio_driver_output_samples_buf)
return;
@ -696,6 +698,9 @@ static void audio_driver_flush(const int16_t *data, size_t samples)
**/
void audio_driver_sample(int16_t left, int16_t right)
{
if (audio_suspended)
return;
audio_driver_output_samples_conv_buf[audio_driver_data_ptr++] = left;
audio_driver_output_samples_conv_buf[audio_driver_data_ptr++] = right;
@ -723,6 +728,9 @@ size_t audio_driver_sample_batch(const int16_t *data, size_t frames)
if (frames > (AUDIO_CHUNK_SIZE_NONBLOCKING >> 1))
frames = AUDIO_CHUNK_SIZE_NONBLOCKING >> 1;
if (audio_suspended)
return frames;
audio_driver_flush(data, frames << 1);
return frames;
@ -1286,11 +1294,31 @@ bool audio_driver_owns_driver(void)
return audio_driver_data_own;
}
void audio_driver_suspend(void)
{
audio_suspended = true;
}
bool audio_driver_is_suspended(void)
{
return audio_suspended;
}
void audio_driver_resume(void)
{
audio_suspended = false;
}
void audio_driver_set_active(void)
{
audio_driver_active = true;
}
bool audio_driver_is_active(void)
{
return audio_driver_active;
}
void audio_driver_destroy(void)
{
audio_driver_active = false;

View File

@ -152,8 +152,16 @@ void audio_driver_set_own_driver(void);
void audio_driver_unset_own_driver(void);
void audio_driver_suspend(void);
bool audio_driver_is_suspended(void);
void audio_driver_resume(void);
void audio_driver_set_active(void);
bool audio_driver_is_active(void);
void audio_driver_destroy(void);
void audio_driver_deinit_resampler(void);

View File

@ -1692,6 +1692,25 @@ bool rarch_environment_cb(unsigned cmd, void *data)
ledintf->set_led_state = led_driver_set_led;
}
break;
case RETRO_ENVIRONMENT_GET_AUDIO_VIDEO_ENABLE:
{
int result = 0;
if (!audio_driver_is_suspended() && audio_driver_is_active())
{
result |= 2;
}
if (video_driver_is_active() && !video_driver_is_stub_frame())
{
result |= 1;
}
if (data != NULL)
{
int* result_p = (int*)data;
*result_p = result;
}
}
break;
default:
RARCH_LOG("Environ UNSUPPORTED (#%u).\n", cmd);

View File

@ -1589,6 +1589,11 @@ void video_driver_unset_stub_frame(void)
frame_bak = NULL;
}
bool video_driver_is_stub_frame(void)
{
return current_video->frame == video_null.frame;
}
bool video_driver_supports_recording(void)
{
settings_t *settings = config_get_ptr();
@ -2150,6 +2155,11 @@ void video_driver_set_active(void)
video_driver_active = true;
}
void video_driver_unset_active(void)
{
video_driver_active = false;
}
bool video_driver_is_active(void)
{
return video_driver_active;

View File

@ -931,6 +931,7 @@ void video_driver_destroy(void);
void video_driver_set_cached_frame_ptr(const void *data);
void video_driver_set_stub_frame(void);
void video_driver_unset_stub_frame(void);
bool video_driver_is_stub_frame(void);
bool video_driver_supports_recording(void);
bool video_driver_supports_viewport_read(void);
bool video_driver_supports_read_frame_raw(void);
@ -975,6 +976,7 @@ bool video_driver_is_video_cache_context(void);
void video_driver_set_video_cache_context_ack(void);
bool video_driver_is_video_cache_context_ack(void);
void video_driver_set_active(void);
void video_driver_unset_active(void);
bool video_driver_is_active(void);
bool video_driver_gpu_record_init(unsigned size);
void video_driver_gpu_record_deinit(void);

View File

@ -1113,6 +1113,15 @@ struct retro_led_interface
retro_set_led_state_t set_led_state;
};
#define RETRO_ENVIRONMENT_GET_AUDIO_VIDEO_ENABLE (47 | RETRO_ENVIRONMENT_EXPERIMENTAL)
/* int * --
* Queries the frontend if audio and video are enabled or not.
* If not enabled, the frontend will discard the audio or video,
* so the core may decide to skip producing audio or video.
* Bit 0 (value 1) is set if Video is enabled,
* Bit 1 (value 2) is set if Audio is enabled.
* Other bits are reserved for future use.
*/
#define RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE (41 | RETRO_ENVIRONMENT_EXPERIMENTAL)
/* const struct retro_hw_render_interface ** --