refactor(pulseaudio): use pulseaudio thread rater than cpp

This commit is contained in:
Alexis 2018-08-10 00:34:13 +02:00
parent 291267711a
commit f810713570
2 changed files with 14 additions and 11 deletions

View File

@ -4,7 +4,6 @@
#include <json/json.h> #include <json/json.h>
#include <gtkmm.h> #include <gtkmm.h>
#include <fmt/format.h> #include <fmt/format.h>
#include <thread>
#include "IModule.hpp" #include "IModule.hpp"
namespace waybar::modules { namespace waybar::modules {
@ -23,13 +22,14 @@ namespace waybar::modules {
static void _serverInfoCb(pa_context *context, const pa_server_info *i, static void _serverInfoCb(pa_context *context, const pa_server_info *i,
void *data); void *data);
Gtk::Label _label; Gtk::Label _label;
std::thread _thread;
Json::Value _config; Json::Value _config;
pa_mainloop *_mainloop; pa_threaded_mainloop *_mainloop;
pa_mainloop_api *_mainloop_api; pa_mainloop_api *_mainloop_api;
pa_context *_context; pa_context *_context;
uint32_t _sinkIdx{0};
int _volume; int _volume;
bool _muted; bool _muted;
std::string _desc;
}; };
} }

View File

@ -4,13 +4,14 @@
waybar::modules::Pulseaudio::Pulseaudio(Json::Value config) waybar::modules::Pulseaudio::Pulseaudio(Json::Value config)
: _config(config), _mainloop(nullptr), _mainloop_api(nullptr), : _config(config), _mainloop(nullptr), _mainloop_api(nullptr),
_context(nullptr), _volume(0), _muted(false) _context(nullptr), _sinkIdx(0), _volume(0), _muted(false)
{ {
_label.get_style_context()->add_class("pulseaudio"); _label.get_style_context()->add_class("pulseaudio");
_mainloop = pa_mainloop_new(); _mainloop = pa_threaded_mainloop_new();
if (!_mainloop) if (!_mainloop)
throw std::runtime_error("pa_mainloop_new() failed."); throw std::runtime_error("pa_mainloop_new() failed.");
_mainloop_api = pa_mainloop_get_api(_mainloop); pa_threaded_mainloop_lock(_mainloop);
_mainloop_api = pa_threaded_mainloop_get_api(_mainloop);
if (pa_signal_init(_mainloop_api) != 0) if (pa_signal_init(_mainloop_api) != 0)
throw std::runtime_error("pa_signal_init() failed."); throw std::runtime_error("pa_signal_init() failed.");
_context = pa_context_new(_mainloop_api, "waybar"); _context = pa_context_new(_mainloop_api, "waybar");
@ -20,10 +21,9 @@ waybar::modules::Pulseaudio::Pulseaudio(Json::Value config)
throw std::runtime_error(fmt::format("pa_context_connect() failed: {}", throw std::runtime_error(fmt::format("pa_context_connect() failed: {}",
pa_strerror(pa_context_errno(_context)))); pa_strerror(pa_context_errno(_context))));
pa_context_set_state_callback(_context, _contextStateCb, this); pa_context_set_state_callback(_context, _contextStateCb, this);
_thread = std::thread([this]() { if (pa_threaded_mainloop_start(_mainloop) < 0)
if (pa_mainloop_run(_mainloop, nullptr) < 0) throw std::runtime_error("pa_mainloop_run() failed.");
throw std::runtime_error("pa_mainloop_run() failed."); pa_threaded_mainloop_unlock(_mainloop);
});
}; };
void waybar::modules::Pulseaudio::_contextStateCb(pa_context *c, void *data) void waybar::modules::Pulseaudio::_contextStateCb(pa_context *c, void *data)
@ -80,8 +80,10 @@ void waybar::modules::Pulseaudio::_sinkInfoCb(pa_context *context,
if (i) { if (i) {
auto pa = static_cast<waybar::modules::Pulseaudio *>(data); auto pa = static_cast<waybar::modules::Pulseaudio *>(data);
float volume = (float)pa_cvolume_avg(&(i->volume)) / (float)PA_VOLUME_NORM; float volume = (float)pa_cvolume_avg(&(i->volume)) / (float)PA_VOLUME_NORM;
pa->_sinkIdx = i->index;
pa->_volume = volume * 100.0f; pa->_volume = volume * 100.0f;
pa->_muted = i->mute; pa->_muted = i->mute;
pa->_desc = i->description;
pa->update(); pa->update();
} }
} }
@ -107,7 +109,8 @@ auto waybar::modules::Pulseaudio::update() -> void
_label.get_style_context()->add_class("muted"); _label.get_style_context()->add_class("muted");
} else if (_label.get_style_context()->has_class("muted")) } else if (_label.get_style_context()->has_class("muted"))
_label.get_style_context()->remove_class("muted"); _label.get_style_context()->remove_class("muted");
_label.set_text(fmt::format(format, _volume)); _label.set_label(fmt::format(format, _volume));
_label.set_tooltip_text(_desc);
} }
waybar::modules::Pulseaudio::operator Gtk::Widget &() { waybar::modules::Pulseaudio::operator Gtk::Widget &() {