feat: pulseaudio slider module

This commit is contained in:
Brenno Lemos
2023-10-15 11:32:05 -03:00
parent c9e129cda2
commit 442a4b0da0
9 changed files with 221 additions and 2 deletions

34
src/ASlider.cpp Normal file
View File

@ -0,0 +1,34 @@
#include "ASlider.hpp"
#include "gtkmm/adjustment.h"
#include "gtkmm/enums.h"
namespace waybar {
ASlider::ASlider(const Json::Value& config, const std::string& name, const std::string& id)
: AModule(config, name, id, false, false),
vertical_(config_["orientation"].asString() == "vertical"),
scale_(vertical_ ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL) {
scale_.set_name(name);
if (!id.empty()) {
scale_.get_style_context()->add_class(id);
}
event_box_.add(scale_);
scale_.signal_value_changed().connect(sigc::mem_fun(*this, &ASlider::onValueChanged));
if (config_["min"].isUInt()) {
min_ = config_["min"].asUInt();
}
if (config_["max"].isUInt()) {
max_ = config_["max"].asUInt();
}
scale_.set_inverted(vertical_);
scale_.set_draw_value(false);
scale_.set_adjustment(Gtk::Adjustment::create(curr_, min_, max_ + 1, 1, 1, 1));
}
void ASlider::onValueChanged() {}
} // namespace waybar

View File

@ -1,5 +1,9 @@
#include "factory.hpp"
#ifdef HAVE_LIBPULSE
#include "modules/pulseaudio_slider.hpp"
#endif
waybar::Factory::Factory(const Bar& bar, const Json::Value& config) : bar_(bar), config_(config) {}
waybar::AModule* waybar::Factory::makeModule(const std::string& name) const {
@ -136,6 +140,9 @@ waybar::AModule* waybar::Factory::makeModule(const std::string& name) const {
if (ref == "pulseaudio") {
return new waybar::modules::Pulseaudio(id, config_[name]);
}
if (ref == "pulseaudio/slider") {
return new waybar::modules::PulseaudioSlider(id, config_[name]);
}
#endif
#ifdef HAVE_LIBMPDCLIENT
if (ref == "mpd") {

View File

@ -0,0 +1,45 @@
#include "modules/pulseaudio_slider.hpp"
namespace waybar::modules {
PulseaudioSlider::PulseaudioSlider(const std::string& id, const Json::Value& config)
: ASlider(config, "pulseaudio-slider", id) {
backend = util::AudioBackend::getInstance([this] { this->dp.emit(); });
backend->setIgnoredSinks(config_["ignored-sinks"]);
if (config_["target"].isString()) {
std::string target = config_["target"].asString();
if (target == "sink") {
this->target = PulseaudioSliderTarget::Sink;
} else if (target == "source") {
this->target = PulseaudioSliderTarget::Source;
}
}
}
void PulseaudioSlider::update() {
switch (target) {
case PulseaudioSliderTarget::Sink:
if (backend->getSinkMuted()) {
scale_.set_value(min_);
} else {
scale_.set_value(backend->getSinkVolume());
}
break;
case PulseaudioSliderTarget::Source:
if (backend->getSourceMuted()) {
scale_.set_value(min_);
} else {
scale_.set_value(backend->getSourceVolume());
}
break;
}
}
void PulseaudioSlider::onValueChanged() {
uint16_t volume = scale_.get_value();
backend->changeVolume(volume, min_, max_);
}
} // namespace waybar::modules

View File

@ -204,11 +204,12 @@ void AudioBackend::serverInfoCb(pa_context *context, const pa_server_info *i, vo
pa_context_get_source_info_list(context, sourceInfoCb, data);
}
void AudioBackend::changeVolume(uint16_t volume, uint16_t max_volume) {
void AudioBackend::changeVolume(uint16_t volume, uint16_t min_volume, uint16_t max_volume) {
double volume_tick = static_cast<double>(PA_VOLUME_NORM) / 100;
pa_cvolume pa_volume = pa_volume_;
volume = std::min(volume, max_volume);
volume = std::max(volume, min_volume);
pa_cvolume_set(&pa_volume, pa_volume_.channels, volume * volume_tick);
pa_context_set_sink_volume_by_index(context_, sink_idx_, &pa_volume, volumeModifyCb, this);