mirror of
https://github.com/mackron/miniaudio.git
synced 2026-04-23 00:34:03 +02:00
PulseAudio: Experimental work on improving the stop callback.
Public issue https://github.com/mackron/miniaudio/issues/341
This commit is contained in:
+47
@@ -3862,6 +3862,8 @@ struct ma_context
|
||||
ma_proc pa_stream_get_device_name;
|
||||
ma_proc pa_stream_set_write_callback;
|
||||
ma_proc pa_stream_set_read_callback;
|
||||
ma_proc pa_stream_set_suspended_callback;
|
||||
ma_proc pa_stream_is_suspended;
|
||||
ma_proc pa_stream_flush;
|
||||
ma_proc pa_stream_drain;
|
||||
ma_proc pa_stream_is_corked;
|
||||
@@ -21737,6 +21739,7 @@ to check for type safety. We cannot do this when linking at run time because the
|
||||
#define MA_PA_ERR_ACCESS PA_ERR_ACCESS
|
||||
#define MA_PA_ERR_INVALID PA_ERR_INVALID
|
||||
#define MA_PA_ERR_NOENTITY PA_ERR_NOENTITY
|
||||
#define MA_PA_ERR_NOTSUPPORTED PA_ERR_NOTSUPPORTED
|
||||
|
||||
#define MA_PA_CHANNELS_MAX PA_CHANNELS_MAX
|
||||
#define MA_PA_RATE_MAX PA_RATE_MAX
|
||||
@@ -21932,12 +21935,14 @@ typedef pa_sink_info_cb_t ma_pa_sink_info_cb_t;
|
||||
typedef pa_source_info_cb_t ma_pa_source_info_cb_t;
|
||||
typedef pa_stream_success_cb_t ma_pa_stream_success_cb_t;
|
||||
typedef pa_stream_request_cb_t ma_pa_stream_request_cb_t;
|
||||
typedef pa_stream_notify_cb_t ma_pa_stream_notify_cb_t;
|
||||
typedef pa_free_cb_t ma_pa_free_cb_t;
|
||||
#else
|
||||
#define MA_PA_OK 0
|
||||
#define MA_PA_ERR_ACCESS 1
|
||||
#define MA_PA_ERR_INVALID 2
|
||||
#define MA_PA_ERR_NOENTITY 5
|
||||
#define MA_PA_ERR_NOTSUPPORTED 19
|
||||
|
||||
#define MA_PA_CHANNELS_MAX 32
|
||||
#define MA_PA_RATE_MAX 384000
|
||||
@@ -22211,6 +22216,7 @@ typedef void (* ma_pa_sink_info_cb_t) (ma_pa_context* c, const ma_pa_sink_in
|
||||
typedef void (* ma_pa_source_info_cb_t) (ma_pa_context* c, const ma_pa_source_info* i, int eol, void* userdata);
|
||||
typedef void (* ma_pa_stream_success_cb_t)(ma_pa_stream* s, int success, void* userdata);
|
||||
typedef void (* ma_pa_stream_request_cb_t)(ma_pa_stream* s, size_t nbytes, void* userdata);
|
||||
typedef void (* ma_pa_stream_notify_cb_t) (ma_pa_stream* s, void* userdata);
|
||||
typedef void (* ma_pa_free_cb_t) (void* p);
|
||||
#endif
|
||||
|
||||
@@ -22262,6 +22268,8 @@ typedef ma_pa_operation* (* ma_pa_stream_set_buffer_attr_proc) (
|
||||
typedef const char* (* ma_pa_stream_get_device_name_proc) (ma_pa_stream* s);
|
||||
typedef void (* ma_pa_stream_set_write_callback_proc) (ma_pa_stream* s, ma_pa_stream_request_cb_t cb, void* userdata);
|
||||
typedef void (* ma_pa_stream_set_read_callback_proc) (ma_pa_stream* s, ma_pa_stream_request_cb_t cb, void* userdata);
|
||||
typedef void (* ma_pa_stream_set_suspended_callback_proc) (ma_pa_stream* s, ma_pa_stream_notify_cb_t cb, void* userdata);
|
||||
typedef int (* ma_pa_stream_is_suspended_proc) (const ma_pa_stream* s);
|
||||
typedef ma_pa_operation* (* ma_pa_stream_flush_proc) (ma_pa_stream* s, ma_pa_stream_success_cb_t cb, void* userdata);
|
||||
typedef ma_pa_operation* (* ma_pa_stream_drain_proc) (ma_pa_stream* s, ma_pa_stream_success_cb_t cb, void* userdata);
|
||||
typedef int (* ma_pa_stream_is_corked_proc) (ma_pa_stream* s);
|
||||
@@ -23134,6 +23142,36 @@ static void ma_device_on_write__pulse(ma_pa_stream* pStream, size_t byteCount, v
|
||||
}
|
||||
}
|
||||
|
||||
static void ma_device_on_suspended__pulse(ma_pa_stream* pStream, void* pUserData)
|
||||
{
|
||||
ma_device* pDevice = (ma_device*)pUserData;
|
||||
int suspended;
|
||||
|
||||
(void)pStream;
|
||||
|
||||
suspended = ((ma_pa_stream_is_suspended_proc)pDevice->pContext->pulse.pa_stream_is_suspended)(pStream);
|
||||
ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[Pulse] Device suspended state changed. pa_stream_is_suspended() returned %d.\n", suspended);
|
||||
|
||||
if (suspended < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (suspended == 1) {
|
||||
ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[Pulse] Device suspended state changed. Suspended.\n");
|
||||
|
||||
/* Locking this behind MA_DEBUG_OUTPUT for the moment while this is still in an experimental state. */
|
||||
#if defined(MA_DEBUG_OUTPUT)
|
||||
{
|
||||
if (pDevice->onStop) {
|
||||
pDevice->onStop(pDevice);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[Pulse] Device suspended state changed. Resumed.\n");
|
||||
}
|
||||
}
|
||||
|
||||
static ma_result ma_device_init__pulse(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture)
|
||||
{
|
||||
/*
|
||||
@@ -23353,6 +23391,9 @@ static ma_result ma_device_init__pulse(ma_device* pDevice, const ma_device_confi
|
||||
*/
|
||||
((ma_pa_stream_set_write_callback_proc)pDevice->pContext->pulse.pa_stream_set_write_callback)((ma_pa_stream*)pDevice->pulse.pStreamPlayback, ma_device_on_write__pulse, pDevice);
|
||||
|
||||
/* State callback for checking when the device has been corked. */
|
||||
((ma_pa_stream_set_suspended_callback_proc)pDevice->pContext->pulse.pa_stream_set_suspended_callback)((ma_pa_stream*)pDevice->pulse.pStreamPlayback, ma_device_on_suspended__pulse, pDevice);
|
||||
|
||||
|
||||
/* Connect after we've got all of our internal state set up. */
|
||||
streamFlags = MA_PA_STREAM_START_CORKED | MA_PA_STREAM_ADJUST_LATENCY | MA_PA_STREAM_FIX_FORMAT | MA_PA_STREAM_FIX_RATE | MA_PA_STREAM_FIX_CHANNELS;
|
||||
@@ -23673,6 +23714,8 @@ static ma_result ma_context_init__pulse(ma_context* pContext, const ma_context_c
|
||||
pContext->pulse.pa_stream_get_device_name = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_get_device_name");
|
||||
pContext->pulse.pa_stream_set_write_callback = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_set_write_callback");
|
||||
pContext->pulse.pa_stream_set_read_callback = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_set_read_callback");
|
||||
pContext->pulse.pa_stream_set_suspended_callback = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_set_suspended_callback");
|
||||
pContext->pulse.pa_stream_is_suspended = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_is_suspended");
|
||||
pContext->pulse.pa_stream_flush = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_flush");
|
||||
pContext->pulse.pa_stream_drain = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_drain");
|
||||
pContext->pulse.pa_stream_is_corked = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_is_corked");
|
||||
@@ -23733,6 +23776,8 @@ static ma_result ma_context_init__pulse(ma_context* pContext, const ma_context_c
|
||||
ma_pa_stream_get_device_name_proc _pa_stream_get_device_name = pa_stream_get_device_name;
|
||||
ma_pa_stream_set_write_callback_proc _pa_stream_set_write_callback = pa_stream_set_write_callback;
|
||||
ma_pa_stream_set_read_callback_proc _pa_stream_set_read_callback = pa_stream_set_read_callback;
|
||||
ma_pa_stream_set_suspended_callback_proc _pa_stream_set_suspended_callback = pa_stream_set_suspended_callback;
|
||||
ma_pa_stream_is_suspended_proc _pa_stream_is_suspended = pa_stream_is_suspended;
|
||||
ma_pa_stream_flush_proc _pa_stream_flush = pa_stream_flush;
|
||||
ma_pa_stream_drain_proc _pa_stream_drain = pa_stream_drain;
|
||||
ma_pa_stream_is_corked_proc _pa_stream_is_corked = pa_stream_is_corked;
|
||||
@@ -23792,6 +23837,8 @@ static ma_result ma_context_init__pulse(ma_context* pContext, const ma_context_c
|
||||
pContext->pulse.pa_stream_get_device_name = (ma_proc)_pa_stream_get_device_name;
|
||||
pContext->pulse.pa_stream_set_write_callback = (ma_proc)_pa_stream_set_write_callback;
|
||||
pContext->pulse.pa_stream_set_read_callback = (ma_proc)_pa_stream_set_read_callback;
|
||||
pContext->pulse.pa_stream_set_suspended_callback = (ma_proc)_pa_stream_set_suspended_callback;
|
||||
pContext->pulse.pa_stream_is_suspended = (ma_proc)_pa_stream_is_suspended;
|
||||
pContext->pulse.pa_stream_flush = (ma_proc)_pa_stream_flush;
|
||||
pContext->pulse.pa_stream_drain = (ma_proc)_pa_stream_drain;
|
||||
pContext->pulse.pa_stream_is_corked = (ma_proc)_pa_stream_is_corked;
|
||||
|
||||
Reference in New Issue
Block a user