aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2018-11-10 18:39:14 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2018-11-10 18:39:14 +0000
commit79a63cde40917504e55375309fb5d03cd7483e3a (patch)
treec49f1fd948adc9a74210e415ab3c590a22598ae0
parent6830ae3f8d49e2e5efc575beba46e43f07e92f0f (diff)
downloadqmmp-79a63cde40917504e55375309fb5d03cd7483e3a.tar.gz
qmmp-79a63cde40917504e55375309fb5d03cd7483e3a.tar.bz2
qmmp-79a63cde40917504e55375309fb5d03cd7483e3a.zip
pulseaudio: optimization
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@8416 90c681e8-e032-0410-971d-27865f9a5e38
-rw-r--r--src/plugins/Output/pulseaudio/outputpulseaudio.cpp69
-rw-r--r--src/plugins/Output/pulseaudio/outputpulseaudio.h11
2 files changed, 37 insertions, 43 deletions
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;