pulseaudio: add target option to control source (microphone) volume

The pulseaudio/slider module had partial support for a "target" config
option but changeVolume() in the audio backend was hardcoded to only
modify sink volume. This adds full source volume control:

- Add AudioTarget enum (Sink/Source) to audio_backend
- Extend changeVolume() overloads with AudioTarget parameter
- Store and use pa_cvolume for source (with mono channel default)
- Add sourceVolumeModifyCb for source volume change confirmation
- Add "target" config option to the pulseaudio module for scroll control
- Document "target" in both pulseaudio and pulseaudio-slider man pages

Usage:
  "pulseaudio/slider#in": { "target": "source" }
  "pulseaudio#in": { "target": "source" }
This commit is contained in:
7FM
2026-03-06 00:41:42 +01:00
parent 68d4360c26
commit ab5b1a6cd4
8 changed files with 116 additions and 43 deletions
+9 -9
View File
@@ -10,16 +10,16 @@ PulseaudioSlider::PulseaudioSlider(const std::string& id, const Json::Value& con
if (config_["target"].isString()) {
std::string target = config_["target"].asString();
if (target == "sink") {
this->target = PulseaudioSliderTarget::Sink;
this->target = util::AudioTarget::Sink;
} else if (target == "source") {
this->target = PulseaudioSliderTarget::Source;
this->target = util::AudioTarget::Source;
}
}
}
void PulseaudioSlider::update() {
switch (target) {
case PulseaudioSliderTarget::Sink:
case util::AudioTarget::Sink:
if (backend->getSinkMuted()) {
scale_.set_value(min_);
} else {
@@ -27,7 +27,7 @@ void PulseaudioSlider::update() {
}
break;
case PulseaudioSliderTarget::Source:
case util::AudioTarget::Source:
if (backend->getSourceMuted()) {
scale_.set_value(min_);
} else {
@@ -41,13 +41,13 @@ void PulseaudioSlider::onValueChanged() {
bool is_mute = false;
switch (target) {
case PulseaudioSliderTarget::Sink:
case util::AudioTarget::Sink:
if (backend->getSinkMuted()) {
is_mute = true;
}
break;
case PulseaudioSliderTarget::Source:
case util::AudioTarget::Source:
if (backend->getSourceMuted()) {
is_mute = true;
}
@@ -65,18 +65,18 @@ void PulseaudioSlider::onValueChanged() {
// If the sink/source is mute, but the user clicked the slider, unmute it!
else {
switch (target) {
case PulseaudioSliderTarget::Sink:
case util::AudioTarget::Sink:
backend->toggleSinkMute(false);
break;
case PulseaudioSliderTarget::Source:
case util::AudioTarget::Source:
backend->toggleSourceMute(false);
break;
}
}
}
backend->changeVolume(volume, min_, max_);
backend->changeVolume(volume, min_, max_, target);
}
} // namespace waybar::modules