OSDN Git Service

MacGui: Remove Target Size as a rate control option as it doesn't really work correct...
[handbrake-jp/handbrake-jp-git.git] / gtk / src / audiohandler.c
index 5288e31..c52b2cd 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
  * audiohandler.c
- * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
+ * Copyright (C) John Stebbins 2008-2011 <stebbins@stebbins>
  * 
  * audiohandler.c is free software.
  * 
 #include "audiohandler.h"
 
 static void ghb_add_audio(signal_user_data_t *ud, GValue *settings);
+static GValue* get_selected_asettings(signal_user_data_t *ud);
+
+static gboolean block_updates = FALSE;
 
 void
 ghb_adjust_audio_rate_combos(signal_user_data_t *ud)
 {
        gint titleindex, track, acodec, select_acodec, mix;
-       ghb_audio_info_t ainfo;
+       hb_audio_config_t *aconfig;
        GtkWidget *widget;
        GValue *gval;
        int mux;
@@ -71,44 +74,38 @@ ghb_adjust_audio_rate_combos(signal_user_data_t *ud)
                acodec = select_acodec;
        }
 
-       gboolean info_valid = FALSE;
-       if (ghb_get_audio_info (&ainfo, titleindex, track))
-       {
-               info_valid = TRUE;
-       }
+       aconfig = ghb_get_scan_audio_info(titleindex, track);
        if (sr == 0)
        {
-               sr = info_valid ? ainfo.samplerate : 48000;
+               sr = aconfig ? aconfig->in.samplerate : 48000;
        }
+       gboolean codec_defined_bitrate = FALSE;
        if (ghb_audio_is_passthru (select_acodec))
        {
-               ghb_set_default_bitrate_opts (ud->builder, 0, -1);
-               if (info_valid)
+               if (aconfig)
                {
-                       bitrate = ainfo.bitrate / 1000;
+                       bitrate = aconfig->in.bitrate / 1000;
 
                        // Set the values for bitrate and samplerate to the input rates
-                       if (ainfo.codec & select_acodec & HB_ACODEC_PASS_MASK)
+                       if (aconfig->in.codec & select_acodec & HB_ACODEC_PASS_MASK)
                        {
                                ghb_set_passthru_bitrate_opts (ud->builder, bitrate);
                                ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(0));
-                               select_acodec &= ainfo.codec | HB_ACODEC_PASS_FLAG;
+                               select_acodec &= aconfig->in.codec | HB_ACODEC_PASS_FLAG;
+                               codec_defined_bitrate = TRUE;
                        }
                        else
                        {
-                               select_acodec = ghb_select_audio_codec(ud->settings, acodec, track);
+                               select_acodec = ghb_select_audio_codec(ud->settings, aconfig, acodec);
                                if (acodec != HB_ACODEC_ANY)
                                {
                                        ghb_ui_update(ud, "AudioEncoder", ghb_int64_value(select_acodec));
                                }
 
-                               int channels;
-                               mix = ghb_get_best_mix( titleindex, track, select_acodec, mix);
-                               channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(mix);
+                               mix = ghb_get_best_mix( aconfig, select_acodec, mix);
                                bitrate = hb_get_default_audio_bitrate(select_acodec, sr, mix);
                                ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix));
                        }
-                       ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(bitrate));
                        ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(0));
                }
                else
@@ -116,19 +113,31 @@ ghb_adjust_audio_rate_combos(signal_user_data_t *ud)
                        ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(0));
                        ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(0));
                        bitrate = 448;
-                       mix = ghb_get_best_mix( titleindex, track, select_acodec, 0);
+                       mix = ghb_get_best_mix( aconfig, select_acodec, 0);
                }
                ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_double_value(0));
        }
-       bitrate = hb_get_best_audio_bitrate(select_acodec, bitrate, sr, mix);
+       else
+       {
+               bitrate = hb_get_best_audio_bitrate(select_acodec, bitrate, sr, mix);
+       }
+       if (!codec_defined_bitrate)
+       {
+               int low, high;
+               hb_get_audio_bitrate_limits(select_acodec, sr, mix, &low, &high);
+               ghb_set_default_bitrate_opts (ud->builder, low, high);
+       }
        ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(bitrate));
 
-       int low, high;
-       hb_get_audio_bitrate_limits(select_acodec, sr, mix, &low, &high);
-       ghb_set_default_bitrate_opts (ud->builder, low, high);
-
        ghb_settings_take_value(ud->settings, "AudioEncoderActual", 
                                                        ghb_lookup_acodec_value(select_acodec));
+       GValue *asettings = get_selected_asettings(ud);
+       if (asettings)
+       {
+               ghb_settings_take_value(asettings, "AudioEncoderActual", 
+                                                       ghb_lookup_acodec_value(select_acodec));
+       }
+       ghb_audio_list_refresh_selected(ud);
        ghb_check_dependency(ud, NULL, "AudioEncoderActual");
 }
 
@@ -158,14 +167,13 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
 {
        gint fallback_acodec, track;
        gchar *source_lang = NULL;
-       GtkWidget *button;
-       ghb_audio_info_t ainfo;
+       hb_audio_config_t *aconfig;
        GHashTable *track_indices;
        gint mux;
 
        const GValue *pref_audio;
        const GValue *audio, *drc;
-       gint mix_acodec, acodec, bitrate, mix;
+       gint acodec, bitrate, mix;
        gdouble rate;
        gint count, ii, list_count;
        
@@ -184,7 +192,6 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
        // Clear the audio list
        ghb_clear_audio_list(ud);
        // Find "best" audio based on audio preferences
-       button = GHB_WIDGET (ud->builder, "audio_add");
        if (!ghb_settings_get_boolean(ud->settings, "AudioDUB"))
        {
                source_lang = ghb_get_source_audio_lang(titleindex, 0);
@@ -216,7 +223,6 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
                {
                        fallback_acodec = HB_ACODEC_AC3;
                }
-               mix_acodec = acodec;
                bitrate = ghb_settings_combo_int(audio, "AudioBitrate");
                rate = ghb_settings_combo_double(audio, "AudioSamplerate");
                mix = ghb_settings_combo_int(audio, "AudioMixdown");
@@ -230,15 +236,14 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
                // 1. pref codec is passthru
                // 2. source codec is not passthru
                // 3. next pref is enabled
-               if (ghb_get_audio_info (&ainfo, titleindex, track) && 
-                       ghb_audio_is_passthru (acodec))
+               aconfig = ghb_get_scan_audio_info(titleindex, track);
+               if (aconfig && ghb_audio_is_passthru (acodec))
                {
                        // HB_ACODEC_* are bit fields.  Treat acodec as mask
-                       if (!(ainfo.codec & select_acodec & HB_ACODEC_PASS_MASK))
+                       if (!(aconfig->in.codec & select_acodec & HB_ACODEC_PASS_MASK))
                        {
                                if (acodec != HB_ACODEC_ANY)
                                        acodec = fallback_acodec;
-                               mix_acodec = fallback_acodec;
                                // If we can't substitute the passthru with a suitable
                                // encoder and
                                // If there's more audio to process, or we've already
@@ -252,9 +257,10 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
                                else
                                {
                                        int channels, min_rate, max_rate;
-                                       mix = ghb_get_best_mix( titleindex, track, mix_acodec, mix);
+                                       select_acodec = fallback_acodec;
+                                       mix = ghb_get_best_mix(aconfig, select_acodec, mix);
                                        channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(mix);
-                                       bitrate = ainfo.bitrate / 1000;
+                                       bitrate = aconfig->in.bitrate / 1000;
                                        min_rate = channels * 64;
                                        max_rate = channels * 160;
                                        if (bitrate < min_rate)
@@ -264,6 +270,10 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
                                        rate = 0;
                                }
                        }
+                       else
+                       {
+                               select_acodec &= aconfig->in.codec | HB_ACODEC_PASS_FLAG;
+                       }
                }
                if (titleindex >= 0 && track < 0)
                        acodec = 0;
@@ -274,13 +284,13 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
                        ghb_settings_set_string(settings, "AudioEncoder", 
                                ghb_lookup_combo_string("AudioEncoder", ghb_int_value(acodec)));
                        ghb_settings_set_value(settings, "AudioEncoderActual", 
-                               ghb_settings_get_value(ud->settings, "AudioEncoderActual"));
+                                                                       ghb_lookup_acodec_value(select_acodec));
                        // This gets set autimatically if the codec is passthru
                        ghb_settings_set_string(settings, "AudioBitrate",
                                ghb_lookup_combo_string("AudioBitrate", ghb_int_value(bitrate)));
                        ghb_settings_set_string(settings, "AudioSamplerate",
                                ghb_lookup_combo_string("AudioSamplerate", ghb_int_value(rate)));
-                       mix = ghb_get_best_mix( titleindex, track, mix_acodec, mix);
+                       mix = ghb_get_best_mix( aconfig, select_acodec, mix);
                        ghb_settings_set_string(settings, "AudioMixdown",
                                ghb_lookup_combo_string("AudioMixdown", ghb_int_value(mix)));
                        ghb_settings_set_value(settings, "AudioTrackDRCSlider", drc);
@@ -345,7 +355,7 @@ ghb_audio_list_refresh_selected(signal_user_data_t *ud)
        {
                const gchar *track, *codec, *br, *sr, *mix;
                gchar *s_drc;
-               gint itrack, icodec;
+               gint itrack;
                gdouble drc;
                // Get the row number
                treepath = gtk_tree_model_get_path (store, &iter);
@@ -361,8 +371,7 @@ 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, "AudioEncoder");
-               icodec = ghb_settings_combo_int(asettings, "AudioEncoder");
+               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");
@@ -373,9 +382,6 @@ ghb_audio_list_refresh_selected(signal_user_data_t *ud)
                else
                        s_drc = g_strdup_printf("%.1f", drc);
 
-               if (icodec == HB_ACODEC_ANY)
-                       codec = ghb_select_audio_codec_str(ud->settings, icodec, itrack);
-
                gtk_list_store_set(GTK_LIST_STORE(store), &iter, 
                        // These are displayed in list
                        0, track,
@@ -399,6 +405,15 @@ 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);
+       if (block_updates)
+       {
+               prev_acodec = acodec_code;
+               ghb_grey_combo_options (ud->builder);
+               return;
+       }
+
+       gval = ghb_widget_value(widget);
+       acodec_code = ghb_lookup_combo_int("AudioEncoder", gval);
        ghb_value_free(gval);
 
        asettings = get_selected_asettings(ud);
@@ -432,19 +447,13 @@ audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
                }
                ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(sr));
 
+               hb_audio_config_t *aconfig;
+               aconfig = ghb_get_scan_audio_info(titleindex, track);
                if (sr == 0)
                {
-                       ghb_audio_info_t ainfo;
-                       if (ghb_get_audio_info (&ainfo, titleindex, track))
-                       {
-                               sr = ainfo.samplerate;
-                       }
-                       else
-                       {
-                               sr = 48000;
-                       }
+                       sr = aconfig ? aconfig->in.samplerate : 48000;
                }
-               mix_code = ghb_get_best_mix( titleindex, track, acodec_code, mix_code);
+               mix_code = ghb_get_best_mix( aconfig, acodec_code, mix_code);
                br = hb_get_best_audio_bitrate(acodec_code, br, sr, mix_code);
                ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(br));
 
@@ -470,6 +479,8 @@ audio_track_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        GValue *asettings;
 
        g_debug("audio_track_changed_cb ()");
+       if (block_updates) return;
+
        ghb_adjust_audio_rate_combos(ud);
        ghb_check_dependency(ud, widget, NULL);
        ghb_grey_combo_options(ud->builder);
@@ -492,6 +503,8 @@ audio_mix_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        GValue *asettings;
 
        g_debug("audio_mix_changed_cb ()");
+       if (block_updates) return;
+
        ghb_adjust_audio_rate_combos(ud);
        ghb_check_dependency(ud, widget, NULL);
        asettings = get_selected_asettings(ud);
@@ -509,6 +522,8 @@ audio_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        GValue *asettings;
 
        g_debug("audio_widget_changed_cb ()");
+       if (block_updates) return;
+
        ghb_adjust_audio_rate_combos(ud);
        ghb_check_dependency(ud, widget, NULL);
        asettings = get_selected_asettings(ud);
@@ -528,6 +543,7 @@ drc_widget_changed_cb(GtkWidget *widget, gdouble val, signal_user_data_t *ud)
        gchar *drc;
 
        g_debug("drc_widget_changed_cb ()");
+       if (block_updates) return;
 
        label = GTK_LABEL(GHB_WIDGET(ud->builder, "drc_label"));
        if (val < 1.0)
@@ -576,7 +592,7 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings)
        GtkTreeSelection *selection;
        const gchar *track, *codec, *br, *sr, *mix;
        gchar *s_drc;
-       gint icodec, itrack;
+       gint itrack;
        gdouble drc;
        
        g_debug("add_to_audio_list ()");
@@ -586,8 +602,7 @@ 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, "AudioEncoder");
-       icodec = ghb_settings_combo_int(settings, "AudioEncoder");
+       codec = ghb_settings_combo_option(settings, "AudioEncoderActual");
        br = ghb_settings_combo_option(settings, "AudioBitrate");
        sr = ghb_settings_combo_option(settings, "AudioSamplerate");
        mix = ghb_settings_combo_option(settings, "AudioMixdown");
@@ -598,11 +613,6 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings)
        else
                s_drc = g_strdup_printf("%.1f", drc);
 
-       if (icodec == HB_ACODEC_ANY)
-       {
-               codec = ghb_select_audio_codec_str(ud->settings, icodec, itrack);
-       }
-
        gtk_list_store_append(store, &iter);
        gtk_list_store_set(store, &iter, 
                // These are displayed in list
@@ -648,6 +658,7 @@ audio_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t
                        return;
                asettings = ghb_array_get_nth(audio_list, row);
 
+               block_updates = TRUE;
                ghb_ui_update(ud, "AudioTrack", ghb_settings_get_value(asettings, "AudioTrack"));
                ghb_ui_update(ud, "AudioEncoder", ghb_settings_get_value(asettings, "AudioEncoder"));
                ghb_settings_set_value(ud->settings, "AudioEncoderActual", ghb_settings_get_value(asettings, "AudioEncoderActual"));
@@ -656,6 +667,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"));
+               block_updates = FALSE;
                widget = GHB_WIDGET (ud->builder, "audio_remove");
                gtk_widget_set_sensitive(widget, TRUE);
        }
@@ -774,16 +786,14 @@ void
 ghb_set_audio(signal_user_data_t *ud, GValue *settings)
 {
        gint acodec_code;
-       GtkWidget *button;
 
        GValue *alist;
-       GValue *track, *audio, *acodec, *bitrate, *rate, *mix, *drc;
+       GValue *track, *audio, *acodec, *acodec_actual, *bitrate, *rate, *mix, *drc;
        gint count, ii;
        
        g_debug("set_audio");
        // Clear the audio list
        ghb_clear_audio_list(ud);
-       button = GHB_WIDGET (ud->builder, "audio_add");
        alist = ghb_settings_get_value(settings, "audio_list");
 
        count = ghb_array_len(alist);
@@ -792,6 +802,7 @@ ghb_set_audio(signal_user_data_t *ud, GValue *settings)
                audio = ghb_array_get_nth(alist, ii);
                track = ghb_settings_get_value(audio, "AudioTrack");
                acodec = ghb_settings_get_value(audio, "AudioEncoder");
+               acodec_actual = ghb_settings_get_value(audio, "AudioEncoderActual");
                bitrate = ghb_settings_get_value(audio, "AudioBitrate");
                rate = ghb_settings_get_value(audio, "AudioSamplerate");
                mix = ghb_settings_get_value(audio, "AudioMixdown");
@@ -803,8 +814,8 @@ ghb_set_audio(signal_user_data_t *ud, GValue *settings)
                        GValue *settings = ghb_dict_value_new();
                        ghb_settings_set_value(settings, "AudioTrack", track);
                        ghb_settings_set_value(settings, "AudioEncoder", acodec);
-                       ghb_settings_set_value(settings, "AudioEncoderActual", 
-                               ghb_settings_get_value(ud->settings, "AudioEncoderActual"));
+                       ghb_settings_set_value(settings, "AudioEncoderActual", acodec_actual);
+
                        // This gets set autimatically if the codec is passthru
                        ghb_settings_set_value(settings, "AudioBitrate", bitrate);
                        ghb_settings_set_value(settings, "AudioSamplerate", rate);