show volume in decibel

git-svn-id: file:///home/lennart/svn/public/pavucontrol/trunk@74 c17c95f2-f111-0410-90bf-f30a9569010c
This commit is contained in:
Lennart Poettering 2008-04-20 23:56:36 +00:00
parent 0fa6450239
commit 52abd202b5
2 changed files with 26 additions and 13 deletions

View File

@ -40,6 +40,7 @@
static pa_context *context = NULL; static pa_context *context = NULL;
static int n_outstanding = 0; static int n_outstanding = 0;
static bool show_decibel = true;
enum SinkInputType { enum SinkInputType {
SINK_INPUT_ALL, SINK_INPUT_ALL,
@ -86,6 +87,7 @@ public:
void onVolumeScaleValueChanged(); void onVolumeScaleValueChanged();
bool can_decibel;
bool volumeScaleEnabled; bool volumeScaleEnabled;
virtual void set_sensitive(bool enabled); virtual void set_sensitive(bool enabled);
@ -115,7 +117,7 @@ class StreamWidget : public MinimalStreamWidget {
public: public:
StreamWidget(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& x); StreamWidget(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& x);
void setChannelMap(const pa_channel_map &m); void setChannelMap(const pa_channel_map &m, bool can_decibel);
void setVolume(const pa_cvolume &volume, bool force); void setVolume(const pa_cvolume &volume, bool force);
virtual void updateChannelVolume(int channel, pa_volume_t v); virtual void updateChannelVolume(int channel, pa_volume_t v);
@ -145,6 +147,7 @@ public:
Glib::ustring description; Glib::ustring description;
Glib::ustring name; Glib::ustring name;
uint32_t index; uint32_t index;
bool can_decibel;
Gtk::CheckMenuItem defaultMenuItem; Gtk::CheckMenuItem defaultMenuItem;
@ -162,6 +165,7 @@ public:
Glib::ustring name; Glib::ustring name;
Glib::ustring description; Glib::ustring description;
uint32_t index; uint32_t index;
bool can_decibel;
Gtk::CheckMenuItem defaultMenuItem; Gtk::CheckMenuItem defaultMenuItem;
@ -327,17 +331,26 @@ ChannelWidget* ChannelWidget::create() {
} }
void ChannelWidget::setVolume(pa_volume_t volume) { void ChannelWidget::setVolume(pa_volume_t volume) {
double v = ((gdouble) volume * 100) / PA_VOLUME_NORM; double v;
char txt[64]; char txt[64];
snprintf(txt, sizeof(txt), "%0.0f%%", v); v = ((gdouble) volume * 100) / PA_VOLUME_NORM;
volumeLabel->set_text(txt);
if (v > 100) if (can_decibel && show_decibel) {
v = 100; double dB = pa_sw_volume_to_dB(volume);
if (dB > PA_DECIBEL_MININFTY) {
snprintf(txt, sizeof(txt), "%0.2f dB", dB);
volumeLabel->set_text(txt);
} else
volumeLabel->set_markup("-&#8734;dB");
} else {
snprintf(txt, sizeof(txt), "%0.0f%%", v);
volumeLabel->set_text(txt);
}
volumeScaleEnabled = false; volumeScaleEnabled = false;
volumeScale->set_value(v); volumeScale->set_value(v > 100 ? 100 : v);
volumeScaleEnabled = true; volumeScaleEnabled = true;
} }
@ -433,12 +446,13 @@ StreamWidget::StreamWidget(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Gl
channelWidgets[i] = NULL; channelWidgets[i] = NULL;
} }
void StreamWidget::setChannelMap(const pa_channel_map &m) { void StreamWidget::setChannelMap(const pa_channel_map &m, bool can_decibel) {
channelMap = m; channelMap = m;
for (int i = 0; i < m.channels; i++) { for (int i = 0; i < m.channels; i++) {
ChannelWidget *cw = channelWidgets[i] = ChannelWidget::create(); ChannelWidget *cw = channelWidgets[i] = ChannelWidget::create();
cw->channel = i; cw->channel = i;
cw->can_decibel = can_decibel;
cw->streamWidget = this; cw->streamWidget = this;
char text[64]; char text[64];
snprintf(text, sizeof(text), "<b>%s</b>", pa_channel_position_to_pretty_string(m.map[i])); snprintf(text, sizeof(text), "<b>%s</b>", pa_channel_position_to_pretty_string(m.map[i]));
@ -854,7 +868,7 @@ void MainWindow::updateSink(const pa_sink_info &info) {
w = sinkWidgets[info.index]; w = sinkWidgets[info.index];
else { else {
sinkWidgets[info.index] = w = SinkWidget::create(); sinkWidgets[info.index] = w = SinkWidget::create();
w->setChannelMap(info.channel_map); w->setChannelMap(info.channel_map, !!(info.flags & PA_SINK_DECIBEL_VOLUME));
sinksVBox->pack_start(*w, false, false, 0); sinksVBox->pack_start(*w, false, false, 0);
w->index = info.index; w->index = info.index;
is_new = true; is_new = true;
@ -890,7 +904,7 @@ void MainWindow::updateSource(const pa_source_info &info) {
w = sourceWidgets[info.index]; w = sourceWidgets[info.index];
else { else {
sourceWidgets[info.index] = w = SourceWidget::create(); sourceWidgets[info.index] = w = SourceWidget::create();
w->setChannelMap(info.channel_map); w->setChannelMap(info.channel_map, !!(info.flags & PA_SOURCE_DECIBEL_VOLUME));
sourcesVBox->pack_start(*w, false, false, 0); sourcesVBox->pack_start(*w, false, false, 0);
w->index = info.index; w->index = info.index;
is_new = true; is_new = true;
@ -926,7 +940,7 @@ void MainWindow::updateSinkInput(const pa_sink_input_info &info) {
w = sinkInputWidgets[info.index]; w = sinkInputWidgets[info.index];
else { else {
sinkInputWidgets[info.index] = w = SinkInputWidget::create(); sinkInputWidgets[info.index] = w = SinkInputWidget::create();
w->setChannelMap(info.channel_map); w->setChannelMap(info.channel_map, true);
streamsVBox->pack_start(*w, false, false, 0); streamsVBox->pack_start(*w, false, false, 0);
w->index = info.index; w->index = info.index;
w->clientIndex = info.client; w->clientIndex = info.client;
@ -968,7 +982,6 @@ void MainWindow::updateSourceOutput(const pa_source_output_info &info) {
w = sourceOutputWidgets[info.index]; w = sourceOutputWidgets[info.index];
else { else {
sourceOutputWidgets[info.index] = w = SourceOutputWidget::create(); sourceOutputWidgets[info.index] = w = SourceOutputWidget::create();
//w->setChannelMap(info.channel_map);
recsVBox->pack_start(*w, false, false, 0); recsVBox->pack_start(*w, false, false, 0);
w->index = info.index; w->index = info.index;
w->clientIndex = info.client; w->clientIndex = info.client;

View File

@ -1241,7 +1241,7 @@ Monitors</property>
<property name="xpad">0</property> <property name="xpad">0</property>
<property name="ypad">0</property> <property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">5</property> <property name="width_chars">9</property>
<property name="single_line_mode">False</property> <property name="single_line_mode">False</property>
<property name="angle">0</property> <property name="angle">0</property>
</widget> </widget>