feat: allow unmuting by moving the pulseaudio slider
parent
fd3710d869
commit
ecbcf242d5
|
@ -83,6 +83,12 @@ class AudioBackend {
|
||||||
std::string getSourceDesc() const { return source_desc_; }
|
std::string getSourceDesc() const { return source_desc_; }
|
||||||
std::string getDefaultSourceName() const { return default_source_name_; }
|
std::string getDefaultSourceName() const { return default_source_name_; }
|
||||||
|
|
||||||
|
void toggleSinkMute();
|
||||||
|
void toggleSinkMute(bool);
|
||||||
|
|
||||||
|
void toggleSourceMute();
|
||||||
|
void toggleSourceMute(bool);
|
||||||
|
|
||||||
bool isBluetooth();
|
bool isBluetooth();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,44 @@ void PulseaudioSlider::update() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void PulseaudioSlider::onValueChanged() {
|
void PulseaudioSlider::onValueChanged() {
|
||||||
|
bool is_mute = false;
|
||||||
|
|
||||||
|
switch (target) {
|
||||||
|
case PulseaudioSliderTarget::Sink:
|
||||||
|
if (backend->getSinkMuted()) {
|
||||||
|
is_mute = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PulseaudioSliderTarget::Source:
|
||||||
|
if (backend->getSourceMuted()) {
|
||||||
|
is_mute = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t volume = scale_.get_value();
|
uint16_t volume = scale_.get_value();
|
||||||
|
|
||||||
|
if (is_mute) {
|
||||||
|
// Avoid setting sink/source to volume 0 if the user muted if via another mean.
|
||||||
|
if (volume == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the sink/source is mute, but the user clicked the slider, unmute it!
|
||||||
|
else {
|
||||||
|
switch (target) {
|
||||||
|
case PulseaudioSliderTarget::Sink:
|
||||||
|
backend->toggleSinkMute(false);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PulseaudioSliderTarget::Source:
|
||||||
|
backend->toggleSourceMute(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
backend->changeVolume(volume, min_, max_);
|
backend->changeVolume(volume, min_, max_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -241,6 +241,26 @@ void AudioBackend::changeVolume(ChangeType change_type, double step, uint16_t ma
|
||||||
pa_context_set_sink_volume_by_index(context_, sink_idx_, &pa_volume, volumeModifyCb, this);
|
pa_context_set_sink_volume_by_index(context_, sink_idx_, &pa_volume, volumeModifyCb, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AudioBackend::toggleSinkMute() {
|
||||||
|
muted_ = !muted_;
|
||||||
|
pa_context_set_sink_mute_by_index(context_, sink_idx_, muted_, nullptr, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioBackend::toggleSinkMute(bool mute) {
|
||||||
|
muted_ = mute;
|
||||||
|
pa_context_set_sink_mute_by_index(context_, sink_idx_, muted_, nullptr, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioBackend::toggleSourceMute() {
|
||||||
|
source_muted_ = !muted_;
|
||||||
|
pa_context_set_source_mute_by_index(context_, source_idx_, source_muted_, nullptr, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioBackend::toggleSourceMute(bool mute) {
|
||||||
|
source_muted_ = mute;
|
||||||
|
pa_context_set_source_mute_by_index(context_, source_idx_, source_muted_, nullptr, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
bool AudioBackend::isBluetooth() {
|
bool AudioBackend::isBluetooth() {
|
||||||
return monitor_.find("a2dp_sink") != std::string::npos || // PulseAudio
|
return monitor_.find("a2dp_sink") != std::string::npos || // PulseAudio
|
||||||
monitor_.find("a2dp-sink") != std::string::npos || // PipeWire
|
monitor_.find("a2dp-sink") != std::string::npos || // PipeWire
|
||||||
|
|
Loading…
Reference in New Issue