ossia / score

ossia score, an interactive sequencer for the intermedia arts
https://ossia.io
Other
1.45k stars 101 forks source link

Ossia crashes when the pipewire binaries and/or conf files are not installed #1487

Closed pgervais closed 9 months ago

pgervais commented 10 months ago

Reproduction

The crash happens when the pipewire client binaries and conf files are missing. It's the pipewire-bin package on Debian Bookworm (file list). No crash happens when these binaries are present but not the daemons (pipewire, wireplumber).

Release mode:

Debug mode (with or without the vanilla jack daemon running):

In both cases the crash happens in pw_filter_add_port() from /lib/x86_64-linux-gnu/libpipewire-0.3.so. This library is part of the libpipewire-0.3-dev package on Bookworm, which is the only one necessary to compile Ossia Score.

System: Linux Debian Bookworm Ossia compiled from source at abfeb0c3cb556e25c7945362b2da7f0795816e13

Debug information

Output in the console in debug compilation mode:

QVariant::load: unknown user type with name TimeVal.
*** WEAK-JACK: initializing

*** WEAK-JACK: OK.
pd 0.52.2
bonk version 1.5
fiddle version 1.1 TEST4
pd~ version 0.54
pique 0.1 for PD version 23
sigmund~ version 0.07
Warning: Invalid QML element name "Type"; value type names should begin with a lowercase letter (:0)
Warning: Invalid QML element name "Access"; value type names should begin with a lowercase letter (:0)
Warning: Invalid QML element name "Bounding"; value type names should begin with a lowercase letter (:0)
Warning: Invalid QML element name "Repetitions"; value type names should begin with a lowercase letter (:0)
Warning: Invalid QML element name "Duration"; value type names should begin with a lowercase letter (:0)
JACK ERROR: Cannot connect to server socket err = Aucun fichier ou dossier de ce type
JACK ERROR: Cannot connect to server request channel
JACK ERROR: jack server is not running or cannot be started
JACK ERROR: JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
JACK ERROR: JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
JACK ERROR: Cannot connect to server socket err = Aucun fichier ou dossier de ce type
JACK ERROR: Cannot connect to server request channel
JACK ERROR: jack server is not running or cannot be started
JACK ERROR: JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
JACK ERROR: JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
JACK ERROR: Cannot connect to server socket err = Aucun fichier ou dossier de ce type
JACK ERROR: Cannot connect to server request channel
JACK ERROR: jack server is not running or cannot be started
JACK ERROR: JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
JACK ERROR: JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
JACK ERROR: Cannot connect to server socket err = Aucun fichier ou dossier de ce type
JACK ERROR: Cannot connect to server request channel
JACK ERROR: jack server is not running or cannot be started
JACK ERROR: JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
JACK ERROR: JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
[W][07726.290724] pw.conf      | [          conf.c:  939 try_load_conf()] can't load config client.conf: Aucun fichier ou dossier de ce type
[E][07726.290783] pw.conf      | [          conf.c:  963 pw_conf_load_conf_for_context()] can't load default config client.conf: Aucun fichier ou dossier de ce type
Debug: Could not save device (DeviceDocumentPlugin:281)
[W][07726.429893] pw.conf      | [          conf.c:  939 try_load_conf()] can't load config client.conf: Aucun fichier ou dossier de ce type
[E][07726.429931] pw.conf      | [          conf.c:  963 pw_conf_load_conf_for_context()] can't load default config client.conf: Aucun fichier ou dossier de ce type
Erreur de segmentation

Full backtrace, obtained from gdb:

#0  0x00007fffd0763fe8 in pw_filter_add_port () at /lib/x86_64-linux-gnu/libpipewire-0.3.so.0
#1  0x00005555567d89ec in ossia::pipewire_audio_protocol::pipewire_audio_protocol(std::shared_ptr<ossia::pipewire_context>, ossia::audio_setup const&)
    (this=0x55555ba4b9c0, loop=std::shared_ptr<ossia::pipewire_context> (use count 4, weak count 0) = {...}, setup=...)
    at <REDACTED>/prog/ossia-score/3rdparty/libossia/src/ossia/audio/pipewire_protocol.hpp:562
#2  0x0000555556819d62 in std::_Construct<ossia::pipewire_audio_protocol, std::shared_ptr<ossia::pipewire_context>&, ossia::audio_setup&>(ossia::pipewire_audio_protocol*, std::shared_ptr<ossia::pipewire_context>&, ossia::audio_setup&) (__p=0x55555ba4b9c0) at /usr/include/c++/12/bits/stl_construct.h:119
#3  0x00005555568152bb in std::allocator_traits<std::allocator<void> >::construct<ossia::pipewire_audio_protocol, std::shared_ptr<ossia::pipewire_context>&, ossia::audio_setup&>(std::allocator<void>&, ossia::pipewire_audio_protocol*, std::shared_ptr<ossia::pipewire_context>&, ossia::audio_setup&) (__p=0x55555ba4b9c0)
    at /usr/include/c++/12/bits/alloc_traits.h:635
#4  0x000055555680fd76 in std::_Sp_counted_ptr_inplace<ossia::pipewire_audio_protocol, std::allocator<void>, (__gnu_cxx::_Lock_policy)2>::_Sp_counted_ptr_inplace<std::shared_ptr<ossia::pipewire_context>&, ossia::audio_setup&>(std::allocator<void>, std::shared_ptr<ossia::pipewire_context>&, ossia::audio_setup&) (this=0x55555ba4b980, __a=...)
    at /usr/include/c++/12/bits/shared_ptr_base.h:604
#5  0x000055555680862a in std::__shared_count<(__gnu_cxx::_Lock_policy)2>::__shared_count<ossia::pipewire_audio_protocol, std::allocator<void>, std::shared_ptr<ossia::pipewire_context>&, ossia::audio_setup&>(ossia::pipewire_audio_protocol*&, std::_Sp_alloc_shared_tag<std::allocator<void> >, std::shared_ptr<ossia::pipewire_context>&, ossia::audio_setup&) (this=0x7fffffffd518, __p=@0x7fffffffd510: 0x0, __a=...) at /usr/include/c++/12/bits/shared_ptr_base.h:971
#6  0x00005555567ff41e in std::__shared_ptr<ossia::pipewire_audio_protocol, (__gnu_cxx::_Lock_policy)2>::__shared_ptr<std::allocator<void>, std::shared_ptr<ossia::pipewire_context>&, ossia::audio_setup&>(std::_Sp_alloc_shared_tag<std::allocator<void> >, std::shared_ptr<ossia::pipewire_context>&, ossia::audio_setup&)
    (this=0x7fffffffd510, __tag=...) at /usr/include/c++/12/bits/shared_ptr_base.h:1712
#7  0x00005555567f1813 in std::shared_ptr<ossia::pipewire_audio_protocol>::shared_ptr<std::allocator<void>, std::shared_ptr<ossia::pipewire_context>&, ossia::audio_setup&>(std::_Sp_alloc_shared_tag<std::allocator<void> >, std::shared_ptr<ossia::pipewire_context>&, ossia::audio_setup&) (this=0x7fffffffd510, __tag=...)
    at /usr/include/c++/12/bits/shared_ptr.h:464
#8  0x00005555567e5d62 in std::make_shared<ossia::pipewire_audio_protocol, std::shared_ptr<ossia::pipewire_context>&, ossia::audio_setup&>(std::shared_ptr<ossia::pipewire_context>&, ossia::audio_setup&) () at /usr/include/c++/12/bits/shared_ptr.h:1010
#9  0x00005555567bc864 in Audio::PipeWireAudioFactory::make_engine(Audio::Settings::Model const&, score::ApplicationContext const&) (this=0x55555a878600, set=..., ctx=...)
    at <REDACTED>/prog/ossia-score/src/plugins/score-plugin-audio/Audio/PipeWireInterface.cpp:108
#10 0x00005555567bea78 in Audio::ApplicationPlugin::start_engine() (this=0x55555a928550)
    at <REDACTED>/prog/ossia-score/src/plugins/score-plugin-audio/Audio/AudioApplicationPlugin.cpp:222
#11 0x00005555567be59c in Audio::ApplicationPlugin::restart_engine() (this=0x55555a928550)
    at <REDACTED>/prog/ossia-score/src/plugins/score-plugin-audio/Audio/AudioApplicationPlugin.cpp:160
#12 0x00005555567bdc28 in Audio::ApplicationPlugin::on_documentChanged(score::Document*, score::Document*) (this=0x55555a928550, olddoc=0x0, newdoc=0x55555b880eb0)
    at <REDACTED>/prog/ossia-score/src/plugins/score-plugin-audio/Audio/AudioApplicationPlugin.cpp:58
#13 0x0000555555c6e9b7 in score::DocumentManager::setCurrentDocument(score::GUIApplicationContext const&, score::Document*)
    (this=0x55555a5331a8, ctx=..., doc=0x55555b880eb0) at <REDACTED>/prog/ossia-score/src/lib/core/presenter/DocumentManager.cpp:223
#14 0x0000555555c6e76a in score::DocumentManager::setupDocument(score::GUIApplicationContext const&, score::Document*) (this=0x55555a5331a8, ctx=..., doc=0x55555b880eb0)
    at <REDACTED>/prog/ossia-score/src/lib/core/presenter/DocumentManager.cpp:185
#15 0x0000555555bad934 in score::DocumentManager::newDocument<id_base_t<score::DocumentModel, int>, score::DocumentDelegateFactory&>(score::GUIApplicationContext const&, id_base_t<score::DocumentModel, int>&&, score::DocumentDelegateFactory&) (this=0x55555a5331a8, ctx=...)
    at <REDACTED>/prog/ossia-score/src/lib/core/presenter/DocumentManager.hpp:67
#16 0x0000555555b78fb5 in Application::openNewDocument() (this=0x7fffffffe160) at <REDACTED>/prog/ossia-score/src/app/Application.cpp:482
#17 0x0000555555b78e4d in Application::initDocuments() (this=0x7fffffffe160) at <REDACTED>/prog/ossia-score/src/app/Application.cpp:463
#18 0x0000555555b78609 in operator()() const (__closure=0x55555b7cf710) at <REDACTED>/prog/ossia-score/src/app/Application.cpp:412
#19 0x0000555555b975f4 in QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, Application::init()::<lambda()> >::call(struct {...} &, void **)
    (f=..., arg=0x7fffffffdd20) at /usr/include/x86_64-linux-gnu/qt6/QtCore/qobjectdefs_impl.h:127
#20 0x0000555555b97447 in QtPrivate::Functor<Application::init()::<lambda()>, 0>::call<QtPrivate::List<>, void>(struct {...} &, void *, void **) (f=..., arg=0x7fffffffdd20)
    at /usr/include/x86_64-linux-gnu/qt6/QtCore/qobjectdefs_impl.h:241
#21 0x0000555555b96e94 in QtPrivate::QFunctorSlotObject<Application::init()::<lambda()>, 0, QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase *, QObject *, void **, bool *) (which=1, this_=0x55555b7cf700, r=0x0, a=0x7fffffffdd20, ret=0x0) at /usr/include/x86_64-linux-gnu/qt6/QtCore/qobjectdefs_impl.h:408
--Type <RET> for more, q to quit, c to continue without paging--c
#22 0x00007ffff3199ac2 in  () at /lib/x86_64-linux-gnu/libQt6Core.so.6
#23 0x00007ffff31848de in QObject::event(QEvent*) () at /lib/x86_64-linux-gnu/libQt6Core.so.6
#24 0x00007ffff3de2a53 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /lib/x86_64-linux-gnu/libQt6Widgets.so.6
#25 0x00007ffff31488b8 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /lib/x86_64-linux-gnu/libQt6Core.so.6
#26 0x00007ffff327d689 in QTimerInfoList::activateTimers() () at /lib/x86_64-linux-gnu/libQt6Core.so.6
#27 0x00007ffff332f2f4 in  () at /lib/x86_64-linux-gnu/libQt6Core.so.6
#28 0x00007fffef4d17a9 in g_main_context_dispatch () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#29 0x00007fffef4d1a38 in  () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#30 0x00007fffef4d1acc in g_main_context_iteration () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#31 0x00007ffff332cf7c in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib/x86_64-linux-gnu/libQt6Core.so.6
#32 0x00007ffff315257a in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib/x86_64-linux-gnu/libQt6Core.so.6
#33 0x00007ffff314b6a8 in QCoreApplication::exec() () at /lib/x86_64-linux-gnu/libQt6Core.so.6
#34 0x0000555555b78ff9 in Application::exec() (this=0x7fffffffe160) at <REDACTED>/prog/ossia-score/src/app/Application.cpp:493
#35 0x0000555555b7a750 in main(int, char**) (argc=1, argv=0x7fffffffe378) at <REDACTED>/prog/ossia-score/src/app/main.cpp:615

Analysis

Looking at Ossia's source code where the crash happens (https://github.com/ossia/libossia/blob/590c9af897202c993d0da06f93a86e0151f2c03e/src/ossia/audio/pipewire_protocol.hpp#L562), gdb says that this->filter is NULL, which means that pw.filter_new_simple() above returns NULL. Gdb says this function's parameters are all non-null.

From pipewire's source code (https://github.com/PipeWire/pipewire/blob/8e6d070148fc018df78a30ec410ed35340b9f53b/src/pipewire/filter.c#L1319) it looks like pw.filter_new_simple` only returns NULL on errors. I don't know the pipewire client code at all, but I have a hunch this is where the missing binaries/conf are involved.

It's probably a good idea to test whether this->filter is NULL in pipewire_protocol.hpp and abort more gracefully instead of getting into a segfault, though it might be too late for error handling at this point.

Hope this helps, happy to dig deeper if you cannot reproduce the issue locally.

jcelerier commented 9 months ago

Hi, can you check with this appimage if this still happens? Now it should show an error dialog complaining about pipewire instead: https://github.com/ossia/score/releases/tag/continuous

pgervais commented 9 months ago

I compiled Ossia score at 8a2f759284bd5c0bac447227657d51ddb92e2f13, which matches the appimage you pointed. I confirm that the crash is gone, and replace by a popup saying "The desired audio settings could not be applied. Please change them."

From my perspective that's a much better behavior. Thank you!