diff --git a/src/channelwidget.cc b/src/channelwidget.cc index cc9988b..d58bf96 100644 --- a/src/channelwidget.cc +++ b/src/channelwidget.cc @@ -47,16 +47,32 @@ ChannelWidget::ChannelWidget(BaseObjectType* cobject, const Glib::RefPtrsignal_value_changed().connect(sigc::mem_fun(*this, &ChannelWidget::onVolumeScaleValueChanged)); } -ChannelWidget* ChannelWidget::create() { +ChannelWidget* ChannelWidget::createOne(MinimalStreamWidget *owner, int channelIndex, pa_channel_position channelPosition, bool can_decibel) { ChannelWidget* w; Glib::RefPtr x = Gtk::Builder::create(); x->add_from_file(GLADE_FILE, "adjustment1"); x->add_from_file(GLADE_FILE, "channelWidget"); x->get_widget_derived("channelWidget", w); w->reference(); + + w->channel = channelIndex; + w->can_decibel = can_decibel; + w->minimalStreamWidget = owner; + + char text[64]; + snprintf(text, sizeof(text), "%s", pa_channel_position_to_pretty_string(channelPosition)); + w->channelLabel->set_markup(text); + return w; } +void ChannelWidget::create(MinimalStreamWidget *owner, const pa_channel_map &m, bool can_decibel, ChannelWidget *widgets[PA_CHANNELS_MAX]) { + for (int i = 0; i < m.channels; i++) + widgets[i] = ChannelWidget::createOne(owner, i, m.map[i], can_decibel); + + widgets[m.channels - 1]->last = true; +} + void ChannelWidget::setVolume(pa_volume_t volume) { double v; char txt[64]; diff --git a/src/channelwidget.h b/src/channelwidget.h index bcfa48d..c9c5c9d 100644 --- a/src/channelwidget.h +++ b/src/channelwidget.h @@ -28,7 +28,11 @@ class MinimalStreamWidget; class ChannelWidget : public Gtk::EventBox { public: ChannelWidget(BaseObjectType* cobject, const Glib::RefPtr& x); - static ChannelWidget* create(); + + /* This creates multiple ChannelWidgets based on the given channel map. The + * widgets are stored in the caller-provided array. */ + static void create(MinimalStreamWidget *owner, const pa_channel_map &m, bool can_decibel, + ChannelWidget *widgets[PA_CHANNELS_MAX]); void setVolume(pa_volume_t volume); @@ -47,7 +51,10 @@ public: virtual void set_sensitive(bool enabled); virtual void setBaseVolume(pa_volume_t); + +private: + static ChannelWidget *createOne(MinimalStreamWidget *owner, int channelIndex, pa_channel_position channelPosition, + bool can_decibel); }; - #endif diff --git a/src/devicewidget.cc b/src/devicewidget.cc index 0a51bc0..b7405bb 100644 --- a/src/devicewidget.cc +++ b/src/devicewidget.cc @@ -83,19 +83,13 @@ void DeviceWidget::init(MainWindow* mainWindow, Glib::ustring deviceType) { void DeviceWidget::setChannelMap(const pa_channel_map &m, bool can_decibel) { channelMap = m; + ChannelWidget::create(this, m, can_decibel, channelWidgets); for (int i = 0; i < m.channels; i++) { - ChannelWidget *cw = channelWidgets[i] = ChannelWidget::create(); - cw->channel = i; - cw->can_decibel = can_decibel; - cw->minimalStreamWidget = this; - char text[64]; - snprintf(text, sizeof(text), "%s", pa_channel_position_to_pretty_string(m.map[i])); - cw->channelLabel->set_markup(text); + ChannelWidget *cw = channelWidgets[i]; channelsVBox->pack_start(*cw, false, false, 0); cw->unreference(); } - channelWidgets[m.channels-1]->last = true; lockToggleButton->set_sensitive(m.channels > 1); hideLockedChannels(lockToggleButton->get_active()); diff --git a/src/streamwidget.cc b/src/streamwidget.cc index 8aab675..00b7796 100644 --- a/src/streamwidget.cc +++ b/src/streamwidget.cc @@ -76,18 +76,14 @@ bool StreamWidget::onContextTriggerEvent(GdkEventButton* event) { void StreamWidget::setChannelMap(const pa_channel_map &m, bool can_decibel) { channelMap = m; + ChannelWidget::create(this, m, can_decibel, channelWidgets); + for (int i = 0; i < m.channels; i++) { - ChannelWidget *cw = channelWidgets[i] = ChannelWidget::create(); - cw->channel = i; - cw->can_decibel = can_decibel; - cw->minimalStreamWidget = this; - char text[64]; - snprintf(text, sizeof(text), "%s", pa_channel_position_to_pretty_string(m.map[i])); - cw->channelLabel->set_markup(text); + ChannelWidget *cw = channelWidgets[i]; channelsVBox->pack_start(*cw, false, false, 0); cw->unreference(); } - channelWidgets[m.channels-1]->last = true; + channelWidgets[m.channels-1]->setBaseVolume(PA_VOLUME_NORM); lockToggleButton->set_sensitive(m.channels > 1);