From 9f205ae53d29127c54d416b5ca024fb625b1b950 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 10 Apr 2006 17:14:45 +0000 Subject: * 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 --- src/SourceWindow.cc | 62 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 7 deletions(-) (limited to 'src/SourceWindow.cc') 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::RefPtrget_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%% (-∞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; -- cgit