From 79a63cde40917504e55375309fb5d03cd7483e3a Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Sat, 10 Nov 2018 18:39:14 +0000 Subject: pulseaudio: optimization git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@8416 90c681e8-e032-0410-971d-27865f9a5e38 --- src/plugins/Output/pulseaudio/outputpulseaudio.cpp | 69 ++++++++++------------ src/plugins/Output/pulseaudio/outputpulseaudio.h | 11 ++-- 2 files changed, 37 insertions(+), 43 deletions(-) (limited to 'src') diff --git a/src/plugins/Output/pulseaudio/outputpulseaudio.cpp b/src/plugins/Output/pulseaudio/outputpulseaudio.cpp index 44bd8ec12..a243ca877 100644 --- a/src/plugins/Output/pulseaudio/outputpulseaudio.cpp +++ b/src/plugins/Output/pulseaudio/outputpulseaudio.cpp @@ -157,40 +157,16 @@ bool OutputPulseAudio::initialize(quint32 freq, ChannelMap map, Qmmp::AudioForma bool success = false; pa_operation *op = pa_context_subscribe(m_ctx, PA_SUBSCRIPTION_MASK_SINK_INPUT, OutputPulseAudio::context_success_cb, &success); - if(!op) - { - qWarning("OutputPulseAudio: pa_context_subscribe failed: %s", pa_strerror(pa_context_errno(m_ctx))); - return false; - } - - pa_operation_state_t op_state; - while((op_state = pa_operation_get_state(op)) != PA_OPERATION_DONE && isReady()) - { - poll(); - } - pa_operation_unref(op); - - if(op_state != PA_OPERATION_DONE || !success) + if(!process(op) || !success) { qWarning("OutputPulseAudio: pa_context_subscribe failed: %s", pa_strerror(pa_context_errno(m_ctx))); return false; } success = false; - if(!(op = pa_context_get_sink_input_info(m_ctx, pa_stream_get_index(m_stream), OutputPulseAudio::info_cb, &success))) + op = pa_context_get_sink_input_info(m_ctx, pa_stream_get_index(m_stream), OutputPulseAudio::info_cb, &success); + if(!process(op) || !success) { - qWarning("OutputPulseAudio: pa_context_get_sink_input_info failed: %s", pa_strerror(pa_context_errno(m_ctx))); - return false; - } - - while((op_state = pa_operation_get_state(op)) != PA_OPERATION_DONE && isReady()) - { - poll(); - } - pa_operation_unref(op); - - if(op_state != PA_OPERATION_DONE || !success) - { - qWarning("OutputPulseAudio: pa_context_get_sink_input_info failed: %s", pa_strerror(pa_context_errno(m_ctx))); + qWarning("OutputPulseAudio:pa_context_get_sink_input_info: %s", pa_strerror(pa_context_errno(m_ctx))); return false; } @@ -226,23 +202,25 @@ qint64 OutputPulseAudio::writeAudio(unsigned char *data, qint64 maxSize) void OutputPulseAudio::drain() { pa_operation *op = pa_stream_drain(m_stream, OutputPulseAudio::stream_success_cb, 0); - - while(pa_operation_get_state(op) != PA_OPERATION_DONE && isReady()) - { - poll(); - } - pa_operation_unref(op); + process(op); } void OutputPulseAudio::reset() { pa_operation *op = pa_stream_flush(m_stream, OutputPulseAudio::stream_success_cb, 0); + process(op); +} - while(pa_operation_get_state(op) != PA_OPERATION_DONE && isReady()) - { - poll(); - } - pa_operation_unref(op); +void OutputPulseAudio::suspend() +{ + pa_operation *op = pa_stream_cork(m_stream, 1, OutputPulseAudio::stream_success_cb, 0); + process(op); +} + +void OutputPulseAudio::resume() +{ + pa_operation *op = pa_stream_cork(m_stream, 0, OutputPulseAudio::stream_success_cb, 0); + process(op); } void OutputPulseAudio::setVolume(const VolumeSettings &v) @@ -289,6 +267,19 @@ void OutputPulseAudio::poll() pa_mainloop_poll(m_loop); pa_mainloop_dispatch(m_loop); } + +bool OutputPulseAudio::process(pa_operation *op) +{ + if(!op) + return false; + + pa_operation_state_t state; + while((state = pa_operation_get_state(op)) != PA_OPERATION_DONE && isReady()) + poll(); + + pa_operation_unref(op); + return (state == PA_OPERATION_DONE) && isReady(); +} //callbacks void OutputPulseAudio::subscribe_cb(pa_context *ctx, pa_subscription_event_type t, uint32_t index, void *data) { diff --git a/src/plugins/Output/pulseaudio/outputpulseaudio.h b/src/plugins/Output/pulseaudio/outputpulseaudio.h index b78b7cde8..ae95da520 100644 --- a/src/plugins/Output/pulseaudio/outputpulseaudio.h +++ b/src/plugins/Output/pulseaudio/outputpulseaudio.h @@ -46,6 +46,8 @@ public: qint64 writeAudio(unsigned char *data, qint64 maxSize); void drain(); void reset(); + void suspend(); + void resume(); void setVolume(const VolumeSettings &v); static OutputPulseAudio *instance; @@ -56,13 +58,14 @@ private: void uninitialize(); bool isReady() const; void poll(); + bool process(pa_operation *op); //callbacks static void subscribe_cb(pa_context *ctx, pa_subscription_event_type t, uint32_t index, void *data); - static void info_cb (pa_context *ctx, const pa_sink_input_info * info, int, void * data); - static void context_success_cb (pa_context *, int success, void *data); - static void stream_success_cb (pa_stream *, int success, void *data); + static void info_cb(pa_context *ctx, const pa_sink_input_info * info, int, void * data); + //converters + static void context_success_cb(pa_context *, int success, void *data); + static void stream_success_cb(pa_stream *, int success, void *data); - //pa_simple *m_connection; pa_mainloop *m_loop; pa_context *m_ctx; pa_stream *m_stream; -- cgit v1.2.3-13-gbd6f