summaryrefslogtreecommitdiffstats
path: root/gtk/src
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/src')
-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);