pulseaudio: extract context connecting into `connectContext()`

pull/2866/head
Jay-716 2024-01-27 23:44:32 +08:00
parent 167f04a4df
commit 14d168c254
No known key found for this signature in database
GPG Key ID: 42A0537B397B96C6
2 changed files with 16 additions and 20 deletions

View File

@ -22,6 +22,7 @@ class AudioBackend {
static void sourceInfoCb(pa_context*, const pa_source_info* i, int, void* data); static void sourceInfoCb(pa_context*, const pa_source_info* i, int, void* data);
static void serverInfoCb(pa_context*, const pa_server_info*, void*); static void serverInfoCb(pa_context*, const pa_server_info*, void*);
static void volumeModifyCb(pa_context*, int, void*); static void volumeModifyCb(pa_context*, int, void*);
void connectContext();
pa_threaded_mainloop* mainloop_; pa_threaded_mainloop* mainloop_;
pa_mainloop_api* mainloop_api_; pa_mainloop_api* mainloop_api_;

View File

@ -28,16 +28,7 @@ AudioBackend::AudioBackend(std::function<void()> on_updated_cb, private_construc
} }
pa_threaded_mainloop_lock(mainloop_); pa_threaded_mainloop_lock(mainloop_);
mainloop_api_ = pa_threaded_mainloop_get_api(mainloop_); mainloop_api_ = pa_threaded_mainloop_get_api(mainloop_);
context_ = pa_context_new(mainloop_api_, "waybar"); connectContext();
if (context_ == nullptr) {
throw std::runtime_error("pa_context_new() failed.");
}
if (pa_context_connect(context_, nullptr, PA_CONTEXT_NOFAIL, nullptr) < 0) {
auto err =
fmt::format("pa_context_connect() failed: {}", pa_strerror(pa_context_errno(context_)));
throw std::runtime_error(err);
}
pa_context_set_state_callback(context_, contextStateCb, this);
if (pa_threaded_mainloop_start(mainloop_) < 0) { if (pa_threaded_mainloop_start(mainloop_) < 0) {
throw std::runtime_error("pa_mainloop_run() failed."); throw std::runtime_error("pa_mainloop_run() failed.");
} }
@ -61,6 +52,19 @@ std::shared_ptr<AudioBackend> AudioBackend::getInstance(std::function<void()> on
return std::make_shared<AudioBackend>(on_updated_cb, tag); return std::make_shared<AudioBackend>(on_updated_cb, tag);
} }
void AudioBackend::connectContext() {
context_ = pa_context_new(mainloop_api_, "waybar");
if (context_ == nullptr) {
throw std::runtime_error("pa_context_new() failed.");
}
pa_context_set_state_callback(context_, contextStateCb, this);
if (pa_context_connect(context_, nullptr, PA_CONTEXT_NOFAIL, nullptr) < 0) {
auto err =
fmt::format("pa_context_connect() failed: {}", pa_strerror(pa_context_errno(context_)));
throw std::runtime_error(err);
}
}
void AudioBackend::contextStateCb(pa_context *c, void *data) { void AudioBackend::contextStateCb(pa_context *c, void *data) {
auto backend = static_cast<AudioBackend *>(data); auto backend = static_cast<AudioBackend *>(data);
switch (pa_context_get_state(c)) { switch (pa_context_get_state(c)) {
@ -86,16 +90,7 @@ void AudioBackend::contextStateCb(pa_context *c, void *data) {
if (backend->context_ != nullptr) { if (backend->context_ != nullptr) {
pa_context_disconnect(backend->context_); pa_context_disconnect(backend->context_);
} }
backend->context_ = pa_context_new(backend->mainloop_api_, "waybar"); backend->connectContext();
if (backend->context_ == nullptr) {
throw std::runtime_error("pa_context_new() failed.");
}
pa_context_set_state_callback(backend->context_, contextStateCb, data);
if (pa_context_connect(backend->context_, nullptr, PA_CONTEXT_NOFAIL, nullptr) < 0) {
auto err =
fmt::format("pa_context_connect() failed: {}", pa_strerror(pa_context_errno(backend->context_)));
throw std::runtime_error(err);
}
break; break;
case PA_CONTEXT_CONNECTING: case PA_CONTEXT_CONNECTING:
case PA_CONTEXT_AUTHORIZING: case PA_CONTEXT_AUTHORIZING: