1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
4 * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
6 * audiohandler.c is free software.
8 * You may redistribute it and/or modify it under the terms of the
9 * GNU General Public License, as published by the Free Software
10 * Foundation; either version 2 of the License, or (at your option)
17 #include "hb-backend.h"
19 #include "callbacks.h"
21 #include "audiohandler.h"
23 static void ghb_add_audio(signal_user_data_t *ud, GValue *settings);
24 static GValue* get_selected_asettings(signal_user_data_t *ud);
27 ghb_adjust_audio_rate_combos(signal_user_data_t *ud)
29 gint titleindex, track, acodec, select_acodec, mix;
30 hb_audio_config_t *aconfig;
37 g_debug("ghb_adjust_audio_rate_combos ()");
38 mux = ghb_settings_combo_int(ud->settings, "FileFormat");
39 titleindex = ghb_settings_combo_int(ud->settings, "title");
41 widget = GHB_WIDGET(ud->builder, "AudioTrack");
42 gval = ghb_widget_value(widget);
43 track = ghb_lookup_combo_int("AudioTrack", gval);
46 widget = GHB_WIDGET(ud->builder, "AudioEncoder");
47 gval = ghb_widget_value(widget);
48 acodec = ghb_lookup_combo_int("AudioEncoder", gval);
50 widget = GHB_WIDGET(ud->builder, "AudioMixdown");
51 gval = ghb_widget_value(widget);
52 mix = ghb_lookup_combo_int("AudioMixdown", gval);
55 widget = GHB_WIDGET(ud->builder, "AudioBitrate");
56 gval = ghb_widget_value(widget);
57 bitrate = ghb_lookup_combo_int("AudioBitrate", gval);
59 widget = GHB_WIDGET(ud->builder, "AudioSamplerate");
60 gval = ghb_widget_value(widget);
61 sr = ghb_lookup_combo_int("AudioSamplerate", gval);
63 select_acodec = acodec;
64 if (mux == HB_MUX_MP4)
66 select_acodec &= ~HB_ACODEC_DCA;
68 if ((select_acodec & HB_ACODEC_MASK) == 0)
70 // Unsuported codec in this container.
71 select_acodec |= HB_ACODEC_AC3;
72 acodec = select_acodec;
75 aconfig = ghb_get_scan_audio_info(titleindex, track);
78 sr = aconfig ? aconfig->in.samplerate : 48000;
80 gboolean codec_defined_bitrate = FALSE;
81 if (ghb_audio_is_passthru (select_acodec))
85 bitrate = aconfig->in.bitrate / 1000;
87 // Set the values for bitrate and samplerate to the input rates
88 if (aconfig->in.codec & select_acodec & HB_ACODEC_PASS_MASK)
90 ghb_set_passthru_bitrate_opts (ud->builder, bitrate);
91 ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(0));
92 select_acodec &= aconfig->in.codec | HB_ACODEC_PASS_FLAG;
93 codec_defined_bitrate = TRUE;
97 select_acodec = ghb_select_audio_codec(ud->settings, aconfig, acodec);
98 if (acodec != HB_ACODEC_ANY)
100 ghb_ui_update(ud, "AudioEncoder", ghb_int64_value(select_acodec));
103 mix = ghb_get_best_mix( aconfig, select_acodec, mix);
104 bitrate = hb_get_default_audio_bitrate(select_acodec, sr, mix);
105 ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix));
107 ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(0));
111 ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(0));
112 ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(0));
114 mix = ghb_get_best_mix( aconfig, select_acodec, 0);
116 ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_double_value(0));
120 bitrate = hb_get_best_audio_bitrate(select_acodec, bitrate, sr, mix);
122 if (!codec_defined_bitrate)
125 hb_get_audio_bitrate_limits(select_acodec, sr, mix, &low, &high);
126 ghb_set_default_bitrate_opts (ud->builder, low, high);
128 ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(bitrate));
130 ghb_settings_take_value(ud->settings, "AudioEncoderActual",
131 ghb_lookup_acodec_value(select_acodec));
132 GValue *asettings = get_selected_asettings(ud);
135 ghb_settings_take_value(asettings, "AudioEncoderActual",
136 ghb_lookup_acodec_value(select_acodec));
138 ghb_audio_list_refresh_selected(ud);
139 ghb_check_dependency(ud, NULL, "AudioEncoderActual");
143 free_audio_hash_key_value(gpointer data)
149 ghb_get_user_audio_lang(signal_user_data_t *ud, gint titleindex, gint track)
151 GValue *audio_list, *asettings;
154 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
155 if (ghb_array_len(audio_list) <= track)
157 asettings = ghb_array_get_nth(audio_list, track);
158 track = ghb_settings_get_int(asettings, "AudioTrack");
159 lang = ghb_get_source_audio_lang(titleindex, track);
164 ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
166 gint fallback_acodec, track;
167 gchar *source_lang = NULL;
168 hb_audio_config_t *aconfig;
169 GHashTable *track_indices;
172 const GValue *pref_audio;
173 const GValue *audio, *drc;
174 gint acodec, bitrate, mix;
176 gint count, ii, list_count;
178 g_debug("set_pref_audio");
179 mux = ghb_settings_combo_int(ud->settings, "FileFormat");
180 if (mux == HB_MUX_MP4)
182 fallback_acodec = HB_ACODEC_FAAC;
186 fallback_acodec = HB_ACODEC_LAME;
188 track_indices = g_hash_table_new_full(g_int_hash, g_int_equal,
189 free_audio_hash_key_value, free_audio_hash_key_value);
190 // Clear the audio list
191 ghb_clear_audio_list(ud);
192 // Find "best" audio based on audio preferences
193 if (!ghb_settings_get_boolean(ud->settings, "AudioDUB"))
195 source_lang = ghb_get_source_audio_lang(titleindex, 0);
197 if (source_lang == NULL)
198 source_lang = ghb_settings_get_string(ud->settings, "PreferredLanguage");
200 pref_audio = ghb_settings_get_value(ud->settings, "AudioList");
203 count = ghb_array_len(pref_audio);
204 for (ii = 0; ii < count; ii++)
208 audio = ghb_array_get_nth(pref_audio, ii);
209 select_acodec = acodec = ghb_settings_combo_int(audio, "AudioEncoder");
210 if (mux == HB_MUX_MP4)
212 select_acodec &= ~HB_ACODEC_DCA;
214 if ((select_acodec & HB_ACODEC_MASK) == 0)
216 // Unsuported codec in this container.
217 select_acodec |= HB_ACODEC_AC3;
218 acodec = select_acodec;
220 if ( ghb_audio_can_passthru( select_acodec ) )
222 fallback_acodec = HB_ACODEC_AC3;
224 bitrate = ghb_settings_combo_int(audio, "AudioBitrate");
225 rate = ghb_settings_combo_double(audio, "AudioSamplerate");
226 mix = ghb_settings_combo_int(audio, "AudioMixdown");
227 drc = ghb_settings_get_value(audio, "AudioTrackDRCSlider");
228 // If there are multiple audios using the same codec, then
229 // select sequential tracks for each. The hash keeps track
230 // of the tracks used for each codec.
231 track = ghb_find_audio_track(titleindex, source_lang,
232 select_acodec, fallback_acodec, track_indices);
234 // 1. pref codec is passthru
235 // 2. source codec is not passthru
236 // 3. next pref is enabled
237 aconfig = ghb_get_scan_audio_info(titleindex, track);
238 if (aconfig && ghb_audio_is_passthru (acodec))
240 // HB_ACODEC_* are bit fields. Treat acodec as mask
241 if (!(aconfig->in.codec & select_acodec & HB_ACODEC_PASS_MASK))
243 if (acodec != HB_ACODEC_ANY)
244 acodec = fallback_acodec;
245 // If we can't substitute the passthru with a suitable
247 // If there's more audio to process, or we've already
248 // placed one in the list, then we can skip this one
249 if (!(select_acodec & fallback_acodec) &&
250 ((ii + 1 < count) || (list_count != 0)))
257 int channels, min_rate, max_rate;
258 select_acodec = fallback_acodec;
259 mix = ghb_get_best_mix(aconfig, select_acodec, mix);
260 channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(mix);
261 bitrate = aconfig->in.bitrate / 1000;
262 min_rate = channels * 64;
263 max_rate = channels * 160;
264 if (bitrate < min_rate)
266 if (bitrate > max_rate)
273 select_acodec &= aconfig->in.codec | HB_ACODEC_PASS_FLAG;
276 if (titleindex >= 0 && track < 0)
280 GValue *settings = ghb_dict_value_new();
281 ghb_settings_set_int(settings, "AudioTrack", track);
282 ghb_settings_set_string(settings, "AudioEncoder",
283 ghb_lookup_combo_string("AudioEncoder", ghb_int_value(acodec)));
284 ghb_settings_set_value(settings, "AudioEncoderActual",
285 ghb_lookup_acodec_value(select_acodec));
286 // This gets set autimatically if the codec is passthru
287 ghb_settings_set_string(settings, "AudioBitrate",
288 ghb_lookup_combo_string("AudioBitrate", ghb_int_value(bitrate)));
289 ghb_settings_set_string(settings, "AudioSamplerate",
290 ghb_lookup_combo_string("AudioSamplerate", ghb_int_value(rate)));
291 mix = ghb_get_best_mix( aconfig, select_acodec, mix);
292 ghb_settings_set_string(settings, "AudioMixdown",
293 ghb_lookup_combo_string("AudioMixdown", ghb_int_value(mix)));
294 ghb_settings_set_value(settings, "AudioTrackDRCSlider", drc);
295 ghb_add_audio(ud, settings);
296 ghb_adjust_audio_rate_combos(ud);
300 g_hash_table_destroy(track_indices);
304 get_selected_asettings(signal_user_data_t *ud)
306 GtkTreeView *treeview;
307 GtkTreePath *treepath;
308 GtkTreeSelection *selection;
313 GValue *asettings = NULL;
314 const GValue *audio_list;
316 g_debug("get_selected_asettings ()");
317 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
318 selection = gtk_tree_view_get_selection (treeview);
319 if (gtk_tree_selection_get_selected(selection, &store, &iter))
321 // Get the row number
322 treepath = gtk_tree_model_get_path (store, &iter);
323 indices = gtk_tree_path_get_indices (treepath);
325 gtk_tree_path_free(treepath);
326 // find audio settings
327 if (row < 0) return NULL;
328 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
329 if (row >= ghb_array_len(audio_list))
331 asettings = ghb_array_get_nth(audio_list, row);
337 ghb_audio_list_refresh_selected(signal_user_data_t *ud)
339 GtkTreeView *treeview;
340 GtkTreePath *treepath;
341 GtkTreeSelection *selection;
346 GValue *asettings = NULL;
347 const GValue *audio_list;
349 g_debug("ghb_audio_list_refresh_selected ()");
350 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
351 selection = gtk_tree_view_get_selection (treeview);
352 if (gtk_tree_selection_get_selected(selection, &store, &iter))
354 const gchar *track, *codec, *br, *sr, *mix;
358 // Get the row number
359 treepath = gtk_tree_model_get_path (store, &iter);
360 indices = gtk_tree_path_get_indices (treepath);
362 gtk_tree_path_free(treepath);
363 // find audio settings
365 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
366 if (row >= ghb_array_len(audio_list))
368 asettings = ghb_array_get_nth(audio_list, row);
370 track = ghb_settings_combo_option(asettings, "AudioTrack");
371 itrack = ghb_settings_combo_int(asettings, "AudioTrack");
372 codec = ghb_settings_combo_option(asettings, "AudioEncoderActual");
373 br = ghb_settings_combo_option(asettings, "AudioBitrate");
374 sr = ghb_settings_combo_option(asettings, "AudioSamplerate");
375 mix = ghb_settings_combo_option(asettings, "AudioMixdown");
377 drc = ghb_settings_get_double(asettings, "AudioTrackDRCSlider");
379 s_drc = g_strdup("Off");
381 s_drc = g_strdup_printf("%.1f", drc);
383 gtk_list_store_set(GTK_LIST_STORE(store), &iter,
384 // These are displayed in list
397 audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
399 static gint prev_acodec = 0;
401 GValue *asettings, *gval;
403 g_debug("audio_codec_changed_cb ()");
404 gval = ghb_widget_value(widget);
405 acodec_code = ghb_lookup_combo_int("AudioEncoder", gval);
406 ghb_value_free(gval);
408 asettings = get_selected_asettings(ud);
409 if (ghb_audio_is_passthru (prev_acodec) &&
410 !ghb_audio_is_passthru (acodec_code))
412 // Transition from passthru to not, put some audio settings back to
416 gint br, sr, mix_code;
418 if (asettings != NULL)
420 br = ghb_settings_get_int(asettings, "AudioBitrate");
421 sr = ghb_settings_combo_int(asettings, "AudioSamplerate");
422 mix_code = ghb_settings_combo_int(asettings, "AudioMixdown");
431 titleindex = ghb_settings_combo_int(ud->settings, "title");
432 track = ghb_settings_combo_int(ud->settings, "AudioTrack");
435 sr = ghb_find_closest_audio_rate(sr);
437 ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(sr));
439 hb_audio_config_t *aconfig;
440 aconfig = ghb_get_scan_audio_info(titleindex, track);
443 sr = aconfig ? aconfig->in.samplerate : 48000;
445 mix_code = ghb_get_best_mix( aconfig, acodec_code, mix_code);
446 br = hb_get_best_audio_bitrate(acodec_code, br, sr, mix_code);
447 ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(br));
449 ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix_code));
451 ghb_adjust_audio_rate_combos(ud);
452 ghb_grey_combo_options (ud->builder);
453 ghb_check_dependency(ud, widget, NULL);
454 prev_acodec = acodec_code;
455 if (asettings != NULL)
457 ghb_widget_to_setting(asettings, widget);
458 ghb_settings_set_value(asettings, "AudioEncoderActual", ghb_settings_get_value(ud->settings, "AudioEncoderActual"));
459 ghb_audio_list_refresh_selected(ud);
461 ghb_update_destination_extension(ud);
466 audio_track_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
470 g_debug("audio_track_changed_cb ()");
471 ghb_adjust_audio_rate_combos(ud);
472 ghb_check_dependency(ud, widget, NULL);
473 ghb_grey_combo_options(ud->builder);
474 asettings = get_selected_asettings(ud);
475 if (asettings != NULL)
479 ghb_widget_to_setting(asettings, widget);
480 ghb_audio_list_refresh_selected(ud);
481 track = ghb_settings_combo_option(asettings, "AudioTrack");
482 ghb_settings_set_string(asettings, "AudioTrackDescription", track);
488 audio_mix_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
492 g_debug("audio_mix_changed_cb ()");
493 ghb_adjust_audio_rate_combos(ud);
494 ghb_check_dependency(ud, widget, NULL);
495 asettings = get_selected_asettings(ud);
496 if (asettings != NULL)
498 ghb_widget_to_setting(asettings, widget);
499 ghb_audio_list_refresh_selected(ud);
505 audio_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
509 g_debug("audio_widget_changed_cb ()");
511 ghb_adjust_audio_rate_combos(ud);
512 ghb_check_dependency(ud, widget, NULL);
513 asettings = get_selected_asettings(ud);
514 if (asettings != NULL)
516 ghb_widget_to_setting(asettings, widget);
517 ghb_audio_list_refresh_selected(ud);
523 drc_widget_changed_cb(GtkWidget *widget, gdouble val, signal_user_data_t *ud)
529 g_debug("drc_widget_changed_cb ()");
531 label = GTK_LABEL(GHB_WIDGET(ud->builder, "drc_label"));
533 drc = g_strdup_printf("Off");
535 drc = g_strdup_printf("%.1f", val);
536 gtk_label_set_text(label, drc);
538 ghb_check_dependency(ud, widget, NULL);
539 asettings = get_selected_asettings(ud);
540 if (asettings != NULL)
542 ghb_widget_to_setting(asettings, widget);
543 ghb_audio_list_refresh_selected(ud);
549 ghb_clear_audio_list(signal_user_data_t *ud)
551 GtkTreeView *treeview;
555 g_debug("clear_audio_list ()");
556 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
557 if (audio_list == NULL)
559 audio_list = ghb_array_value_new(8);
560 ghb_settings_set_value(ud->settings, "audio_list", audio_list);
563 ghb_array_value_reset(audio_list, 8);
564 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
565 store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview));
566 gtk_list_store_clear (store);
570 add_to_audio_list(signal_user_data_t *ud, GValue *settings)
572 GtkTreeView *treeview;
575 GtkTreeSelection *selection;
576 const gchar *track, *codec, *br, *sr, *mix;
581 g_debug("add_to_audio_list ()");
582 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
583 selection = gtk_tree_view_get_selection (treeview);
584 store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview));
586 track = ghb_settings_combo_option(settings, "AudioTrack");
587 itrack = ghb_settings_combo_int(settings, "AudioTrack");
588 codec = ghb_settings_combo_option(settings, "AudioEncoderActual");
589 br = ghb_settings_combo_option(settings, "AudioBitrate");
590 sr = ghb_settings_combo_option(settings, "AudioSamplerate");
591 mix = ghb_settings_combo_option(settings, "AudioMixdown");
593 drc = ghb_settings_get_double(settings, "AudioTrackDRCSlider");
595 s_drc = g_strdup("Off");
597 s_drc = g_strdup_printf("%.1f", drc);
599 gtk_list_store_append(store, &iter);
600 gtk_list_store_set(store, &iter,
601 // These are displayed in list
609 gtk_tree_selection_select_iter(selection, &iter);
614 audio_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t *ud)
620 GtkTreePath *treepath;
623 GValue *asettings = NULL;
625 const GValue *audio_list;
626 g_debug("audio_list_selection_changed_cb ()");
627 if (gtk_tree_selection_get_selected(selection, &store, &iter))
629 //const gchar *actual_codec, *track, *codec, *bitrate, *sample_rate, *mix;
632 // Get the row number
633 treepath = gtk_tree_model_get_path (store, &iter);
634 indices = gtk_tree_path_get_indices (treepath);
636 gtk_tree_path_free(treepath);
637 // find audio settings
639 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
640 if (row >= ghb_array_len(audio_list))
642 asettings = ghb_array_get_nth(audio_list, row);
644 ghb_ui_update(ud, "AudioTrack", ghb_settings_get_value(asettings, "AudioTrack"));
645 ghb_ui_update(ud, "AudioEncoder", ghb_settings_get_value(asettings, "AudioEncoder"));
646 ghb_settings_set_value(ud->settings, "AudioEncoderActual", ghb_settings_get_value(asettings, "AudioEncoderActual"));
647 ghb_check_dependency(ud, NULL, "AudioEncoderActual");
648 ghb_ui_update(ud, "AudioBitrate", ghb_settings_get_value(asettings, "AudioBitrate"));
649 ghb_ui_update(ud, "AudioSamplerate", ghb_settings_get_value(asettings, "AudioSamplerate"));
650 ghb_ui_update(ud, "AudioMixdown", ghb_settings_get_value(asettings, "AudioMixdown"));
651 ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_settings_get_value(asettings, "AudioTrackDRCSlider"));
652 widget = GHB_WIDGET (ud->builder, "audio_remove");
653 gtk_widget_set_sensitive(widget, TRUE);
657 widget = GHB_WIDGET (ud->builder, "audio_remove");
658 gtk_widget_set_sensitive(widget, FALSE);
663 ghb_add_audio(signal_user_data_t *ud, GValue *settings)
669 track = ghb_settings_combo_option(settings, "AudioTrack");
670 ghb_settings_set_string(settings, "AudioTrackDescription", track);
672 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
673 if (audio_list == NULL)
675 audio_list = ghb_array_value_new(8);
676 ghb_settings_set_value(ud->settings, "audio_list", audio_list);
678 ghb_array_append(audio_list, settings);
679 add_to_audio_list(ud, settings);
680 count = ghb_array_len(audio_list);
683 GtkWidget * widget = GHB_WIDGET(ud->builder, "audio_add");
684 gtk_widget_set_sensitive(widget, FALSE);
686 ghb_update_destination_extension(ud);
690 audio_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
692 // Add the current audio settings to the list.
696 g_debug("audio_add_clicked_cb ()");
697 asettings = ghb_dict_value_new();
698 widget = GHB_WIDGET(ud->builder, "AudioTrack");
699 ghb_settings_take_value(asettings, "AudioTrack", ghb_widget_value(widget));
700 widget = GHB_WIDGET(ud->builder, "AudioEncoder");
701 ghb_settings_take_value(asettings, "AudioEncoder", ghb_widget_value(widget));
702 ghb_settings_set_value(asettings, "AudioEncoderActual",
703 ghb_settings_get_value(ud->settings, "AudioEncoderActual"));
704 widget = GHB_WIDGET(ud->builder, "AudioBitrate");
705 ghb_settings_take_value(asettings, "AudioBitrate", ghb_widget_value(widget));
706 widget = GHB_WIDGET(ud->builder, "AudioSamplerate");
707 ghb_settings_take_value(asettings, "AudioSamplerate", ghb_widget_value(widget));
708 widget = GHB_WIDGET(ud->builder, "AudioMixdown");
709 ghb_settings_take_value(asettings, "AudioMixdown", ghb_widget_value(widget));
710 widget = GHB_WIDGET(ud->builder, "AudioTrackDRCSlider");
711 ghb_settings_take_value(asettings, "AudioTrackDRCSlider", ghb_widget_value(widget));
713 ghb_add_audio(ud, asettings);
717 audio_remove_clicked_cb(GtkWidget *widget, signal_user_data_t *ud)
719 GtkTreeView *treeview;
720 GtkTreePath *treepath;
721 GtkTreeSelection *selection;
723 GtkTreeIter iter, nextIter;
728 g_debug("audio_remove_clicked_cb ()");
729 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
730 selection = gtk_tree_view_get_selection (treeview);
731 if (gtk_tree_selection_get_selected(selection, &store, &iter))
734 if (!gtk_tree_model_iter_next(store, &nextIter))
737 if (gtk_tree_model_get_iter_first(store, &nextIter))
739 gtk_tree_selection_select_iter (selection, &nextIter);
744 gtk_tree_selection_select_iter (selection, &nextIter);
746 // Get the row number
747 treepath = gtk_tree_model_get_path (store, &iter);
748 indices = gtk_tree_path_get_indices (treepath);
750 gtk_tree_path_free(treepath);
751 // Remove the selected item
752 gtk_list_store_remove (GTK_LIST_STORE(store), &iter);
753 // remove from audio settings list
755 widget = GHB_WIDGET (ud->builder, "audio_add");
756 gtk_widget_set_sensitive(widget, TRUE);
757 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
758 if (row >= ghb_array_len(audio_list))
760 GValue *old = ghb_array_get_nth(audio_list, row);
762 ghb_array_remove(audio_list, row);
767 ghb_set_audio(signal_user_data_t *ud, GValue *settings)
772 GValue *track, *audio, *acodec, *acodec_actual, *bitrate, *rate, *mix, *drc;
775 g_debug("set_audio");
776 // Clear the audio list
777 ghb_clear_audio_list(ud);
778 alist = ghb_settings_get_value(settings, "audio_list");
780 count = ghb_array_len(alist);
781 for (ii = 0; ii < count; ii++)
783 audio = ghb_array_get_nth(alist, ii);
784 track = ghb_settings_get_value(audio, "AudioTrack");
785 acodec = ghb_settings_get_value(audio, "AudioEncoder");
786 acodec_actual = ghb_settings_get_value(audio, "AudioEncoderActual");
787 bitrate = ghb_settings_get_value(audio, "AudioBitrate");
788 rate = ghb_settings_get_value(audio, "AudioSamplerate");
789 mix = ghb_settings_get_value(audio, "AudioMixdown");
790 drc = ghb_settings_get_value(audio, "AudioTrackDRCSlider");
791 acodec_code = ghb_lookup_combo_int("AudioEncoder", acodec);
793 if (acodec_code != 0)
795 GValue *settings = ghb_dict_value_new();
796 ghb_settings_set_value(settings, "AudioTrack", track);
797 ghb_settings_set_value(settings, "AudioEncoder", acodec);
798 ghb_settings_set_value(settings, "AudioEncoderActual", acodec_actual);
800 // This gets set autimatically if the codec is passthru
801 ghb_settings_set_value(settings, "AudioBitrate", bitrate);
802 ghb_settings_set_value(settings, "AudioSamplerate", rate);
803 ghb_settings_set_value(settings, "AudioMixdown", mix);
804 ghb_settings_set_value(settings, "AudioTrackDRCSlider", drc);
805 ghb_add_audio(ud, settings);
806 ghb_adjust_audio_rate_combos(ud);