aboutsummaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2021-04-26 20:10:21 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2021-04-26 20:10:21 +0000
commita4d2cd0cd112fd21bf757b2d6021cc19c739e780 (patch)
tree6bf14e1aefe069226a7b38e9043c3e28d12f1ade /src/plugins
parent6055e4c2f8c3055ac90f20e2214b5923cd606d72 (diff)
downloadqmmp-a4d2cd0cd112fd21bf757b2d6021cc19c739e780.tar.gz
qmmp-a4d2cd0cd112fd21bf757b2d6021cc19c739e780.tar.bz2
qmmp-a4d2cd0cd112fd21bf757b2d6021cc19c739e780.zip
pipewire: fixed crash
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@9840 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/Output/pipewire/outputpipewire.cpp90
1 files changed, 76 insertions, 14 deletions
diff --git a/src/plugins/Output/pipewire/outputpipewire.cpp b/src/plugins/Output/pipewire/outputpipewire.cpp
index b11842294..e4a043490 100644
--- a/src/plugins/Output/pipewire/outputpipewire.cpp
+++ b/src/plugins/Output/pipewire/outputpipewire.cpp
@@ -46,14 +46,36 @@ OutputPipeWire::OutputPipeWire(): Output()
OutputPipeWire::~OutputPipeWire()
{
uninitialize();
+ pw_deinit();
}
void OutputPipeWire::onStateChanged (void *data, enum pw_stream_state old,
enum pw_stream_state state, const char *error)
{
- qDebug() << Q_FUNC_INFO << state << error;
OutputPipeWire *o = static_cast<OutputPipeWire *>(data);
- pw_thread_loop_signal(o->m_loop, false);
+
+ if (o->m_ignoreStateChange)
+ return;
+
+ switch (state)
+ {
+ case PW_STREAM_STATE_UNCONNECTED:
+ pw_thread_loop_signal(o->m_loop, false);
+ break;
+ case PW_STREAM_STATE_PAUSED:
+ o->m_streamPaused = true;
+ qDebug("paused");
+ pw_thread_loop_signal(o->m_loop, false);
+ break;
+ case PW_STREAM_STATE_STREAMING:
+ o->m_streamPaused = false;
+ pw_thread_loop_signal(o->m_loop, false);
+ break;
+ default:
+ break;
+ }
+
+ //pw_thread_loop_signal(o->m_loop, false);
}
bool OutputPipeWire::initialize(quint32 freq, ChannelMap map, Qmmp::AudioFormat format)
@@ -137,7 +159,6 @@ bool OutputPipeWire::initialize(quint32 freq, ChannelMap map, Qmmp::AudioFormat
pw_thread_loop_lock(m_loop);
- m_stream = pw_stream_new(m_core, "Playback", props);
if (!(m_stream = pw_stream_new(m_core, "Playback", props)))
{
qWarning("OutputPipeWire: unable to create stream");
@@ -249,26 +270,37 @@ qint64 OutputPipeWire::writeAudio(unsigned char *data, qint64 maxSize)
void OutputPipeWire::drain()
{
- //pa_operation *op = pa_stream_drain(m_stream, OutputPipeWire::stream_success_cb, nullptr);
- //process(op);
+ pw_thread_loop_lock(m_loop);
+ if(m_buffer_at > 0)
+ pw_thread_loop_timed_wait(m_loop, 1);
+ pw_thread_loop_unlock(m_loop);
+ pw_stream_flush(m_stream, true);
}
void OutputPipeWire::reset()
{
- //pa_operation *op = pa_stream_flush(m_stream, OutputPipeWire::stream_success_cb, nullptr);
- //process(op);
+ pw_thread_loop_lock(m_loop);
+ m_buffer_at = 0;
+ pw_thread_loop_unlock(m_loop);
+ pw_stream_flush(m_stream, false);
}
void OutputPipeWire::suspend()
{
//pa_operation *op = pa_stream_cork(m_stream, 1, OutputPipeWire::stream_success_cb, nullptr);
//process(op);
+ pw_thread_loop_lock(m_loop);
+ pw_stream_set_active(m_stream, false);
+ pw_thread_loop_unlock(m_loop);
}
void OutputPipeWire::resume()
{
//pa_operation *op = pa_stream_cork(m_stream, 0, OutputPipeWire::stream_success_cb, nullptr);
//process(op);
+ pw_thread_loop_lock(m_loop);
+ pw_stream_set_active(m_stream, true);
+ pw_thread_loop_unlock(m_loop);
}
void OutputPipeWire::setMuted(bool mute)
@@ -280,21 +312,51 @@ void OutputPipeWire::setMuted(bool mute)
void OutputPipeWire::uninitialize()
{
- if(m_loop)
+ if(m_stream)
{
+
+ pw_thread_loop_lock(m_loop);
+ m_ignoreStateChange = true;
+ pw_stream_disconnect(m_stream);
+ pw_stream_destroy(m_stream);
+ m_ignoreStateChange = false;
+ m_stream = nullptr;
+ pw_thread_loop_unlock(m_loop);
+
+ }
+
+ if(m_loop)
pw_thread_loop_stop(m_loop);
+
+ if(m_registry)
+ {
+ pw_proxy_destroy(reinterpret_cast<pw_proxy *>(m_registry));
+ m_registry = nullptr;
+ }
+
+ if(m_core)
+ {
+ pw_core_disconnect(m_core);
+ m_core = nullptr;
+ }
+
+ if(m_context)
+ {
+ pw_context_destroy(m_context);
+ m_context = nullptr;
+ }
+
+ if(m_loop)
+ {
pw_thread_loop_destroy(m_loop);
m_loop = nullptr;
}
- if(m_stream)
+ if(m_buffer)
{
- pw_stream_disconnect(m_stream);
- pw_stream_destroy(m_stream);
- m_stream = nullptr;
+ delete [] m_buffer;
+ m_buffer = nullptr;
}
-
- pw_deinit();
}
//callbacks