summaryrefslogtreecommitdiffstats
path: root/gtk
diff options
context:
space:
mode:
authorjstebbins <[email protected]>2011-10-12 20:19:33 +0000
committerjstebbins <[email protected]>2011-10-12 20:19:33 +0000
commit9d95d88d5a05abf6086ab474c0aa2583a9da6345 (patch)
tree5ff672576f6efacb2f03a36b85a88a8b2d3e85e1 /gtk
parentd41d9e0d88a689a11fe0978d4e415b89e72c2e62 (diff)
Add flac + quality + compression level support
Adds flac audio to cli, lingui, and macgui Adds quality and compression level options to cli Adds quality option to lingui Quality option works for vorbis and lame git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@4281 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'gtk')
-rw-r--r--gtk/src/audiohandler.c255
-rw-r--r--gtk/src/audiohandler.h2
-rw-r--r--gtk/src/callbacks.c12
-rw-r--r--gtk/src/ghb.ui499
-rw-r--r--gtk/src/hb-backend.c66
-rw-r--r--gtk/src/hb-backend.h5
-rw-r--r--gtk/src/internal_defaults.xml4
-rw-r--r--gtk/src/makedeps.py16
-rw-r--r--gtk/src/queuehandler.c86
9 files changed, 667 insertions, 278 deletions
diff --git a/gtk/src/audiohandler.c b/gtk/src/audiohandler.c
index 90256d6cf..13c26e90d 100644
--- a/gtk/src/audiohandler.c
+++ b/gtk/src/audiohandler.c
@@ -175,7 +175,7 @@ ghb_adjust_audio_rate_combos(signal_user_data_t *ud)
bitrate = aconfig->in.bitrate / 1000;
// Set the values for bitrate and samplerate to the input rates
- ghb_set_passthru_bitrate_opts (ud->builder, bitrate);
+ ghb_set_bitrate_opts (ud->builder, bitrate, bitrate, bitrate);
mix = 0;
ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix));
select_acodec &= aconfig->in.codec | HB_ACODEC_PASS_FLAG;
@@ -203,7 +203,7 @@ ghb_adjust_audio_rate_combos(signal_user_data_t *ud)
int low, high;
mix = ghb_get_best_mix( aconfig, select_acodec, mix);
hb_get_audio_bitrate_limits(select_acodec, sr, mix, &low, &high);
- ghb_set_default_bitrate_opts (ud->builder, low, high);
+ ghb_set_bitrate_opts (ud->builder, low, high, -1);
}
ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(bitrate));
@@ -250,9 +250,9 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
gint mux;
const GValue *pref_audio;
- const GValue *audio, *drc, *gain;
+ const GValue *audio, *drc, *gain, *enable_qual;
gint acodec, bitrate, mix;
- gdouble rate;
+ gdouble rate, quality;
gint count, ii, list_count;
g_debug("set_pref_audio");
@@ -288,6 +288,8 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
mix = ghb_settings_combo_int(audio, "AudioMixdown");
drc = ghb_settings_get_value(audio, "AudioTrackDRCSlider");
gain = ghb_settings_get_value(audio, "AudioTrackGain");
+ enable_qual = ghb_settings_get_value(audio, "AudioTrackQualityEnable");
+ quality = ghb_settings_get_double(audio, "AudioTrackQuality");
// 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.
@@ -324,6 +326,7 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
bitrate = aconfig->in.bitrate / 1000;
bitrate = hb_get_best_audio_bitrate(select_acodec, bitrate,
aconfig->in.samplerate, mix);
+ quality = hb_get_default_audio_quality( select_acodec );
rate = 0;
}
}
@@ -342,6 +345,8 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
ghb_lookup_combo_string("AudioEncoder", ghb_int_value(acodec)));
ghb_settings_set_value(settings, "AudioEncoderActual",
ghb_lookup_acodec_value(select_acodec));
+ ghb_settings_set_value(settings, "AudioTrackQualityEnable", enable_qual);
+ ghb_settings_set_double(settings, "AudioTrackQuality", quality);
// This gets set autimatically if the codec is passthru
ghb_settings_set_string(settings, "AudioBitrate",
ghb_lookup_combo_string("AudioBitrate", ghb_int_value(bitrate)));
@@ -412,7 +417,7 @@ 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, *s_gain;
+ gchar *s_drc, *s_gain, *s_quality = NULL;
gint itrack;
gdouble drc, gain;
// Get the row number
@@ -430,7 +435,17 @@ ghb_audio_list_refresh_selected(signal_user_data_t *ud)
track = ghb_settings_combo_option(asettings, "AudioTrack");
itrack = ghb_settings_combo_int(asettings, "AudioTrack");
codec = ghb_settings_combo_option(asettings, "AudioEncoderActual");
- br = ghb_settings_combo_option(asettings, "AudioBitrate");
+ double quality = ghb_settings_get_double(asettings, "AudioTrackQuality");
+ if (ghb_settings_get_boolean(asettings, "AudioTrackQualityEnable") &&
+ quality >= 0)
+ {
+ int codec = ghb_settings_combo_int(asettings, "AudioEncoderActual");
+ s_quality = ghb_format_quality("Q/", codec, quality);
+ }
+ else
+ {
+ 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");
@@ -446,7 +461,7 @@ ghb_audio_list_refresh_selected(signal_user_data_t *ud)
// These are displayed in list
0, track,
1, codec,
- 2, br,
+ 2, s_quality ? s_quality : br,
3, sr,
4, mix,
5, s_gain,
@@ -454,6 +469,78 @@ ghb_audio_list_refresh_selected(signal_user_data_t *ud)
-1);
g_free(s_drc);
g_free(s_gain);
+ g_free(s_quality);
+ }
+}
+
+void
+ghb_audio_list_refresh(signal_user_data_t *ud)
+{
+ GtkTreeView *treeview;
+ GtkTreeIter iter;
+ GtkListStore *store;
+ gboolean done;
+ gint row = 0;
+ const GValue *audio_list;
+
+ g_debug("ghb_audio_list_refresh ()");
+ treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
+ store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview));
+ if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter))
+ {
+ do
+ {
+ const gchar *track, *codec, *br, *sr, *mix;
+ gchar *s_drc, *s_gain, *s_quality = NULL;
+ gint itrack;
+ gdouble drc, gain;
+ GValue *asettings;
+
+ audio_list = ghb_settings_get_value(ud->settings, "audio_list");
+ if (row >= ghb_array_len(audio_list))
+ return;
+ asettings = ghb_array_get_nth(audio_list, row);
+
+ track = ghb_settings_combo_option(asettings, "AudioTrack");
+ itrack = ghb_settings_combo_int(asettings, "AudioTrack");
+ codec = ghb_settings_combo_option(asettings, "AudioEncoderActual");
+ double quality = ghb_settings_get_double(asettings, "AudioTrackQuality");
+ if (ghb_settings_get_boolean(asettings, "AudioTrackQualityEnable") &&
+ quality >= 0)
+ {
+ int codec = ghb_settings_combo_int(asettings, "AudioEncoderActual");
+ s_quality = ghb_format_quality("Q/", codec, quality);
+ }
+ else
+ {
+ 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)
+ s_drc = g_strdup("Off");
+ else
+ s_drc = g_strdup_printf("%.1f", drc);
+
+ gtk_list_store_set(GTK_LIST_STORE(store), &iter,
+ // These are displayed in list
+ 0, track,
+ 1, codec,
+ 2, s_quality ? s_quality : br,
+ 3, sr,
+ 4, mix,
+ 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);
}
}
@@ -467,17 +554,16 @@ audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
g_debug("audio_codec_changed_cb ()");
gval = ghb_widget_value(widget);
acodec_code = ghb_lookup_combo_int("AudioEncoder", gval);
+ ghb_value_free(gval);
+
if (block_updates)
{
prev_acodec = acodec_code;
ghb_grey_combo_options (ud);
+ ghb_check_dependency(ud, widget, NULL);
return;
}
- gval = ghb_widget_value(widget);
- acodec_code = ghb_lookup_combo_int("AudioEncoder", gval);
- ghb_value_free(gval);
-
asettings = get_selected_asettings(ud);
if (ghb_audio_is_passthru (prev_acodec) &&
!ghb_audio_is_passthru (acodec_code))
@@ -533,6 +619,21 @@ audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
}
ghb_update_destination_extension(ud);
ghb_live_reset(ud);
+
+ float low, high, gran, defval;
+ int dir;
+ hb_get_audio_quality_limits(acodec_code, &low, &high, &gran, &dir);
+ defval = hb_get_default_audio_quality(acodec_code);
+ GtkScaleButton *sb;
+ GtkAdjustment *adj;
+ sb = GTK_SCALE_BUTTON(GHB_WIDGET(ud->builder, "AudioTrackQuality"));
+ adj = gtk_scale_button_get_adjustment(sb);
+ if (dir)
+ {
+ // Quality values are inverted
+ defval = high - defval + low;
+ }
+ gtk_adjustment_configure (adj, defval, low, high, gran, gran * 10, 0);
}
G_MODULE_EXPORT void
@@ -543,6 +644,7 @@ audio_track_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
g_debug("audio_track_changed_cb ()");
if (block_updates)
{
+ ghb_check_dependency(ud, widget, NULL);
ghb_grey_combo_options (ud);
return;
}
@@ -569,7 +671,11 @@ audio_mix_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
GValue *asettings;
g_debug("audio_mix_changed_cb ()");
- if (block_updates) return;
+ if (block_updates)
+ {
+ ghb_check_dependency(ud, widget, NULL);
+ return;
+ }
ghb_adjust_audio_rate_combos(ud);
ghb_check_dependency(ud, widget, NULL);
@@ -588,10 +694,13 @@ audio_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
GValue *asettings;
g_debug("audio_widget_changed_cb ()");
- if (block_updates) return;
+ if (block_updates)
+ {
+ ghb_check_dependency(ud, widget, NULL);
+ return;
+ }
ghb_adjust_audio_rate_combos(ud);
- ghb_check_dependency(ud, widget, NULL);
asettings = get_selected_asettings(ud);
if (asettings != NULL)
{
@@ -605,7 +714,11 @@ G_MODULE_EXPORT void
global_audio_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
{
g_debug("global_audio_widget_changed_cb ()");
- if (block_updates) return;
+ if (block_updates)
+ {
+ ghb_check_dependency(ud, widget, NULL);
+ return;
+ }
ghb_check_dependency(ud, widget, NULL);
ghb_widget_to_setting(ud->settings, widget);
@@ -623,6 +736,64 @@ format_drc_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud)
return g_strdup_printf("%-7.1f", val);
}
+static inline int is_close(float a, float b, float metric)
+{
+ float diff = a - b;
+ diff = (diff > 0) ? diff : -diff;
+ return diff < metric;
+}
+
+char * ghb_format_quality( const char *prefix, int codec, double quality )
+{
+ float low, high, gran;
+ int dir;
+ hb_get_audio_quality_limits(codec, &low, &high, &gran, &dir);
+
+ int digits;
+ float tmp = gran;
+ while (1)
+ {
+ if (is_close(tmp, (int)tmp, gran / 10))
+ break;
+ digits++;
+ tmp *= 10;
+ }
+ return g_strdup_printf("%s%.*f", prefix, digits, quality);
+}
+
+G_MODULE_EXPORT void
+quality_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
+{
+ GValue *asettings;
+
+ g_debug("quality_widget_changed_cb ()");
+
+ ghb_check_dependency(ud, widget, NULL);
+ float low, high, gran;
+ int dir;
+ int codec = ghb_settings_combo_int(ud->settings, "AudioEncoderActual");
+ hb_get_audio_quality_limits(codec, &low, &high, &gran, &dir);
+ double quality = ghb_widget_double(widget);
+ if (dir)
+ {
+ // Quality values are inverted
+ quality = high - quality + low;
+ }
+ char *s_quality = ghb_format_quality("", codec, quality);
+ ghb_ui_update( ud, "AudioTrackQualityValue", ghb_string_value(s_quality));
+ g_free(s_quality);
+
+ if (block_updates) return;
+
+ asettings = get_selected_asettings(ud);
+ if (asettings != NULL)
+ {
+ ghb_settings_set_double(asettings, "AudioTrackQuality", quality);
+ ghb_audio_list_refresh_selected(ud);
+ }
+ ghb_live_reset(ud);
+}
+
G_MODULE_EXPORT void
drc_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
{
@@ -630,8 +801,18 @@ drc_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
g_debug("drc_widget_changed_cb ()");
- if (block_updates) return;
ghb_check_dependency(ud, widget, NULL);
+ if (block_updates) return;
+
+ double drc = ghb_widget_double(widget);
+ char *s_drc;
+ if (drc < 0.99)
+ s_drc = g_strdup("Off");
+ else
+ s_drc = g_strdup_printf("%.1f", drc);
+ ghb_ui_update( ud, "AudioTrackDRCValue", ghb_string_value(s_drc));
+ g_free(s_drc);
+
asettings = get_selected_asettings(ud);
if (asettings != NULL)
{
@@ -656,9 +837,19 @@ gain_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
g_debug("gain_widget_changed_cb ()");
- if (block_updates) return;
ghb_check_dependency(ud, widget, NULL);
+ if (block_updates) return;
asettings = get_selected_asettings(ud);
+
+ int gain = ghb_widget_int(widget);
+ char *s_gain;
+ if ( gain >= 21.0 )
+ s_gain = g_strdup_printf("*11*");
+ else
+ s_gain = g_strdup_printf("%ddB", gain);
+ ghb_ui_update( ud, "AudioTrackGainValue", ghb_string_value(s_gain));
+ g_free(s_gain);
+
if (asettings != NULL)
{
ghb_widget_to_setting(asettings, widget);
@@ -696,7 +887,7 @@ 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, *s_gain;
+ gchar *s_drc, *s_gain, *s_quality = NULL;
gint itrack;
gdouble drc;
gdouble gain;
@@ -709,7 +900,17 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings)
track = ghb_settings_combo_option(settings, "AudioTrack");
itrack = ghb_settings_combo_int(settings, "AudioTrack");
codec = ghb_settings_combo_option(settings, "AudioEncoderActual");
- br = ghb_settings_combo_option(settings, "AudioBitrate");
+ double quality = ghb_settings_get_double(settings, "AudioTrackQuality");
+ if (ghb_settings_get_boolean(settings, "AudioTrackQualityEnable") &&
+ quality >= 0)
+ {
+ int codec = ghb_settings_combo_int(settings, "AudioEncoderActual");
+ s_quality = ghb_format_quality("Q/", codec, quality);
+ }
+ else
+ {
+ 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");
@@ -726,7 +927,7 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings)
// These are displayed in list
0, track,
1, codec,
- 2, br,
+ 2, s_quality ? s_quality : br,
3, sr,
4, mix,
5, s_gain,
@@ -735,6 +936,7 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings)
gtk_tree_selection_select_iter(selection, &iter);
g_free(s_drc);
g_free(s_gain);
+ g_free(s_quality);
}
G_MODULE_EXPORT void
@@ -779,6 +981,8 @@ audio_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t
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"));
+ ghb_ui_update(ud, "AudioTrackQuality", ghb_settings_get_value(asettings, "AudioTrackQuality"));
+ ghb_ui_update(ud, "AudioTrackQualityEnable", ghb_settings_get_value(asettings, "AudioTrackQualityEnable"));
block_updates = FALSE;
widget = GHB_WIDGET (ud->builder, "audio_remove");
gtk_widget_set_sensitive(widget, TRUE);
@@ -838,6 +1042,10 @@ audio_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
ghb_settings_take_value(asettings, "AudioEncoder", ghb_widget_value(widget));
ghb_settings_set_value(asettings, "AudioEncoderActual",
ghb_settings_get_value(ud->settings, "AudioEncoderActual"));
+ widget = GHB_WIDGET(ud->builder, "AudioTrackQualityEnable");
+ ghb_settings_take_value(asettings, "AudioTrackQualityEnable", ghb_widget_value(widget));
+ widget = GHB_WIDGET(ud->builder, "AudioTrackQuality");
+ ghb_settings_take_value(asettings, "AudioTrackQuality", ghb_widget_value(widget));
widget = GHB_WIDGET(ud->builder, "AudioBitrate");
ghb_settings_take_value(asettings, "AudioBitrate", ghb_widget_value(widget));
widget = GHB_WIDGET(ud->builder, "AudioSamplerate");
@@ -931,7 +1139,8 @@ 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, *gain;
+ GValue *track, *audio, *acodec, *acodec_actual, *bitrate, *rate,
+ *mix, *drc, *gain, *quality, *enable_quality;
gint count, ii;
g_debug("set_audio");
@@ -946,6 +1155,8 @@ ghb_set_audio(signal_user_data_t *ud, GValue *settings)
track = ghb_settings_get_value(audio, "AudioTrack");
acodec = ghb_settings_get_value(audio, "AudioEncoder");
acodec_actual = ghb_settings_get_value(audio, "AudioEncoderActual");
+ enable_quality = ghb_settings_get_value(audio, "AudioTrackQualityEnable");
+ quality = ghb_settings_get_value(audio, "AudioTrackQuality");
bitrate = ghb_settings_get_value(audio, "AudioBitrate");
rate = ghb_settings_get_value(audio, "AudioSamplerate");
mix = ghb_settings_get_value(audio, "AudioMixdown");
@@ -959,6 +1170,8 @@ ghb_set_audio(signal_user_data_t *ud, GValue *settings)
ghb_settings_set_value(settings, "AudioTrack", track);
ghb_settings_set_value(settings, "AudioEncoder", acodec);
ghb_settings_set_value(settings, "AudioEncoderActual", acodec_actual);
+ ghb_settings_set_value(settings, "AudioTrackQualityEnable", enable_quality);
+ ghb_settings_set_value(settings, "AudioTrackQuality", quality);
// This gets set autimatically if the codec is passthru
ghb_settings_set_value(settings, "AudioBitrate", bitrate);
diff --git a/gtk/src/audiohandler.h b/gtk/src/audiohandler.h
index 88ee306ae..6ecca9983 100644
--- a/gtk/src/audiohandler.h
+++ b/gtk/src/audiohandler.h
@@ -36,5 +36,7 @@ gchar* ghb_get_user_audio_lang(
void ghb_audio_list_refresh_selected(signal_user_data_t *ud);
gint ghb_select_audio_codec(gint mux, hb_audio_config_t *aconfig, gint acodec, gint fallback_acodec, gint copy_mask);
int ghb_get_copy_mask(GValue *settings);
+void ghb_audio_list_refresh(signal_user_data_t *ud);
+char * ghb_format_quality( const char *prefix, int codec, double quality );
#endif // _AUDIOHANDLER_H_
diff --git a/gtk/src/callbacks.c b/gtk/src/callbacks.c
index 7b7b81f52..cce28befd 100644
--- a/gtk/src/callbacks.c
+++ b/gtk/src/callbacks.c
@@ -237,7 +237,6 @@ ghb_check_dependency(
continue;
}
sensitive = dep_check(ud, dep_name, &hide);
- g_free(dep_name);
if (GTK_IS_ACTION(dep_object))
{
gtk_action_set_sensitive(GTK_ACTION(dep_object), sensitive);
@@ -248,13 +247,20 @@ ghb_check_dependency(
gtk_widget_set_sensitive(GTK_WIDGET(dep_object), sensitive);
if (!sensitive && hide)
{
- gtk_widget_hide(GTK_WIDGET(dep_object));
+ if (gtk_widget_get_visible(GTK_WIDGET(dep_object)))
+ {
+ gtk_widget_hide(GTK_WIDGET(dep_object));
+ }
}
else
{
- gtk_widget_show_now(GTK_WIDGET(dep_object));
+ if (!gtk_widget_get_visible(GTK_WIDGET(dep_object)))
+ {
+ gtk_widget_show_now(GTK_WIDGET(dep_object));
+ }
}
}
+ g_free(dep_name);
}
}
diff --git a/gtk/src/ghb.ui b/gtk/src/ghb.ui
index 5ef2664e6..b25120594 100644
--- a/gtk/src/ghb.ui
+++ b/gtk/src/ghb.ui
@@ -288,6 +288,14 @@
<property name="page_size">0</property>
<property name="value">10</property>
</object>
+ <object class="GtkAdjustment" id="audio_quality_adj">
+ <property name="upper">10</property>
+ <property name="lower">0</property>
+ <property name="page_increment">1</property>
+ <property name="step_increment">0.1</property>
+ <property name="page_size">0</property>
+ <property name="value">0.0</property>
+ </object>
<object class="GtkImage" id="subtitle_add_image">
<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>
@@ -2159,6 +2167,22 @@ FFMpeg's and Theora's scale is more linear. These encoders do not have a lossle
</packing>
</child>
<child>
+ <object class="GtkLabel" id="labela6">
+ <property name="visible">True</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes"></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">3</property>
+ <property name="right_attach">3</property>
+ <property name="x_options">GTK_EXPAND</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
<object class="GtkExpander" id="expander1">
<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>
@@ -2169,186 +2193,279 @@ FFMpeg's and Theora's scale is more linear. These encoders do not have a lossle
<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">4</property>
- <property name="n_columns">5</property>
+ <property name="n_columns">8</property>
<property name="row_spacing">5</property>
<property name="column_spacing">5</property>
<child>
- <object class="GtkLabel" id="audio_name_label">
+ <object class="GtkHBox" id="hbox40">
<property name="visible">True</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">Track Name:</property>
- <property name="use_markup">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="spacing">5</property>
+ <child>
+ <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="xalign">1</property>
+ <property name="label" translatable="yes">Auto Passthru:</property>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="AudioAllowMP3Pass">
+ <property name="visible">True</property>
+ <property name="can_focus">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">Enable this if your playback device supports AAC. This permits AAC passthru to be selected when automatic passthru selection is enabled.</property>
+ <property name="label" translatable="yes">MP3</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <signal handler="global_audio_widget_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="AudioAllowAACPass">
+ <property name="visible">True</property>
+ <property name="can_focus">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">Enable this if your playback device supports AAC. This permits AAC passthru to be selected when automatic passthru selection is enabled.</property>
+ <property name="label" translatable="yes">AAC</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <signal handler="global_audio_widget_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="AudioAllowAC3Pass">
+ <property name="visible">True</property>
+ <property name="can_focus">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">Enable this if your playback device supports AC-3. This permits AC-3 passthru to be selected when automatic passthru selection is enabled.</property>
+ <property name="label" translatable="yes">AC-3</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <signal handler="global_audio_widget_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="AudioAllowDTSPass">
+ <property name="visible">True</property>
+ <property name="can_focus">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">Enable this if your playback device supports DTS. This permits DTS passthru to be selected when automatic passthru selection is enabled.</property>
+ <property name="label" translatable="yes">DTS</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <signal handler="global_audio_widget_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="AudioAllowDTSHDPass">
+ <property name="visible">True</property>
+ <property name="can_focus">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">Enable this if your playback device supports DTS-HD. This permits DTS-HD passthru to be selected when automatic passthru selection is enabled.</property>
+ <property name="label" translatable="yes">DTS-HD</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <signal handler="global_audio_widget_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ <property name="expand">False</property>
+ </packing>
+ </child>
</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="right_attach">4</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
<child>
- <object class="GtkAlignment" id="alignment25">
+ <object class="GtkLabel" id="labela4">
<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="xalign">0</property>
- <child>
- <object class="GtkEntry" id="AudioTrackName">
- <property name="visible">True</property>
- <property name="can_focus">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="max_length">40</property>
- <property name="activates_default">True</property>
- <property name="width_chars">20</property>
- <property name="truncate_multiline">True</property>
- <property name="tooltip-text" translatable="yes">Set the audio track name. Players may use this in the audio selection list.</property>
- <signal handler="audio_widget_changed_cb" name="changed"/>
- </object>
- </child>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">Passthru Fallback:</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="left_attach">4</property>
+ <property name="right_attach">7</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
<child>
- <object class="GtkLabel" id="fill_label1">
+ <object class="GtkComboBox" id="AudioEncoderFallback">
<property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_markup">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 with when a suitable track can not be found for audio passthru.</property>
+ <signal handler="global_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">3</property>
- <property name="x_options">GTK_FILL|GTK_EXPAND</property>
+ <property name="left_attach">7</property>
+ <property name="right_attach">8</property>
+ <property name="x_options">GTK_FILL</property>
</packing>
</child>
<child>
- <object class="GtkLabel" id="sr_label">
+ <object class="GtkHSeparator" id="separator1">
<property name="visible">True</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">Sample Rate:</property>
- <property name="use_markup">True</property>
+ <property name="orientation">horizontal</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="right_attach">8</property>
<property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
</packing>
</child>
<child>
- <object class="GtkAlignment" id="alignment34">
+ <object class="GtkAlignment" id="alignment59">
<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="xalign">0</property>
- <property name="xscale">0</property>
+ <property name="top_padding">8</property>
<child>
- <object class="GtkComboBox" id="AudioSamplerate">
+ <object class="GtkLabel" id="audio_name_label">
<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"/>
+ <property name="xalign">0.5</property>
+ <property name="label" translatable="yes">Track Name:</property>
+ <property name="use_markup">True</property>
</object>
</child>
</object>
<packing>
- <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="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="GtkLabel" id="gain_label">
+ <object class="GtkAlignment" id="alignment25">
<property name="visible">True</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">Gain:</property>
- <property name="use_markup">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="xalign">0</property>
+ <child>
+ <object class="GtkEntry" id="AudioTrackName">
+ <property name="visible">True</property>
+ <property name="can_focus">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="max_length">40</property>
+ <property name="activates_default">True</property>
+ <property name="width_chars">20</property>
+ <property name="truncate_multiline">True</property>
+ <property name="tooltip-text" translatable="yes">Set the audio track name. Players may use this in the audio selection list.</property>
+ <signal handler="audio_widget_changed_cb" name="changed"/>
+ </object>
+ </child>
</object>
<packing>
- <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="top_attach">3</property>
+ <property name="bottom_attach">4</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">
+ <object class="GtkLabel" id="AudioSamplerateLabel">
<property name="visible">True</property>
- <property name="width-request">150</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"/>
+ <property name="xalign">0.5</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">4</property>
- <property name="right_attach">5</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</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="GtkAlignment" id="alignment34">
<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>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="xalign">0.5</property>
+ <property name="xscale">0</property>
+ <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>
+ </child>
</object>
<packing>
- <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="top_attach">3</property>
+ <property name="bottom_attach">4</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="GtkHScale" id="AudioTrackDRCSlider">
+ <object class="GtkLabel" id="AudioTrackGainLabel">
<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"/>
+ <property name="xalign">0.5</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">4</property>
- <property name="right_attach">5</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</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="GtkHBox" id="hbox40">
+ <object class="GtkHBox" id="hbox34">
<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="spacing">5</property>
+ <property name="spacing">0</property>
<child>
- <object class="GtkLabel" id="labela3">
+ <object class="GtkScaleButton" id="AudioTrackGain">
<property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="icons">audio-volume-muted
+audio-volume-high
+audio-volume-low
+audio-volume-medium</property>
+ <property name="adjustment">adjustment35</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">Auto Passthru:</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"/>
</object>
<packing>
<property name="position">0</property>
@@ -2356,130 +2473,194 @@ FFMpeg's and Theora's scale is more linear. These encoders do not have a lossle
</packing>
</child>
<child>
- <object class="GtkCheckButton" id="AudioAllowMP3Pass">
+ <object class="GtkLabel" id="AudioTrackGainValue">
<property name="visible">True</property>
- <property name="can_focus">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">Enable this if your playback device supports AAC. This permits AAC passthru to be selected when automatic passthru selection is enabled.</property>
- <property name="label" translatable="yes">MP3</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <signal handler="global_audio_widget_changed_cb" name="toggled"/>
+ <property name="width_chars">6</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">0dB</property>
+ <property name="use_markup">True</property>
</object>
<packing>
<property name="position">1</property>
<property name="expand">False</property>
</packing>
</child>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</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="GtkLabel" id="AudioTrackDRCSliderLabel">
+ <property name="visible">True</property>
+ <property name="xalign">0.5</property>
+ <property name="label" translatable="yes">DRC:</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>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</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="GtkHBox" id="hbox33">
+ <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="spacing">0</property>
<child>
- <object class="GtkCheckButton" id="AudioAllowAACPass">
+ <object class="GtkScaleButton" id="AudioTrackDRCSlider">
<property name="visible">True</property>
- <property name="can_focus">True</property>
+ <property name="orientation">vertical</property>
+ <property name="icons">audio-input-microphone</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-text" translatable="yes">Enable this if your playback device supports AAC. This permits AAC passthru to be selected when automatic passthru selection is enabled.</property>
- <property name="label" translatable="yes">AAC</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <signal handler="global_audio_widget_changed_cb" name="toggled"/>
+ <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"/>
</object>
<packing>
- <property name="position">2</property>
+ <property name="position">0</property>
<property name="expand">False</property>
</packing>
</child>
<child>
- <object class="GtkCheckButton" id="AudioAllowAC3Pass">
+ <object class="GtkLabel" id="AudioTrackDRCValue">
<property name="visible">True</property>
- <property name="can_focus">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">Enable this if your playback device supports AC-3. This permits AC-3 passthru to be selected when automatic passthru selection is enabled.</property>
- <property name="label" translatable="yes">AC-3</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <signal handler="global_audio_widget_changed_cb" name="toggled"/>
+ <property name="width_chars">4</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Off</property>
+ <property name="use_markup">True</property>
</object>
<packing>
- <property name="position">3</property>
+ <property name="position">1</property>
<property name="expand">False</property>
</packing>
</child>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</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="GtkCheckButton" id="AudioTrackQualityEnable">
+ <property name="visible">True</property>
+ <property name="can_focus">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">Quality:</property>
+ <property name="tooltip-markup" translatable="yes">&lt;b&gt;Quality:&lt;/b&gt; For output codec's that support it, adjust the quality of the output.</property>
+ <property name="active">False</property>
+ <property name="draw_indicator">True</property>
+ <signal handler="audio_widget_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="left_attach">4</property>
+ <property name="right_attach">5</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox32">
+ <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="spacing">0</property>
<child>
- <object class="GtkCheckButton" id="AudioAllowDTSPass">
+ <object class="GtkScaleButton" id="AudioTrackQuality">
<property name="visible">True</property>
- <property name="can_focus">True</property>
+ <property name="orientation">vertical</property>
+ <property name="icons">weather-storm
+weather-clear
+weather-storm
+weather-showers-scattered
+weather-showers
+weather-overcast
+weather-few-clouds
+weather-clear</property>
+ <property name="adjustment">audio_quality_adj</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">Enable this if your playback device supports DTS. This permits DTS passthru to be selected when automatic passthru selection is enabled.</property>
- <property name="label" translatable="yes">DTS</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <signal handler="global_audio_widget_changed_cb" name="toggled"/>
+ <property name="tooltip-markup" translatable="yes">&lt;b&gt;Quality:&lt;/b&gt; For output codec's that support it, adjust the quality of the output.</property>
+ <signal handler="quality_widget_changed_cb" name="value_changed"/>
</object>
<packing>
- <property name="position">4</property>
+ <property name="position">0</property>
<property name="expand">False</property>
</packing>
</child>
<child>
- <object class="GtkCheckButton" id="AudioAllowDTSHDPass">
+ <object class="GtkLabel" id="AudioTrackQualityValue">
<property name="visible">True</property>
- <property name="can_focus">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">Enable this if your playback device supports DTS-HD. This permits DTS-HD passthru to be selected when automatic passthru selection is enabled.</property>
- <property name="label" translatable="yes">DTS-HD</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <signal handler="global_audio_widget_changed_cb" name="toggled"/>
+ <property name="width_chars">4</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">00.0</property>
+ <property name="use_markup">True</property>
</object>
<packing>
- <property name="position">5</property>
+ <property name="position">1</property>
<property name="expand">False</property>
</packing>
</child>
</object>
<packing>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="left_attach">0</property>
- <property name="right_attach">4</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <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="labela4">
+ <object class="GtkLabel" id="filler_label0">
<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="xalign">1</property>
- <property name="label" translatable="yes">Passthru Fallback:</property>
+ <property name="label" translatable="yes"></property>
+ <property name="xalign">0</property>
+ <property name="use_markup">True</property>
</object>
<packing>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="x_options">GTK_FILL</property>
+ <property name="left_attach">5</property>
+ <property name="right_attach">8</property>
+ <property name="x_options">GTK_FILL|GTK_EXPAND</property>
</packing>
</child>
<child>
- <object class="GtkComboBox" id="AudioEncoderFallback">
+ <object class="GtkLabel" id="filler_label1">
<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 with when a suitable track can not be found for audio passthru.</property>
- <signal handler="global_audio_widget_changed_cb" name="changed"/>
+ <property name="label" translatable="yes"></property>
+ <property name="xalign">0</property>
+ <property name="use_markup">True</property>
</object>
<packing>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="x_options">GTK_FILL</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="left_attach">5</property>
+ <property name="right_attach">8</property>
+ <property name="x_options">GTK_FILL|GTK_EXPAND</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
- <property name="top_attach">0</property>
+ <property name="top_attach">1</property>
<property name="bottom_attach">2</property>
- <property name="left_attach">2</property>
+ <property name="left_attach">0</property>
<property name="right_attach">3</property>
<property name="x_options">GTK_FILL|GTK_EXPAND</property>
<property name="y_options"></property>
@@ -2526,7 +2707,7 @@ FFMpeg's and Theora's scale is more linear. These encoders do not have a lossle
</packing>
</child>
<child>
- <object class="GtkLabel" id="label69">
+ <object class="GtkLabel" id="AudioBitrateLabel">
<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">Bitrate</property>
@@ -2542,7 +2723,7 @@ FFMpeg's and Theora's scale is more linear. These encoders do not have a lossle
</packing>
</child>
<child>
- <object class="GtkLabel" id="label24">
+ <object class="GtkLabel" id="AudioMixdownLabel">
<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>
diff --git a/gtk/src/hb-backend.c b/gtk/src/hb-backend.c
index 98a13079d..ea817b7ff 100644
--- a/gtk/src/hb-backend.c
+++ b/gtk/src/hb-backend.c
@@ -3219,21 +3219,30 @@ audio_bitrate_opts_add(GtkBuilder *builder, const gchar *name, gint rate)
g_debug("audio_bitrate_opts_add ()\n");
- if (rate < 8) return;
+ if (rate >= 0 && rate < 8) return;
if (ghb_audio_bitrates[hb_audio_bitrates_count].string)
{
g_free(ghb_audio_bitrates[hb_audio_bitrates_count].string);
}
ghb_audio_bitrates[hb_audio_bitrates_count].rate = rate;
- ghb_audio_bitrates[hb_audio_bitrates_count].string =
- g_strdup_printf("%d", rate);
+ if (rate < 0)
+ {
+ ghb_audio_bitrates[hb_audio_bitrates_count].string =
+ g_strdup_printf("N/A");
+ }
+ else
+ {
+ ghb_audio_bitrates[hb_audio_bitrates_count].string =
+ g_strdup_printf("%d", rate);
+ }
ghb_audio_bitrates_count = hb_audio_bitrates_count + 1;
store = get_combo_box_store(builder, name);
if (!find_combo_item_by_int(GTK_TREE_MODEL(store), rate, &iter))
{
- str = g_strdup_printf ("<small>%d</small>", rate);
+ str = g_strdup_printf ("<small>%s</small>",
+ ghb_audio_bitrates[hb_audio_bitrates_count].string);
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter,
0, str,
@@ -3247,11 +3256,12 @@ audio_bitrate_opts_add(GtkBuilder *builder, const gchar *name, gint rate)
}
static void
-audio_bitrate_opts_clean(
+audio_bitrate_opts_update(
GtkBuilder *builder,
const gchar *name,
gint first_rate,
- gint last_rate)
+ gint last_rate,
+ gint extra_rate)
{
GtkTreeIter iter;
GtkListStore *store;
@@ -3270,12 +3280,14 @@ audio_bitrate_opts_clean(
do
{
gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 3, &ivalue, -1);
- if (search_rates(
+ if (ivalue != first_rate && ivalue != last_rate &&
+ !(ivalue == extra_rate && extra_rate >= first_rate) &&
+ search_rates(
ghb_audio_bitrates, ivalue, ghb_audio_bitrates_count) < 0)
{
done = !gtk_list_store_remove(store, &iter);
}
- else if (ivalue < first || ivalue > last)
+ else if ((int)ivalue < first || (int)ivalue > last)
{
ii++;
gtk_list_store_set(store, &iter, 1, FALSE, -1);
@@ -3289,6 +3301,8 @@ audio_bitrate_opts_clean(
}
} while (!done);
}
+ if (extra_rate >= first_rate)
+ audio_bitrate_opts_add(builder, name, extra_rate);
}
static void
@@ -3327,18 +3341,13 @@ audio_bitrate_opts_set(GtkBuilder *builder, const gchar *name)
}
void
-ghb_set_passthru_bitrate_opts(GtkBuilder *builder, gint bitrate)
-{
- audio_bitrate_opts_add(builder, "AudioBitrate", bitrate);
-}
-
-void
-ghb_set_default_bitrate_opts(
+ghb_set_bitrate_opts(
GtkBuilder *builder,
gint first_rate,
- gint last_rate)
+ gint last_rate,
+ gint extra_rate)
{
- audio_bitrate_opts_clean(builder, "AudioBitrate", first_rate, last_rate);
+ audio_bitrate_opts_update(builder, "AudioBitrate", first_rate, last_rate, extra_rate);
}
static ghb_status_t hb_status;
@@ -4906,17 +4915,28 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
// Make sure the mixdown is valid and pick a new one if not.
audio.out.mixdown = ghb_get_best_mix(aconfig, audio.out.codec,
audio.out.mixdown);
- audio.out.bitrate =
- ghb_settings_combo_int(asettings, "AudioBitrate");
+ double quality = ghb_settings_get_double(asettings, "AudioTrackQuality");
+ if (ghb_settings_get_boolean(asettings, "AudioTrackQualityEnable") &&
+ quality >= 0)
+ {
+ audio.out.quality = quality;
+ audio.out.bitrate = -1;
+ }
+ else
+ {
+ audio.out.quality = -1;
+ audio.out.bitrate =
+ ghb_settings_combo_int(asettings, "AudioBitrate");
+
+ audio.out.bitrate = hb_get_best_audio_bitrate(
+ audio.out.codec, audio.out.bitrate,
+ audio.out.samplerate, audio.out.mixdown);
+ }
gint srate = ghb_settings_combo_int(asettings, "AudioSamplerate");
if (srate == 0) // 0 is same as source
audio.out.samplerate = aconfig->in.samplerate;
else
audio.out.samplerate = srate;
-
- audio.out.bitrate = hb_get_best_audio_bitrate(
- audio.out.codec, audio.out.bitrate,
- audio.out.samplerate, audio.out.mixdown);
}
// Add it to the jobs audio list
diff --git a/gtk/src/hb-backend.h b/gtk/src/hb-backend.h
index 683ead9c1..4d6f1efa3 100644
--- a/gtk/src/hb-backend.h
+++ b/gtk/src/hb-backend.h
@@ -135,9 +135,8 @@ gboolean ghb_audio_is_passthru(gint acodec);
gboolean ghb_audio_can_passthru(gint acodec);
gint ghb_get_default_acodec(void);
hb_audio_config_t* ghb_get_scan_audio_info(gint titleindex, gint audioindex);
-void ghb_set_passthru_bitrate_opts(GtkBuilder *builder, gint bitrate);
-void ghb_set_default_bitrate_opts(
- GtkBuilder *builder, gint first_rate, gint last_rate);
+void ghb_set_bitrate_opts(
+ GtkBuilder *builder, gint first_rate, gint last_rate, gint extra_rate);
void ghb_grey_combo_options(signal_user_data_t *ud);
void ghb_update_ui_combo_box(
signal_user_data_t *ud, const gchar *name, gint user_data, gboolean all);
diff --git a/gtk/src/internal_defaults.xml b/gtk/src/internal_defaults.xml
index b4d06694d..0a6f65aba 100644
--- a/gtk/src/internal_defaults.xml
+++ b/gtk/src/internal_defaults.xml
@@ -318,6 +318,10 @@
<integer>1</integer>
<key>AudioTrackDescription</key>
<string></string>
+ <key>AudioTrackQualityEnable</key>
+ <false />
+ <key>AudioTrackQuality</key>
+ <real>-1</real>
<key>AudioTrackGain</key>
<real>0</real>
<key>AudioTrackDRCSlider</key>
diff --git a/gtk/src/makedeps.py b/gtk/src/makedeps.py
index a3c3bdf62..d7c2fa762 100644
--- a/gtk/src/makedeps.py
+++ b/gtk/src/makedeps.py
@@ -49,13 +49,25 @@ dep_map = (
DepEntry("VideoEncoder", "x264_tab", "x264", False, True),
DepEntry("VideoEncoder", "lavc_mpeg4_tab", "ffmpeg|ffmpeg2", False, True),
DepEntry("VideoEncoder", "Mp4iPodCompatible", "x264", False, False),
+ DepEntry("AudioTrackQualityEnable", "AudioTrackQuality", "FALSE", True, False),
+ DepEntry("AudioTrackQualityEnable", "AudioTrackQualityValue", "FALSE", True, False),
+ DepEntry("AudioTrackQualityEnable", "AudioBitrateLabel", "TRUE", True, False),
+ DepEntry("AudioTrackQualityEnable", "AudioBitrate", "TRUE", True, False),
+ DepEntry("AudioEncoderActual", "AudioTrackQualityEnable", "lame|vorbis", False, True),
+ DepEntry("AudioEncoderActual", "AudioTrackQuality", "lame|vorbis", False, True),
+ DepEntry("AudioEncoderActual", "AudioTrackQualityValue", "lame|vorbis", False, True),
+ DepEntry("AudioEncoderActual", "AudioBitrateLabel", "copy:mp3|copy:aac|copy:ac3|copy:dts|copy:dtshd", True, False),
DepEntry("AudioEncoderActual", "AudioBitrate", "copy:mp3|copy:aac|copy:ac3|copy:dts|copy:dtshd", True, False),
+ DepEntry("AudioEncoderActual", "AudioSamplerateLabel", "copy:mp3|copy:aac|copy:ac3|copy:dts|copy:dtshd", True, False),
DepEntry("AudioEncoderActual", "AudioSamplerate", "copy:mp3|copy:aac|copy:ac3|copy:dts|copy:dtshd", True, False),
+ DepEntry("AudioEncoderActual", "AudioMixdownLabel", "copy:mp3|copy:aac|copy:ac3|copy:dts|copy:dtshd", True, False),
DepEntry("AudioEncoderActual", "AudioMixdown", "copy:mp3|copy:aac|copy:ac3|copy:dts|copy:dtshd", True, False),
+ DepEntry("AudioEncoderActual", "AudioTrackDRCSliderLabel", "copy:mp3|copy:aac|copy:ac3|copy:dts|copy:dtshd", True, False),
DepEntry("AudioEncoderActual", "AudioTrackDRCSlider", "copy:mp3|copy:aac|copy:ac3|copy:dts|copy:dtshd", True, False),
- DepEntry("AudioEncoderActual", "drc_label", "copy:mp3|copy:aac|copy:ac3|copy:dts|copy:dtshd", True, False),
+ DepEntry("AudioEncoderActual", "AudioTrackDRCValue", "copy:mp3|copy:aac|copy:ac3|copy:dts|copy:dtshd", True, False),
+ DepEntry("AudioEncoderActual", "AudioTrackGainLabel", "copy:mp3|copy:aac|copy:ac3|copy:dts|copy:dtshd", True, False),
DepEntry("AudioEncoderActual", "AudioTrackGain", "copy:mp3|copy:aac|copy:ac3|copy:dts|copy:dtshd", True, False),
- DepEntry("AudioEncoderActual", "gain_label", "copy:mp3|copy:aac|copy:ac3|copy:dts|copy:dtshd", True, False),
+ DepEntry("AudioEncoderActual", "AudioTrackGainValue", "copy:mp3|copy:aac|copy:ac3|copy:dts|copy:dtshd", True, False),
DepEntry("AudioEncoder", "AudioAllowMP3Pass", "copy", False, False),
DepEntry("AudioEncoder", "AudioAllowAACPass", "copy", False, False),
DepEntry("AudioEncoder", "AudioAllowAC3Pass", "copy", False, False),
diff --git a/gtk/src/queuehandler.c b/gtk/src/queuehandler.c
index 6b934c14e..8769ad5b3 100644
--- a/gtk/src/queuehandler.c
+++ b/gtk/src/queuehandler.c
@@ -20,6 +20,7 @@
#include "values.h"
#include "callbacks.h"
#include "presets.h"
+#include "audiohandler.h"
#include "ghb-dvd.h"
G_MODULE_EXPORT void
@@ -400,7 +401,7 @@ add_to_queue_list(signal_user_data_t *ud, GValue *settings, GtkTreeIter *piter)
count = ghb_array_len(audio_list);
for (ii = 0; ii < count; ii++)
{
- gchar *bitrate, *samplerate, *track;
+ gchar *quality = NULL, *samplerate, *track;
const gchar *acodec, *mix;
GValue *asettings;
gdouble sr;
@@ -408,7 +409,19 @@ add_to_queue_list(signal_user_data_t *ud, GValue *settings, GtkTreeIter *piter)
asettings = ghb_array_get_nth(audio_list, ii);
acodec = ghb_settings_combo_option(asettings, "AudioEncoderActual");
- bitrate = ghb_settings_get_string(asettings, "AudioBitrate");
+ double q = ghb_settings_get_double(asettings, "AudioTrackQuality");
+ if (ghb_settings_get_boolean(asettings, "AudioTrackQualityEnable") &&
+ q >= 0)
+ {
+ int codec = ghb_settings_combo_int(asettings, "AudioEncoderActual");
+ quality = ghb_format_quality("Quality: ", codec, q);
+ }
+ else
+ {
+ const char *br;
+ br = ghb_settings_combo_option(asettings, "AudioBitrate");
+ quality = g_strdup_printf("Bitrate: %s", br);
+ }
sr = ghb_settings_get_double(asettings, "AudioSamplerate");
samplerate = ghb_settings_get_string(asettings, "AudioSamplerate");
if ((int)sr == 0)
@@ -429,10 +442,10 @@ add_to_queue_list(signal_user_data_t *ud, GValue *settings, GtkTreeIter *piter)
g_string_append_printf(str, "\t");
g_string_append_printf(str,
- "<small> %s, Encoder: %s, Mixdown: %s, SampleRate: %s, Bitrate: %s</small>\n",
- track, acodec, mix, samplerate, bitrate);
+ "<small> %s, Encoder: %s, Mixdown: %s, SampleRate: %s, %s</small>\n",
+ track, acodec, mix, samplerate, quality);
g_free(track);
- g_free(bitrate);
+ g_free(quality);
g_free(samplerate);
}
@@ -505,67 +518,6 @@ add_to_queue_list(signal_user_data_t *ud, GValue *settings, GtkTreeIter *piter)
g_free(preset);
}
-void
-audio_list_refresh(signal_user_data_t *ud)
-{
- GtkTreeView *treeview;
- GtkTreeIter iter;
- GtkListStore *store;
- gboolean done;
- gint row = 0;
- const GValue *audio_list;
-
- g_debug("ghb_audio_list_refresh ()");
- treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
- store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview));
- if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter))
- {
- do
- {
- const gchar *track, *codec, *br, *sr, *mix;
- gchar *s_drc, *s_gain;
- gint itrack;
- gdouble drc, gain;
- GValue *asettings;
-
- audio_list = ghb_settings_get_value(ud->settings, "audio_list");
- if (row >= ghb_array_len(audio_list))
- return;
- asettings = ghb_array_get_nth(audio_list, row);
-
- track = ghb_settings_combo_option(asettings, "AudioTrack");
- itrack = ghb_settings_combo_int(asettings, "AudioTrack");
- codec = ghb_settings_combo_option(asettings, "AudioEncoderActual");
- 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)
- s_drc = g_strdup("Off");
- else
- s_drc = g_strdup_printf("%.1f", drc);
-
- gtk_list_store_set(GTK_LIST_STORE(store), &iter,
- // These are displayed in list
- 0, track,
- 1, codec,
- 2, br,
- 3, sr,
- 4, mix,
- 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);
- }
-}
-
static gboolean
validate_settings(signal_user_data_t *ud)
{
@@ -711,7 +663,7 @@ validate_settings(signal_user_data_t *ud)
{
return FALSE;
}
- audio_list_refresh(ud);
+ ghb_audio_list_refresh(ud);
return TRUE;
}