/***
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 .
***/
#ifdef HAVE_CONFIG_H
#include
#endif
#include "streamwidget.h"
#include "mainwindow.h"
#include "channel.h"
#include
/*** StreamWidget ***/
StreamWidget::StreamWidget(MainWindow *parent) :
MinimalStreamWidget(parent),
mpMainWindow(parent),
terminate{new QAction{tr("Terminate"), this}} {
setupUi(this);
initPeakProgressBar(channelsGrid);
timeout.setSingleShot(true);
timeout.setInterval(100);
connect(&timeout, &QTimer::timeout, this, &StreamWidget::timeoutEvent);
connect(muteToggleButton, &QToolButton::toggled, this, &StreamWidget::onMuteToggleButton);
connect(lockToggleButton, &QToolButton::toggled, this, &StreamWidget::onLockToggleButton);
connect(deviceButton, &QAbstractButton::released, this, &StreamWidget::onDeviceChangePopup);
connect(terminate, &QAction::triggered, this, &StreamWidget::onKill);
addAction(terminate);
setContextMenuPolicy(Qt::ActionsContextMenu);
for (unsigned i = 0; i < PA_CHANNELS_MAX; i++)
channels[i] = NULL;
}
void StreamWidget::setChannelMap(const pa_channel_map &m, bool can_decibel) {
channelMap = m;
for (int i = 0; i < m.channels; i++) {
Channel *ch = channels[i] = new Channel(channelsGrid);
ch->channel = i;
ch->can_decibel = can_decibel;
ch->minimalStreamWidget = this;
char text[64];
snprintf(text, sizeof(text), "%s", pa_channel_position_to_pretty_string(m.map[i]));
ch->channelLabel->setText(QString::fromUtf8(text));
}
channels[m.channels-1]->last = true;
channels[m.channels-1]->setBaseVolume(PA_VOLUME_NORM);
lockToggleButton->setEnabled(m.channels > 1);
hideLockedChannels(lockToggleButton->isChecked());
}
void StreamWidget::setVolume(const pa_cvolume &v, bool force) {
g_assert(v.channels == channelMap.channels);
volume = v;
if (!timeout.isActive() || force) { /* do not update the volume when a volume change is still in flux */
for (int i = 0; i < volume.channels; i++)
channels[i]->setVolume(volume.values[i]);
}
}
void StreamWidget::updateChannelVolume(int channel, pa_volume_t v) {
pa_cvolume n;
g_assert(channel < volume.channels);
n = volume;
if (lockToggleButton->isChecked()) {
for (int i = 0; i < n.channels; i++)
n.values[i] = v;
} else
n.values[channel] = v;
setVolume(n, true);
if(!timeout.isActive()) {
timeout.start();
}
}
void StreamWidget::hideLockedChannels(bool hide) {
for (int i = 0; i < channelMap.channels - 1; i++)
channels[i]->setVisible(!hide);
channels[channelMap.channels - 1]->channelLabel->setVisible(!hide);
}
void StreamWidget::onMuteToggleButton() {
lockToggleButton->setEnabled(!muteToggleButton->isChecked());
for (int i = 0; i < channelMap.channels; i++)
channels[i]->setEnabled(!muteToggleButton->isChecked());
}
void StreamWidget::onLockToggleButton() {
hideLockedChannels(lockToggleButton->isChecked());
}
bool StreamWidget::timeoutEvent() {
executeVolumeUpdate();
return false;
}
void StreamWidget::executeVolumeUpdate() {
}
void StreamWidget::onDeviceChangePopup() {
}
void StreamWidget::onKill() {
}