X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=gtk%2Fsrc%2Faudiohandler.c;h=5895a83c0f980081b5483fc5be97025f826b713e;hb=0884cb45aeeb60a46effe1d1056a61fe68300ea7;hp=e6085d304ec1b5b3b10594a5f170d8076148ff15;hpb=0c10c5ae47be0381f337cfdc0624f96e6f3cf5e9;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/gtk/src/audiohandler.c b/gtk/src/audiohandler.c index e6085d30..5895a83c 100644 --- a/gtk/src/audiohandler.c +++ b/gtk/src/audiohandler.c @@ -17,6 +17,7 @@ #include "hb-backend.h" #include "values.h" #include "callbacks.h" +#include "preview.h" #include "audiohandler.h" void @@ -25,144 +26,212 @@ ghb_adjust_audio_rate_combos(signal_user_data_t *ud) gint titleindex, audioindex, acodec, mix; ghb_audio_info_t ainfo; GtkWidget *widget; + GValue *gval; g_debug("ghb_adjust_audio_rate_combos ()"); titleindex = ghb_settings_combo_int(ud->settings, "title"); - widget = GHB_WIDGET(ud->builder, "audio_track"); - audioindex = ghb_lookup_combo_int("audio_track", ghb_widget_value(widget)); + widget = GHB_WIDGET(ud->builder, "AudioTrack"); + gval = ghb_widget_value(widget); + audioindex = ghb_lookup_combo_int("AudioTrack", gval); + ghb_value_free(gval); - widget = GHB_WIDGET(ud->builder, "audio_codec"); - acodec = ghb_lookup_combo_int("audio_codec", ghb_widget_value(widget)); - widget = GHB_WIDGET(ud->builder, "audio_mix"); - mix = ghb_lookup_combo_int("audio_mix", ghb_widget_value(widget)); + widget = GHB_WIDGET(ud->builder, "AudioEncoder"); + gval = ghb_widget_value(widget); + acodec = ghb_lookup_combo_int("AudioEncoder", gval); + ghb_value_free(gval); + widget = GHB_WIDGET(ud->builder, "AudioMixdown"); + gval = ghb_widget_value(widget); + mix = ghb_lookup_combo_int("AudioMixdown", gval); + ghb_value_free(gval); if (ghb_audio_is_passthru (acodec)) { - ghb_set_default_bitrate_opts (ud->builder, -1); + ghb_set_default_bitrate_opts (ud->builder, 0, -1); if (ghb_get_audio_info (&ainfo, titleindex, audioindex)) { gint br = ainfo.bitrate / 1000; // Set the values for bitrate and samplerate to the input rates - ghb_set_passthru_bitrate_opts (ud->builder, br); - ghb_ui_update(ud, "audio_bitrate", ghb_int64_value(br)); - ghb_ui_update(ud, "audio_rate", ghb_int64_value(0)); - ghb_ui_update(ud, "audio_mix", ghb_int64_value(0)); + if (br < 8) + br = 160; + if (ghb_audio_is_passthru (ainfo.codec)) + { + ghb_set_passthru_bitrate_opts (ud->builder, br); + ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(0)); + } + else + { + acodec = ghb_select_audio_codec(ud, audioindex); + br = ghb_find_closest_audio_bitrate(acodec, br); + mix = ghb_get_best_mix( titleindex, audioindex, acodec, 0); + ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix)); + } + ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(br)); + ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(0)); } else { - ghb_ui_update(ud, "audio_bitrate", ghb_int64_value(384)); - ghb_ui_update(ud, "audio_rate", ghb_int64_value(0)); - ghb_ui_update(ud, "audio_mix", ghb_int64_value(0)); + ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(384)); + ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(0)); + ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(0)); } + ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_double_value(0)); } - else if (acodec == HB_ACODEC_FAAC && mix != HB_AMIXDOWN_6CH) + else if (acodec == HB_ACODEC_FAAC) { - gint br; + gint br, last = 320, first = 0; + + if (mix == HB_AMIXDOWN_6CH) + { + first = 192; + last = 768; + } - widget = GHB_WIDGET(ud->builder, "audio_bitrate"); - br = ghb_lookup_combo_int("audio_bitrate", ghb_widget_value(widget)); - if (br > 160) - ghb_ui_update(ud, "audio_bitrate", ghb_int64_value(160)); - ghb_set_default_bitrate_opts (ud->builder, 160); + widget = GHB_WIDGET(ud->builder, "AudioBitrate"); + gval = ghb_widget_value(widget); + br = ghb_lookup_combo_int("AudioBitrate", gval); + ghb_value_free(gval); + if (br > last) + ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(last)); + if (br < first) + ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(first)); + ghb_set_default_bitrate_opts (ud->builder, first, last); } else { - ghb_set_default_bitrate_opts (ud->builder, -1); + ghb_set_default_bitrate_opts (ud->builder, 0, -1); } } +static void +free_audio_hash_key_value(gpointer data) +{ + g_free(data); +} + +gchar* +ghb_get_user_audio_lang(signal_user_data_t *ud, gint titleindex, gint track) +{ + GValue *audio_list, *asettings; + gchar *lang = NULL; + + audio_list = ghb_settings_get_value(ud->settings, "audio_list"); + if (ghb_array_len(audio_list) <= track) + return NULL; + asettings = ghb_array_get_nth(audio_list, track); + track = ghb_settings_get_int(asettings, "AudioTrack"); + lang = ghb_get_source_audio_lang(titleindex, track); + return lang; +} + void ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud) { - gint acodec_code, mix_code, track; - gchar *source_lang; + gint fallback_acodec, track; + gchar *source_lang = NULL; GtkWidget *button; ghb_audio_info_t ainfo; - gint index; - GHashTable *track_indicies; - gint *iptr; + GHashTable *track_indices; + gint mux; - GValue *pref_audio; - GValue *audio, *acodec, *bitrate, *rate, *mix, *drc; + const GValue *pref_audio; + const GValue *audio, *drc; + gint acodec, bitrate, mix; + gdouble rate; gint count, ii, list_count; g_debug("set_pref_audio"); - track_indicies = g_hash_table_new(g_int_hash, g_int_equal); + mux = ghb_settings_combo_int(ud->settings, "FileFormat"); + if (mux == HB_MUX_MP4) + fallback_acodec = HB_ACODEC_FAAC; + else + fallback_acodec = HB_ACODEC_LAME; + track_indices = g_hash_table_new_full(g_int_hash, g_int_equal, + free_audio_hash_key_value, free_audio_hash_key_value); // Clear the audio list ghb_clear_audio_list(ud); // Find "best" audio based on audio preferences button = GHB_WIDGET (ud->builder, "audio_add"); - source_lang = ghb_settings_get_string(ud->settings, "source_audio_lang"); + if (!ghb_settings_get_boolean(ud->settings, "AudioDUB")) + { + source_lang = ghb_get_source_audio_lang(titleindex, 0); + } + if (source_lang == NULL) + source_lang = ghb_settings_get_string(ud->settings, "PreferredLanguage"); - pref_audio = ghb_settings_get_value(ud->settings, "pref_audio_list"); + pref_audio = ghb_settings_get_value(ud->settings, "AudioList"); list_count = 0; count = ghb_array_len(pref_audio); for (ii = 0; ii < count; ii++) { audio = ghb_array_get_nth(pref_audio, ii); - acodec = ghb_settings_get_value(audio, "audio_codec"); - bitrate = ghb_settings_get_value(audio, "audio_bitrate"); - rate = ghb_settings_get_value(audio, "audio_rate"); - mix = ghb_settings_get_value(audio, "audio_mix"); - drc = ghb_settings_get_value(audio, "audio_drc"); - acodec_code = ghb_lookup_combo_int("audio_codec", acodec); + acodec = ghb_settings_combo_int(audio, "AudioEncoder"); + bitrate = ghb_settings_combo_int(audio, "AudioBitrate"); + rate = ghb_settings_combo_double(audio, "AudioSamplerate"); + mix = ghb_settings_combo_int(audio, "AudioMixdown"); + drc = ghb_settings_get_value(audio, "AudioTrackDRCSlider"); + //acodec_code = ghb_lookup_combo_int("AudioEncoder", acodec); // If there are multiple audios using the same codec, then - // select sequential tracks for each. This hash keeps track - // of the last used track for each codec. - iptr = g_hash_table_lookup(track_indicies, &acodec_code); - if (iptr == NULL) - index = 0; - else - index = *(gint*)iptr; - - track = ghb_find_audio_track(titleindex, source_lang, index); + // select sequential tracks for each. The hash keeps track + // of the tracks used for each codec. + track = ghb_find_audio_track(titleindex, source_lang, + acodec, fallback_acodec, track_indices); // Check to see if: - // 1. pref codec is ac3 - // 2. source codec is not ac3 + // 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_code)) + ghb_audio_is_passthru (acodec)) { - if (!ghb_audio_is_passthru(ainfo.codec)) + // HB_ACODEC_* are bit fields. Treat acodec as mask + if (!(ainfo.codec & acodec & (HB_ACODEC_AC3 | HB_ACODEC_DCA))) { - acodec_code = ghb_get_default_acodec(); + acodec = fallback_acodec; // If there's more audio to process, or we've already // placed one in the list, then we can skip this one if ((ii + 1 < count) || (list_count != 0)) { // Skip this audio - acodec_code = 0; + acodec = 0; + } + else + { + bitrate = ainfo.bitrate / 1000; + if (bitrate < 8) + bitrate = 160; + rate = 0; + mix = HB_AMIXDOWN_DOLBYPLII; } } + else + { + acodec &= ainfo.codec; + } } if (titleindex >= 0 && track < 0) - acodec_code = 0; - if (acodec_code != 0) + acodec = 0; + if (acodec != 0) { // Add to audio list g_signal_emit_by_name(button, "clicked", ud); list_count++; - ghb_ui_update(ud, "audio_track", ghb_int64_value(track)); - ghb_ui_update(ud, "audio_codec", acodec); - if (!ghb_audio_is_passthru (acodec_code)) + ghb_ui_update(ud, "AudioTrack", ghb_int64_value(track)); + ghb_ui_update(ud, "AudioEncoder", ghb_int64_value(acodec)); + if (!ghb_audio_is_passthru (acodec)) { // This gets set autimatically if the codec is passthru - ghb_ui_update(ud, "audio_bitrate", bitrate); - ghb_ui_update(ud, "audio_rate", rate); - mix_code = ghb_lookup_combo_int("audio_mix", mix); - mix_code = ghb_get_best_mix( - titleindex, track, acodec_code, mix_code); - ghb_ui_update(ud, "audio_mix", ghb_int64_value(mix_code)); + ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(bitrate)); + ghb_ui_update(ud, "AudioSamplerate", ghb_double_value(rate)); + mix = ghb_get_best_mix( titleindex, track, acodec, mix); + ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix)); } - ghb_ui_update(ud, "audio_drc", drc); - index++; - g_hash_table_insert(track_indicies, &acodec_code, &index); + ghb_adjust_audio_rate_combos(ud); + ghb_ui_update(ud, "AudioTrackDRCSlider", drc); } } g_free(source_lang); - g_hash_table_destroy(track_indicies); + g_hash_table_destroy(track_indices); } static GValue* @@ -198,8 +267,8 @@ get_selected_asettings(signal_user_data_t *ud) return asettings; } -static void -audio_list_refresh_selected(signal_user_data_t *ud) +void +ghb_audio_list_refresh_selected(signal_user_data_t *ud) { GtkTreeView *treeview; GtkTreePath *treepath; @@ -211,14 +280,15 @@ audio_list_refresh_selected(signal_user_data_t *ud) GValue *asettings = NULL; const GValue *audio_list; - g_debug("audio_list_refresh_selected ()"); + g_debug("ghb_audio_list_refresh_selected ()"); treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list")); selection = gtk_tree_view_get_selection (treeview); if (gtk_tree_selection_get_selected(selection, &store, &iter)) { const gchar *track, *codec, *br, *sr, *mix; - gchar *drc, *s_track, *s_codec, *s_br, *s_sr, *s_mix; - gdouble s_drc; + gchar *s_drc, *s_track, *s_codec, *s_br, *s_sr, *s_mix; + gint itrack, icodec; + gdouble drc; // Get the row number treepath = gtk_tree_model_get_path (store, &iter); indices = gtk_tree_path_get_indices (treepath); @@ -231,19 +301,27 @@ audio_list_refresh_selected(signal_user_data_t *ud) return; asettings = ghb_array_get_nth(audio_list, row); - track = ghb_settings_combo_option(asettings, "audio_track"); - codec = ghb_settings_combo_option(asettings, "audio_codec"); - br = ghb_settings_combo_option(asettings, "audio_bitrate"); - sr = ghb_settings_combo_option(asettings, "audio_rate"); - mix = ghb_settings_combo_option(asettings, "audio_mix"); - drc = ghb_settings_get_string(asettings, "audio_drc"); + 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"); + br = ghb_settings_combo_option(asettings, "AudioBitrate"); + sr = ghb_settings_combo_option(asettings, "AudioSamplerate"); + mix = ghb_settings_combo_option(asettings, "AudioMixdown"); + + s_track = ghb_settings_get_string(asettings, "AudioTrack"); + s_codec = ghb_settings_get_string(asettings, "AudioEncoder"); + s_br = ghb_settings_get_string(asettings, "AudioBitrate"); + s_sr = ghb_settings_get_string(asettings, "AudioSamplerate"); + s_mix = ghb_settings_get_string(asettings, "AudioMixdown"); + drc = ghb_settings_get_double(asettings, "AudioTrackDRCSlider"); + if (drc < 1.0) + s_drc = g_strdup("Off"); + else + s_drc = g_strdup_printf("%.1f", drc); - s_track = ghb_settings_get_string(asettings, "audio_track"); - s_codec = ghb_settings_get_string(asettings, "audio_codec"); - s_br = ghb_settings_get_string(asettings, "audio_bitrate"); - s_sr = ghb_settings_get_string(asettings, "audio_rate"); - s_mix = ghb_settings_get_string(asettings, "audio_mix"); - s_drc = ghb_settings_get_double(asettings, "audio_drc"); + if (icodec == HB_ACODEC_MASK) + codec = ghb_select_audio_codec_str(ud, itrack); gtk_list_store_set(GTK_LIST_STORE(store), &iter, // These are displayed in list @@ -252,16 +330,16 @@ audio_list_refresh_selected(signal_user_data_t *ud) 2, br, 3, sr, 4, mix, + 5, s_drc, // These are used to set combo values when a list item is selected - 5, drc, 6, s_track, 7, s_codec, 8, s_br, 9, s_sr, 10, s_mix, - 11, s_drc, + 11, drc, -1); - g_free(drc); + g_free(s_drc); g_free(s_track); g_free(s_codec); g_free(s_br); @@ -270,15 +348,17 @@ audio_list_refresh_selected(signal_user_data_t *ud) } } -void +G_MODULE_EXPORT void audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { static gint prev_acodec = 0; gint acodec_code, mix_code; - GValue *asettings; + GValue *asettings, *gval; g_debug("audio_codec_changed_cb ()"); - acodec_code = ghb_lookup_combo_int("audio_codec", ghb_widget_value(widget)); + gval = ghb_widget_value(widget); + acodec_code = ghb_lookup_combo_int("AudioEncoder", gval); + ghb_value_free(gval); if (ghb_audio_is_passthru (prev_acodec) && !ghb_audio_is_passthru (acodec_code)) { @@ -288,49 +368,36 @@ audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud) gint track; titleindex = ghb_settings_combo_int(ud->settings, "title"); - track = ghb_settings_combo_int(ud->settings, "audio_track"); + track = ghb_settings_combo_int(ud->settings, "AudioTrack"); - ghb_ui_update(ud, "audio_bitrate", ghb_string_value("160")); - ghb_ui_update(ud, "audio_rate", ghb_string_value("source")); - mix_code = ghb_lookup_combo_int("audio_mix", ghb_string_value("dpl2")); + ghb_ui_update(ud, "AudioBitrate", ghb_string_value("160")); + ghb_ui_update(ud, "AudioSamplerate", ghb_string_value("source")); + mix_code = ghb_lookup_combo_int("AudioMixdown", ghb_string_value("dpl2")); mix_code = ghb_get_best_mix( titleindex, track, acodec_code, mix_code); - ghb_ui_update(ud, "audio_mix", ghb_int64_value(mix_code)); - ghb_ui_update(ud, "audio_drc", ghb_double_value(1.0)); + ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix_code)); } ghb_adjust_audio_rate_combos(ud); ghb_grey_combo_options (ud->builder); - ghb_check_dependency(ud, widget); + ghb_check_dependency(ud, widget, NULL); prev_acodec = acodec_code; asettings = get_selected_asettings(ud); if (asettings != NULL) { ghb_widget_to_setting(asettings, widget); - audio_list_refresh_selected(ud); - } - - const GValue *audio_list; - audio_list = ghb_settings_get_value(ud->settings, "audio_list"); - if (ghb_ac3_in_audio_list (audio_list)) - { - gchar *container; - - container = ghb_settings_get_string(ud->settings, "container"); - if (strcmp(container, "mp4") == 0) - { - ghb_ui_update(ud, "container", ghb_string_value("m4v")); - } - g_free(container); + ghb_audio_list_refresh_selected(ud); } + ghb_update_destination_extension(ud); + ghb_live_reset(ud); } -void +G_MODULE_EXPORT void audio_track_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { GValue *asettings; g_debug("audio_track_changed_cb ()"); ghb_adjust_audio_rate_combos(ud); - ghb_check_dependency(ud, widget); + ghb_check_dependency(ud, widget, NULL); ghb_grey_combo_options(ud->builder); asettings = get_selected_asettings(ud); if (asettings != NULL) @@ -338,54 +405,84 @@ audio_track_changed_cb(GtkWidget *widget, signal_user_data_t *ud) const gchar *track; ghb_widget_to_setting(asettings, widget); - audio_list_refresh_selected(ud); - track = ghb_settings_combo_option(asettings, "audio_track"); - ghb_settings_set_string(asettings, "audio_track_long", track); + ghb_audio_list_refresh_selected(ud); + track = ghb_settings_combo_option(asettings, "AudioTrack"); + ghb_settings_set_string(asettings, "AudioTrackDescription", track); } + ghb_live_reset(ud); } -void +G_MODULE_EXPORT void audio_mix_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { GValue *asettings; - g_debug("audio_widget_changed_cb ()"); + g_debug("audio_mix_changed_cb ()"); ghb_adjust_audio_rate_combos(ud); - ghb_check_dependency(ud, widget); + ghb_check_dependency(ud, widget, NULL); asettings = get_selected_asettings(ud); if (asettings != NULL) { ghb_widget_to_setting(asettings, widget); - audio_list_refresh_selected(ud); + ghb_audio_list_refresh_selected(ud); } + ghb_live_reset(ud); } -void +G_MODULE_EXPORT void audio_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { GValue *asettings; g_debug("audio_widget_changed_cb ()"); - ghb_check_dependency(ud, widget); + ghb_check_dependency(ud, widget, NULL); asettings = get_selected_asettings(ud); if (asettings != NULL) { ghb_widget_to_setting(asettings, widget); - audio_list_refresh_selected(ud); + ghb_audio_list_refresh_selected(ud); } + ghb_live_reset(ud); +} + +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 ()"); + + 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); + 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); } // subtitles differ from other settings in that // the selection is updated automaitcally when the title // changes. I don't want the preset selection changed as // would happen for regular settings. -void +G_MODULE_EXPORT void subtitle_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { - const gchar *name = gtk_widget_get_name(widget); + const gchar *name = ghb_get_setting_key(widget); g_debug("subtitle_changed_cb () %s", name); ghb_widget_to_setting(ud->settings, widget); - ghb_check_dependency(ud, widget); + ghb_check_dependency(ud, widget, NULL); + ghb_live_reset(ud); } void @@ -417,27 +514,38 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings) GtkListStore *store; GtkTreeSelection *selection; const gchar *track, *codec, *br, *sr, *mix; - gchar *drc, *s_track, *s_codec, *s_br, *s_sr, *s_mix; - gdouble s_drc; + gchar *s_drc, *s_track, *s_codec, *s_br, *s_sr, *s_mix; + gint icodec, itrack; + gdouble drc; g_debug("add_to_audio_list ()"); treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list")); selection = gtk_tree_view_get_selection (treeview); store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview)); - track = ghb_settings_combo_option(settings, "audio_track"); - codec = ghb_settings_combo_option(settings, "audio_codec"); - br = ghb_settings_combo_option(settings, "audio_bitrate"); - sr = ghb_settings_combo_option(settings, "audio_rate"); - mix = ghb_settings_combo_option(settings, "audio_mix"); - drc = ghb_settings_get_string(settings, "audio_drc"); + 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"); + br = ghb_settings_combo_option(settings, "AudioBitrate"); + sr = ghb_settings_combo_option(settings, "AudioSamplerate"); + mix = ghb_settings_combo_option(settings, "AudioMixdown"); + + s_track = ghb_settings_get_string(settings, "AudioTrack"); + s_codec = ghb_settings_get_string(settings, "AudioEncoder"); + s_br = ghb_settings_get_string(settings, "AudioBitrate"); + s_sr = ghb_settings_get_string(settings, "AudioSamplerate"); + s_mix = ghb_settings_get_string(settings, "AudioMixdown"); + drc = ghb_settings_get_double(settings, "AudioTrackDRCSlider"); + if (drc < 1.0) + s_drc = g_strdup("Off"); + else + s_drc = g_strdup_printf("%.1f", drc); - s_track = ghb_settings_get_string(settings, "audio_track"); - s_codec = ghb_settings_get_string(settings, "audio_codec"); - s_br = ghb_settings_get_string(settings, "audio_bitrate"); - s_sr = ghb_settings_get_string(settings, "audio_rate"); - s_mix = ghb_settings_get_string(settings, "audio_mix"); - s_drc = ghb_settings_get_double(settings, "audio_drc"); + if (icodec == HB_ACODEC_MASK) + { + codec = ghb_select_audio_codec_str(ud, itrack); + } gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, @@ -447,17 +555,17 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings) 2, br, 3, sr, 4, mix, + 5, s_drc, // These are used to set combo box values when a list item is selected - 5, drc, 6, s_track, 7, s_codec, 8, s_br, 9, s_sr, 10, s_mix, - 11, s_drc, + 11, drc, -1); gtk_tree_selection_select_iter(selection, &iter); - g_free(drc); + g_free(s_drc); g_free(s_track); g_free(s_codec); g_free(s_br); @@ -465,7 +573,7 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings) g_free(s_mix); } -void +G_MODULE_EXPORT void audio_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t *ud) { GtkTreeModel *store; @@ -486,27 +594,23 @@ audio_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t 10, &mix, 11, &drc, -1); - ghb_ui_update(ud, "audio_track", ghb_string_value(track)); - ghb_ui_update(ud, "audio_codec", ghb_string_value(codec)); - ghb_ui_update(ud, "audio_bitrate", ghb_string_value(bitrate)); - ghb_ui_update(ud, "audio_rate", ghb_string_value(sample_rate)); - ghb_ui_update(ud, "audio_mix", ghb_string_value(mix)); - ghb_ui_update(ud, "audio_drc", ghb_double_value(drc)); + ghb_ui_update(ud, "AudioTrack", ghb_string_value(track)); + ghb_ui_update(ud, "AudioEncoder", ghb_string_value(codec)); + ghb_ui_update(ud, "AudioBitrate", ghb_string_value(bitrate)); + ghb_ui_update(ud, "AudioSamplerate", ghb_string_value(sample_rate)); + ghb_ui_update(ud, "AudioMixdown", ghb_string_value(mix)); + ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_double_value(drc)); widget = GHB_WIDGET (ud->builder, "audio_remove"); gtk_widget_set_sensitive(widget, TRUE); - //widget = GHB_WIDGET (ud->builder, "audio_update"); - //gtk_widget_set_sensitive(widget, TRUE); } else { widget = GHB_WIDGET (ud->builder, "audio_remove"); gtk_widget_set_sensitive(widget, FALSE); - //widget = GHB_WIDGET (ud->builder, "audio_update"); - //gtk_widget_set_sensitive(widget, FALSE); } } -void +G_MODULE_EXPORT void audio_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) { // Add the current audio settings to the list. @@ -519,20 +623,20 @@ audio_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) g_debug("audio_add_clicked_cb ()"); asettings = ghb_dict_value_new(); // Only allow up to 8 audio entries - widget = GHB_WIDGET(ud->builder, "audio_track"); - ghb_settings_take_value(asettings, "audio_track", ghb_widget_value(widget)); - widget = GHB_WIDGET(ud->builder, "audio_codec"); - ghb_settings_take_value(asettings, "audio_codec", ghb_widget_value(widget)); - widget = GHB_WIDGET(ud->builder, "audio_bitrate"); - ghb_settings_take_value(asettings, "audio_bitrate", ghb_widget_value(widget)); - widget = GHB_WIDGET(ud->builder, "audio_rate"); - ghb_settings_take_value(asettings, "audio_rate", ghb_widget_value(widget)); - widget = GHB_WIDGET(ud->builder, "audio_mix"); - ghb_settings_take_value(asettings, "audio_mix", ghb_widget_value(widget)); - widget = GHB_WIDGET(ud->builder, "audio_drc"); - ghb_settings_take_value(asettings, "audio_drc", ghb_widget_value(widget)); - track = ghb_settings_combo_option(asettings, "audio_track"); - ghb_settings_set_string(asettings, "audio_track_long", track); + widget = GHB_WIDGET(ud->builder, "AudioTrack"); + ghb_settings_take_value(asettings, "AudioTrack", ghb_widget_value(widget)); + widget = GHB_WIDGET(ud->builder, "AudioEncoder"); + ghb_settings_take_value(asettings, "AudioEncoder", 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"); + 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, "AudioTrackDRCSlider"); + ghb_settings_take_value(asettings, "AudioTrackDRCSlider", ghb_widget_value(widget)); + track = ghb_settings_combo_option(asettings, "AudioTrack"); + ghb_settings_set_string(asettings, "AudioTrackDescription", track); audio_list = ghb_settings_get_value(ud->settings, "audio_list"); if (audio_list == NULL) @@ -543,13 +647,14 @@ audio_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) ghb_array_append(audio_list, asettings); add_to_audio_list(ud, asettings); count = ghb_array_len(audio_list); - if (count >= 8) + if (count >= 99) { gtk_widget_set_sensitive(xwidget, FALSE); } + ghb_update_destination_extension(ud); } -void +G_MODULE_EXPORT void audio_remove_clicked_cb(GtkWidget *widget, signal_user_data_t *ud) { GtkTreeView *treeview; @@ -599,3 +704,49 @@ audio_remove_clicked_cb(GtkWidget *widget, signal_user_data_t *ud) } } +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; + 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); + for (ii = 0; ii < count; ii++) + { + audio = ghb_array_get_nth(alist, ii); + track = ghb_settings_get_value(audio, "AudioTrack"); + acodec = ghb_settings_get_value(audio, "AudioEncoder"); + bitrate = ghb_settings_get_value(audio, "AudioBitrate"); + rate = ghb_settings_get_value(audio, "AudioSamplerate"); + mix = ghb_settings_get_value(audio, "AudioMixdown"); + drc = ghb_settings_get_value(audio, "AudioTrackDRCSlider"); + acodec_code = ghb_lookup_combo_int("AudioEncoder", acodec); + + if (acodec_code != 0) + { + // Add to audio list + g_signal_emit_by_name(button, "clicked", ud); + ghb_ui_update(ud, "AudioTrack", track); + ghb_ui_update(ud, "AudioEncoder", acodec); + if (!ghb_audio_is_passthru (acodec_code)) + { + // This gets set autimatically if the codec is passthru + ghb_ui_update(ud, "AudioBitrate", bitrate); + ghb_ui_update(ud, "AudioSamplerate", rate); + ghb_ui_update(ud, "AudioMixdown", mix); + } + ghb_ui_update(ud, "AudioTrackDRCSlider", drc); + } + } +} +