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);
26 ghb_adjust_audio_rate_combos(signal_user_data_t *ud)
28 gint titleindex, track, acodec, mix;
29 ghb_audio_info_t ainfo;
33 g_debug("ghb_adjust_audio_rate_combos ()");
34 titleindex = ghb_settings_combo_int(ud->settings, "title");
36 widget = GHB_WIDGET(ud->builder, "AudioTrack");
37 gval = ghb_widget_value(widget);
38 track = ghb_lookup_combo_int("AudioTrack", gval);
41 widget = GHB_WIDGET(ud->builder, "AudioEncoder");
42 gval = ghb_widget_value(widget);
43 acodec = ghb_lookup_combo_int("AudioEncoder", gval);
45 widget = GHB_WIDGET(ud->builder, "AudioMixdown");
46 gval = ghb_widget_value(widget);
47 mix = ghb_lookup_combo_int("AudioMixdown", gval);
50 if (ghb_audio_is_passthru (acodec))
52 ghb_set_default_bitrate_opts (ud->builder, 0, -1);
53 if (ghb_get_audio_info (&ainfo, titleindex, track))
55 gint br = ainfo.bitrate / 1000;
56 // Set the values for bitrate and samplerate to the input rates
59 if (ghb_audio_is_passthru (ainfo.codec))
61 ghb_set_passthru_bitrate_opts (ud->builder, br);
62 ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(0));
63 acodec &= ainfo.codec;
67 if (acodec != HB_ACODEC_MASK)
69 acodec = ghb_select_audio_codec(ud, track);
70 ghb_ui_update(ud, "AudioEncoder", ghb_int64_value(acodec));
74 acodec = ghb_select_audio_codec(ud, track);
76 br = ghb_find_closest_audio_bitrate(acodec, br);
77 mix = ghb_get_best_mix( titleindex, track, acodec, 0);
78 ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix));
80 ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(br));
81 ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(0));
85 ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(384));
86 ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(0));
87 ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(0));
88 acodec = HB_ACODEC_AC3;
90 ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_double_value(0));
92 else if (acodec == HB_ACODEC_FAAC)
94 gint br, last = 320, first = 0;
96 if (mix == HB_AMIXDOWN_6CH)
102 widget = GHB_WIDGET(ud->builder, "AudioBitrate");
103 gval = ghb_widget_value(widget);
104 br = ghb_lookup_combo_int("AudioBitrate", gval);
105 ghb_value_free(gval);
107 ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(last));
109 ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(first));
110 ghb_set_default_bitrate_opts (ud->builder, first, last);
114 ghb_set_default_bitrate_opts (ud->builder, 0, -1);
116 ghb_settings_take_value(ud->settings, "AudioEncoderActual",
117 ghb_lookup_acodec_value(acodec));
118 ghb_check_dependency(ud, NULL, "AudioEncoderActual");
122 free_audio_hash_key_value(gpointer data)
128 ghb_get_user_audio_lang(signal_user_data_t *ud, gint titleindex, gint track)
130 GValue *audio_list, *asettings;
133 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
134 if (ghb_array_len(audio_list) <= track)
136 asettings = ghb_array_get_nth(audio_list, track);
137 track = ghb_settings_get_int(asettings, "AudioTrack");
138 lang = ghb_get_source_audio_lang(titleindex, track);
143 ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
145 gint fallback_acodec, track;
146 gchar *source_lang = NULL;
148 ghb_audio_info_t ainfo;
149 GHashTable *track_indices;
152 const GValue *pref_audio;
153 const GValue *audio, *drc;
154 gint acodec, bitrate, mix;
156 gint count, ii, list_count;
158 g_debug("set_pref_audio");
159 mux = ghb_settings_combo_int(ud->settings, "FileFormat");
160 if (mux == HB_MUX_MP4)
161 fallback_acodec = HB_ACODEC_FAAC;
163 fallback_acodec = HB_ACODEC_LAME;
164 track_indices = g_hash_table_new_full(g_int_hash, g_int_equal,
165 free_audio_hash_key_value, free_audio_hash_key_value);
166 // Clear the audio list
167 ghb_clear_audio_list(ud);
168 // Find "best" audio based on audio preferences
169 button = GHB_WIDGET (ud->builder, "audio_add");
170 if (!ghb_settings_get_boolean(ud->settings, "AudioDUB"))
172 source_lang = ghb_get_source_audio_lang(titleindex, 0);
174 if (source_lang == NULL)
175 source_lang = ghb_settings_get_string(ud->settings, "PreferredLanguage");
177 pref_audio = ghb_settings_get_value(ud->settings, "AudioList");
180 count = ghb_array_len(pref_audio);
181 for (ii = 0; ii < count; ii++)
183 audio = ghb_array_get_nth(pref_audio, ii);
184 acodec = ghb_settings_combo_int(audio, "AudioEncoder");
185 bitrate = ghb_settings_combo_int(audio, "AudioBitrate");
186 rate = ghb_settings_combo_double(audio, "AudioSamplerate");
187 mix = ghb_settings_combo_int(audio, "AudioMixdown");
188 drc = ghb_settings_get_value(audio, "AudioTrackDRCSlider");
189 // If there are multiple audios using the same codec, then
190 // select sequential tracks for each. The hash keeps track
191 // of the tracks used for each codec.
192 track = ghb_find_audio_track(titleindex, source_lang,
193 acodec, fallback_acodec, track_indices);
195 // 1. pref codec is passthru
196 // 2. source codec is not passthru
197 // 3. next pref is enabled
198 if (ghb_get_audio_info (&ainfo, titleindex, track) &&
199 ghb_audio_is_passthru (acodec))
201 // HB_ACODEC_* are bit fields. Treat acodec as mask
202 if (!(ainfo.codec & acodec & (HB_ACODEC_AC3 | HB_ACODEC_DCA)))
204 if (acodec != HB_ACODEC_MASK)
205 acodec = fallback_acodec;
206 // If there's more audio to process, or we've already
207 // placed one in the list, then we can skip this one
208 if ((ii + 1 < count) || (list_count != 0))
215 bitrate = ainfo.bitrate / 1000;
219 mix = HB_AMIXDOWN_DOLBYPLII;
223 if (titleindex >= 0 && track < 0)
227 GValue *settings = ghb_dict_value_new();
228 ghb_settings_set_int(settings, "AudioTrack", track);
229 ghb_settings_set_string(settings, "AudioEncoder",
230 ghb_lookup_combo_string("AudioEncoder", ghb_int_value(acodec)));
231 ghb_settings_set_value(settings, "AudioEncoderActual",
232 ghb_settings_get_value(ud->settings, "AudioEncoderActual"));
233 // This gets set autimatically if the codec is passthru
234 ghb_settings_set_string(settings, "AudioBitrate",
235 ghb_lookup_combo_string("AudioBitrate", ghb_int_value(bitrate)));
236 ghb_settings_set_string(settings, "AudioSamplerate",
237 ghb_lookup_combo_string("AudioSamplerate", ghb_int_value(rate)));
238 mix = ghb_get_best_mix( titleindex, track, acodec, mix);
239 ghb_settings_set_string(settings, "AudioMixdown",
240 ghb_lookup_combo_string("AudioMixdown", ghb_int_value(mix)));
241 ghb_settings_set_value(settings, "AudioTrackDRCSlider", drc);
242 ghb_add_audio(ud, settings);
243 ghb_adjust_audio_rate_combos(ud);
247 g_hash_table_destroy(track_indices);
251 get_selected_asettings(signal_user_data_t *ud)
253 GtkTreeView *treeview;
254 GtkTreePath *treepath;
255 GtkTreeSelection *selection;
260 GValue *asettings = NULL;
261 const GValue *audio_list;
263 g_debug("get_selected_asettings ()");
264 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
265 selection = gtk_tree_view_get_selection (treeview);
266 if (gtk_tree_selection_get_selected(selection, &store, &iter))
268 // Get the row number
269 treepath = gtk_tree_model_get_path (store, &iter);
270 indices = gtk_tree_path_get_indices (treepath);
272 gtk_tree_path_free(treepath);
273 // find audio settings
274 if (row < 0) return NULL;
275 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
276 if (row >= ghb_array_len(audio_list))
278 asettings = ghb_array_get_nth(audio_list, row);
284 ghb_audio_list_refresh_selected(signal_user_data_t *ud)
286 GtkTreeView *treeview;
287 GtkTreePath *treepath;
288 GtkTreeSelection *selection;
293 GValue *asettings = NULL;
294 const GValue *audio_list;
296 g_debug("ghb_audio_list_refresh_selected ()");
297 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
298 selection = gtk_tree_view_get_selection (treeview);
299 if (gtk_tree_selection_get_selected(selection, &store, &iter))
301 const gchar *track, *codec, *br, *sr, *mix;
305 // Get the row number
306 treepath = gtk_tree_model_get_path (store, &iter);
307 indices = gtk_tree_path_get_indices (treepath);
309 gtk_tree_path_free(treepath);
310 // find audio settings
312 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
313 if (row >= ghb_array_len(audio_list))
315 asettings = ghb_array_get_nth(audio_list, row);
317 track = ghb_settings_combo_option(asettings, "AudioTrack");
318 itrack = ghb_settings_combo_int(asettings, "AudioTrack");
319 codec = ghb_settings_combo_option(asettings, "AudioEncoder");
320 icodec = ghb_settings_combo_int(asettings, "AudioEncoder");
321 br = ghb_settings_combo_option(asettings, "AudioBitrate");
322 sr = ghb_settings_combo_option(asettings, "AudioSamplerate");
323 mix = ghb_settings_combo_option(asettings, "AudioMixdown");
325 drc = ghb_settings_get_double(asettings, "AudioTrackDRCSlider");
327 s_drc = g_strdup("Off");
329 s_drc = g_strdup_printf("%.1f", drc);
331 if (icodec == HB_ACODEC_MASK)
332 codec = ghb_select_audio_codec_str(ud, itrack);
334 gtk_list_store_set(GTK_LIST_STORE(store), &iter,
335 // These are displayed in list
348 audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
350 static gint prev_acodec = 0;
352 GValue *asettings, *gval;
354 g_debug("audio_codec_changed_cb ()");
355 gval = ghb_widget_value(widget);
356 acodec_code = ghb_lookup_combo_int("AudioEncoder", gval);
357 ghb_value_free(gval);
359 asettings = get_selected_asettings(ud);
360 if (ghb_audio_is_passthru (prev_acodec) &&
361 !ghb_audio_is_passthru (acodec_code))
363 // Transition from passthru to not, put some audio settings back to
367 gint br, sr, mix_code;
369 if (asettings != NULL)
371 br = ghb_settings_get_int(asettings, "AudioBitrate");
372 sr = ghb_settings_get_int(asettings, "AudioSamplerate");
373 mix_code = ghb_settings_combo_int(asettings, "AudioMixdown");
382 titleindex = ghb_settings_combo_int(ud->settings, "title");
383 track = ghb_settings_combo_int(ud->settings, "AudioTrack");
385 br = ghb_find_closest_audio_bitrate(acodec_code, br);
386 ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(br));
388 sr = ghb_find_closest_audio_rate(sr);
389 ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(sr));
390 mix_code = ghb_get_best_mix( titleindex, track, acodec_code, mix_code);
391 ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix_code));
393 ghb_adjust_audio_rate_combos(ud);
394 ghb_grey_combo_options (ud->builder);
395 ghb_check_dependency(ud, widget, NULL);
396 prev_acodec = acodec_code;
397 if (asettings != NULL)
399 ghb_widget_to_setting(asettings, widget);
400 ghb_settings_set_value(asettings, "AudioEncoderActual", ghb_settings_get_value(ud->settings, "AudioEncoderActual"));
401 ghb_audio_list_refresh_selected(ud);
403 ghb_update_destination_extension(ud);
408 audio_track_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
412 g_debug("audio_track_changed_cb ()");
413 ghb_adjust_audio_rate_combos(ud);
414 ghb_check_dependency(ud, widget, NULL);
415 ghb_grey_combo_options(ud->builder);
416 asettings = get_selected_asettings(ud);
417 if (asettings != NULL)
421 ghb_widget_to_setting(asettings, widget);
422 ghb_audio_list_refresh_selected(ud);
423 track = ghb_settings_combo_option(asettings, "AudioTrack");
424 ghb_settings_set_string(asettings, "AudioTrackDescription", track);
430 audio_mix_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
434 g_debug("audio_mix_changed_cb ()");
435 ghb_adjust_audio_rate_combos(ud);
436 ghb_check_dependency(ud, widget, NULL);
437 asettings = get_selected_asettings(ud);
438 if (asettings != NULL)
440 ghb_widget_to_setting(asettings, widget);
441 ghb_audio_list_refresh_selected(ud);
447 audio_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
451 g_debug("audio_widget_changed_cb ()");
452 ghb_check_dependency(ud, widget, NULL);
453 asettings = get_selected_asettings(ud);
454 if (asettings != NULL)
456 ghb_widget_to_setting(asettings, widget);
457 ghb_audio_list_refresh_selected(ud);
463 drc_widget_changed_cb(GtkWidget *widget, gdouble val, signal_user_data_t *ud)
469 g_debug("drc_widget_changed_cb ()");
471 label = GTK_LABEL(GHB_WIDGET(ud->builder, "drc_label"));
473 drc = g_strdup_printf("Off");
475 drc = g_strdup_printf("%.1f", val);
476 gtk_label_set_text(label, drc);
478 ghb_check_dependency(ud, widget, NULL);
479 asettings = get_selected_asettings(ud);
480 if (asettings != NULL)
482 ghb_widget_to_setting(asettings, widget);
483 ghb_audio_list_refresh_selected(ud);
489 ghb_clear_audio_list(signal_user_data_t *ud)
491 GtkTreeView *treeview;
495 g_debug("clear_audio_list ()");
496 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
497 if (audio_list == NULL)
499 audio_list = ghb_array_value_new(8);
500 ghb_settings_set_value(ud->settings, "audio_list", audio_list);
503 ghb_array_value_reset(audio_list, 8);
504 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
505 store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview));
506 gtk_list_store_clear (store);
510 add_to_audio_list(signal_user_data_t *ud, GValue *settings)
512 GtkTreeView *treeview;
515 GtkTreeSelection *selection;
516 const gchar *track, *codec, *br, *sr, *mix;
521 g_debug("add_to_audio_list ()");
522 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
523 selection = gtk_tree_view_get_selection (treeview);
524 store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview));
526 track = ghb_settings_combo_option(settings, "AudioTrack");
527 itrack = ghb_settings_combo_int(settings, "AudioTrack");
528 codec = ghb_settings_combo_option(settings, "AudioEncoder");
529 icodec = ghb_settings_combo_int(settings, "AudioEncoder");
530 br = ghb_settings_combo_option(settings, "AudioBitrate");
531 sr = ghb_settings_combo_option(settings, "AudioSamplerate");
532 mix = ghb_settings_combo_option(settings, "AudioMixdown");
534 drc = ghb_settings_get_double(settings, "AudioTrackDRCSlider");
536 s_drc = g_strdup("Off");
538 s_drc = g_strdup_printf("%.1f", drc);
540 if (icodec == HB_ACODEC_MASK)
542 codec = ghb_select_audio_codec_str(ud, itrack);
545 gtk_list_store_append(store, &iter);
546 gtk_list_store_set(store, &iter,
547 // These are displayed in list
555 gtk_tree_selection_select_iter(selection, &iter);
560 audio_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t *ud)
566 GtkTreePath *treepath;
569 GValue *asettings = NULL;
571 const GValue *audio_list;
572 g_debug("audio_list_selection_changed_cb ()");
573 if (gtk_tree_selection_get_selected(selection, &store, &iter))
575 //const gchar *actual_codec, *track, *codec, *bitrate, *sample_rate, *mix;
578 // Get the row number
579 treepath = gtk_tree_model_get_path (store, &iter);
580 indices = gtk_tree_path_get_indices (treepath);
582 gtk_tree_path_free(treepath);
583 // find audio settings
585 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
586 if (row >= ghb_array_len(audio_list))
588 asettings = ghb_array_get_nth(audio_list, row);
590 ghb_ui_update(ud, "AudioTrack", ghb_settings_get_value(asettings, "AudioTrack"));
591 ghb_ui_update(ud, "AudioEncoder", ghb_settings_get_value(asettings, "AudioEncoder"));
592 ghb_settings_set_value(ud->settings, "AudioEncoderActual", ghb_settings_get_value(asettings, "AudioEncoderActual"));
593 ghb_check_dependency(ud, NULL, "AudioEncoderActual");
594 ghb_ui_update(ud, "AudioBitrate", ghb_settings_get_value(asettings, "AudioBitrate"));
595 ghb_ui_update(ud, "AudioSamplerate", ghb_settings_get_value(asettings, "AudioSamplerate"));
596 ghb_ui_update(ud, "AudioMixdown", ghb_settings_get_value(asettings, "AudioMixdown"));
597 ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_settings_get_value(asettings, "AudioTrackDRCSlider"));
598 widget = GHB_WIDGET (ud->builder, "audio_remove");
599 gtk_widget_set_sensitive(widget, TRUE);
603 widget = GHB_WIDGET (ud->builder, "audio_remove");
604 gtk_widget_set_sensitive(widget, FALSE);
609 ghb_add_audio(signal_user_data_t *ud, GValue *settings)
615 track = ghb_settings_combo_option(settings, "AudioTrack");
616 ghb_settings_set_string(settings, "AudioTrackDescription", track);
618 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
619 if (audio_list == NULL)
621 audio_list = ghb_array_value_new(8);
622 ghb_settings_set_value(ud->settings, "audio_list", audio_list);
624 ghb_array_append(audio_list, settings);
625 add_to_audio_list(ud, settings);
626 count = ghb_array_len(audio_list);
629 GtkWidget * widget = GHB_WIDGET(ud->builder, "audio_add");
630 gtk_widget_set_sensitive(widget, FALSE);
632 ghb_update_destination_extension(ud);
636 audio_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
638 // Add the current audio settings to the list.
642 g_debug("audio_add_clicked_cb ()");
643 asettings = ghb_dict_value_new();
644 // Only allow up to 8 audio entries
645 widget = GHB_WIDGET(ud->builder, "AudioTrack");
646 ghb_settings_take_value(asettings, "AudioTrack", ghb_widget_value(widget));
647 widget = GHB_WIDGET(ud->builder, "AudioEncoder");
648 ghb_settings_take_value(asettings, "AudioEncoder", ghb_widget_value(widget));
649 ghb_settings_set_value(asettings, "AudioEncoderActual",
650 ghb_settings_get_value(ud->settings, "AudioEncoderActual"));
651 widget = GHB_WIDGET(ud->builder, "AudioBitrate");
652 ghb_settings_take_value(asettings, "AudioBitrate", ghb_widget_value(widget));
653 widget = GHB_WIDGET(ud->builder, "AudioSamplerate");
654 ghb_settings_take_value(asettings, "AudioSamplerate", ghb_widget_value(widget));
655 widget = GHB_WIDGET(ud->builder, "AudioMixdown");
656 ghb_settings_take_value(asettings, "AudioMixdown", ghb_widget_value(widget));
657 widget = GHB_WIDGET(ud->builder, "AudioTrackDRCSlider");
658 ghb_settings_take_value(asettings, "AudioTrackDRCSlider", ghb_widget_value(widget));
660 ghb_add_audio(ud, asettings);
664 audio_remove_clicked_cb(GtkWidget *widget, signal_user_data_t *ud)
666 GtkTreeView *treeview;
667 GtkTreePath *treepath;
668 GtkTreeSelection *selection;
670 GtkTreeIter iter, nextIter;
675 g_debug("audio_remove_clicked_cb ()");
676 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
677 selection = gtk_tree_view_get_selection (treeview);
678 if (gtk_tree_selection_get_selected(selection, &store, &iter))
681 if (!gtk_tree_model_iter_next(store, &nextIter))
684 if (gtk_tree_model_get_iter_first(store, &nextIter))
686 gtk_tree_selection_select_iter (selection, &nextIter);
691 gtk_tree_selection_select_iter (selection, &nextIter);
693 // Get the row number
694 treepath = gtk_tree_model_get_path (store, &iter);
695 indices = gtk_tree_path_get_indices (treepath);
697 gtk_tree_path_free(treepath);
698 // Remove the selected item
699 gtk_list_store_remove (GTK_LIST_STORE(store), &iter);
700 // remove from audio settings list
702 widget = GHB_WIDGET (ud->builder, "audio_add");
703 gtk_widget_set_sensitive(widget, TRUE);
704 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
705 if (row >= ghb_array_len(audio_list))
707 GValue *old = ghb_array_get_nth(audio_list, row);
709 ghb_array_remove(audio_list, row);
714 ghb_set_audio(signal_user_data_t *ud, GValue *settings)
720 GValue *track, *audio, *acodec, *bitrate, *rate, *mix, *drc;
723 g_debug("set_audio");
724 // Clear the audio list
725 ghb_clear_audio_list(ud);
726 button = GHB_WIDGET (ud->builder, "audio_add");
727 alist = ghb_settings_get_value(settings, "audio_list");
729 count = ghb_array_len(alist);
730 for (ii = 0; ii < count; ii++)
732 audio = ghb_array_get_nth(alist, ii);
733 track = ghb_settings_get_value(audio, "AudioTrack");
734 acodec = ghb_settings_get_value(audio, "AudioEncoder");
735 bitrate = ghb_settings_get_value(audio, "AudioBitrate");
736 rate = ghb_settings_get_value(audio, "AudioSamplerate");
737 mix = ghb_settings_get_value(audio, "AudioMixdown");
738 drc = ghb_settings_get_value(audio, "AudioTrackDRCSlider");
739 acodec_code = ghb_lookup_combo_int("AudioEncoder", acodec);
741 if (acodec_code != 0)
743 GValue *settings = ghb_dict_value_new();
744 ghb_settings_set_value(settings, "AudioTrack", track);
745 ghb_settings_set_value(settings, "AudioEncoder", acodec);
746 ghb_settings_set_value(settings, "AudioEncoderActual",
747 ghb_settings_get_value(ud->settings, "AudioEncoderActual"));
748 // This gets set autimatically if the codec is passthru
749 ghb_settings_set_value(settings, "AudioBitrate", bitrate);
750 ghb_settings_set_value(settings, "AudioSamplerate", rate);
751 ghb_settings_set_value(settings, "AudioMixdown", mix);
752 ghb_settings_set_value(settings, "AudioTrackDRCSlider", drc);
753 ghb_add_audio(ud, settings);
754 ghb_adjust_audio_rate_combos(ud);