mirror of
https://github.com/rad4day/Waybar.git
synced 2025-07-13 22:52:30 +02:00
feat: pulseaudio slider module
This commit is contained in:
34
src/ASlider.cpp
Normal file
34
src/ASlider.cpp
Normal 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
|
@ -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") {
|
||||
|
45
src/modules/pulseaudio_slider.cpp
Normal file
45
src/modules/pulseaudio_slider.cpp
Normal 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
|
@ -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);
|
||||
|
Reference in New Issue
Block a user