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, select_acodec, mix;
29 ghb_audio_info_t ainfo;
35 g_debug("ghb_adjust_audio_rate_combos ()");
36 mux = ghb_settings_combo_int(ud->settings, "FileFormat");
37 titleindex = ghb_settings_combo_int(ud->settings, "title");
39 widget = GHB_WIDGET(ud->builder, "AudioTrack");
40 gval = ghb_widget_value(widget);
41 track = ghb_lookup_combo_int("AudioTrack", gval);
44 widget = GHB_WIDGET(ud->builder, "AudioEncoder");
45 gval = ghb_widget_value(widget);
46 acodec = ghb_lookup_combo_int("AudioEncoder", gval);
48 widget = GHB_WIDGET(ud->builder, "AudioMixdown");
49 gval = ghb_widget_value(widget);
50 mix = ghb_lookup_combo_int("AudioMixdown", gval);
53 widget = GHB_WIDGET(ud->builder, "AudioBitrate");
54 gval = ghb_widget_value(widget);
55 bitrate = ghb_lookup_combo_int("AudioBitrate", gval);
57 select_acodec = acodec;
58 if (mux == HB_MUX_MP4)
60 select_acodec &= ~HB_ACODEC_DCA;
62 if ((select_acodec & HB_ACODEC_MASK) == 0)
64 // Unsuported codec in this container.
65 select_acodec |= HB_ACODEC_AC3;
66 acodec = select_acodec;
69 if (ghb_audio_is_passthru (select_acodec))
71 ghb_set_default_bitrate_opts (ud->builder, 0, -1);
72 if (ghb_get_audio_info (&ainfo, titleindex, track))
74 bitrate = ainfo.bitrate / 1000;
76 // Set the values for bitrate and samplerate to the input rates
77 if (ainfo.codec & select_acodec & HB_ACODEC_PASS_MASK)
79 ghb_set_passthru_bitrate_opts (ud->builder, bitrate);
80 ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(0));
81 select_acodec &= ainfo.codec | HB_ACODEC_PASS_FLAG;
85 select_acodec = ghb_select_audio_codec(ud->settings, acodec, track);
86 if (acodec != HB_ACODEC_ANY)
88 ghb_ui_update(ud, "AudioEncoder", ghb_int64_value(select_acodec));
92 mix = ghb_get_best_mix( titleindex, track, select_acodec, mix);
93 channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(mix);
94 bitrate = ghb_get_default_audio_bitrate(select_acodec, ainfo.samplerate, bitrate, channels);
95 ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix));
97 ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(bitrate));
98 ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(0));
102 ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(0));
103 ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(0));
105 mix = ghb_get_best_mix( titleindex, track, select_acodec, 0);
107 ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_double_value(0));
109 gint channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(mix);
110 bitrate = ghb_get_best_audio_bitrate(select_acodec, bitrate, channels);
111 ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(bitrate));
114 ghb_get_audio_bitrate_limits(select_acodec, channels, &low, &high);
115 ghb_set_default_bitrate_opts (ud->builder, low, high);
117 ghb_settings_take_value(ud->settings, "AudioEncoderActual",
118 ghb_lookup_acodec_value(select_acodec));
119 ghb_check_dependency(ud, NULL, "AudioEncoderActual");
123 free_audio_hash_key_value(gpointer data)
129 ghb_get_user_audio_lang(signal_user_data_t *ud, gint titleindex, gint track)
131 GValue *audio_list, *asettings;
134 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
135 if (ghb_array_len(audio_list) <= track)
137 asettings = ghb_array_get_nth(audio_list, track);
138 track = ghb_settings_get_int(asettings, "AudioTrack");
139 lang = ghb_get_source_audio_lang(titleindex, track);
144 ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
146 gint fallback_acodec, track;
147 gchar *source_lang = NULL;
149 ghb_audio_info_t ainfo;
150 GHashTable *track_indices;
153 const GValue *pref_audio;
154 const GValue *audio, *drc;
155 gint mix_acodec, acodec, bitrate, mix;
157 gint count, ii, list_count;
159 g_debug("set_pref_audio");
160 mux = ghb_settings_combo_int(ud->settings, "FileFormat");
161 if (mux == HB_MUX_MP4)
163 fallback_acodec = HB_ACODEC_FAAC;
167 fallback_acodec = HB_ACODEC_LAME;
169 track_indices = g_hash_table_new_full(g_int_hash, g_int_equal,
170 free_audio_hash_key_value, free_audio_hash_key_value);
171 // Clear the audio list
172 ghb_clear_audio_list(ud);
173 // Find "best" audio based on audio preferences
174 button = GHB_WIDGET (ud->builder, "audio_add");
175 if (!ghb_settings_get_boolean(ud->settings, "AudioDUB"))
177 source_lang = ghb_get_source_audio_lang(titleindex, 0);
179 if (source_lang == NULL)
180 source_lang = ghb_settings_get_string(ud->settings, "PreferredLanguage");
182 pref_audio = ghb_settings_get_value(ud->settings, "AudioList");
185 count = ghb_array_len(pref_audio);
186 for (ii = 0; ii < count; ii++)
190 audio = ghb_array_get_nth(pref_audio, ii);
191 select_acodec = acodec = ghb_settings_combo_int(audio, "AudioEncoder");
192 if (mux == HB_MUX_MP4)
194 select_acodec &= ~HB_ACODEC_DCA;
196 if ((select_acodec & HB_ACODEC_MASK) == 0)
198 // Unsuported codec in this container.
199 select_acodec |= HB_ACODEC_AC3;
200 acodec = select_acodec;
202 if ( ghb_audio_can_passthru( select_acodec ) )
204 fallback_acodec = HB_ACODEC_AC3;
207 bitrate = ghb_settings_combo_int(audio, "AudioBitrate");
208 rate = ghb_settings_combo_double(audio, "AudioSamplerate");
209 mix = ghb_settings_combo_int(audio, "AudioMixdown");
210 drc = ghb_settings_get_value(audio, "AudioTrackDRCSlider");
211 // If there are multiple audios using the same codec, then
212 // select sequential tracks for each. The hash keeps track
213 // of the tracks used for each codec.
214 track = ghb_find_audio_track(titleindex, source_lang,
215 select_acodec, fallback_acodec, track_indices);
217 // 1. pref codec is passthru
218 // 2. source codec is not passthru
219 // 3. next pref is enabled
220 if (ghb_get_audio_info (&ainfo, titleindex, track) &&
221 ghb_audio_is_passthru (acodec))
223 // HB_ACODEC_* are bit fields. Treat acodec as mask
224 if (!(ainfo.codec & select_acodec & HB_ACODEC_PASS_MASK))
226 if (acodec != HB_ACODEC_ANY)
227 acodec = fallback_acodec;
228 mix_acodec = fallback_acodec;
229 // If we can't substitute the passthru with a suitable
231 // If there's more audio to process, or we've already
232 // placed one in the list, then we can skip this one
233 if (!(select_acodec & fallback_acodec) &&
234 ((ii + 1 < count) || (list_count != 0)))
241 int channels, min_rate, max_rate;
242 mix = ghb_get_best_mix( titleindex, track, mix_acodec, mix);
243 channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(mix);
244 bitrate = ainfo.bitrate / 1000;
245 min_rate = channels * 64;
246 max_rate = channels * 160;
247 if (bitrate < min_rate)
249 if (bitrate > max_rate)
255 if (titleindex >= 0 && track < 0)
259 GValue *settings = ghb_dict_value_new();
260 ghb_settings_set_int(settings, "AudioTrack", track);
261 ghb_settings_set_string(settings, "AudioEncoder",
262 ghb_lookup_combo_string("AudioEncoder", ghb_int_value(acodec)));
263 ghb_settings_set_value(settings, "AudioEncoderActual",
264 ghb_settings_get_value(ud->settings, "AudioEncoderActual"));
265 // This gets set autimatically if the codec is passthru
266 ghb_settings_set_string(settings, "AudioBitrate",
267 ghb_lookup_combo_string("AudioBitrate", ghb_int_value(bitrate)));
268 ghb_settings_set_string(settings, "AudioSamplerate",
269 ghb_lookup_combo_string("AudioSamplerate", ghb_int_value(rate)));
270 mix = ghb_get_best_mix( titleindex, track, mix_acodec, mix);
271 ghb_settings_set_string(settings, "AudioMixdown",
272 ghb_lookup_combo_string("AudioMixdown", ghb_int_value(mix)));
273 ghb_settings_set_value(settings, "AudioTrackDRCSlider", drc);
274 ghb_add_audio(ud, settings);
275 ghb_adjust_audio_rate_combos(ud);
279 g_hash_table_destroy(track_indices);
283 get_selected_asettings(signal_user_data_t *ud)
285 GtkTreeView *treeview;
286 GtkTreePath *treepath;
287 GtkTreeSelection *selection;
292 GValue *asettings = NULL;
293 const GValue *audio_list;
295 g_debug("get_selected_asettings ()");
296 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
297 selection = gtk_tree_view_get_selection (treeview);
298 if (gtk_tree_selection_get_selected(selection, &store, &iter))
300 // Get the row number
301 treepath = gtk_tree_model_get_path (store, &iter);
302 indices = gtk_tree_path_get_indices (treepath);
304 gtk_tree_path_free(treepath);
305 // find audio settings
306 if (row < 0) return NULL;
307 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
308 if (row >= ghb_array_len(audio_list))
310 asettings = ghb_array_get_nth(audio_list, row);
316 ghb_audio_list_refresh_selected(signal_user_data_t *ud)
318 GtkTreeView *treeview;
319 GtkTreePath *treepath;
320 GtkTreeSelection *selection;
325 GValue *asettings = NULL;
326 const GValue *audio_list;
328 g_debug("ghb_audio_list_refresh_selected ()");
329 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
330 selection = gtk_tree_view_get_selection (treeview);
331 if (gtk_tree_selection_get_selected(selection, &store, &iter))
333 const gchar *track, *codec, *br, *sr, *mix;
337 // Get the row number
338 treepath = gtk_tree_model_get_path (store, &iter);
339 indices = gtk_tree_path_get_indices (treepath);
341 gtk_tree_path_free(treepath);
342 // find audio settings
344 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
345 if (row >= ghb_array_len(audio_list))
347 asettings = ghb_array_get_nth(audio_list, row);
349 track = ghb_settings_combo_option(asettings, "AudioTrack");
350 itrack = ghb_settings_combo_int(asettings, "AudioTrack");
351 codec = ghb_settings_combo_option(asettings, "AudioEncoder");
352 icodec = ghb_settings_combo_int(asettings, "AudioEncoder");
353 br = ghb_settings_combo_option(asettings, "AudioBitrate");
354 sr = ghb_settings_combo_option(asettings, "AudioSamplerate");
355 mix = ghb_settings_combo_option(asettings, "AudioMixdown");
357 drc = ghb_settings_get_double(asettings, "AudioTrackDRCSlider");
359 s_drc = g_strdup("Off");
361 s_drc = g_strdup_printf("%.1f", drc);
363 if (icodec == HB_ACODEC_ANY)
364 codec = ghb_select_audio_codec_str(ud->settings, icodec, itrack);
366 gtk_list_store_set(GTK_LIST_STORE(store), &iter,
367 // These are displayed in list
380 audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
382 static gint prev_acodec = 0;
384 GValue *asettings, *gval;
386 g_debug("audio_codec_changed_cb ()");
387 gval = ghb_widget_value(widget);
388 acodec_code = ghb_lookup_combo_int("AudioEncoder", gval);
389 ghb_value_free(gval);
391 asettings = get_selected_asettings(ud);
392 if (ghb_audio_is_passthru (prev_acodec) &&
393 !ghb_audio_is_passthru (acodec_code))
395 // Transition from passthru to not, put some audio settings back to
399 gint br, sr, mix_code;
401 if (asettings != NULL)
403 br = ghb_settings_get_int(asettings, "AudioBitrate");
404 sr = ghb_settings_get_int(asettings, "AudioSamplerate");
405 mix_code = ghb_settings_combo_int(asettings, "AudioMixdown");
414 titleindex = ghb_settings_combo_int(ud->settings, "title");
415 track = ghb_settings_combo_int(ud->settings, "AudioTrack");
417 mix_code = ghb_get_best_mix( titleindex, track, acodec_code, mix_code);
418 int channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(mix_code);
419 br = ghb_get_best_audio_bitrate(acodec_code, br, channels);
420 ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(br));
422 sr = ghb_find_closest_audio_rate(sr);
423 ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(sr));
424 ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix_code));
426 ghb_adjust_audio_rate_combos(ud);
427 ghb_grey_combo_options (ud->builder);
428 ghb_check_dependency(ud, widget, NULL);
429 prev_acodec = acodec_code;
430 if (asettings != NULL)
432 ghb_widget_to_setting(asettings, widget);
433 ghb_settings_set_value(asettings, "AudioEncoderActual", ghb_settings_get_value(ud->settings, "AudioEncoderActual"));
434 ghb_audio_list_refresh_selected(ud);
436 ghb_update_destination_extension(ud);
441 audio_track_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
445 g_debug("audio_track_changed_cb ()");
446 ghb_adjust_audio_rate_combos(ud);
447 ghb_check_dependency(ud, widget, NULL);
448 ghb_grey_combo_options(ud->builder);
449 asettings = get_selected_asettings(ud);
450 if (asettings != NULL)
454 ghb_widget_to_setting(asettings, widget);
455 ghb_audio_list_refresh_selected(ud);
456 track = ghb_settings_combo_option(asettings, "AudioTrack");
457 ghb_settings_set_string(asettings, "AudioTrackDescription", track);
463 audio_mix_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
467 g_debug("audio_mix_changed_cb ()");
468 ghb_adjust_audio_rate_combos(ud);
469 ghb_check_dependency(ud, widget, NULL);
470 asettings = get_selected_asettings(ud);
471 if (asettings != NULL)
473 ghb_widget_to_setting(asettings, widget);
474 ghb_audio_list_refresh_selected(ud);
480 audio_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
484 g_debug("audio_widget_changed_cb ()");
485 ghb_check_dependency(ud, widget, NULL);
486 asettings = get_selected_asettings(ud);
487 if (asettings != NULL)
489 ghb_widget_to_setting(asettings, widget);
490 ghb_audio_list_refresh_selected(ud);
496 drc_widget_changed_cb(GtkWidget *widget, gdouble val, signal_user_data_t *ud)
502 g_debug("drc_widget_changed_cb ()");
504 label = GTK_LABEL(GHB_WIDGET(ud->builder, "drc_label"));
506 drc = g_strdup_printf("Off");
508 drc = g_strdup_printf("%.1f", val);
509 gtk_label_set_text(label, drc);
511 ghb_check_dependency(ud, widget, NULL);
512 asettings = get_selected_asettings(ud);
513 if (asettings != NULL)
515 ghb_widget_to_setting(asettings, widget);
516 ghb_audio_list_refresh_selected(ud);
522 ghb_clear_audio_list(signal_user_data_t *ud)
524 GtkTreeView *treeview;
528 g_debug("clear_audio_list ()");
529 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
530 if (audio_list == NULL)
532 audio_list = ghb_array_value_new(8);
533 ghb_settings_set_value(ud->settings, "audio_list", audio_list);
536 ghb_array_value_reset(audio_list, 8);
537 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
538 store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview));
539 gtk_list_store_clear (store);
543 add_to_audio_list(signal_user_data_t *ud, GValue *settings)
545 GtkTreeView *treeview;
548 GtkTreeSelection *selection;
549 const gchar *track, *codec, *br, *sr, *mix;
554 g_debug("add_to_audio_list ()");
555 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
556 selection = gtk_tree_view_get_selection (treeview);
557 store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview));
559 track = ghb_settings_combo_option(settings, "AudioTrack");
560 itrack = ghb_settings_combo_int(settings, "AudioTrack");
561 codec = ghb_settings_combo_option(settings, "AudioEncoder");
562 icodec = ghb_settings_combo_int(settings, "AudioEncoder");
563 br = ghb_settings_combo_option(settings, "AudioBitrate");
564 sr = ghb_settings_combo_option(settings, "AudioSamplerate");
565 mix = ghb_settings_combo_option(settings, "AudioMixdown");
567 drc = ghb_settings_get_double(settings, "AudioTrackDRCSlider");
569 s_drc = g_strdup("Off");
571 s_drc = g_strdup_printf("%.1f", drc);
573 if (icodec == HB_ACODEC_ANY)
575 codec = ghb_select_audio_codec_str(ud->settings, icodec, itrack);
578 gtk_list_store_append(store, &iter);
579 gtk_list_store_set(store, &iter,
580 // These are displayed in list
588 gtk_tree_selection_select_iter(selection, &iter);
593 audio_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t *ud)
599 GtkTreePath *treepath;
602 GValue *asettings = NULL;
604 const GValue *audio_list;
605 g_debug("audio_list_selection_changed_cb ()");
606 if (gtk_tree_selection_get_selected(selection, &store, &iter))
608 //const gchar *actual_codec, *track, *codec, *bitrate, *sample_rate, *mix;
611 // Get the row number
612 treepath = gtk_tree_model_get_path (store, &iter);
613 indices = gtk_tree_path_get_indices (treepath);
615 gtk_tree_path_free(treepath);
616 // find audio settings
618 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
619 if (row >= ghb_array_len(audio_list))
621 asettings = ghb_array_get_nth(audio_list, row);
623 ghb_ui_update(ud, "AudioTrack", ghb_settings_get_value(asettings, "AudioTrack"));
624 ghb_ui_update(ud, "AudioEncoder", ghb_settings_get_value(asettings, "AudioEncoder"));
625 ghb_settings_set_value(ud->settings, "AudioEncoderActual", ghb_settings_get_value(asettings, "AudioEncoderActual"));
626 ghb_check_dependency(ud, NULL, "AudioEncoderActual");
627 ghb_ui_update(ud, "AudioBitrate", ghb_settings_get_value(asettings, "AudioBitrate"));
628 ghb_ui_update(ud, "AudioSamplerate", ghb_settings_get_value(asettings, "AudioSamplerate"));
629 ghb_ui_update(ud, "AudioMixdown", ghb_settings_get_value(asettings, "AudioMixdown"));
630 ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_settings_get_value(asettings, "AudioTrackDRCSlider"));
631 widget = GHB_WIDGET (ud->builder, "audio_remove");
632 gtk_widget_set_sensitive(widget, TRUE);
636 widget = GHB_WIDGET (ud->builder, "audio_remove");
637 gtk_widget_set_sensitive(widget, FALSE);
642 ghb_add_audio(signal_user_data_t *ud, GValue *settings)
648 track = ghb_settings_combo_option(settings, "AudioTrack");
649 ghb_settings_set_string(settings, "AudioTrackDescription", track);
651 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
652 if (audio_list == NULL)
654 audio_list = ghb_array_value_new(8);
655 ghb_settings_set_value(ud->settings, "audio_list", audio_list);
657 ghb_array_append(audio_list, settings);
658 add_to_audio_list(ud, settings);
659 count = ghb_array_len(audio_list);
662 GtkWidget * widget = GHB_WIDGET(ud->builder, "audio_add");
663 gtk_widget_set_sensitive(widget, FALSE);
665 ghb_update_destination_extension(ud);
669 audio_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
671 // Add the current audio settings to the list.
675 g_debug("audio_add_clicked_cb ()");
676 asettings = ghb_dict_value_new();
677 widget = GHB_WIDGET(ud->builder, "AudioTrack");
678 ghb_settings_take_value(asettings, "AudioTrack", ghb_widget_value(widget));
679 widget = GHB_WIDGET(ud->builder, "AudioEncoder");
680 ghb_settings_take_value(asettings, "AudioEncoder", ghb_widget_value(widget));
681 ghb_settings_set_value(asettings, "AudioEncoderActual",
682 ghb_settings_get_value(ud->settings, "AudioEncoderActual"));
683 widget = GHB_WIDGET(ud->builder, "AudioBitrate");
684 ghb_settings_take_value(asettings, "AudioBitrate", ghb_widget_value(widget));
685 widget = GHB_WIDGET(ud->builder, "AudioSamplerate");
686 ghb_settings_take_value(asettings, "AudioSamplerate", ghb_widget_value(widget));
687 widget = GHB_WIDGET(ud->builder, "AudioMixdown");
688 ghb_settings_take_value(asettings, "AudioMixdown", ghb_widget_value(widget));
689 widget = GHB_WIDGET(ud->builder, "AudioTrackDRCSlider");
690 ghb_settings_take_value(asettings, "AudioTrackDRCSlider", ghb_widget_value(widget));
692 ghb_add_audio(ud, asettings);
696 audio_remove_clicked_cb(GtkWidget *widget, signal_user_data_t *ud)
698 GtkTreeView *treeview;
699 GtkTreePath *treepath;
700 GtkTreeSelection *selection;
702 GtkTreeIter iter, nextIter;
707 g_debug("audio_remove_clicked_cb ()");
708 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
709 selection = gtk_tree_view_get_selection (treeview);
710 if (gtk_tree_selection_get_selected(selection, &store, &iter))
713 if (!gtk_tree_model_iter_next(store, &nextIter))
716 if (gtk_tree_model_get_iter_first(store, &nextIter))
718 gtk_tree_selection_select_iter (selection, &nextIter);
723 gtk_tree_selection_select_iter (selection, &nextIter);
725 // Get the row number
726 treepath = gtk_tree_model_get_path (store, &iter);
727 indices = gtk_tree_path_get_indices (treepath);
729 gtk_tree_path_free(treepath);
730 // Remove the selected item
731 gtk_list_store_remove (GTK_LIST_STORE(store), &iter);
732 // remove from audio settings list
734 widget = GHB_WIDGET (ud->builder, "audio_add");
735 gtk_widget_set_sensitive(widget, TRUE);
736 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
737 if (row >= ghb_array_len(audio_list))
739 GValue *old = ghb_array_get_nth(audio_list, row);
741 ghb_array_remove(audio_list, row);
746 ghb_set_audio(signal_user_data_t *ud, GValue *settings)
752 GValue *track, *audio, *acodec, *bitrate, *rate, *mix, *drc;
755 g_debug("set_audio");
756 // Clear the audio list
757 ghb_clear_audio_list(ud);
758 button = GHB_WIDGET (ud->builder, "audio_add");
759 alist = ghb_settings_get_value(settings, "audio_list");
761 count = ghb_array_len(alist);
762 for (ii = 0; ii < count; ii++)
764 audio = ghb_array_get_nth(alist, ii);
765 track = ghb_settings_get_value(audio, "AudioTrack");
766 acodec = ghb_settings_get_value(audio, "AudioEncoder");
767 bitrate = ghb_settings_get_value(audio, "AudioBitrate");
768 rate = ghb_settings_get_value(audio, "AudioSamplerate");
769 mix = ghb_settings_get_value(audio, "AudioMixdown");
770 drc = ghb_settings_get_value(audio, "AudioTrackDRCSlider");
771 acodec_code = ghb_lookup_combo_int("AudioEncoder", acodec);
773 if (acodec_code != 0)
775 GValue *settings = ghb_dict_value_new();
776 ghb_settings_set_value(settings, "AudioTrack", track);
777 ghb_settings_set_value(settings, "AudioEncoder", acodec);
778 ghb_settings_set_value(settings, "AudioEncoderActual",
779 ghb_settings_get_value(ud->settings, "AudioEncoderActual"));
780 // This gets set autimatically if the codec is passthru
781 ghb_settings_set_value(settings, "AudioBitrate", bitrate);
782 ghb_settings_set_value(settings, "AudioSamplerate", rate);
783 ghb_settings_set_value(settings, "AudioMixdown", mix);
784 ghb_settings_set_value(settings, "AudioTrackDRCSlider", drc);
785 ghb_add_audio(ud, settings);
786 ghb_adjust_audio_rate_combos(ud);