diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2021-04-26 20:10:21 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2021-04-26 20:10:21 +0000 |
| commit | a4d2cd0cd112fd21bf757b2d6021cc19c739e780 (patch) | |
| tree | 6bf14e1aefe069226a7b38e9043c3e28d12f1ade /src/plugins | |
| parent | 6055e4c2f8c3055ac90f20e2214b5923cd606d72 (diff) | |
| download | qmmp-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.cpp | 90 |
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 |
