diff --git a/src/context.h b/src/context.h --- a/src/context.h +++ b/src/context.h @@ -65,6 +65,8 @@ const ModuleMap &modules() const { return m_modules; } const StreamRestoreMap &streamRestores() const { return m_streamRestores; } Server *server() const { return m_server; } + QString newDefaultSink() const { return m_newDefaultSink; } + QString newDefaultSource() const { return m_newDefaultSource; } void subscribeCallback(pa_context *context, pa_subscription_event_type_t type, uint32_t index); void contextStateCallback(pa_context *context); @@ -171,6 +173,9 @@ pa_context *m_context; pa_glib_mainloop *m_mainloop; + QString m_newDefaultSink; + QString m_newDefaultSource; + int m_references; static Context* s_context; }; diff --git a/src/context.cpp b/src/context.cpp --- a/src/context.cpp +++ b/src/context.cpp @@ -180,6 +180,46 @@ } } +static void ext_stream_restore_change_sink_cb(pa_context *context, const pa_ext_stream_restore_info *info, int eol, void *data) +{ + if (!isGoodState(eol)) { + return; + } + Q_ASSERT(context); + Q_ASSERT(data); + if (qstrncmp(info->name, "sink-input-by", 13) == 0) { + Context *context = static_cast(data); + const QByteArray deviceData = context->newDefaultSink().toUtf8(); + pa_ext_stream_restore_info newinfo; + newinfo.name = info->name; + newinfo.channel_map = info->channel_map; + newinfo.volume = info->volume; + newinfo.mute = info->mute; + newinfo.device = deviceData.constData(); + context->streamRestoreWrite(&newinfo); + } +} + +static void ext_stream_restore_change_source_cb(pa_context *context, const pa_ext_stream_restore_info *info, int eol, void *data) +{ + if (!isGoodState(eol)) { + return; + } + Q_ASSERT(context); + Q_ASSERT(data); + if (qstrncmp(info->name, "source-output-by", 16) == 0) { + Context *context = static_cast(data); + const QByteArray deviceData = context->newDefaultSource().toUtf8(); + pa_ext_stream_restore_info newinfo; + newinfo.name = info->name; + newinfo.channel_map = info->channel_map; + newinfo.volume = info->volume; + newinfo.mute = info->mute; + newinfo.device = deviceData.constData(); + context->streamRestoreWrite(&newinfo); + } +} + // -------------------------- Context::Context(QObject *parent) @@ -501,6 +541,14 @@ nullptr))) { qCWarning(PLASMAPA) << "pa_context_set_default_sink failed"; } + + // Change device for all entries in stream-restore database + m_newDefaultSink = name; + if (!PAOperation(pa_ext_stream_restore_read(m_context, + ext_stream_restore_change_sink_cb, + this))) { + qCWarning(PLASMAPA) << "pa_ext_stream_restore_read failed"; + } } void Context::setDefaultSource(const QString &name) @@ -515,6 +563,14 @@ nullptr))) { qCWarning(PLASMAPA) << "pa_context_set_default_source failed"; } + + // Change device for all entries in stream-restore database + m_newDefaultSource = name; + if (!PAOperation(pa_ext_stream_restore_read(m_context, + ext_stream_restore_change_source_cb, + this))) { + qCWarning(PLASMAPA) << "pa_ext_stream_restore_read failed"; + } } void Context::streamRestoreWrite(const pa_ext_stream_restore_info *info)