summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjstebbins <[email protected]>2011-04-05 20:46:35 +0000
committerjstebbins <[email protected]>2011-04-05 20:46:35 +0000
commit6c75ac124c15e395e3e8b004a188d262d8d3b692 (patch)
tree504cb94a43220b8d144a0c8b98a87c604fc55ffa
parentd54c2303fdf029738bfc198b011a8dff725635cf (diff)
LinGui: add audio gain adjustment and create advanced audio dialog.
Gain, DRC, and Sample Rate are now in an advanced audio dialog. This makes the audio tab less crowded and makes room for future improvements. git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@3903 b64f7644-9d1e-0410-96f1-a4d463321fa5
-rw-r--r--gtk/src/audiohandler.c95
-rw-r--r--gtk/src/callbacks.c13
-rw-r--r--gtk/src/ghb.ui333
-rw-r--r--gtk/src/hb-backend.c3
-rw-r--r--gtk/src/internal_defaults.xml2
-rw-r--r--gtk/src/main.c11
-rw-r--r--gtk/src/makedeps.py2
-rw-r--r--gtk/src/queuehandler.c10
8 files changed, 338 insertions, 131 deletions
diff --git a/gtk/src/audiohandler.c b/gtk/src/audiohandler.c
index d44960a04..b490c825a 100644
--- a/gtk/src/audiohandler.c
+++ b/gtk/src/audiohandler.c
@@ -172,7 +172,7 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
gint mux;
const GValue *pref_audio;
- const GValue *audio, *drc;
+ const GValue *audio, *drc, *gain;
gint acodec, bitrate, mix;
gdouble rate;
gint count, ii, list_count;
@@ -227,6 +227,7 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
rate = ghb_settings_combo_double(audio, "AudioSamplerate");
mix = ghb_settings_combo_int(audio, "AudioMixdown");
drc = ghb_settings_get_value(audio, "AudioTrackDRCSlider");
+ gain = ghb_settings_get_value(audio, "AudioTrackGain");
// If there are multiple audios using the same codec, then
// select sequential tracks for each. The hash keeps track
// of the tracks used for each codec.
@@ -294,6 +295,7 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
ghb_settings_set_string(settings, "AudioMixdown",
ghb_lookup_combo_string("AudioMixdown", ghb_int_value(mix)));
ghb_settings_set_value(settings, "AudioTrackDRCSlider", drc);
+ ghb_settings_set_value(settings, "AudioTrackGain", gain);
ghb_add_audio(ud, settings);
ghb_adjust_audio_rate_combos(ud);
}
@@ -354,9 +356,9 @@ ghb_audio_list_refresh_selected(signal_user_data_t *ud)
if (gtk_tree_selection_get_selected(selection, &store, &iter))
{
const gchar *track, *codec, *br, *sr, *mix;
- gchar *s_drc;
+ gchar *s_drc, *s_gain;
gint itrack;
- gdouble drc;
+ gdouble drc, gain;
// Get the row number
treepath = gtk_tree_model_get_path (store, &iter);
indices = gtk_tree_path_get_indices (treepath);
@@ -375,6 +377,8 @@ ghb_audio_list_refresh_selected(signal_user_data_t *ud)
br = ghb_settings_combo_option(asettings, "AudioBitrate");
sr = ghb_settings_combo_option(asettings, "AudioSamplerate");
mix = ghb_settings_combo_option(asettings, "AudioMixdown");
+ gain = ghb_settings_get_double(asettings, "AudioTrackGain");
+ s_gain = g_strdup_printf("%.fdB", gain);
drc = ghb_settings_get_double(asettings, "AudioTrackDRCSlider");
if (drc < 1.0)
@@ -389,9 +393,11 @@ ghb_audio_list_refresh_selected(signal_user_data_t *ud)
2, br,
3, sr,
4, mix,
- 5, s_drc,
+ 5, s_gain,
+ 6, s_drc,
-1);
g_free(s_drc);
+ g_free(s_gain);
}
}
@@ -535,23 +541,47 @@ audio_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
ghb_live_reset(ud);
}
+G_MODULE_EXPORT gchar*
+format_drc_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud)
+{
+ if (val < 1.0)
+ return g_strdup_printf("%-7s", "Off");
+ else
+ return g_strdup_printf("%-7.1f", val);
+}
+
G_MODULE_EXPORT void
drc_widget_changed_cb(GtkWidget *widget, gdouble val, signal_user_data_t *ud)
{
GValue *asettings;
- GtkLabel *label;
- gchar *drc;
g_debug("drc_widget_changed_cb ()");
+
if (block_updates) return;
+ ghb_check_dependency(ud, widget, NULL);
+ asettings = get_selected_asettings(ud);
+ if (asettings != NULL)
+ {
+ ghb_widget_to_setting(asettings, widget);
+ ghb_audio_list_refresh_selected(ud);
+ }
+ ghb_live_reset(ud);
+}
- label = GTK_LABEL(GHB_WIDGET(ud->builder, "drc_label"));
- if (val < 1.0)
- drc = g_strdup_printf("Off");
- else
- drc = g_strdup_printf("%.1f", val);
- gtk_label_set_text(label, drc);
- g_free(drc);
+G_MODULE_EXPORT gchar*
+format_gain_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud)
+{
+ return g_strdup_printf("%ddB", (int)val);
+}
+
+G_MODULE_EXPORT void
+gain_widget_changed_cb(GtkWidget *widget, gdouble val, signal_user_data_t *ud)
+{
+ GValue *asettings;
+
+ g_debug("gain_widget_changed_cb ()");
+
+ if (block_updates) return;
ghb_check_dependency(ud, widget, NULL);
asettings = get_selected_asettings(ud);
if (asettings != NULL)
@@ -591,9 +621,10 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings)
GtkListStore *store;
GtkTreeSelection *selection;
const gchar *track, *codec, *br, *sr, *mix;
- gchar *s_drc;
+ gchar *s_drc, *s_gain;
gint itrack;
gdouble drc;
+ gdouble gain;
g_debug("add_to_audio_list ()");
treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
@@ -606,6 +637,8 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings)
br = ghb_settings_combo_option(settings, "AudioBitrate");
sr = ghb_settings_combo_option(settings, "AudioSamplerate");
mix = ghb_settings_combo_option(settings, "AudioMixdown");
+ gain = ghb_settings_get_double(settings, "AudioTrackGain");
+ s_gain = g_strdup_printf("%.fdB", gain);
drc = ghb_settings_get_double(settings, "AudioTrackDRCSlider");
if (drc < 1.0)
@@ -621,10 +654,12 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings)
2, br,
3, sr,
4, mix,
- 5, s_drc,
+ 5, s_gain,
+ 6, s_drc,
-1);
gtk_tree_selection_select_iter(selection, &iter);
g_free(s_drc);
+ g_free(s_gain);
}
G_MODULE_EXPORT void
@@ -667,6 +702,7 @@ audio_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t
ghb_ui_update(ud, "AudioSamplerate", ghb_settings_get_value(asettings, "AudioSamplerate"));
ghb_ui_update(ud, "AudioMixdown", ghb_settings_get_value(asettings, "AudioMixdown"));
ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_settings_get_value(asettings, "AudioTrackDRCSlider"));
+ ghb_ui_update(ud, "AudioTrackGain", ghb_settings_get_value(asettings, "AudioTrackGain"));
block_updates = FALSE;
widget = GHB_WIDGET (ud->builder, "audio_remove");
gtk_widget_set_sensitive(widget, TRUE);
@@ -726,6 +762,8 @@ audio_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
ghb_settings_take_value(asettings, "AudioSamplerate", ghb_widget_value(widget));
widget = GHB_WIDGET(ud->builder, "AudioMixdown");
ghb_settings_take_value(asettings, "AudioMixdown", ghb_widget_value(widget));
+ widget = GHB_WIDGET(ud->builder, "AudioTrackGain");
+ ghb_settings_take_value(asettings, "AudioTrackGain", ghb_widget_value(widget));
widget = GHB_WIDGET(ud->builder, "AudioTrackDRCSlider");
ghb_settings_take_value(asettings, "AudioTrackDRCSlider", ghb_widget_value(widget));
@@ -733,6 +771,29 @@ audio_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
}
G_MODULE_EXPORT void
+audio_advanced_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
+{
+ GtkWidget *dialog;
+
+ g_debug("audio_advanced_clicked_cb ()");
+ dialog = GHB_WIDGET(ud->builder, "audio_dialog");
+ if (gtk_widget_get_visible(dialog))
+ gtk_widget_hide(dialog);
+ else
+ gtk_widget_show(dialog);
+}
+
+G_MODULE_EXPORT void
+audio_advanced_ok_cb(GtkWidget *xwidget, signal_user_data_t *ud)
+{
+ GtkWidget *dialog;
+
+ g_debug("audio_advanced_clicked_cb ()");
+ dialog = GHB_WIDGET(ud->builder, "audio_dialog");
+ gtk_widget_hide(dialog);
+}
+
+G_MODULE_EXPORT void
audio_remove_clicked_cb(GtkWidget *widget, signal_user_data_t *ud)
{
GtkTreeView *treeview;
@@ -788,7 +849,7 @@ ghb_set_audio(signal_user_data_t *ud, GValue *settings)
gint acodec_code;
GValue *alist;
- GValue *track, *audio, *acodec, *acodec_actual, *bitrate, *rate, *mix, *drc;
+ GValue *track, *audio, *acodec, *acodec_actual, *bitrate, *rate, *mix, *drc, *gain;
gint count, ii;
g_debug("set_audio");
@@ -806,6 +867,7 @@ ghb_set_audio(signal_user_data_t *ud, GValue *settings)
bitrate = ghb_settings_get_value(audio, "AudioBitrate");
rate = ghb_settings_get_value(audio, "AudioSamplerate");
mix = ghb_settings_get_value(audio, "AudioMixdown");
+ gain = ghb_settings_get_value(audio, "AudioTrackGain");
drc = ghb_settings_get_value(audio, "AudioTrackDRCSlider");
acodec_code = ghb_lookup_combo_int("AudioEncoder", acodec);
@@ -820,6 +882,7 @@ ghb_set_audio(signal_user_data_t *ud, GValue *settings)
ghb_settings_set_value(settings, "AudioBitrate", bitrate);
ghb_settings_set_value(settings, "AudioSamplerate", rate);
ghb_settings_set_value(settings, "AudioMixdown", mix);
+ ghb_settings_set_value(settings, "AudioTrackGain", gain);
ghb_settings_set_value(settings, "AudioTrackDRCSlider", drc);
ghb_add_audio(ud, settings);
ghb_adjust_audio_rate_combos(ud);
diff --git a/gtk/src/callbacks.c b/gtk/src/callbacks.c
index 0d8699c0d..f9b4afac6 100644
--- a/gtk/src/callbacks.c
+++ b/gtk/src/callbacks.c
@@ -4588,19 +4588,6 @@ format_deblock_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud)
}
G_MODULE_EXPORT gchar*
-format_drc_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud)
-{
- if (val <= 0.0)
- {
- return g_strdup_printf("Off");
- }
- else
- {
- return g_strdup_printf("%.1f", val);
- }
-}
-
-G_MODULE_EXPORT gchar*
format_vquality_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud)
{
gint vcodec = ghb_settings_combo_int(ud->settings, "VideoEncoder");
diff --git a/gtk/src/ghb.ui b/gtk/src/ghb.ui
index 9c3d1b44a..f5bb94300 100644
--- a/gtk/src/ghb.ui
+++ b/gtk/src/ghb.ui
@@ -257,6 +257,14 @@
<property name="page_size">0</property>
<property name="value">1</property>
</object>
+ <object class="GtkAdjustment" id="adjustment35">
+ <property name="upper">20</property>
+ <property name="lower">-20</property>
+ <property name="page_increment">1</property>
+ <property name="step_increment">1</property>
+ <property name="page_size">0</property>
+ <property name="value">0.0</property>
+ </object>
<object class="GtkAdjustment" id="preview_progress_adj">
<property name="upper">100</property>
<property name="lower">0</property>
@@ -2052,60 +2060,43 @@ FFMpeg's and Theora's scale is more linear. These encoders do not have a lossle
<property name="position">1</property>
</packing>
</child>
- </object>
- <packing>
- <property name="expand">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkTable" id="table1">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="n_rows">2</property>
- <property name="n_columns">7</property>
<child>
- <object class="GtkComboBox" id="AudioTrack">
- <property name="width_request">180</property>
+ <object class="GtkLabel" id="labela3">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-text" translatable="yes">List of audio tracks available from your source.</property>
- <signal handler="audio_track_changed_cb" name="changed"/>
- </object>
- <packing>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkComboBox" id="AudioEncoder">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-text" translatable="yes">Set the audio codec to encode this track with.</property>
- <signal handler="audio_codec_changed_cb" name="changed"/>
+ <property name="label" translatable="yes"></property>
</object>
<packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">GTK_FILL</property>
+ <property name="expand">True</property>
+ <property name="position">2</property>
</packing>
</child>
<child>
- <object class="GtkComboBox" id="AudioSamplerate">
+ <object class="GtkButton" id="audio_advanced">
<property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-text" translatable="yes">Set the sample rate of the output audio track.</property>
- <signal handler="audio_widget_changed_cb" name="changed"/>
+ <property name="tooltip-text" translatable="yes">Change advanced audio settings.</property>
+ <signal handler="audio_advanced_clicked_cb" name="clicked"/>
+ <property name="label">Advanced Audio</property>
</object>
<packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">GTK_FILL</property>
+ <property name="expand">False</property>
+ <property name="position">3</property>
</packing>
</child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="table1">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">4</property>
<child>
<object class="GtkLabel" id="label35">
<property name="visible">True</property>
@@ -2113,6 +2104,10 @@ FFMpeg's and Theora's scale is more linear. These encoders do not have a lossle
<property name="label" translatable="yes">Track</property>
</object>
<packing>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
@@ -2123,6 +2118,8 @@ FFMpeg's and Theora's scale is more linear. These encoders do not have a lossle
<property name="label" translatable="yes">Codec</property>
</object>
<packing>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="x_options">GTK_FILL</property>
@@ -2137,6 +2134,8 @@ FFMpeg's and Theora's scale is more linear. These encoders do not have a lossle
<property name="justify">GTK_JUSTIFY_CENTER</property>
</object>
<packing>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
<property name="left_attach">2</property>
<property name="right_attach">3</property>
<property name="x_options">GTK_FILL</property>
@@ -2144,107 +2143,76 @@ FFMpeg's and Theora's scale is more linear. These encoders do not have a lossle
</packing>
</child>
<child>
- <object class="GtkLabel" id="label38">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label" translatable="yes">Sample Rate</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- </object>
- <packing>
- <property name="left_attach">3</property>
- <property name="right_attach">4</property>
- <property name="x_options"/>
- </packing>
- </child>
- <child>
<object class="GtkLabel" id="label24">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">Mix</property>
</object>
<packing>
- <property name="left_attach">4</property>
- <property name="right_attach">5</property>
- <property name="x_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label39">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label" translatable="yes">DRC</property>
- </object>
- <packing>
- <property name="left_attach">5</property>
- <property name="right_attach">7</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
<child>
- <object class="GtkComboBox" id="AudioMixdown">
+ <object class="GtkComboBox" id="AudioTrack">
+ <property name="width_request">180</property>
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-text" translatable="yes">Set the mixdown of the output audio track.</property>
- <signal handler="audio_mix_changed_cb" name="changed"/>
+ <property name="tooltip-text" translatable="yes">List of audio tracks available from your source.</property>
+ <signal handler="audio_track_changed_cb" name="changed"/>
</object>
<packing>
- <property name="left_attach">4</property>
- <property name="right_attach">5</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
- <property name="x_options">GTK_FILL</property>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
</packing>
</child>
<child>
- <object class="GtkScaleButton" id="AudioTrackDRCSlider">
+ <object class="GtkComboBox" id="AudioEncoder">
<property name="visible">True</property>
- <property name="orientation">1</property>
- <property name="icons">audio-volume-muted
-audio-volume-high
-audio-volume-low
-audio-volume-medium</property>
- <property name="adjustment">adjustment28</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-markup" translatable="yes">&lt;b&gt;Dynamic Range Compression:&lt;/b&gt; Adjust the dynamic range of the output audio track.
-
-For source audio that has a wide dynamic range (very loud and very soft sequences), DRC allows you to 'compress' the range by making loud sections softer and soft sections louder.</property>
- <signal handler="drc_widget_changed_cb" name="value_changed"/>
+ <property name="tooltip-text" translatable="yes">Set the audio codec to encode this track with.</property>
+ <signal handler="audio_codec_changed_cb" name="changed"/>
</object>
<packing>
- <property name="left_attach">5</property>
- <property name="right_attach">6</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
<child>
- <object class="GtkLabel" id="drc_label">
+ <object class="GtkComboBox" id="AudioBitrate">
<property name="visible">True</property>
- <property name="width-chars">3</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label" translatable="yes">Off</property>
+ <property name="tooltip-text" translatable="yes">Set the bitrate to encode this track with.</property>
+ <signal handler="audio_widget_changed_cb" name="changed"/>
</object>
<packing>
- <property name="left_attach">6</property>
- <property name="right_attach">7</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
<child>
- <object class="GtkComboBox" id="AudioBitrate">
+ <object class="GtkComboBox" id="AudioMixdown">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-text" translatable="yes">Set the bitrate to encode this track with.</property>
- <signal handler="audio_widget_changed_cb" name="changed"/>
+ <property name="tooltip-text" translatable="yes">Set the mixdown of the output audio track.</property>
+ <signal handler="audio_mix_changed_cb" name="changed"/>
</object>
<packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
@@ -3868,6 +3836,179 @@ no-fast-pskip=0:no-dct-decimate=0:cabac=1</property>
</child>
</object>
+
+ <object class="GtkDialog" id="audio_dialog">
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Advanced Audio Settings</property>
+ <property name="modal">False</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="type_hint">dialog</property>
+ <property name="skip_taskbar_hint">True</property>
+ <property name="skip_pager_hint">True</property>
+ <signal name="delete_event" handler="gtk_widget_hide_on_delete"/>
+ <child internal-child="vbox">
+ <object class="GtkVBox" id="dialog-vbox10">
+ <property name="orientation">vertical</property>
+ <property name="visible">True</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkHBox" id="hbox55">
+ <property name="visible">True</property>
+ <property name="spacing">4</property>
+ <child>
+ <object class="GtkImage" id="image5">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="icon_name">hb-icon</property>
+ <property name="icon-size">6</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTable" id="table14">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">3</property>
+ <property name="row_spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="sr_label">
+ <property name="visible">True</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">Sample Rate:</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="AudioSamplerate">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip-text" translatable="yes">Set the sample rate of the output audio track.</property>
+ <signal handler="audio_widget_changed_cb" name="changed"/>
+ </object>
+ <packing>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="left_attach">2</property>
+ <property name="right_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="gain_label">
+ <property name="visible">True</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">Gain:</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHScale" id="AudioTrackGain">
+ <property name="visible">True</property>
+ <property name="width-request">200</property>
+ <property name="orientation">horizontal</property>
+ <property name="adjustment">adjustment35</property>
+ <property name="value_pos">right</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip-markup" translatable="yes">&lt;b&gt;Audio Gain:&lt;/b&gt; Adjust the amplification or attenuation of the output audio track.</property>
+ <signal handler="gain_widget_changed_cb" name="value_changed"/>
+ <signal name="format_value" handler="format_gain_cb"/>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">3</property>
+ <property name="x_options">GTK_FILL|GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="drc_label">
+ <property name="visible">True</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">Dynamic Range Compression:</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHScale" id="AudioTrackDRCSlider">
+ <property name="visible">True</property>
+ <property name="width-request">100</property>
+ <property name="orientation">horizontal</property>
+ <property name="value_pos">right</property>
+ <property name="adjustment">adjustment28</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip-markup" translatable="yes">&lt;b&gt;Dynamic Range Compression:&lt;/b&gt; Adjust the dynamic range of the output audio track.
+
+For source audio that has a wide dynamic range (very loud and very soft sequences), DRC allows you to 'compress' the range by making loud sections softer and soft sections louder.</property>
+ <signal handler="drc_widget_changed_cb" name="value_changed"/>
+ <signal name="format_value" handler="format_drc_cb"/>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">3</property>
+ <property name="x_options">GTK_FILL|GTK_EXPAND</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child internal-child="action_area">
+ <object class="GtkHButtonBox" id="dialog-action_area10">
+ <property name="visible">True</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="advanced_audio_ok">
+ <property name="label" translatable="yes">gtk-ok</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="audio_advanced_ok_cb"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-5">advanced_audio_ok</action-widget>
+ </action-widgets>
+ </object>
+
<object class="GtkDialog" id="prefs_dialog">
<property name="border_width">5</property>
<property name="title" translatable="yes">Preferences</property>
diff --git a/gtk/src/hb-backend.c b/gtk/src/hb-backend.c
index f6061c564..f453f98d3 100644
--- a/gtk/src/hb-backend.c
+++ b/gtk/src/hb-backend.c
@@ -4684,6 +4684,9 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
acodec = ghb_settings_combo_int(asettings, "AudioEncoder");
audio.out.codec = ghb_select_audio_codec(js, aconfig, acodec);
+ audio.out.gain =
+ ghb_settings_get_double(asettings, "AudioTrackGain");
+
audio.out.dynamic_range_compression =
ghb_settings_get_double(asettings, "AudioTrackDRCSlider");
if (audio.out.dynamic_range_compression < 1.0)
diff --git a/gtk/src/internal_defaults.xml b/gtk/src/internal_defaults.xml
index 51fa9bc18..21e293892 100644
--- a/gtk/src/internal_defaults.xml
+++ b/gtk/src/internal_defaults.xml
@@ -300,6 +300,8 @@
<integer>1</integer>
<key>AudioTrackDescription</key>
<string></string>
+ <key>AudioTrackGain</key>
+ <real>0</real>
<key>AudioTrackDRCSlider</key>
<real>0</real>
<key>AudioMixdown</key>
diff --git a/gtk/src/main.c b/gtk/src/main.c
index 176f0f489..7b5f3b6c6 100644
--- a/gtk/src/main.c
+++ b/gtk/src/main.c
@@ -333,9 +333,9 @@ bind_audio_tree_model (signal_user_data_t *ud)
selection = gtk_tree_view_get_selection (treeview);
// 12 columns in model. 6 are visible, the other 6 are for storing
// values that I need
- treestore = gtk_list_store_new(6, G_TYPE_STRING, G_TYPE_STRING,
+ treestore = gtk_list_store_new(7, G_TYPE_STRING, G_TYPE_STRING,
G_TYPE_STRING, G_TYPE_STRING,
- G_TYPE_STRING, G_TYPE_STRING);
+ G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
gtk_tree_view_set_model(treeview, GTK_TREE_MODEL(treestore));
cell = gtk_cell_renderer_text_new();
@@ -371,7 +371,12 @@ bind_audio_tree_model (signal_user_data_t *ud)
cell = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(
- _("DRC"), cell, "text", 5, NULL);
+ _("Gain"), cell, "text", 5, NULL);
+ gtk_tree_view_append_column(treeview, GTK_TREE_VIEW_COLUMN(column));
+
+ cell = gtk_cell_renderer_text_new();
+ column = gtk_tree_view_column_new_with_attributes(
+ _("DRC"), cell, "text", 6, NULL);
gtk_tree_view_append_column(treeview, GTK_TREE_VIEW_COLUMN(column));
g_signal_connect(selection, "changed", audio_list_selection_changed_cb, ud);
diff --git a/gtk/src/makedeps.py b/gtk/src/makedeps.py
index 2164ab4e7..a16b28ca5 100644
--- a/gtk/src/makedeps.py
+++ b/gtk/src/makedeps.py
@@ -54,6 +54,8 @@ dep_map = (
DepEntry("AudioEncoderActual", "AudioMixdown", "ac3pass|dtspass", True, False),
DepEntry("AudioEncoderActual", "AudioTrackDRCSlider", "ac3pass|dtspass", True, False),
DepEntry("AudioEncoderActual", "drc_label", "ac3pass|dtspass", True, False),
+ DepEntry("AudioEncoderActual", "AudioTrackGain", "ac3pass|dtspass", True, False),
+ DepEntry("AudioEncoderActual", "gain_label", "ac3pass|dtspass", True, False),
DepEntry("x264_bframes", "x264_bpyramid", "<2", True, False),
DepEntry("x264_bframes", "x264_direct", "0", True, False),
DepEntry("x264_bframes", "x264_b_adapt", "0", True, False),
diff --git a/gtk/src/queuehandler.c b/gtk/src/queuehandler.c
index 7fd6a82da..6b934c14e 100644
--- a/gtk/src/queuehandler.c
+++ b/gtk/src/queuehandler.c
@@ -523,9 +523,9 @@ audio_list_refresh(signal_user_data_t *ud)
do
{
const gchar *track, *codec, *br, *sr, *mix;
- gchar *s_drc;
+ gchar *s_drc, *s_gain;
gint itrack;
- gdouble drc;
+ gdouble drc, gain;
GValue *asettings;
audio_list = ghb_settings_get_value(ud->settings, "audio_list");
@@ -539,6 +539,8 @@ audio_list_refresh(signal_user_data_t *ud)
br = ghb_settings_combo_option(asettings, "AudioBitrate");
sr = ghb_settings_combo_option(asettings, "AudioSamplerate");
mix = ghb_settings_combo_option(asettings, "AudioMixdown");
+ gain = ghb_settings_get_double(asettings, "AudioTrackGain");
+ s_gain = g_strdup_printf("%.fdB", gain);
drc = ghb_settings_get_double(asettings, "AudioTrackDRCSlider");
if (drc < 1.0)
@@ -553,9 +555,11 @@ audio_list_refresh(signal_user_data_t *ud)
2, br,
3, sr,
4, mix,
- 5, s_drc,
+ 5, s_gain,
+ 6, s_drc,
-1);
g_free(s_drc);
+ g_free(s_gain);
done = !gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
row++;
} while (!done);