summaryrefslogtreecommitdiffstats
path: root/src/SourceWindow.cc
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2006-04-10 17:14:45 +0000
committerLennart Poettering <lennart@poettering.net>2006-04-10 17:14:45 +0000
commit9f205ae53d29127c54d416b5ca024fb625b1b950 (patch)
tree9abc0e2bd7917edf79670f230b6d4e477f09875c /src/SourceWindow.cc
parent2348be825542354e15a3dcc4f7f2581fa598c721 (diff)
* add volume control for sources
* add channel map information to sinks/source/sink inputs/source outputs git-svn-id: file:///home/lennart/svn/public/paman/trunk@54 cdefa82f-4ce1-0310-97f5-ab6066f37c3c
Diffstat (limited to 'src/SourceWindow.cc')
-rw-r--r--src/SourceWindow.cc62
1 files changed, 55 insertions, 7 deletions
diff --git a/src/SourceWindow.cc b/src/SourceWindow.cc
index b79c9e5..d12802d 100644
--- a/src/SourceWindow.cc
+++ b/src/SourceWindow.cc
@@ -33,26 +33,38 @@ SourceWindow::SourceWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Gl
ownerModuleLabel(NULL),
monitorOfSinkLabel(NULL),
latencyLabel(NULL),
+ volumeLabel(NULL),
closeButton(NULL),
toParentSinkButton(NULL),
toOwnerModuleButton(NULL),
- volumeMeterButton(NULL) {
+ volumeResetButton(NULL),
+ volumeMuteButton(NULL),
+ volumeMeterButton(NULL),
+ volumeScale(NULL) {
refGlade->get_widget("nameLabel", nameLabel);
refGlade->get_widget("descriptionLabel", descriptionLabel);
refGlade->get_widget("indexLabel", indexLabel);
refGlade->get_widget("sampleTypeLabel", sampleTypeLabel);
+ refGlade->get_widget("channelMapLabel", channelMapLabel);
refGlade->get_widget("ownerModuleLabel", ownerModuleLabel);
refGlade->get_widget("monitorOfSinkLabel", monitorOfSinkLabel);
refGlade->get_widget("latencyLabel", latencyLabel);
refGlade->get_widget("closeButton", closeButton);
refGlade->get_widget("toParentSinkButton", toParentSinkButton);
refGlade->get_widget("toOwnerModuleButton", toOwnerModuleButton);
+ refGlade->get_widget("volumeLabel", volumeLabel);
+ refGlade->get_widget("volumeScale", volumeScale);
+ refGlade->get_widget("volumeResetButton", volumeResetButton);
+ refGlade->get_widget("volumeMuteButton", volumeMuteButton);
refGlade->get_widget("volumeMeterButton", volumeMeterButton);
closeButton->signal_clicked().connect(sigc::mem_fun(*this, &SourceWindow::onCloseButton));
toParentSinkButton->signal_clicked().connect(sigc::mem_fun(*this, &SourceWindow::onParentSinkButton));
toOwnerModuleButton->signal_clicked().connect(sigc::mem_fun(*this, &SourceWindow::onToOwnerModuleButton));
+ volumeScale->signal_value_changed().connect(sigc::mem_fun(*this, &SourceWindow::onVolumeScaleValueChanged));
+ volumeResetButton->signal_clicked().connect(sigc::mem_fun(*this, &SourceWindow::onVolumeResetButton));
+ volumeMuteButton->signal_clicked().connect(sigc::mem_fun(*this, &SourceWindow::onVolumeMuteButton));
volumeMeterButton->signal_clicked().connect(sigc::mem_fun(*this, &SourceWindow::onVolumeMeterButton));
}
@@ -64,14 +76,17 @@ SourceWindow* SourceWindow::create() {
}
void SourceWindow::updateInfo(const SourceInfo &i) {
- char t[20], ss[PA_SAMPLE_SPEC_SNPRINT_MAX];
+ char t[20], ss[PA_SAMPLE_SPEC_SNPRINT_MAX], cm[PA_CHANNEL_MAP_SNPRINT_MAX];
+ double percent;
nameLabel->set_text(i.name);
descriptionLabel->set_text(i.description);
snprintf(t, sizeof(t), "#%u", i.index);
indexLabel->set_text(t);
- pa_sample_spec_snprint(ss, sizeof(ss), &i.sample_spec);
- sampleTypeLabel->set_text(ss);
+
+ sampleTypeLabel->set_text(pa_sample_spec_snprint(ss, sizeof(ss), &i.sample_spec));
+ channelMapLabel->set_text(pa_channel_map_snprint(cm, sizeof(cm), &i.channel_map));
+
snprintf(t, sizeof(t), "#%u", i.owner_module);
ownerModuleLabel->set_text(t);
@@ -88,12 +103,32 @@ void SourceWindow::updateInfo(const SourceInfo &i) {
}
}
- monitor_of_sink = i.monitor_of_sink;
- source_name = i.name;
-
+ percent = ((double) pa_cvolume_avg(&i.volume) * 100) / PA_VOLUME_NORM;
+ scaleEnabled = false;
+ volumeScale->set_value(percent);
+ scaleEnabled = true;
+
+ if (i.hw_volume_supported)
+ snprintf(t, sizeof(t), "%0.0f%%", percent);
+ else {
+ double db;
+
+ db = pa_sw_volume_to_dB(pa_cvolume_avg(&i.volume));
+
+ if (db != PA_DECIBEL_MININFTY)
+ snprintf(t, sizeof(t), "%0.0f%% (%0.2fdB)", percent, db);
+ else
+ snprintf(t, sizeof(t), "%0.0f%% (-&#8734;dB)", percent);
+ }
+ volumeLabel->set_markup(t);
+
set_title("Source: "+i.name);
+ monitor_of_sink = i.monitor_of_sink;
owner_module = i.owner_module;
+ index = i.index;
+ source_name = i.name;
+
toOwnerModuleButton->set_sensitive(owner_module != (uint32_t) -1);
}
@@ -111,6 +146,19 @@ void SourceWindow::onToOwnerModuleButton() {
serverInfoManager->showModuleWindow(owner_module);
}
+void SourceWindow::onVolumeScaleValueChanged() {
+ if (scaleEnabled)
+ serverInfoManager->setSourceVolume(index, (pa_volume_t) (((double) volumeScale->get_value()/100) * PA_VOLUME_NORM));
+}
+
+void SourceWindow::onVolumeResetButton() {
+ serverInfoManager->setSourceVolume(index, PA_VOLUME_NORM);
+}
+
+void SourceWindow::onVolumeMuteButton() {
+ serverInfoManager->setSourceVolume(index, PA_VOLUME_MUTED);
+}
+
bool SourceWindow::on_delete_event(GdkEventAny*) {
hide();
return false;