X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=gtk%2Fsrc%2Faudiohandler.c;h=e11d4e0614e049f3bc559bba09a117d1d0b87cca;hb=8f4fee8854fc711bbf089b6867c46f1b0a6ea4c9;hp=39d54c10935ed3bf2a6b7b71bc692712b4c2396e;hpb=701a385b2d3ad4c95d3d16d62212fbc9078ac2de;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/gtk/src/audiohandler.c b/gtk/src/audiohandler.c index 39d54c10..e11d4e06 100644 --- a/gtk/src/audiohandler.c +++ b/gtk/src/audiohandler.c @@ -20,10 +20,12 @@ #include "preview.h" #include "audiohandler.h" +static void ghb_add_audio(signal_user_data_t *ud, GValue *settings); + void ghb_adjust_audio_rate_combos(signal_user_data_t *ud) { - gint titleindex, audioindex, acodec, mix; + gint titleindex, track, acodec, mix; ghb_audio_info_t ainfo; GtkWidget *widget; GValue *gval; @@ -33,7 +35,7 @@ ghb_adjust_audio_rate_combos(signal_user_data_t *ud) widget = GHB_WIDGET(ud->builder, "AudioTrack"); gval = ghb_widget_value(widget); - audioindex = ghb_lookup_combo_int("AudioTrack", gval); + track = ghb_lookup_combo_int("AudioTrack", gval); ghb_value_free(gval); widget = GHB_WIDGET(ud->builder, "AudioEncoder"); @@ -47,35 +49,55 @@ ghb_adjust_audio_rate_combos(signal_user_data_t *ud) if (ghb_audio_is_passthru (acodec)) { - ghb_set_default_bitrate_opts (ud->builder, -1); - if (ghb_get_audio_info (&ainfo, titleindex, audioindex)) + ghb_set_default_bitrate_opts (ud->builder, 0, -1); + if (ghb_get_audio_info (&ainfo, titleindex, track)) { gint br = ainfo.bitrate / 1000; // Set the values for bitrate and samplerate to the input rates - if (br >= 8) + 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)); + acodec &= ainfo.codec; + } else - br = 160; + { + if (acodec != HB_ACODEC_MASK) + { + acodec = ghb_select_audio_codec(ud, track); + ghb_ui_update(ud, "AudioEncoder", ghb_int64_value(acodec)); + } + else + { + acodec = ghb_select_audio_codec(ud, track); + } + br = ghb_find_closest_audio_bitrate(acodec, br); + mix = ghb_get_best_mix( titleindex, track, 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)); - ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(0)); } else { 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)); + acodec = HB_ACODEC_AC3; } ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_double_value(0)); } else if (acodec == HB_ACODEC_FAAC) { - gint br, last; + gint br, last = 320, first = 0; if (mix == HB_AMIXDOWN_6CH) - last = 448; - else - last = 160; + { + first = 192; + last = 768; + } widget = GHB_WIDGET(ud->builder, "AudioBitrate"); gval = ghb_widget_value(widget); @@ -83,16 +105,21 @@ ghb_adjust_audio_rate_combos(signal_user_data_t *ud) ghb_value_free(gval); if (br > last) ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(last)); - ghb_set_default_bitrate_opts (ud->builder, 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); } + ghb_settings_take_value(ud->settings, "AudioEncoderActual", + ghb_lookup_acodec_value(acodec)); + ghb_check_dependency(ud, NULL, "AudioEncoderActual"); } -void -free_audio_index_list(gpointer data) +static void +free_audio_hash_key_value(gpointer data) { g_free(data); } @@ -115,19 +142,27 @@ ghb_get_user_audio_lang(signal_user_data_t *ud, gint titleindex, gint track) void ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud) { - gint acodec_code, mix_code, track; + gint fallback_acodec, track; gchar *source_lang = NULL; GtkWidget *button; ghb_audio_info_t ainfo; GHashTable *track_indices; + gint mux; const GValue *pref_audio; - const GValue *audio, *acodec, *bitrate, *rate, *mix, *drc; + const GValue *audio, *drc; + gint acodec, bitrate, mix; + gdouble rate; gint count, ii, list_count; g_debug("set_pref_audio"); + 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, - NULL, free_audio_index_list); + 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 @@ -146,62 +181,66 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud) for (ii = 0; ii < count; ii++) { audio = ghb_array_get_nth(pref_audio, ii); - 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"); + 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. The hash keeps track // of the tracks used for each codec. track = ghb_find_audio_track(titleindex, source_lang, - acodec_code, track_indices); + 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)) { - // HB_ACODEC_* are bit fields. Treat acodec_code as mask - if (!(ainfo.codec & acodec_code)) + // 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(); + if (acodec != HB_ACODEC_MASK) + 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_code &= 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, "AudioTrack", ghb_int64_value(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); - mix_code = ghb_lookup_combo_int("AudioMixdown", mix); - mix_code = ghb_get_best_mix( - titleindex, track, acodec_code, mix_code); - ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix_code)); - } + GValue *settings = ghb_dict_value_new(); + ghb_settings_set_int(settings, "AudioTrack", track); + 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")); + // 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, acodec, mix); + ghb_settings_set_string(settings, "AudioMixdown", + ghb_lookup_combo_string("AudioMixdown", ghb_int_value(mix))); + ghb_settings_set_value(settings, "AudioTrackDRCSlider", drc); + ghb_add_audio(ud, settings); ghb_adjust_audio_rate_combos(ud); - ghb_ui_update(ud, "AudioTrackDRCSlider", drc); } } g_free(source_lang); @@ -260,7 +299,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_track, *s_codec, *s_br, *s_sr, *s_mix; + gchar *s_drc; gint itrack, icodec; gdouble drc; // Get the row number @@ -283,11 +322,6 @@ ghb_audio_list_refresh_selected(signal_user_data_t *ud) 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"); @@ -305,20 +339,8 @@ ghb_audio_list_refresh_selected(signal_user_data_t *ud) 3, sr, 4, mix, 5, s_drc, - // These are used to set combo values when a list item is selected - 6, s_track, - 7, s_codec, - 8, s_br, - 9, s_sr, - 10, s_mix, - 11, drc, -1); g_free(s_drc); - g_free(s_track); - g_free(s_codec); - g_free(s_br); - g_free(s_sr); - g_free(s_mix); } } @@ -358,6 +380,7 @@ audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud) if (asettings != NULL) { ghb_widget_to_setting(asettings, widget); + ghb_settings_set_value(asettings, "AudioEncoderActual", ghb_settings_get_value(ud->settings, "AudioEncoderActual")); ghb_audio_list_refresh_selected(ud); } ghb_update_destination_extension(ud); @@ -445,20 +468,6 @@ drc_widget_changed_cb(GtkWidget *widget, gdouble val, signal_user_data_t *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. -G_MODULE_EXPORT void -subtitle_changed_cb(GtkWidget *widget, signal_user_data_t *ud) -{ - const gchar *name = gtk_widget_get_name(widget); - g_debug("subtitle_changed_cb () %s", name); - ghb_widget_to_setting(ud->settings, widget); - ghb_check_dependency(ud, widget, NULL); - ghb_live_reset(ud); -} - void ghb_clear_audio_list(signal_user_data_t *ud) { @@ -488,7 +497,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_track, *s_codec, *s_br, *s_sr, *s_mix; + gchar *s_drc; gint icodec, itrack; gdouble drc; @@ -505,11 +514,6 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings) 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"); @@ -530,21 +534,9 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings) 3, sr, 4, mix, 5, s_drc, - // These are used to set combo box values when a list item is selected - 6, s_track, - 7, s_codec, - 8, s_br, - 9, s_sr, - 10, s_mix, - 11, drc, -1); gtk_tree_selection_select_iter(selection, &iter); g_free(s_drc); - g_free(s_track); - g_free(s_codec); - g_free(s_br); - g_free(s_sr); - g_free(s_mix); } G_MODULE_EXPORT void @@ -554,26 +546,38 @@ audio_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t GtkTreeIter iter; GtkWidget *widget; + GtkTreePath *treepath; + gint *indices; + gint row; + GValue *asettings = NULL; + + const GValue *audio_list; g_debug("audio_list_selection_changed_cb ()"); if (gtk_tree_selection_get_selected(selection, &store, &iter)) { - const gchar *track, *codec, *bitrate, *sample_rate, *mix; - gdouble drc; + //const gchar *actual_codec, *track, *codec, *bitrate, *sample_rate, *mix; + //gdouble drc; - gtk_tree_model_get(store, &iter, - 6, &track, - 7, &codec, - 8, &bitrate, - 9, &sample_rate, - 10, &mix, - 11, &drc, - -1); - 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)); + // Get the row number + treepath = gtk_tree_model_get_path (store, &iter); + indices = gtk_tree_path_get_indices (treepath); + row = indices[0]; + gtk_tree_path_free(treepath); + // find audio settings + if (row < 0) return; + 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); + + 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")); + ghb_check_dependency(ud, NULL, "AudioEncoderActual"); + ghb_ui_update(ud, "AudioBitrate", ghb_settings_get_value(asettings, "AudioBitrate")); + 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")); widget = GHB_WIDGET (ud->builder, "audio_remove"); gtk_widget_set_sensitive(widget, TRUE); } @@ -584,15 +588,39 @@ audio_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t } } +static void +ghb_add_audio(signal_user_data_t *ud, GValue *settings) +{ + GValue *audio_list; + int count; + const gchar * track; + + track = ghb_settings_combo_option(settings, "AudioTrack"); + ghb_settings_set_string(settings, "AudioTrackDescription", track); + + audio_list = ghb_settings_get_value(ud->settings, "audio_list"); + if (audio_list == NULL) + { + audio_list = ghb_array_value_new(8); + ghb_settings_set_value(ud->settings, "audio_list", audio_list); + } + ghb_array_append(audio_list, settings); + add_to_audio_list(ud, settings); + count = ghb_array_len(audio_list); + if (count >= 99) + { + GtkWidget * widget = GHB_WIDGET(ud->builder, "audio_add"); + gtk_widget_set_sensitive(widget, FALSE); + } + ghb_update_destination_extension(ud); +} + G_MODULE_EXPORT void audio_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) { // Add the current audio settings to the list. GValue *asettings; GtkWidget *widget; - gint count; - GValue *audio_list; - const gchar *track; g_debug("audio_add_clicked_cb ()"); asettings = ghb_dict_value_new(); @@ -601,6 +629,8 @@ audio_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) 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)); + ghb_settings_set_value(asettings, "AudioEncoderActual", + ghb_settings_get_value(ud->settings, "AudioEncoderActual")); widget = GHB_WIDGET(ud->builder, "AudioBitrate"); ghb_settings_take_value(asettings, "AudioBitrate", ghb_widget_value(widget)); widget = GHB_WIDGET(ud->builder, "AudioSamplerate"); @@ -609,23 +639,8 @@ audio_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) 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) - { - audio_list = ghb_array_value_new(8); - ghb_settings_set_value(ud->settings, "audio_list", audio_list); - } - ghb_array_append(audio_list, asettings); - add_to_audio_list(ud, asettings); - count = ghb_array_len(audio_list); - if (count >= 99) - { - gtk_widget_set_sensitive(xwidget, FALSE); - } - ghb_update_destination_extension(ud); + ghb_add_audio(ud, asettings); } G_MODULE_EXPORT void @@ -708,18 +723,18 @@ ghb_set_audio(signal_user_data_t *ud, GValue *settings) 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); + 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")); + // This gets set autimatically if the codec is passthru + ghb_settings_set_value(settings, "AudioBitrate", bitrate); + ghb_settings_set_value(settings, "AudioSamplerate", rate); + ghb_settings_set_value(settings, "AudioMixdown", mix); + ghb_settings_set_value(settings, "AudioTrackDRCSlider", drc); + ghb_add_audio(ud, settings); + ghb_adjust_audio_rate_combos(ud); } } }