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/ServerInfoManager.cc | 27 +- src/ServerInfoManager.hh | 8 + src/SinkInputWindow.cc | 10 +- src/SinkInputWindow.hh | 1 + src/SinkWindow.cc | 35 +- src/SinkWindow.hh | 4 +- src/SourceOutputWindow.cc | 9 +- src/SourceOutputWindow.hh | 1 + src/SourceWindow.cc | 62 ++- src/SourceWindow.hh | 17 +- src/paman.glade | 1081 ++++++++++++++++++++++++++++++--------------- 11 files changed, 860 insertions(+), 395 deletions(-) (limited to 'src') diff --git a/src/ServerInfoManager.cc b/src/ServerInfoManager.cc index a809de6..e1c978b 100644 --- a/src/ServerInfoManager.cc +++ b/src/ServerInfoManager.cc @@ -26,14 +26,16 @@ #include "ServerInfoManager.hh" #include "paman.hh" -SinkInfo::SinkInfo(const struct pa_sink_info &i) : +SinkInfo::SinkInfo(const pa_sink_info &i) : driver(i.driver), name(i.name), index(i.index), sample_spec(i.sample_spec), + channel_map(i.channel_map), monitor_source(i.monitor_source), owner_module(i.owner_module), volume(i.volume), + hw_volume_supported(!!(i.flags & PA_SINK_HW_VOLUME_CTRL)), latency(i.latency), monitor_source_name(i.monitor_source_name), window(NULL) { @@ -47,14 +49,16 @@ SinkInfo::~SinkInfo() { delete window; } -void SinkInfo::update(const struct pa_sink_info &i) { +void SinkInfo::update(const pa_sink_info &i) { driver = Glib::ustring(i.driver); name = Glib::ustring(i.name); index = i.index; sample_spec = i.sample_spec; + channel_map = i.channel_map; monitor_source = i.monitor_source; owner_module = i.owner_module; volume = i.volume; + hw_volume_supported = !!(i.flags & PA_SINK_HW_VOLUME_CTRL), latency = i.latency; monitor_source_name = i.monitor_source_name; @@ -76,13 +80,16 @@ void SinkInfo::showWindow() { } } -SourceInfo::SourceInfo(const struct pa_source_info &i) : +SourceInfo::SourceInfo(const pa_source_info &i) : driver(i.driver), name(i.name), index(i.index), sample_spec(i.sample_spec), + channel_map(i.channel_map), owner_module(i.owner_module), monitor_of_sink(i.monitor_of_sink), + volume(i.volume), + hw_volume_supported(!!(i.flags & PA_SINK_HW_VOLUME_CTRL)), latency(i.latency), window(NULL) { @@ -100,8 +107,11 @@ void SourceInfo::update(const struct pa_source_info &i) { name = i.name; index = i.index; sample_spec = i.sample_spec; + channel_map = i.channel_map; owner_module = i.owner_module; monitor_of_sink = i.monitor_of_sink; + volume = i.volume; + hw_volume_supported = !!(i.flags & PA_SOURCE_HW_VOLUME_CTRL), latency = i.latency; description = i.description ? i.description : ""; @@ -203,6 +213,7 @@ SinkInputInfo::SinkInputInfo(const struct pa_sink_input_info &i) : name(i.name), index(i.index), sample_spec(i.sample_spec), + channel_map(i.channel_map), sink(i.sink), client(i.client), owner_module(i.owner_module), @@ -223,6 +234,7 @@ void SinkInputInfo::update(const struct pa_sink_input_info &i) { name = i.name; index = i.index; sample_spec = i.sample_spec; + channel_map = i.channel_map; sink = i.sink; client = i.client; owner_module = i.owner_module; @@ -252,6 +264,7 @@ SourceOutputInfo::SourceOutputInfo(const struct pa_source_output_info &i) : name(i.name), index(i.index), sample_spec(i.sample_spec), + channel_map(i.channel_map), source(i.source), client(i.client), owner_module(i.owner_module), @@ -271,6 +284,7 @@ void SourceOutputInfo::update(const struct pa_source_output_info &i) { name = i.name; index = i.index; sample_spec = i.sample_spec; + channel_map = i.channel_map; source = i.source; client = i.client; owner_module = i.owner_module; @@ -733,6 +747,13 @@ void ServerInfoManager::setSinkVolume(uint32_t index, pa_volume_t volume) { pa_operation_unref(pa_context_set_sink_volume_by_index(&context, index, &cvol, NULL, NULL)); } +/* FIXME: Handle all channels separately. */ +void ServerInfoManager::setSourceVolume(uint32_t index, pa_volume_t volume) { + pa_cvolume cvol; + pa_cvolume_set(&cvol, sinks[index]->volume.channels, volume); + pa_operation_unref(pa_context_set_source_volume_by_index(&context, index, &cvol, NULL, NULL)); +} + /* FIXME: Handle all channels separately. */ void ServerInfoManager::setSinkInputVolume(uint32_t index, pa_volume_t volume) { pa_cvolume cvol; diff --git a/src/ServerInfoManager.hh b/src/ServerInfoManager.hh index 1b37e66..6467c05 100644 --- a/src/ServerInfoManager.hh +++ b/src/ServerInfoManager.hh @@ -58,9 +58,11 @@ public: Glib::ustring driver, name, description; uint32_t index; struct pa_sample_spec sample_spec; + struct pa_channel_map channel_map; uint32_t monitor_source; uint32_t owner_module; pa_cvolume volume; + int hw_volume_supported; pa_usec_t latency; Glib::ustring monitor_source_name; @@ -80,8 +82,11 @@ public: Glib::ustring driver, name, description; uint32_t index; struct pa_sample_spec sample_spec; + struct pa_channel_map channel_map; uint32_t owner_module; uint32_t monitor_of_sink; + pa_cvolume volume; + int hw_volume_supported; pa_usec_t latency; Gtk::TreeRowReference treeRef; @@ -133,6 +138,7 @@ public: Glib::ustring driver, name; uint32_t index; struct pa_sample_spec sample_spec; + struct pa_channel_map channel_map; uint32_t sink; uint32_t client; uint32_t owner_module; @@ -157,6 +163,7 @@ public: Glib::ustring driver, name; uint32_t index; struct pa_sample_spec sample_spec; + struct pa_channel_map channel_map; uint32_t source; uint32_t client; uint32_t owner_module; @@ -228,6 +235,7 @@ public: void removeSampleInfo(uint32_t index); void setSinkVolume(uint32_t index, pa_volume_t volume); + void setSourceVolume(uint32_t index, pa_volume_t volume); void setSinkInputVolume(uint32_t index, pa_volume_t volume); void showStatWindow(); diff --git a/src/SinkInputWindow.cc b/src/SinkInputWindow.cc index 0b8cc67..320189b 100644 --- a/src/SinkInputWindow.cc +++ b/src/SinkInputWindow.cc @@ -31,6 +31,7 @@ SinkInputWindow::SinkInputWindow(BaseObjectType* cobject, const Glib::RefPtrget_widget("nameLabel", nameLabel); refGlade->get_widget("indexLabel", indexLabel); refGlade->get_widget("sampleTypeLabel", sampleTypeLabel); + refGlade->get_widget("channelMapLabel", channelMapLabel); refGlade->get_widget("latencyLabel", latencyLabel); refGlade->get_widget("sinkLabel", sinkLabel); refGlade->get_widget("clientLabel", clientLabel); @@ -83,14 +85,15 @@ SinkInputWindow* SinkInputWindow::create() { } void SinkInputWindow::updateInfo(const SinkInputInfo &i) { - char t[80], ss[PA_SAMPLE_SPEC_SNPRINT_MAX]; + char t[80], ss[PA_SAMPLE_SPEC_SNPRINT_MAX], cm[PA_CHANNEL_MAP_SNPRINT_MAX]; double percent, db; nameLabel->set_text(i.name); 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)); if (i.owner_module == PA_INVALID_INDEX) ownerModuleLabel->set_markup("n/a"); @@ -113,6 +116,7 @@ void SinkInputWindow::updateInfo(const SinkInputInfo &i) { } percent = pa_sw_volume_to_linear(pa_cvolume_avg(&i.volume)) * 100; + /* FIXME: Hardware volume doesn't translate well to dB. */ db = pa_sw_volume_to_dB(pa_cvolume_avg(&i.volume)); scaleEnabled = false; diff --git a/src/SinkInputWindow.hh b/src/SinkInputWindow.hh index 29b4599..84a3ae4 100644 --- a/src/SinkInputWindow.hh +++ b/src/SinkInputWindow.hh @@ -37,6 +37,7 @@ public: Gtk::Label *nameLabel, *indexLabel, *sampleTypeLabel, + *channelMapLabel, *latencyLabel, *sinkLabel, *clientLabel, diff --git a/src/SinkWindow.cc b/src/SinkWindow.cc index 1999693..d6971dd 100644 --- a/src/SinkWindow.cc +++ b/src/SinkWindow.cc @@ -32,6 +32,7 @@ SinkWindow::SinkWindow(BaseObjectType* cobject, const Glib::RefPtrget_widget("descriptionLabel", descriptionLabel); refGlade->get_widget("indexLabel", indexLabel); refGlade->get_widget("sampleTypeLabel", sampleTypeLabel); + refGlade->get_widget("channelMapLabel", channelMapLabel); refGlade->get_widget("latencyLabel", latencyLabel); refGlade->get_widget("ownerModuleLabel", ownerModuleLabel); refGlade->get_widget("monitorSourceLabel", monitorSourceLabel); @@ -78,15 +80,15 @@ SinkWindow* SinkWindow::create() { } void SinkWindow::updateInfo(const SinkInfo &i) { - char t[64], ss[PA_SAMPLE_SPEC_SNPRINT_MAX]; - double percent, db; + char t[64], 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); @@ -96,16 +98,23 @@ void SinkWindow::updateInfo(const SinkInfo &i) { SourceInfo *source = serverInfoManager->getSourceInfo(i.monitor_source); monitorSourceLabel->set_text(source->name); - percent = pa_sw_volume_to_linear(pa_cvolume_avg(&i.volume)) * 100; - /* FIXME: Hardware volume doesn't translate well to dB. */ - db = pa_sw_volume_to_dB(pa_cvolume_avg(&i.volume)); + percent = ((double) pa_cvolume_avg(&i.volume) * 100) / PA_VOLUME_NORM; scaleEnabled = false; volumeScale->set_value(percent); scaleEnabled = true; - if (db != PA_DECIBEL_MININFTY) - snprintf(t, sizeof(t), "%0.0f%% (%0.2fdB)", percent, db); - else - snprintf(t, sizeof(t), "%0.0f%% (-∞dB)", percent); + + 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("Sink: "+i.name); @@ -115,7 +124,7 @@ void SinkWindow::updateInfo(const SinkInfo &i) { index = i.index; monitor_source_name = i.monitor_source_name; - toOwnerModuleButton->set_sensitive(owner_module != (uint32_t) -1); + toOwnerModuleButton->set_sensitive(owner_module != PA_INVALID_INDEX); } void SinkWindow::onCloseButton() { @@ -133,7 +142,7 @@ void SinkWindow::onToOwnerModuleButton() { void SinkWindow::onVolumeScaleValueChanged() { if (scaleEnabled) - serverInfoManager->setSinkVolume(index, pa_sw_volume_from_linear(volumeScale->get_value()/100)); + serverInfoManager->setSinkVolume(index, (pa_volume_t) (((double) volumeScale->get_value()/100) * PA_VOLUME_NORM)); } void SinkWindow::onVolumeResetButton() { diff --git a/src/SinkWindow.hh b/src/SinkWindow.hh index b3c26a8..dcabb3b 100644 --- a/src/SinkWindow.hh +++ b/src/SinkWindow.hh @@ -38,6 +38,7 @@ public: *descriptionLabel, *indexLabel, *sampleTypeLabel, + *channelMapLabel, *latencyLabel, *ownerModuleLabel, *monitorSourceLabel, @@ -64,8 +65,9 @@ public: virtual void onVolumeScaleValueChanged(); virtual void onVolumeResetButton(); virtual void onVolumeMuteButton(); - virtual bool on_delete_event(GdkEventAny* e); virtual void onVolumeMeterButton(); + + virtual bool on_delete_event(GdkEventAny* e); }; #endif diff --git a/src/SourceOutputWindow.cc b/src/SourceOutputWindow.cc index 0ba686f..836dade 100644 --- a/src/SourceOutputWindow.cc +++ b/src/SourceOutputWindow.cc @@ -31,6 +31,7 @@ SourceOutputWindow::SourceOutputWindow(BaseObjectType* cobject, const Glib::RefP nameLabel(NULL), indexLabel(NULL), sampleTypeLabel(NULL), + channelMapLabel(NULL), sourceLabel(NULL), clientLabel(NULL), ownerModuleLabel(NULL), @@ -45,6 +46,7 @@ SourceOutputWindow::SourceOutputWindow(BaseObjectType* cobject, const Glib::RefP refGlade->get_widget("nameLabel", nameLabel); refGlade->get_widget("indexLabel", indexLabel); refGlade->get_widget("sampleTypeLabel", sampleTypeLabel); + refGlade->get_widget("channelMapLabel", channelMapLabel); refGlade->get_widget("sourceLabel", sourceLabel); refGlade->get_widget("clientLabel", clientLabel); refGlade->get_widget("ownerModuleLabel", ownerModuleLabel); @@ -71,13 +73,14 @@ SourceOutputWindow* SourceOutputWindow::create() { } void SourceOutputWindow::updateInfo(const SourceOutputInfo &i) { - char t[100], ss[PA_SAMPLE_SPEC_SNPRINT_MAX]; + char t[100], ss[PA_SAMPLE_SPEC_SNPRINT_MAX], cm[PA_CHANNEL_MAP_SNPRINT_MAX]; nameLabel->set_text(i.name); 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)); if (i.owner_module == PA_INVALID_INDEX) ownerModuleLabel->set_markup("n/a"); diff --git a/src/SourceOutputWindow.hh b/src/SourceOutputWindow.hh index 71abe48..7ced848 100644 --- a/src/SourceOutputWindow.hh +++ b/src/SourceOutputWindow.hh @@ -37,6 +37,7 @@ public: Gtk::Label *nameLabel, *indexLabel, *sampleTypeLabel, + *channelMapLabel, *sourceLabel, *clientLabel, *ownerModuleLabel, 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; diff --git a/src/SourceWindow.hh b/src/SourceWindow.hh index 7cddff3..05e5167 100644 --- a/src/SourceWindow.hh +++ b/src/SourceWindow.hh @@ -34,25 +34,36 @@ public: *descriptionLabel, *indexLabel, *sampleTypeLabel, + *channelMapLabel, *ownerModuleLabel, *monitorOfSinkLabel, - *latencyLabel; + *latencyLabel, + *volumeLabel; Gtk::Button *closeButton, *toParentSinkButton, *toOwnerModuleButton, + *volumeResetButton, + *volumeMuteButton, *volumeMeterButton; - uint32_t monitor_of_sink, owner_module; + Gtk::HScale *volumeScale; + + uint32_t index, monitor_of_sink, owner_module; Glib::ustring source_name; + bool scaleEnabled; void updateInfo(const SourceInfo &i); virtual void onCloseButton(); virtual void onParentSinkButton(); virtual void onToOwnerModuleButton(); - virtual bool on_delete_event(GdkEventAny* e); + virtual void onVolumeScaleValueChanged(); + virtual void onVolumeResetButton(); + virtual void onVolumeMuteButton(); virtual void onVolumeMeterButton(); + + virtual bool on_delete_event(GdkEventAny* e); }; #endif diff --git a/src/paman.glade b/src/paman.glade index 71913e9..288a23f 100644 --- a/src/paman.glade +++ b/src/paman.glade @@ -1909,7 +1909,7 @@ True - 8 + 9 2 False 6 @@ -1971,90 +1971,6 @@ - - - True - <b>Monitor Source:</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 1 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 6 - 7 - fill - - - - - - - True - <b>Owner Module:</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 1 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 5 - 6 - fill - - - - - - - True - <b>Latency:</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 1 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 4 - 5 - fill - - - - True @@ -2111,34 +2027,6 @@ - - - True - True - foo - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 1 - 2 - 4 - 5 - - - - True @@ -2272,8 +2160,8 @@ 0 1 - 7 - 8 + 8 + 9 fill @@ -2365,26 +2253,197 @@ + + 1 + 2 + 8 + 9 + fill + fill + + + + + + True + <b>Monitor Source:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 7 + 8 + fill + + + + + + + True + True + foo + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + 1 2 7 8 - fill + fill + + + + + + + True + <b>Owner Module:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 6 + 7 + fill + + + + + + + True + True + foo + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 6 + 7 + fill + + + + + + + True + <b>Latency:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 5 + 6 + fill + + + + + + + True + True + foo + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 5 + 6 + fill + - + True - True - foo + <b>Channel Map:</b> False - False + True GTK_JUSTIFY_LEFT False - True - 0 + False + 1 0.5 0 0 @@ -2394,16 +2453,17 @@ 0 - 1 - 2 - 6 - 7 + 0 + 1 + 4 + 5 + fill - + True True foo @@ -2424,8 +2484,9 @@ 1 2 - 5 - 6 + 4 + 5 + fill @@ -2608,7 +2669,7 @@ 5 True - 7 + 9 2 False 6 @@ -2727,7 +2788,7 @@ - + True True foo @@ -2748,14 +2809,14 @@ 1 2 - 3 - 4 + 2 + 3 - + True True foo @@ -2776,14 +2837,14 @@ 1 2 - 2 - 3 + 1 + 2 - + True True foo @@ -2804,23 +2865,117 @@ 1 2 - 1 - 2 + 0 + 1 - + True - True - foo + False + 5 + + + + 80 + True + True + 100% + False + True + GTK_JUSTIFY_LEFT + False + True + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + 100 + True + True + False + GTK_POS_LEFT + 0 + GTK_UPDATE_DISCONTINUOUS + False + 147.692001343 0 500 10 100 20 + + + 0 + True + True + + + + + + True + Reset to 100%, i.e. normal volume + True + Reset + True + GTK_RELIEF_NONE + True + + + 0 + False + False + + + + + + True + Mute to 0%, i.e. turn this sink off + True + Mute + True + GTK_RELIEF_NONE + True + + + 0 + False + False + + + + + 1 + 2 + 8 + 9 + fill + + + + + + True + <b>Volume:</b> False - False + True GTK_JUSTIFY_LEFT False - True - 0 + False + 1 0.5 0 0 @@ -2830,10 +2985,11 @@ 0 - 1 - 2 - 0 - 1 + 0 + 1 + 8 + 9 + fill @@ -2859,8 +3015,37 @@ 0 1 - 6 - 7 + 7 + 8 + fill + + + + + + + True + True + foo + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 7 + 8 fill @@ -2887,8 +3072,37 @@ 0 1 - 5 - 6 + 6 + 7 + fill + + + + + + + True + True + foo + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 6 + 7 fill @@ -2915,15 +3129,15 @@ 0 1 - 4 - 5 + 5 + 6 fill - + True True foo @@ -2944,15 +3158,43 @@ 1 2 - 6 - 7 + 5 + 6 + fill + + + + + + + True + <b>Channel Map:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 4 + 5 fill - + True True foo @@ -2973,14 +3215,15 @@ 1 2 - 5 - 6 + 3 + 4 + fill - + True True foo @@ -3026,7 +3269,7 @@ True True True - To Owner Module + Go To Owner Module True GTK_RELIEF_NORMAL True @@ -3043,7 +3286,7 @@ True True True - To Parent Sink + Go To Parent Sink True GTK_RELIEF_NORMAL True @@ -3820,7 +4063,7 @@ True True True - To Owner Module + Go To Owner Module True GTK_RELIEF_NORMAL True @@ -3962,7 +4205,7 @@ True - 9 + 10 2 False 6 @@ -4109,15 +4352,16 @@ - + True - <b>Latency:</b> + True + label4755 False - True + False GTK_JUSTIFY_LEFT False - False - 1 + True + 0 0.5 0 0 @@ -4127,19 +4371,19 @@ 0 - 0 - 1 - 3 - 4 + 1 + 2 + 2 + 3 fill - + True - <b>Owner Module:</b> + <b>Volume:</b> False True GTK_JUSTIFY_LEFT @@ -4157,17 +4401,113 @@ 0 1 - 6 - 7 + 9 + 10 fill - + True - <b>Connected to Sink:</b> + False + 5 + + + + 80 + True + True + 100% + False + True + GTK_JUSTIFY_LEFT + False + True + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + 100 + True + True + False + GTK_POS_LEFT + 0 + GTK_UPDATE_DISCONTINUOUS + False + 147.692 0 500 10 100 20 + + + 0 + True + True + + + + + + True + Reset to 100%, i.e. normal volume + True + Reset + True + GTK_RELIEF_NONE + True + + + 0 + False + False + + + + + + True + Mute to 0%, i.e. turn this sink off + True + Mute + True + GTK_RELIEF_NONE + True + + + 0 + False + False + + + + + 1 + 2 + 9 + 10 + fill + fill + + + + + + True + <b>Resample Method:</b> False True GTK_JUSTIFY_LEFT @@ -4185,17 +4525,17 @@ 0 1 - 4 - 5 + 8 + 9 fill - + True - <b>Client:</b> + <b>Owner Module:</b> False True GTK_JUSTIFY_LEFT @@ -4213,18 +4553,18 @@ 0 1 - 5 - 6 + 7 + 8 fill - + True True - label4755 + label4834 False False GTK_JUSTIFY_LEFT @@ -4242,18 +4582,18 @@ 1 2 - 2 - 3 + 8 + 9 fill - + True True - label4756 + label4759 False False GTK_JUSTIFY_LEFT @@ -4271,18 +4611,18 @@ 1 2 - 3 - 4 + 7 + 8 fill - + True True - label4757 + label4758 False False GTK_JUSTIFY_LEFT @@ -4300,18 +4640,18 @@ 1 2 - 4 - 5 + 6 + 7 fill - + True True - label4758 + label4757 False False GTK_JUSTIFY_LEFT @@ -4337,16 +4677,15 @@ - + True - True - label4759 + <b>Client:</b> False - False + True GTK_JUSTIFY_LEFT False - True - 0 + False + 1 0.5 0 0 @@ -4356,8 +4695,8 @@ 0 - 1 - 2 + 0 + 1 6 7 fill @@ -4366,15 +4705,72 @@ - + True - <b>Volume:</b> + <b>Connected to Sink:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 5 + 6 + fill + + + + + + + True + <b>Latency:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 4 + 5 + fill + + + + + + + True + True + label4756 False - True + False GTK_JUSTIFY_LEFT False - False - 1 + True + 0 0.5 0 0 @@ -4383,116 +4779,20 @@ False 0 - - 0 - 1 - 8 - 9 - fill - - - - - - - True - False - 5 - - - - 80 - True - True - 100% - False - True - GTK_JUSTIFY_LEFT - False - True - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - 100 - True - True - False - GTK_POS_LEFT - 0 - GTK_UPDATE_DISCONTINUOUS - False - 147.692 0 500 10 100 20 - - - 0 - True - True - - - - - - True - Reset to 100%, i.e. normal volume - True - Reset - True - GTK_RELIEF_NONE - True - - - 0 - False - False - - - - - - True - Mute to 0%, i.e. turn this sink off - True - Mute - True - GTK_RELIEF_NONE - True - - - 0 - False - False - - - 1 2 - 8 - 9 + 4 + 5 fill - + True - <b>Resample Method:</b> + <b>Channel Map:</b> False True GTK_JUSTIFY_LEFT @@ -4510,18 +4810,18 @@ 0 1 - 7 - 8 + 3 + 4 fill - + True True - label4834 + label4755 False False GTK_JUSTIFY_LEFT @@ -4539,8 +4839,8 @@ 1 2 - 7 - 8 + 3 + 4 fill @@ -4741,7 +5041,7 @@ True - 8 + 9 2 False 6 @@ -4917,9 +5217,9 @@ - + True - <b>Owner Module:</b> + <b>Resample Method:</b> False True GTK_JUSTIFY_LEFT @@ -4937,23 +5237,24 @@ 0 1 - 6 - 7 + 8 + 9 fill - + True - <b>Client:</b> + True + label4836 False - True + False GTK_JUSTIFY_LEFT False - False - 1 + True + 0 0.5 0 0 @@ -4963,19 +5264,19 @@ 0 - 0 - 1 - 5 - 6 + 1 + 2 + 8 + 9 fill - + True - <b>Connected to Source:</b> + <b>Owner Module:</b> False True GTK_JUSTIFY_LEFT @@ -4993,17 +5294,46 @@ 0 1 - 4 - 5 + 7 + 8 fill - + True - <b>Latency:</b> + True + label4759 + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 7 + 8 + fill + + + + + + + True + <b>Client:</b> False True GTK_JUSTIFY_LEFT @@ -5021,18 +5351,18 @@ 0 1 - 3 - 4 + 6 + 7 fill - + True True - label4759 + label4758 False False GTK_JUSTIFY_LEFT @@ -5058,16 +5388,15 @@ - + True - True - label4758 + <b>Connected to Source:</b> False - False + True GTK_JUSTIFY_LEFT False - True - 0 + False + 1 0.5 0 0 @@ -5077,8 +5406,8 @@ 0 - 1 - 2 + 0 + 1 5 6 fill @@ -5108,6 +5437,34 @@ 1 2 + 5 + 6 + fill + + + + + + + True + <b>Latency:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 4 5 fill @@ -5137,17 +5494,17 @@ 1 2 - 3 - 4 + 4 + 5 fill - + True - <b>Resample Method:</b> + <b>Channel Map:</b> False True GTK_JUSTIFY_LEFT @@ -5165,18 +5522,18 @@ 0 1 - 7 - 8 + 3 + 4 fill - + True True - label4836 + label4755 False False GTK_JUSTIFY_LEFT @@ -5194,8 +5551,8 @@ 1 2 - 7 - 8 + 3 + 4 fill -- cgit