diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/devicewidget.cc | 96 | ||||
-rw-r--r-- | src/devicewidget.h | 54 |
2 files changed, 150 insertions, 0 deletions
diff --git a/src/devicewidget.cc b/src/devicewidget.cc new file mode 100644 index 0000000..8d7ade2 --- /dev/null +++ b/src/devicewidget.cc @@ -0,0 +1,96 @@ +/*** + This file is part of pavucontrol. + + Copyright 2006-2008 Lennart Poettering + Copyright 2009 Colin Guthrie + + pavucontrol is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + pavucontrol is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pavucontrol. If not, see <http://www.gnu.org/licenses/>. +***/ + +#include "devicewidget.h" + +/*** DeviceWidget ***/ +DeviceWidget::DeviceWidget(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& x) : + MinimalStreamWidget(cobject, x) { + + x->get_widget("lockToggleButton", lockToggleButton); + x->get_widget("muteToggleButton", muteToggleButton); + + muteToggleButton->signal_clicked().connect(sigc::mem_fun(*this, &DeviceWidget::onMuteToggleButton)); + + for (unsigned i = 0; i < PA_CHANNELS_MAX; i++) + channelWidgets[i] = NULL; +} + +void DeviceWidget::setChannelMap(const pa_channel_map &m, bool can_decibel) { + channelMap = m; + + for (int i = 0; i < m.channels; i++) { + ChannelWidget *cw = channelWidgets[i] = ChannelWidget::create(); + cw->beepDevice = beepDevice; + cw->channel = i; + cw->can_decibel = can_decibel; + cw->streamWidget = this; + char text[64]; + snprintf(text, sizeof(text), "<b>%s</b>", pa_channel_position_to_pretty_string(m.map[i])); + cw->channelLabel->set_markup(text); + channelsVBox->pack_start(*cw, false, false, 0); + } + + lockToggleButton->set_sensitive(m.channels > 1); +} + +void DeviceWidget::setVolume(const pa_cvolume &v, bool force) { + g_assert(v.channels == channelMap.channels); + + volume = v; + + if (timeoutConnection.empty() || force) { /* do not update the volume when a volume change is still in flux */ + for (int i = 0; i < volume.channels; i++) + channelWidgets[i]->setVolume(volume.values[i]); + } +} + +void DeviceWidget::updateChannelVolume(int channel, pa_volume_t v) { + pa_cvolume n; + g_assert(channel < volume.channels); + + n = volume; + if (lockToggleButton->get_active()) { + for (int i = 0; i < n.channels; i++) + n.values[i] = v; + } else + n.values[channel] = v; + + setVolume(n, true); + + if (timeoutConnection.empty()) + timeoutConnection = Glib::signal_timeout().connect(sigc::mem_fun(*this, &DeviceWidget::timeoutEvent), 100); +} + +void DeviceWidget::onMuteToggleButton() { + + lockToggleButton->set_sensitive(!muteToggleButton->get_active()); + + for (int i = 0; i < channelMap.channels; i++) + channelWidgets[i]->set_sensitive(!muteToggleButton->get_active()); +} + +bool DeviceWidget::timeoutEvent() { + executeVolumeUpdate(); + return false; +} + +void DeviceWidget::executeVolumeUpdate() { +} diff --git a/src/devicewidget.h b/src/devicewidget.h new file mode 100644 index 0000000..ce3c55f --- /dev/null +++ b/src/devicewidget.h @@ -0,0 +1,54 @@ +/*** + This file is part of pavucontrol. + + Copyright 2006-2008 Lennart Poettering + Copyright 2009 Colin Guthrie + + pavucontrol is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + pavucontrol is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pavucontrol. If not, see <http://www.gnu.org/licenses/>. +***/ + +#ifndef devicewidget_h +#define devicewidget_h + +#include "pavucontrol.h" + +#include "minimalstreamwidget.h" + +class ChannelWidget; + +class DeviceWidget : public MinimalStreamWidget { +public: + DeviceWidget(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& x); + + void setChannelMap(const pa_channel_map &m, bool can_decibel); + void setVolume(const pa_cvolume &volume, bool force = false); + virtual void updateChannelVolume(int channel, pa_volume_t v); + + Gtk::ToggleButton *lockToggleButton, *muteToggleButton; + + pa_channel_map channelMap; + pa_cvolume volume; + + ChannelWidget *channelWidgets[PA_CHANNELS_MAX]; + + virtual void onMuteToggleButton(); + + sigc::connection timeoutConnection; + + bool timeoutEvent(); + + virtual void executeVolumeUpdate(); +}; + +#endif |