diff options
Diffstat (limited to 'gtk/src/audiohandler.c')
-rw-r--r-- | gtk/src/audiohandler.c | 2210 |
1 files changed, 1105 insertions, 1105 deletions
diff --git a/gtk/src/audiohandler.c b/gtk/src/audiohandler.c index 95b9ba166..53a0c29cb 100644 --- a/gtk/src/audiohandler.c +++ b/gtk/src/audiohandler.c @@ -31,1272 +31,1272 @@ static gboolean block_updates = FALSE; void ghb_show_hide_advanced_audio( signal_user_data_t *ud ) { - GtkWidget *widget; - - g_debug("audio_advanced_clicked_cb ()"); - widget = GHB_WIDGET(ud->builder, "AdvancedAudioPassTable"); - if (!ghb_settings_get_boolean(ud->settings, "AdvancedAutoPassthru")) - gtk_widget_hide(widget); - else - gtk_widget_show(widget); + GtkWidget *widget; + + g_debug("audio_advanced_clicked_cb ()"); + widget = GHB_WIDGET(ud->builder, "AdvancedAudioPassTable"); + if (!ghb_settings_get_boolean(ud->settings, "AdvancedAutoPassthru")) + gtk_widget_hide(widget); + else + gtk_widget_show(widget); } void check_list_full(signal_user_data_t *ud) { - GValue *audio_list; - gint count; + GValue *audio_list; + gint count; - audio_list = ghb_settings_get_value(ud->settings, "audio_list"); - count = ghb_array_len(audio_list); - GtkWidget * widget = GHB_WIDGET(ud->builder, "audio_add"); - gtk_widget_set_sensitive(widget, count != 99); + audio_list = ghb_settings_get_value(ud->settings, "audio_list"); + count = ghb_array_len(audio_list); + GtkWidget * widget = GHB_WIDGET(ud->builder, "audio_add"); + gtk_widget_set_sensitive(widget, count != 99); } gint ghb_select_audio_codec(gint mux, hb_audio_config_t *aconfig, gint acodec, gint fallback, gint copy_mask) { - guint32 in_codec = aconfig != NULL ? aconfig->in.codec : 0; - - if (acodec == HB_ACODEC_AUTO_PASS) - { - return hb_autopassthru_get_encoder(in_codec, copy_mask, fallback, mux); - } - - gint ii; - // Sanitize fallback - for (ii = 0; ii < hb_audio_encoders_count; ii++) - { - if (hb_audio_encoders[ii].encoder == fallback && - !(hb_audio_encoders[ii].muxers & mux)) - { - if ( mux == HB_MUX_MKV ) - fallback = HB_ACODEC_LAME; - else - fallback = HB_ACODEC_FAAC; - break; - } - } - if ((acodec & HB_ACODEC_PASS_FLAG) && - !(acodec & in_codec & HB_ACODEC_PASS_MASK)) - { - return fallback; - } - for (ii = 0; ii < hb_audio_encoders_count; ii++) - { - if (hb_audio_encoders[ii].encoder == acodec && - !(hb_audio_encoders[ii].muxers & mux)) - { - return fallback; - } - } - return acodec; + guint32 in_codec = aconfig != NULL ? aconfig->in.codec : 0; + + if (acodec == HB_ACODEC_AUTO_PASS) + { + return hb_autopassthru_get_encoder(in_codec, copy_mask, fallback, mux); + } + + gint ii; + // Sanitize fallback + for (ii = 0; ii < hb_audio_encoders_count; ii++) + { + if (hb_audio_encoders[ii].encoder == fallback && + !(hb_audio_encoders[ii].muxers & mux)) + { + if ( mux == HB_MUX_MKV ) + fallback = HB_ACODEC_LAME; + else + fallback = HB_ACODEC_FAAC; + break; + } + } + if ((acodec & HB_ACODEC_PASS_FLAG) && + !(acodec & in_codec & HB_ACODEC_PASS_MASK)) + { + return fallback; + } + for (ii = 0; ii < hb_audio_encoders_count; ii++) + { + if (hb_audio_encoders[ii].encoder == acodec && + !(hb_audio_encoders[ii].muxers & mux)) + { + return fallback; + } + } + return acodec; } int ghb_get_copy_mask(GValue *settings) { - gint mask = 0; - - if (ghb_settings_get_boolean(settings, "AudioAllowMP3Pass")) - { - mask |= HB_ACODEC_MP3; - } - if (ghb_settings_get_boolean(settings, "AudioAllowAACPass")) - { - mask |= HB_ACODEC_FFAAC; - } - if (ghb_settings_get_boolean(settings, "AudioAllowAC3Pass")) - { - mask |= HB_ACODEC_AC3; - } - if (ghb_settings_get_boolean(settings, "AudioAllowDTSPass")) - { - mask |= HB_ACODEC_DCA; - } - if (ghb_settings_get_boolean(settings, "AudioAllowDTSHDPass")) - { - mask |= HB_ACODEC_DCA_HD; - } - return mask; + gint mask = 0; + + if (ghb_settings_get_boolean(settings, "AudioAllowMP3Pass")) + { + mask |= HB_ACODEC_MP3; + } + if (ghb_settings_get_boolean(settings, "AudioAllowAACPass")) + { + mask |= HB_ACODEC_FFAAC; + } + if (ghb_settings_get_boolean(settings, "AudioAllowAC3Pass")) + { + mask |= HB_ACODEC_AC3; + } + if (ghb_settings_get_boolean(settings, "AudioAllowDTSPass")) + { + mask |= HB_ACODEC_DCA; + } + if (ghb_settings_get_boolean(settings, "AudioAllowDTSHDPass")) + { + mask |= HB_ACODEC_DCA_HD; + } + return mask; } int ghb_select_fallback( GValue *settings, int mux, int acodec ) { - gint mask; - gint fallback = 0; - - switch ( acodec ) - { - case HB_ACODEC_MP3_PASS: - return HB_ACODEC_LAME; - - case HB_ACODEC_AAC_PASS: - return HB_ACODEC_FAAC; - - case HB_ACODEC_AC3_PASS: - return HB_ACODEC_AC3; - - default: - { - fallback = ghb_settings_combo_int(settings, "AudioEncoderFallback"); - } - } - if ( mux == HB_MUX_MP4 ) - { - mask = HB_ACODEC_LAME | - HB_ACODEC_FFAAC | - HB_ACODEC_FAAC | - HB_ACODEC_AC3; - } - if ( mux == HB_MUX_MKV ) - { - mask = - HB_ACODEC_FAAC | - HB_ACODEC_LAME | - HB_ACODEC_VORBIS | - HB_ACODEC_AC3 | - HB_ACODEC_FFAAC | - HB_ACODEC_FFFLAC; - } - if (!(fallback & mask )) - { - fallback = HB_ACODEC_LAME; - } - return fallback; + gint mask; + gint fallback = 0; + + switch ( acodec ) + { + case HB_ACODEC_MP3_PASS: + return HB_ACODEC_LAME; + + case HB_ACODEC_AAC_PASS: + return HB_ACODEC_FAAC; + + case HB_ACODEC_AC3_PASS: + return HB_ACODEC_AC3; + + default: + { + fallback = ghb_settings_combo_int(settings, "AudioEncoderFallback"); + } + } + if ( mux == HB_MUX_MP4 ) + { + mask = HB_ACODEC_LAME | + HB_ACODEC_FFAAC | + HB_ACODEC_FAAC | + HB_ACODEC_AC3; + } + if ( mux == HB_MUX_MKV ) + { + mask = + HB_ACODEC_FAAC | + HB_ACODEC_LAME | + HB_ACODEC_VORBIS | + HB_ACODEC_AC3 | + HB_ACODEC_FFAAC | + HB_ACODEC_FFFLAC; + } + if (!(fallback & mask )) + { + fallback = HB_ACODEC_LAME; + } + return fallback; } void ghb_sanitize_audio(GValue *settings, GValue *asettings) { - gint titleindex, track, acodec, select_acodec, mix; - hb_audio_config_t *aconfig; - gint mux; - gint bitrate; - gint sr; - - g_debug("ghb_santiize_audio ()"); - mux = ghb_settings_combo_int(settings, "FileFormat"); - titleindex = ghb_settings_get_int(settings, "title_no"); - track = ghb_settings_combo_int(asettings, "AudioTrack"); - acodec = ghb_settings_combo_int(asettings, "AudioEncoder"); - mix = ghb_settings_combo_int(asettings, "AudioMixdown"); - bitrate = ghb_settings_combo_int(asettings, "AudioBitrate"); - sr = ghb_settings_combo_int(asettings, "AudioSamplerate"); - - aconfig = ghb_get_scan_audio_info(titleindex, track); - if (sr == 0) - { - sr = aconfig ? aconfig->in.samplerate : 48000; - } - gint fallback = ghb_select_fallback(settings, mux, acodec); - gint copy_mask = ghb_get_copy_mask(settings); - select_acodec = ghb_select_audio_codec(mux, aconfig, acodec, fallback, copy_mask); - if (ghb_audio_is_passthru (select_acodec)) - { - if (aconfig) - { - bitrate = aconfig->in.bitrate / 1000; - - // Set the values for bitrate and samplerate to the input rates - mix = 0; - ghb_settings_set_string(asettings, "AudioMixdown", - ghb_lookup_combo_string("AudioMixdown", ghb_int_value(mix))); - select_acodec &= aconfig->in.codec | HB_ACODEC_PASS_FLAG; - ghb_settings_set_string(asettings, "AudioSamplerate", - ghb_lookup_combo_string("AudioSamplerate", ghb_int_value(0))); - } - else - { - mix = 0; - ghb_settings_set_string(asettings, "AudioMixdown", - ghb_lookup_combo_string("AudioMixdown", ghb_int_value(mix))); - ghb_settings_set_string(asettings, "AudioSamplerate", - ghb_lookup_combo_string("AudioSamplerate", ghb_int_value(0))); - bitrate = 448; - } - ghb_settings_set_double(asettings, "AudioTrackDRCSlider", 0.0); - } - else - { - if (mix == 0) - mix = ghb_get_best_mix( aconfig, select_acodec, 0); - bitrate = hb_get_best_audio_bitrate(select_acodec, bitrate, sr, mix); - ghb_settings_set_string(asettings, "AudioMixdown", - ghb_lookup_combo_string("AudioMixdown", ghb_int_value(mix))); - } - ghb_settings_set_string(asettings, "AudioBitrate", - ghb_lookup_combo_string("AudioBitrate", ghb_int_value(bitrate))); - - ghb_settings_take_value(asettings, "AudioEncoderActual", - ghb_lookup_acodec_value(select_acodec)); + gint titleindex, track, acodec, select_acodec, mix; + hb_audio_config_t *aconfig; + gint mux; + gint bitrate; + gint sr; + + g_debug("ghb_santiize_audio ()"); + mux = ghb_settings_combo_int(settings, "FileFormat"); + titleindex = ghb_settings_get_int(settings, "title_no"); + track = ghb_settings_combo_int(asettings, "AudioTrack"); + acodec = ghb_settings_combo_int(asettings, "AudioEncoder"); + mix = ghb_settings_combo_int(asettings, "AudioMixdown"); + bitrate = ghb_settings_combo_int(asettings, "AudioBitrate"); + sr = ghb_settings_combo_int(asettings, "AudioSamplerate"); + + aconfig = ghb_get_scan_audio_info(titleindex, track); + if (sr == 0) + { + sr = aconfig ? aconfig->in.samplerate : 48000; + } + gint fallback = ghb_select_fallback(settings, mux, acodec); + gint copy_mask = ghb_get_copy_mask(settings); + select_acodec = ghb_select_audio_codec(mux, aconfig, acodec, fallback, copy_mask); + if (ghb_audio_is_passthru (select_acodec)) + { + if (aconfig) + { + bitrate = aconfig->in.bitrate / 1000; + + // Set the values for bitrate and samplerate to the input rates + mix = 0; + ghb_settings_set_string(asettings, "AudioMixdown", + ghb_lookup_combo_string("AudioMixdown", ghb_int_value(mix))); + select_acodec &= aconfig->in.codec | HB_ACODEC_PASS_FLAG; + ghb_settings_set_string(asettings, "AudioSamplerate", + ghb_lookup_combo_string("AudioSamplerate", ghb_int_value(0))); + } + else + { + mix = 0; + ghb_settings_set_string(asettings, "AudioMixdown", + ghb_lookup_combo_string("AudioMixdown", ghb_int_value(mix))); + ghb_settings_set_string(asettings, "AudioSamplerate", + ghb_lookup_combo_string("AudioSamplerate", ghb_int_value(0))); + bitrate = 448; + } + ghb_settings_set_double(asettings, "AudioTrackDRCSlider", 0.0); + } + else + { + if (mix == 0) + mix = ghb_get_best_mix( aconfig, select_acodec, 0); + bitrate = hb_get_best_audio_bitrate(select_acodec, bitrate, sr, mix); + ghb_settings_set_string(asettings, "AudioMixdown", + ghb_lookup_combo_string("AudioMixdown", ghb_int_value(mix))); + } + ghb_settings_set_string(asettings, "AudioBitrate", + ghb_lookup_combo_string("AudioBitrate", ghb_int_value(bitrate))); + + ghb_settings_take_value(asettings, "AudioEncoderActual", + ghb_lookup_acodec_value(select_acodec)); } void ghb_adjust_audio_rate_combos(signal_user_data_t *ud) { - gint titleindex, track, acodec, select_acodec, mix; - hb_audio_config_t *aconfig; - GtkWidget *widget; - GValue *gval; - gint mux; - gint bitrate; - gint sr = 48000; - - g_debug("ghb_adjust_audio_rate_combos ()"); - mux = ghb_settings_combo_int(ud->settings, "FileFormat"); - titleindex = ghb_settings_combo_int(ud->settings, "title"); - - widget = GHB_WIDGET(ud->builder, "AudioTrack"); - gval = ghb_widget_value(widget); - track = ghb_lookup_combo_int("AudioTrack", gval); - ghb_value_free(gval); - - 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); - - widget = GHB_WIDGET(ud->builder, "AudioBitrate"); - gval = ghb_widget_value(widget); - bitrate = ghb_lookup_combo_int("AudioBitrate", gval); - - widget = GHB_WIDGET(ud->builder, "AudioSamplerate"); - gval = ghb_widget_value(widget); - sr = ghb_lookup_combo_int("AudioSamplerate", gval); - - - aconfig = ghb_get_scan_audio_info(titleindex, track); - if (sr == 0) - { - sr = aconfig ? aconfig->in.samplerate : 48000; - } - gint fallback = ghb_select_fallback( ud->settings, mux, acodec ); - gint copy_mask = ghb_get_copy_mask(ud->settings); - select_acodec = ghb_select_audio_codec(mux, aconfig, acodec, fallback, copy_mask); - gboolean codec_defined_bitrate = FALSE; - if (ghb_audio_is_passthru (select_acodec)) - { - if (aconfig) - { - bitrate = aconfig->in.bitrate / 1000; - - // Set the values for bitrate and samplerate to the input rates - 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; - codec_defined_bitrate = TRUE; - ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(0)); - } - else - { - ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(0)); - mix = 0; - ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix)); - bitrate = 448; - } - ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_double_value(0)); - } - else - { - if (mix == 0) - mix = ghb_get_best_mix( aconfig, select_acodec, 0); - bitrate = hb_get_best_audio_bitrate(select_acodec, bitrate, sr, mix); - ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix)); - } - if (!codec_defined_bitrate) - { - 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_bitrate_opts (ud->builder, low, high, -1); - } - ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(bitrate)); - - 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"); + gint titleindex, track, acodec, select_acodec, mix; + hb_audio_config_t *aconfig; + GtkWidget *widget; + GValue *gval; + gint mux; + gint bitrate; + gint sr = 48000; + + g_debug("ghb_adjust_audio_rate_combos ()"); + mux = ghb_settings_combo_int(ud->settings, "FileFormat"); + titleindex = ghb_settings_combo_int(ud->settings, "title"); + + widget = GHB_WIDGET(ud->builder, "AudioTrack"); + gval = ghb_widget_value(widget); + track = ghb_lookup_combo_int("AudioTrack", gval); + ghb_value_free(gval); + + 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); + + widget = GHB_WIDGET(ud->builder, "AudioBitrate"); + gval = ghb_widget_value(widget); + bitrate = ghb_lookup_combo_int("AudioBitrate", gval); + + widget = GHB_WIDGET(ud->builder, "AudioSamplerate"); + gval = ghb_widget_value(widget); + sr = ghb_lookup_combo_int("AudioSamplerate", gval); + + + aconfig = ghb_get_scan_audio_info(titleindex, track); + if (sr == 0) + { + sr = aconfig ? aconfig->in.samplerate : 48000; + } + gint fallback = ghb_select_fallback( ud->settings, mux, acodec ); + gint copy_mask = ghb_get_copy_mask(ud->settings); + select_acodec = ghb_select_audio_codec(mux, aconfig, acodec, fallback, copy_mask); + gboolean codec_defined_bitrate = FALSE; + if (ghb_audio_is_passthru (select_acodec)) + { + if (aconfig) + { + bitrate = aconfig->in.bitrate / 1000; + + // Set the values for bitrate and samplerate to the input rates + 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; + codec_defined_bitrate = TRUE; + ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(0)); + } + else + { + ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(0)); + mix = 0; + ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix)); + bitrate = 448; + } + ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_double_value(0)); + } + else + { + if (mix == 0) + mix = ghb_get_best_mix( aconfig, select_acodec, 0); + bitrate = hb_get_best_audio_bitrate(select_acodec, bitrate, sr, mix); + ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix)); + } + if (!codec_defined_bitrate) + { + 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_bitrate_opts (ud->builder, low, high, -1); + } + ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(bitrate)); + + 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"); } static void free_audio_hash_key_value(gpointer data) { - g_free(data); + g_free(data); } const gchar* ghb_get_user_audio_lang(GValue *settings, gint titleindex, gint track) { - GValue *audio_list, *asettings; - const gchar *lang; - - audio_list = ghb_settings_get_value(settings, "audio_list"); - if (ghb_array_len(audio_list) <= track) - return "und"; - 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; + GValue *audio_list, *asettings; + const gchar *lang; + + audio_list = ghb_settings_get_value(settings, "audio_list"); + if (ghb_array_len(audio_list) <= track) + return "und"; + 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_settings(gint titleindex, GValue *settings) { - gint track; - gchar *source_lang; - hb_audio_config_t *aconfig; - GHashTable *track_indices; - gint mux; - - const GValue *pref_audio; - const GValue *audio, *drc, *gain, *enable_qual; - gint acodec, bitrate, mix; - gdouble rate, quality; - gint count, ii, list_count; - - g_debug("set_pref_audio"); - mux = ghb_settings_combo_int(settings, "FileFormat"); - 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_settings(settings); - - // Find "best" audio based on audio preferences - if (!ghb_settings_get_boolean(settings, "AudioDUB")) - { - source_lang = g_strdup(ghb_get_source_audio_lang(titleindex, 0)); - } - else - { - source_lang = ghb_settings_get_string(settings, "PreferredLanguage"); - } - - pref_audio = ghb_settings_get_value(settings, "AudioList"); - - list_count = 0; - count = ghb_array_len(pref_audio); - for (ii = 0; ii < count; ii++) - { - gint select_acodec; - gint fallback; - - audio = ghb_array_get_nth(pref_audio, ii); - acodec = ghb_settings_combo_int(audio, "AudioEncoder"); - fallback = ghb_select_fallback(settings, mux, acodec); - gint copy_mask = ghb_get_copy_mask(settings); - select_acodec = ghb_select_audio_codec(mux, NULL, acodec, fallback, copy_mask); - 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"); - 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. - track = ghb_find_audio_track(titleindex, source_lang, - select_acodec, fallback, track_indices); - // Check to see if: - // 1. pref codec is passthru - // 2. source codec is not passthru - // 3. next pref is enabled - 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 (!(aconfig->in.codec & select_acodec & HB_ACODEC_PASS_MASK)) - { - if (acodec != HB_ACODEC_AUTO_PASS) - acodec = fallback; - // If we can't substitute the passthru with a suitable - // encoder and - // If there's more audio to process, or we've already - // placed one in the list, then we can skip this one - if (!(select_acodec & fallback) && - ((ii + 1 < count) || (list_count != 0))) - { - // Skip this audio - acodec = 0; - } - } - else - { - select_acodec &= aconfig->in.codec | HB_ACODEC_PASS_FLAG; - } - } - if (titleindex >= 0 && track < 0) - acodec = 0; - if (acodec != 0) - { - GValue *asettings = ghb_dict_value_new(); - ghb_settings_set_int(asettings, "AudioTrack", track); - ghb_settings_set_string(asettings, "AudioEncoder", - ghb_lookup_combo_string("AudioEncoder", ghb_int_value(acodec))); - ghb_settings_set_value(asettings, "AudioEncoderActual", - ghb_lookup_acodec_value(select_acodec)); - ghb_settings_set_value(asettings, "AudioTrackQualityEnable", enable_qual); - ghb_settings_set_double(asettings, "AudioTrackQuality", quality); - - // This gets set autimatically if the codec is passthru - ghb_settings_set_string(asettings, "AudioBitrate", - ghb_lookup_combo_string("AudioBitrate", ghb_int_value(bitrate))); - ghb_settings_set_string(asettings, "AudioSamplerate", - ghb_lookup_combo_string("AudioSamplerate", ghb_int_value(rate))); - mix = ghb_get_best_mix( aconfig, select_acodec, mix); - ghb_settings_set_string(asettings, "AudioMixdown", - ghb_lookup_combo_string("AudioMixdown", ghb_int_value(mix))); - ghb_settings_set_value(asettings, "AudioTrackDRCSlider", drc); - ghb_settings_set_value(asettings, "AudioTrackGain", gain); - ghb_sanitize_audio(settings, asettings); - ghb_add_audio_to_settings(settings, asettings); - } - } - g_free(source_lang); - g_hash_table_destroy(track_indices); + gint track; + gchar *source_lang; + hb_audio_config_t *aconfig; + GHashTable *track_indices; + gint mux; + + const GValue *pref_audio; + const GValue *audio, *drc, *gain, *enable_qual; + gint acodec, bitrate, mix; + gdouble rate, quality; + gint count, ii, list_count; + + g_debug("set_pref_audio"); + mux = ghb_settings_combo_int(settings, "FileFormat"); + 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_settings(settings); + + // Find "best" audio based on audio preferences + if (!ghb_settings_get_boolean(settings, "AudioDUB")) + { + source_lang = g_strdup(ghb_get_source_audio_lang(titleindex, 0)); + } + else + { + source_lang = ghb_settings_get_string(settings, "PreferredLanguage"); + } + + pref_audio = ghb_settings_get_value(settings, "AudioList"); + + list_count = 0; + count = ghb_array_len(pref_audio); + for (ii = 0; ii < count; ii++) + { + gint select_acodec; + gint fallback; + + audio = ghb_array_get_nth(pref_audio, ii); + acodec = ghb_settings_combo_int(audio, "AudioEncoder"); + fallback = ghb_select_fallback(settings, mux, acodec); + gint copy_mask = ghb_get_copy_mask(settings); + select_acodec = ghb_select_audio_codec(mux, NULL, acodec, fallback, copy_mask); + 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"); + 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. + track = ghb_find_audio_track(titleindex, source_lang, + select_acodec, fallback, track_indices); + // Check to see if: + // 1. pref codec is passthru + // 2. source codec is not passthru + // 3. next pref is enabled + 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 (!(aconfig->in.codec & select_acodec & HB_ACODEC_PASS_MASK)) + { + if (acodec != HB_ACODEC_AUTO_PASS) + acodec = fallback; + // If we can't substitute the passthru with a suitable + // encoder and + // If there's more audio to process, or we've already + // placed one in the list, then we can skip this one + if (!(select_acodec & fallback) && + ((ii + 1 < count) || (list_count != 0))) + { + // Skip this audio + acodec = 0; + } + } + else + { + select_acodec &= aconfig->in.codec | HB_ACODEC_PASS_FLAG; + } + } + if (titleindex >= 0 && track < 0) + acodec = 0; + if (acodec != 0) + { + GValue *asettings = ghb_dict_value_new(); + ghb_settings_set_int(asettings, "AudioTrack", track); + ghb_settings_set_string(asettings, "AudioEncoder", + ghb_lookup_combo_string("AudioEncoder", ghb_int_value(acodec))); + ghb_settings_set_value(asettings, "AudioEncoderActual", + ghb_lookup_acodec_value(select_acodec)); + ghb_settings_set_value(asettings, "AudioTrackQualityEnable", enable_qual); + ghb_settings_set_double(asettings, "AudioTrackQuality", quality); + + // This gets set autimatically if the codec is passthru + ghb_settings_set_string(asettings, "AudioBitrate", + ghb_lookup_combo_string("AudioBitrate", ghb_int_value(bitrate))); + ghb_settings_set_string(asettings, "AudioSamplerate", + ghb_lookup_combo_string("AudioSamplerate", ghb_int_value(rate))); + mix = ghb_get_best_mix( aconfig, select_acodec, mix); + ghb_settings_set_string(asettings, "AudioMixdown", + ghb_lookup_combo_string("AudioMixdown", ghb_int_value(mix))); + ghb_settings_set_value(asettings, "AudioTrackDRCSlider", drc); + ghb_settings_set_value(asettings, "AudioTrackGain", gain); + ghb_sanitize_audio(settings, asettings); + ghb_add_audio_to_settings(settings, asettings); + } + } + g_free(source_lang); + g_hash_table_destroy(track_indices); } void ghb_set_pref_audio_from_settings(signal_user_data_t *ud, GValue *settings) { - const GValue *audio_list, *audio; - gint count, ii; - - // Clear the audio list - ghb_clear_audio_list_ui(ud->builder); - - audio_list = ghb_settings_get_value(settings, "audio_list"); - count = ghb_array_len(audio_list); - for (ii = 0; ii < count; ii++) - { - audio = ghb_array_get_nth(audio_list, ii); - ghb_add_audio_to_ui(ud->builder, audio); - ghb_adjust_audio_rate_combos(ud); - } - check_list_full(ud); + const GValue *audio_list, *audio; + gint count, ii; + + // Clear the audio list + ghb_clear_audio_list_ui(ud->builder); + + audio_list = ghb_settings_get_value(settings, "audio_list"); + count = ghb_array_len(audio_list); + for (ii = 0; ii < count; ii++) + { + audio = ghb_array_get_nth(audio_list, ii); + ghb_add_audio_to_ui(ud->builder, audio); + ghb_adjust_audio_rate_combos(ud); + } + check_list_full(ud); } static GValue* get_selected_asettings(signal_user_data_t *ud) { - GtkTreeView *treeview; - GtkTreePath *treepath; - GtkTreeSelection *selection; - GtkTreeModel *store; - GtkTreeIter iter; - gint *indices; - gint row; - GValue *asettings = NULL; - const GValue *audio_list; - - g_debug("get_selected_asettings ()"); - 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)) - { - // 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 NULL; - audio_list = ghb_settings_get_value(ud->settings, "audio_list"); - if (row >= ghb_array_len(audio_list)) - return NULL; - asettings = ghb_array_get_nth(audio_list, row); - } - return asettings; + GtkTreeView *treeview; + GtkTreePath *treepath; + GtkTreeSelection *selection; + GtkTreeModel *store; + GtkTreeIter iter; + gint *indices; + gint row; + GValue *asettings = NULL; + const GValue *audio_list; + + g_debug("get_selected_asettings ()"); + 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)) + { + // 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 NULL; + audio_list = ghb_settings_get_value(ud->settings, "audio_list"); + if (row >= ghb_array_len(audio_list)) + return NULL; + asettings = ghb_array_get_nth(audio_list, row); + } + return asettings; } void ghb_audio_list_refresh_selected(signal_user_data_t *ud) { - GtkTreeView *treeview; - GtkTreePath *treepath; - GtkTreeSelection *selection; - GtkTreeModel *store; - GtkTreeIter iter; - gint *indices; - gint row; - GValue *asettings = NULL; - const GValue *audio_list; - - 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 *s_drc, *s_gain, *s_quality = NULL; - gdouble drc, gain; - // 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); - - track = ghb_settings_combo_option(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 != HB_INVALID_AUDIO_QUALITY) - { - 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("%ddB", (int)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); - g_free(s_quality); - } + GtkTreeView *treeview; + GtkTreePath *treepath; + GtkTreeSelection *selection; + GtkTreeModel *store; + GtkTreeIter iter; + gint *indices; + gint row; + GValue *asettings = NULL; + const GValue *audio_list; + + 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 *s_drc, *s_gain, *s_quality = NULL; + gdouble drc, gain; + // 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); + + track = ghb_settings_combo_option(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 != HB_INVALID_AUDIO_QUALITY) + { + 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("%ddB", (int)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); + 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; - 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"); - codec = ghb_settings_combo_option(asettings, "AudioEncoderActual"); - double quality = ghb_settings_get_double(asettings, "AudioTrackQuality"); - if (ghb_settings_get_boolean(asettings, "AudioTrackQualityEnable") && - quality != HB_INVALID_AUDIO_QUALITY) - { - int codec = ghb_settings_combo_int(asettings, "AudioEncoderActual"); - s_quality = ghb_format_quality("Q/", codec, quality); - } - else - { - br = ghb_settings_get_string(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); - } + 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; + 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"); + codec = ghb_settings_combo_option(asettings, "AudioEncoderActual"); + double quality = ghb_settings_get_double(asettings, "AudioTrackQuality"); + if (ghb_settings_get_boolean(asettings, "AudioTrackQualityEnable") && + quality != HB_INVALID_AUDIO_QUALITY) + { + int codec = ghb_settings_combo_int(asettings, "AudioEncoderActual"); + s_quality = ghb_format_quality("Q/", codec, quality); + } + else + { + br = ghb_settings_get_string(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); + } } G_MODULE_EXPORT void audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { - static gint prev_acodec = 0; - gint acodec_code; - GValue *asettings, *gval; - - 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; - } - - asettings = get_selected_asettings(ud); - if (ghb_audio_is_passthru (prev_acodec) && - !ghb_audio_is_passthru (acodec_code)) - { - // Transition from passthru to not, put some audio settings back to - // pref settings - gint titleindex; - gint track; - gint br, sr, mix_code; - - if (asettings != NULL) - { - br = ghb_settings_get_int(asettings, "AudioBitrate"); - sr = ghb_settings_combo_int(asettings, "AudioSamplerate"); - mix_code = ghb_settings_combo_int(asettings, "AudioMixdown"); - } - else - { - br = 160; - sr = 0; - mix_code = 0; - } - - titleindex = ghb_settings_combo_int(ud->settings, "title"); - track = ghb_settings_combo_int(ud->settings, "AudioTrack"); - if (sr) - { - sr = ghb_find_closest_audio_rate(sr); - } - 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) - { - sr = aconfig ? aconfig->in.samplerate : 48000; - } - 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)); - - ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix_code)); - } - ghb_adjust_audio_rate_combos(ud); - ghb_grey_combo_options (ud); - ghb_check_dependency(ud, widget, NULL); - prev_acodec = acodec_code; - 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_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); + static gint prev_acodec = 0; + gint acodec_code; + GValue *asettings, *gval; + + 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; + } + + asettings = get_selected_asettings(ud); + if (ghb_audio_is_passthru (prev_acodec) && + !ghb_audio_is_passthru (acodec_code)) + { + // Transition from passthru to not, put some audio settings back to + // pref settings + gint titleindex; + gint track; + gint br, sr, mix_code; + + if (asettings != NULL) + { + br = ghb_settings_get_int(asettings, "AudioBitrate"); + sr = ghb_settings_combo_int(asettings, "AudioSamplerate"); + mix_code = ghb_settings_combo_int(asettings, "AudioMixdown"); + } + else + { + br = 160; + sr = 0; + mix_code = 0; + } + + titleindex = ghb_settings_combo_int(ud->settings, "title"); + track = ghb_settings_combo_int(ud->settings, "AudioTrack"); + if (sr) + { + sr = ghb_find_closest_audio_rate(sr); + } + 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) + { + sr = aconfig ? aconfig->in.samplerate : 48000; + } + 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)); + + ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix_code)); + } + ghb_adjust_audio_rate_combos(ud); + ghb_grey_combo_options (ud); + ghb_check_dependency(ud, widget, NULL); + prev_acodec = acodec_code; + 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_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 audio_track_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { - GValue *asettings; - - g_debug("audio_track_changed_cb ()"); - if (block_updates) - { - ghb_check_dependency(ud, widget, NULL); - ghb_grey_combo_options (ud); - return; - } - - ghb_adjust_audio_rate_combos(ud); - ghb_check_dependency(ud, widget, NULL); - ghb_grey_combo_options(ud); - asettings = get_selected_asettings(ud); - if (asettings != NULL) - { - const gchar *track; - - ghb_widget_to_setting(asettings, widget); - ghb_audio_list_refresh_selected(ud); - track = ghb_settings_combo_option(asettings, "AudioTrack"); - ghb_settings_set_string(asettings, "AudioTrackDescription", track); - } - ghb_live_reset(ud); + GValue *asettings; + + g_debug("audio_track_changed_cb ()"); + if (block_updates) + { + ghb_check_dependency(ud, widget, NULL); + ghb_grey_combo_options (ud); + return; + } + + ghb_adjust_audio_rate_combos(ud); + ghb_check_dependency(ud, widget, NULL); + ghb_grey_combo_options(ud); + asettings = get_selected_asettings(ud); + if (asettings != NULL) + { + const gchar *track; + + ghb_widget_to_setting(asettings, widget); + ghb_audio_list_refresh_selected(ud); + track = ghb_settings_combo_option(asettings, "AudioTrack"); + ghb_settings_set_string(asettings, "AudioTrackDescription", track); + } + ghb_live_reset(ud); } G_MODULE_EXPORT void audio_mix_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { - GValue *asettings; - - g_debug("audio_mix_changed_cb ()"); - 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) - { - ghb_widget_to_setting(asettings, widget); - ghb_audio_list_refresh_selected(ud); - } - ghb_live_reset(ud); + GValue *asettings; + + g_debug("audio_mix_changed_cb ()"); + 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) + { + ghb_widget_to_setting(asettings, widget); + ghb_audio_list_refresh_selected(ud); + } + ghb_live_reset(ud); } G_MODULE_EXPORT void audio_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { - GValue *asettings; - - g_debug("audio_widget_changed_cb ()"); - if (block_updates) - { - ghb_check_dependency(ud, widget, NULL); - return; - } - - ghb_adjust_audio_rate_combos(ud); - asettings = get_selected_asettings(ud); - if (asettings != NULL) - { - ghb_widget_to_setting(asettings, widget); - ghb_audio_list_refresh_selected(ud); - } - ghb_live_reset(ud); + GValue *asettings; + + g_debug("audio_widget_changed_cb ()"); + if (block_updates) + { + ghb_check_dependency(ud, widget, NULL); + return; + } + + ghb_adjust_audio_rate_combos(ud); + asettings = get_selected_asettings(ud); + if (asettings != NULL) + { + ghb_widget_to_setting(asettings, widget); + ghb_audio_list_refresh_selected(ud); + } + ghb_live_reset(ud); } 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) - { - ghb_check_dependency(ud, widget, NULL); - return; - } - - ghb_check_dependency(ud, widget, NULL); - ghb_widget_to_setting(ud->settings, widget); - ghb_adjust_audio_rate_combos(ud); - ghb_grey_combo_options (ud); - ghb_audio_list_refresh_selected(ud); - ghb_live_reset(ud); + g_debug("global_audio_widget_changed_cb ()"); + if (block_updates) + { + ghb_check_dependency(ud, widget, NULL); + return; + } + + ghb_check_dependency(ud, widget, NULL); + ghb_widget_to_setting(ud->settings, widget); + ghb_adjust_audio_rate_combos(ud); + ghb_grey_combo_options (ud); + ghb_audio_list_refresh_selected(ud); + ghb_live_reset(ud); } G_MODULE_EXPORT gchar* format_drc_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud) { - if (val < 1.0) - return g_strdup_printf("%-7s", "Off"); - else - return g_strdup_printf("%-7.1f", val); + if (val < 1.0) + return g_strdup_printf("%-7s", "Off"); + else + 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; + 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 = 0; - 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); + float low, high, gran; + int dir; + hb_get_audio_quality_limits(codec, &low, &high, &gran, &dir); + + int digits = 0; + 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, gdouble quality, 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); - 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); + 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); + 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, gdouble drc, signal_user_data_t *ud) { - GValue *asettings; - - g_debug("drc_widget_changed_cb ()"); - - ghb_check_dependency(ud, widget, NULL); - if (block_updates) return; - - 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) - { - ghb_widget_to_setting(asettings, widget); - ghb_audio_list_refresh_selected(ud); - } - ghb_live_reset(ud); + GValue *asettings; + + g_debug("drc_widget_changed_cb ()"); + + ghb_check_dependency(ud, widget, NULL); + if (block_updates) return; + + 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) + { + ghb_widget_to_setting(asettings, widget); + ghb_audio_list_refresh_selected(ud); + } + ghb_live_reset(ud); } G_MODULE_EXPORT gchar* format_gain_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud) { - if ( val >= 21.0 ) - return g_strdup_printf("*11*"); - return g_strdup_printf("%ddB", (int)val); + if ( val >= 21.0 ) + return g_strdup_printf("*11*"); + return g_strdup_printf("%ddB", (int)val); } G_MODULE_EXPORT void gain_widget_changed_cb(GtkWidget *widget, gdouble gain, signal_user_data_t *ud) { - GValue *asettings; - - g_debug("gain_widget_changed_cb ()"); - - ghb_check_dependency(ud, widget, NULL); - if (block_updates) return; - asettings = get_selected_asettings(ud); - - char *s_gain; - if ( gain >= 21.0 ) - s_gain = g_strdup_printf("*11*"); - else - s_gain = g_strdup_printf("%ddB", (int)gain); - ghb_ui_update( ud, "AudioTrackGainValue", ghb_string_value(s_gain)); - g_free(s_gain); - - if (asettings != NULL) - { - ghb_widget_to_setting(asettings, widget); - ghb_audio_list_refresh_selected(ud); - } - ghb_live_reset(ud); + GValue *asettings; + + g_debug("gain_widget_changed_cb ()"); + + ghb_check_dependency(ud, widget, NULL); + if (block_updates) return; + asettings = get_selected_asettings(ud); + + char *s_gain; + if ( gain >= 21.0 ) + s_gain = g_strdup_printf("*11*"); + else + s_gain = g_strdup_printf("%ddB", (int)gain); + ghb_ui_update( ud, "AudioTrackGainValue", ghb_string_value(s_gain)); + g_free(s_gain); + + if (asettings != NULL) + { + ghb_widget_to_setting(asettings, widget); + ghb_audio_list_refresh_selected(ud); + } + ghb_live_reset(ud); } void ghb_clear_audio_list_settings(GValue *settings) { - GValue *audio_list; - - g_debug("clear_audio_list_settings ()"); - audio_list = ghb_settings_get_value(settings, "audio_list"); - if (audio_list == NULL) - { - audio_list = ghb_array_value_new(8); - ghb_settings_set_value(settings, "audio_list", audio_list); - } - else - ghb_array_value_reset(audio_list, 8); + GValue *audio_list; + + g_debug("clear_audio_list_settings ()"); + audio_list = ghb_settings_get_value(settings, "audio_list"); + if (audio_list == NULL) + { + audio_list = ghb_array_value_new(8); + ghb_settings_set_value(settings, "audio_list", audio_list); + } + else + ghb_array_value_reset(audio_list, 8); } void ghb_clear_audio_list_ui(GtkBuilder *builder) { - GtkTreeView *treeview; - GtkListStore *store; - - g_debug("clear_audio_list_ui ()"); - treeview = GTK_TREE_VIEW(GHB_WIDGET(builder, "audio_list")); - store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview)); - gtk_list_store_clear (store); + GtkTreeView *treeview; + GtkListStore *store; + + g_debug("clear_audio_list_ui ()"); + treeview = GTK_TREE_VIEW(GHB_WIDGET(builder, "audio_list")); + store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview)); + gtk_list_store_clear (store); } static void ghb_add_audio_to_ui(GtkBuilder *builder, const GValue *settings) { - GtkTreeView *treeview; - GtkTreeIter iter; - GtkListStore *store; - GtkTreeSelection *selection; - const gchar *track, *codec, *br, *sr, *mix; - gchar *s_drc, *s_gain, *s_quality = NULL; - gdouble drc; - gdouble gain; - - g_debug("ghb_add_audio_to_ui ()"); - treeview = GTK_TREE_VIEW(GHB_WIDGET(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, "AudioTrack"); - codec = ghb_settings_combo_option(settings, "AudioEncoderActual"); - double quality = ghb_settings_get_double(settings, "AudioTrackQuality"); - if (ghb_settings_get_boolean(settings, "AudioTrackQualityEnable") && - quality != HB_INVALID_AUDIO_QUALITY) - { - 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"); - s_gain = g_strdup_printf("%ddB", (int)gain); - - drc = ghb_settings_get_double(settings, "AudioTrackDRCSlider"); - if (drc < 1.0) - s_drc = g_strdup("Off"); - else - s_drc = g_strdup_printf("%.1f", drc); - - gtk_list_store_append(store, &iter); - gtk_list_store_set(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); - gtk_tree_selection_select_iter(selection, &iter); - g_free(s_drc); - g_free(s_gain); - g_free(s_quality); + GtkTreeView *treeview; + GtkTreeIter iter; + GtkListStore *store; + GtkTreeSelection *selection; + const gchar *track, *codec, *br, *sr, *mix; + gchar *s_drc, *s_gain, *s_quality = NULL; + gdouble drc; + gdouble gain; + + g_debug("ghb_add_audio_to_ui ()"); + treeview = GTK_TREE_VIEW(GHB_WIDGET(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, "AudioTrack"); + codec = ghb_settings_combo_option(settings, "AudioEncoderActual"); + double quality = ghb_settings_get_double(settings, "AudioTrackQuality"); + if (ghb_settings_get_boolean(settings, "AudioTrackQualityEnable") && + quality != HB_INVALID_AUDIO_QUALITY) + { + 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"); + s_gain = g_strdup_printf("%ddB", (int)gain); + + drc = ghb_settings_get_double(settings, "AudioTrackDRCSlider"); + if (drc < 1.0) + s_drc = g_strdup("Off"); + else + s_drc = g_strdup_printf("%.1f", drc); + + gtk_list_store_append(store, &iter); + gtk_list_store_set(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); + gtk_tree_selection_select_iter(selection, &iter); + g_free(s_drc); + g_free(s_gain); + g_free(s_quality); } G_MODULE_EXPORT void audio_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t *ud) { - GtkTreeModel *store; - 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 *actual_codec, *track, *codec, *bitrate, *sample_rate, *mix; - //gdouble 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); - - 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")); - ghb_check_dependency(ud, NULL, "AudioEncoderActual"); - ghb_ui_update(ud, "AudioBitrate", ghb_settings_get_value(asettings, "AudioBitrate")); - ghb_ui_update(ud, "AudioTrackName", ghb_settings_get_value(asettings, "AudioTrackName")); - ghb_ui_update(ud, "AudioSamplerate", ghb_settings_get_value(asettings, "AudioSamplerate")); - ghb_ui_update(ud, "AudioMixdown", ghb_settings_get_value(asettings, "AudioMixdown")); - ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_settings_get_value(asettings, "AudioTrackDRCSlider")); - ghb_ui_update(ud, "AudioTrackGain", ghb_settings_get_value(asettings, "AudioTrackGain")); - 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); - } - else - { - widget = GHB_WIDGET (ud->builder, "audio_remove"); - gtk_widget_set_sensitive(widget, FALSE); - } + GtkTreeModel *store; + 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 *actual_codec, *track, *codec, *bitrate, *sample_rate, *mix; + //gdouble 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); + + 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")); + ghb_check_dependency(ud, NULL, "AudioEncoderActual"); + ghb_ui_update(ud, "AudioBitrate", ghb_settings_get_value(asettings, "AudioBitrate")); + ghb_ui_update(ud, "AudioTrackName", ghb_settings_get_value(asettings, "AudioTrackName")); + ghb_ui_update(ud, "AudioSamplerate", ghb_settings_get_value(asettings, "AudioSamplerate")); + ghb_ui_update(ud, "AudioMixdown", ghb_settings_get_value(asettings, "AudioMixdown")); + ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_settings_get_value(asettings, "AudioTrackDRCSlider")); + ghb_ui_update(ud, "AudioTrackGain", ghb_settings_get_value(asettings, "AudioTrackGain")); + 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); + } + else + { + widget = GHB_WIDGET (ud->builder, "audio_remove"); + gtk_widget_set_sensitive(widget, FALSE); + } } static gboolean ghb_add_audio_to_settings(GValue *settings, GValue *asettings) { - GValue *audio_list; - const gchar * track; - int count; - - audio_list = ghb_settings_get_value(settings, "audio_list"); - if (audio_list == NULL) - { - audio_list = ghb_array_value_new(8); - ghb_settings_set_value(settings, "audio_list", audio_list); - } - count = ghb_array_len(audio_list); - // Don't allow more than 99 - // This is a hard limit imposed by libhb/reader.c:GetFifoForId() - if (count >= 99) - { - ghb_value_free(asettings); - return FALSE; - } - - int title_no = ghb_settings_get_int(settings, "title_no"); - int track_no = ghb_settings_get_int(asettings, "AudioTrack"); - track = ghb_audio_track_description(track_no, title_no); - ghb_settings_set_string(asettings, "AudioTrackDescription", track); - - GValue *aname; - aname = ghb_dict_lookup(asettings, "AudioTrackName"); - if (aname == NULL) - { - ghb_settings_set_string(asettings, "AudioTrackName", ""); - } - if (ghb_array_len(audio_list) >= 99) - { - ghb_value_free(asettings); - return FALSE; - } - ghb_array_append(audio_list, asettings); - return TRUE; + GValue *audio_list; + const gchar * track; + int count; + + audio_list = ghb_settings_get_value(settings, "audio_list"); + if (audio_list == NULL) + { + audio_list = ghb_array_value_new(8); + ghb_settings_set_value(settings, "audio_list", audio_list); + } + count = ghb_array_len(audio_list); + // Don't allow more than 99 + // This is a hard limit imposed by libhb/reader.c:GetFifoForId() + if (count >= 99) + { + ghb_value_free(asettings); + return FALSE; + } + + int title_no = ghb_settings_get_int(settings, "title_no"); + int track_no = ghb_settings_get_int(asettings, "AudioTrack"); + track = ghb_audio_track_description(track_no, title_no); + ghb_settings_set_string(asettings, "AudioTrackDescription", track); + + GValue *aname; + aname = ghb_dict_lookup(asettings, "AudioTrackName"); + if (aname == NULL) + { + ghb_settings_set_string(asettings, "AudioTrackName", ""); + } + if (ghb_array_len(audio_list) >= 99) + { + ghb_value_free(asettings); + return FALSE; + } + ghb_array_append(audio_list, asettings); + return TRUE; } 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; - - g_debug("audio_add_clicked_cb ()"); - asettings = ghb_dict_value_new(); - 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)); - 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"); - ghb_settings_take_value(asettings, "AudioSamplerate", ghb_widget_value(widget)); - widget = GHB_WIDGET(ud->builder, "AudioMixdown"); - ghb_settings_take_value(asettings, "AudioMixdown", ghb_widget_value(widget)); - widget = GHB_WIDGET(ud->builder, "AudioTrackGain"); - ghb_settings_take_value(asettings, "AudioTrackGain", ghb_widget_value(widget)); - widget = GHB_WIDGET(ud->builder, "AudioTrackDRCSlider"); - ghb_settings_take_value(asettings, "AudioTrackDRCSlider", ghb_widget_value(widget)); - - if (!ghb_add_audio_to_settings(ud->settings, asettings)) - return; - - ghb_add_audio_to_ui(ud->builder, asettings); - check_list_full(ud); + // Add the current audio settings to the list. + GValue *asettings; + GtkWidget *widget; + + g_debug("audio_add_clicked_cb ()"); + asettings = ghb_dict_value_new(); + 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)); + 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"); + ghb_settings_take_value(asettings, "AudioSamplerate", ghb_widget_value(widget)); + widget = GHB_WIDGET(ud->builder, "AudioMixdown"); + ghb_settings_take_value(asettings, "AudioMixdown", ghb_widget_value(widget)); + widget = GHB_WIDGET(ud->builder, "AudioTrackGain"); + ghb_settings_take_value(asettings, "AudioTrackGain", ghb_widget_value(widget)); + widget = GHB_WIDGET(ud->builder, "AudioTrackDRCSlider"); + ghb_settings_take_value(asettings, "AudioTrackDRCSlider", ghb_widget_value(widget)); + + if (!ghb_add_audio_to_settings(ud->settings, asettings)) + return; + + ghb_add_audio_to_ui(ud->builder, asettings); + check_list_full(ud); } G_MODULE_EXPORT void audio_remove_clicked_cb(GtkWidget *widget, signal_user_data_t *ud) { - GtkTreeView *treeview; - GtkTreePath *treepath; - GtkTreeSelection *selection; - GtkTreeModel *store; - GtkTreeIter iter, nextIter; - gint *indices; - gint row; - GValue *audio_list; - - g_debug("audio_remove_clicked_cb ()"); - 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)) - { - nextIter = iter; - if (!gtk_tree_model_iter_next(store, &nextIter)) - { - nextIter = iter; - if (gtk_tree_model_get_iter_first(store, &nextIter)) - { - gtk_tree_selection_select_iter (selection, &nextIter); - } - } - else - { - gtk_tree_selection_select_iter (selection, &nextIter); - } - // 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); - // Remove the selected item - gtk_list_store_remove (GTK_LIST_STORE(store), &iter); - // remove from audio settings list - if (row < 0) return; - widget = GHB_WIDGET (ud->builder, "audio_add"); - gtk_widget_set_sensitive(widget, TRUE); - audio_list = ghb_settings_get_value(ud->settings, "audio_list"); - if (row >= ghb_array_len(audio_list)) - return; - GValue *old = ghb_array_get_nth(audio_list, row); - ghb_value_free(old); - ghb_array_remove(audio_list, row); - } + GtkTreeView *treeview; + GtkTreePath *treepath; + GtkTreeSelection *selection; + GtkTreeModel *store; + GtkTreeIter iter, nextIter; + gint *indices; + gint row; + GValue *audio_list; + + g_debug("audio_remove_clicked_cb ()"); + 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)) + { + nextIter = iter; + if (!gtk_tree_model_iter_next(store, &nextIter)) + { + nextIter = iter; + if (gtk_tree_model_get_iter_first(store, &nextIter)) + { + gtk_tree_selection_select_iter (selection, &nextIter); + } + } + else + { + gtk_tree_selection_select_iter (selection, &nextIter); + } + // 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); + // Remove the selected item + gtk_list_store_remove (GTK_LIST_STORE(store), &iter); + // remove from audio settings list + if (row < 0) return; + widget = GHB_WIDGET (ud->builder, "audio_add"); + gtk_widget_set_sensitive(widget, TRUE); + audio_list = ghb_settings_get_value(ud->settings, "audio_list"); + if (row >= ghb_array_len(audio_list)) + return; + GValue *old = ghb_array_get_nth(audio_list, row); + ghb_value_free(old); + ghb_array_remove(audio_list, row); + } } void 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, *quality, *enable_quality; - gint count, ii; - - g_debug("set_audio"); - // Clear the audio list - ghb_clear_audio_list_settings(ud->settings); - ghb_clear_audio_list_ui(ud->builder); - 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"); - 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"); - gain = ghb_settings_get_value(audio, "AudioTrackGain"); - drc = ghb_settings_get_value(audio, "AudioTrackDRCSlider"); - acodec_code = ghb_lookup_combo_int("AudioEncoder", acodec); - - if (acodec_code != 0) - { - GValue *asettings = ghb_dict_value_new(); - ghb_settings_set_value(asettings, "AudioTrack", track); - ghb_settings_set_value(asettings, "AudioEncoder", acodec); - ghb_settings_set_value(asettings, "AudioEncoderActual", acodec_actual); - ghb_settings_set_value(asettings, "AudioTrackQualityEnable", enable_quality); - ghb_settings_set_value(asettings, "AudioTrackQuality", quality); - - // This gets set autimatically if the codec is passthru - ghb_settings_set_value(asettings, "AudioBitrate", bitrate); - ghb_settings_set_value(asettings, "AudioSamplerate", rate); - ghb_settings_set_value(asettings, "AudioMixdown", mix); - ghb_settings_set_value(asettings, "AudioTrackGain", gain); - ghb_settings_set_value(asettings, "AudioTrackDRCSlider", drc); - - ghb_add_audio_to_settings(ud->settings, asettings); - - ghb_add_audio_to_ui(ud->builder, asettings); - ghb_adjust_audio_rate_combos(ud); - } - } - check_list_full(ud); + gint acodec_code; + + GValue *alist; + GValue *track, *audio, *acodec, *acodec_actual, *bitrate, *rate, + *mix, *drc, *gain, *quality, *enable_quality; + gint count, ii; + + g_debug("set_audio"); + // Clear the audio list + ghb_clear_audio_list_settings(ud->settings); + ghb_clear_audio_list_ui(ud->builder); + 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"); + 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"); + gain = ghb_settings_get_value(audio, "AudioTrackGain"); + drc = ghb_settings_get_value(audio, "AudioTrackDRCSlider"); + acodec_code = ghb_lookup_combo_int("AudioEncoder", acodec); + + if (acodec_code != 0) + { + GValue *asettings = ghb_dict_value_new(); + ghb_settings_set_value(asettings, "AudioTrack", track); + ghb_settings_set_value(asettings, "AudioEncoder", acodec); + ghb_settings_set_value(asettings, "AudioEncoderActual", acodec_actual); + ghb_settings_set_value(asettings, "AudioTrackQualityEnable", enable_quality); + ghb_settings_set_value(asettings, "AudioTrackQuality", quality); + + // This gets set autimatically if the codec is passthru + ghb_settings_set_value(asettings, "AudioBitrate", bitrate); + ghb_settings_set_value(asettings, "AudioSamplerate", rate); + ghb_settings_set_value(asettings, "AudioMixdown", mix); + ghb_settings_set_value(asettings, "AudioTrackGain", gain); + ghb_settings_set_value(asettings, "AudioTrackDRCSlider", drc); + + ghb_add_audio_to_settings(ud->settings, asettings); + + ghb_add_audio_to_ui(ud->builder, asettings); + ghb_adjust_audio_rate_combos(ud); + } + } + check_list_full(ud); } |