refactor(pulseaudio): use pulseaudio thread rater than cpp
parent
291267711a
commit
f810713570
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 &() {
|
||||||
|
|
Loading…
Reference in New Issue