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);
26 static gboolean block_updates = FALSE;
29 ghb_adjust_audio_rate_combos(signal_user_data_t *ud)
31 gint titleindex, track, acodec, select_acodec, mix;
32 hb_audio_config_t *aconfig;
39 g_debug("ghb_adjust_audio_rate_combos ()");
40 mux = ghb_settings_combo_int(ud->settings, "FileFormat");
41 titleindex = ghb_settings_combo_int(ud->settings, "title");
43 widget = GHB_WIDGET(ud->builder, "AudioTrack");
44 gval = ghb_widget_value(widget);
45 track = ghb_lookup_combo_int("AudioTrack", gval);
48 widget = GHB_WIDGET(ud->builder, "AudioEncoder");
49 gval = ghb_widget_value(widget);
50 acodec = ghb_lookup_combo_int("AudioEncoder", gval);
52 widget = GHB_WIDGET(ud->builder, "AudioMixdown");
53 gval = ghb_widget_value(widget);
54 mix = ghb_lookup_combo_int("AudioMixdown", gval);
57 widget = GHB_WIDGET(ud->builder, "AudioBitrate");
58 gval = ghb_widget_value(widget);
59 bitrate = ghb_lookup_combo_int("AudioBitrate", gval);
61 widget = GHB_WIDGET(ud->builder, "AudioSamplerate");
62 gval = ghb_widget_value(widget);
63 sr = ghb_lookup_combo_int("AudioSamplerate", gval);
65 select_acodec = acodec;
66 if (mux == HB_MUX_MP4)
68 select_acodec &= ~HB_ACODEC_DCA;
70 if ((select_acodec & HB_ACODEC_MASK) == 0)
72 // Unsuported codec in this container.
73 select_acodec |= HB_ACODEC_AC3;
74 acodec = select_acodec;
77 aconfig = ghb_get_scan_audio_info(titleindex, track);
80 sr = aconfig ? aconfig->in.samplerate : 48000;
82 gboolean codec_defined_bitrate = FALSE;
83 if (ghb_audio_is_passthru (select_acodec))
87 bitrate = aconfig->in.bitrate / 1000;
89 // Set the values for bitrate and samplerate to the input rates
90 if (aconfig->in.codec & select_acodec & HB_ACODEC_PASS_MASK)
92 ghb_set_passthru_bitrate_opts (ud->builder, bitrate);
93 ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(0));
94 select_acodec &= aconfig->in.codec | HB_ACODEC_PASS_FLAG;
95 codec_defined_bitrate = TRUE;
99 select_acodec = ghb_select_audio_codec(ud->settings, aconfig, acodec);
100 if (acodec != HB_ACODEC_ANY)
102 ghb_ui_update(ud, "AudioEncoder", ghb_int64_value(select_acodec));
105 mix = ghb_get_best_mix( aconfig, select_acodec, mix);
106 bitrate = hb_get_default_audio_bitrate(select_acodec, sr, mix);
107 ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix));
109 ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(0));
113 ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(0));
114 ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(0));
116 mix = ghb_get_best_mix( aconfig, select_acodec, 0);
118 ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_double_value(0));
122 bitrate = hb_get_best_audio_bitrate(select_acodec, bitrate, sr, mix);
124 if (!codec_defined_bitrate)
127 hb_get_audio_bitrate_limits(select_acodec, sr, mix, &low, &high);
128 ghb_set_default_bitrate_opts (ud->builder, low, high);
130 ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(bitrate));
132 ghb_settings_take_value(ud->settings, "AudioEncoderActual",
133 ghb_lookup_acodec_value(select_acodec));
134 GValue *asettings = get_selected_asettings(ud);
137 ghb_settings_take_value(asettings, "AudioEncoderActual",
138 ghb_lookup_acodec_value(select_acodec));
140 ghb_audio_list_refresh_selected(ud);
141 ghb_check_dependency(ud, NULL, "AudioEncoderActual");
145 free_audio_hash_key_value(gpointer data)
151 ghb_get_user_audio_lang(signal_user_data_t *ud, gint titleindex, gint track)
153 GValue *audio_list, *asettings;
156 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
157 if (ghb_array_len(audio_list) <= track)
159 asettings = ghb_array_get_nth(audio_list, track);
160 track = ghb_settings_get_int(asettings, "AudioTrack");
161 lang = ghb_get_source_audio_lang(titleindex, track);
166 ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
168 gint fallback_acodec, track;
169 gchar *source_lang = NULL;
170 hb_audio_config_t *aconfig;
171 GHashTable *track_indices;
174 const GValue *pref_audio;
175 const GValue *audio, *drc;
176 gint acodec, bitrate, mix;
178 gint count, ii, list_count;
180 g_debug("set_pref_audio");
181 mux = ghb_settings_combo_int(ud->settings, "FileFormat");
182 if (mux == HB_MUX_MP4)
184 fallback_acodec = HB_ACODEC_FAAC;
188 fallback_acodec = HB_ACODEC_LAME;
190 track_indices = g_hash_table_new_full(g_int_hash, g_int_equal,
191 free_audio_hash_key_value, free_audio_hash_key_value);
192 // Clear the audio list
193 ghb_clear_audio_list(ud);
194 // Find "best" audio based on audio preferences
195 if (!ghb_settings_get_boolean(ud->settings, "AudioDUB"))
197 source_lang = ghb_get_source_audio_lang(titleindex, 0);
199 if (source_lang == NULL)
200 source_lang = ghb_settings_get_string(ud->settings, "PreferredLanguage");
202 pref_audio = ghb_settings_get_value(ud->settings, "AudioList");
205 count = ghb_array_len(pref_audio);
206 for (ii = 0; ii < count; ii++)
210 audio = ghb_array_get_nth(pref_audio, ii);
211 select_acodec = acodec = ghb_settings_combo_int(audio, "AudioEncoder");
212 if (mux == HB_MUX_MP4)
214 select_acodec &= ~HB_ACODEC_DCA;
216 if ((select_acodec & HB_ACODEC_MASK) == 0)
218 // Unsuported codec in this container.
219 select_acodec |= HB_ACODEC_AC3;
220 acodec = select_acodec;
222 if ( ghb_audio_can_passthru( select_acodec ) )
224 fallback_acodec = HB_ACODEC_AC3;
226 bitrate = ghb_settings_combo_int(audio, "AudioBitrate");
227 rate = ghb_settings_combo_double(audio, "AudioSamplerate");
228 mix = ghb_settings_combo_int(audio, "AudioMixdown");
229 drc = ghb_settings_get_value(audio, "AudioTrackDRCSlider");
230 // If there are multiple audios using the same codec, then
231 // select sequential tracks for each. The hash keeps track
232 // of the tracks used for each codec.
233 track = ghb_find_audio_track(titleindex, source_lang,
234 select_acodec, fallback_acodec, track_indices);
236 // 1. pref codec is passthru
237 // 2. source codec is not passthru
238 // 3. next pref is enabled
239 aconfig = ghb_get_scan_audio_info(titleindex, track);
240 if (aconfig && ghb_audio_is_passthru (acodec))
242 // HB_ACODEC_* are bit fields. Treat acodec as mask
243 if (!(aconfig->in.codec & select_acodec & HB_ACODEC_PASS_MASK))
245 if (acodec != HB_ACODEC_ANY)
246 acodec = fallback_acodec;
247 // If we can't substitute the passthru with a suitable
249 // If there's more audio to process, or we've already
250 // placed one in the list, then we can skip this one
251 if (!(select_acodec & fallback_acodec) &&
252 ((ii + 1 < count) || (list_count != 0)))
259 int channels, min_rate, max_rate;
260 select_acodec = fallback_acodec;
261 mix = ghb_get_best_mix(aconfig, select_acodec, mix);
262 channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(mix);
263 bitrate = aconfig->in.bitrate / 1000;
264 min_rate = channels * 64;
265 max_rate = channels * 160;
266 if (bitrate < min_rate)
268 if (bitrate > max_rate)
275 select_acodec &= aconfig->in.codec | HB_ACODEC_PASS_FLAG;
278 if (titleindex >= 0 && track < 0)
282 GValue *settings = ghb_dict_value_new();
283 ghb_settings_set_int(settings, "AudioTrack", track);
284 ghb_settings_set_string(settings, "AudioEncoder",
285 ghb_lookup_combo_string("AudioEncoder", ghb_int_value(acodec)));
286 ghb_settings_set_value(settings, "AudioEncoderActual",
287 ghb_lookup_acodec_value(select_acodec));
288 // This gets set autimatically if the codec is passthru
289 ghb_settings_set_string(settings, "AudioBitrate",
290 ghb_lookup_combo_string("AudioBitrate", ghb_int_value(bitrate)));
291 ghb_settings_set_string(settings, "AudioSamplerate",
292 ghb_lookup_combo_string("AudioSamplerate", ghb_int_value(rate)));
293 mix = ghb_get_best_mix( aconfig, select_acodec, mix);
294 ghb_settings_set_string(settings, "AudioMixdown",
295 ghb_lookup_combo_string("AudioMixdown", ghb_int_value(mix)));
296 ghb_settings_set_value(settings, "AudioTrackDRCSlider", drc);
297 ghb_add_audio(ud, settings);
298 ghb_adjust_audio_rate_combos(ud);
302 g_hash_table_destroy(track_indices);
306 get_selected_asettings(signal_user_data_t *ud)
308 GtkTreeView *treeview;
309 GtkTreePath *treepath;
310 GtkTreeSelection *selection;
315 GValue *asettings = NULL;
316 const GValue *audio_list;
318 g_debug("get_selected_asettings ()");
319 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
320 selection = gtk_tree_view_get_selection (treeview);
321 if (gtk_tree_selection_get_selected(selection, &store, &iter))
323 // Get the row number
324 treepath = gtk_tree_model_get_path (store, &iter);
325 indices = gtk_tree_path_get_indices (treepath);
327 gtk_tree_path_free(treepath);
328 // find audio settings
329 if (row < 0) return NULL;
330 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
331 if (row >= ghb_array_len(audio_list))
333 asettings = ghb_array_get_nth(audio_list, row);
339 ghb_audio_list_refresh_selected(signal_user_data_t *ud)
341 GtkTreeView *treeview;
342 GtkTreePath *treepath;
343 GtkTreeSelection *selection;
348 GValue *asettings = NULL;
349 const GValue *audio_list;
351 g_debug("ghb_audio_list_refresh_selected ()");
352 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
353 selection = gtk_tree_view_get_selection (treeview);
354 if (gtk_tree_selection_get_selected(selection, &store, &iter))
356 const gchar *track, *codec, *br, *sr, *mix;
360 // Get the row number
361 treepath = gtk_tree_model_get_path (store, &iter);
362 indices = gtk_tree_path_get_indices (treepath);
364 gtk_tree_path_free(treepath);
365 // find audio settings
367 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
368 if (row >= ghb_array_len(audio_list))
370 asettings = ghb_array_get_nth(audio_list, row);
372 track = ghb_settings_combo_option(asettings, "AudioTrack");
373 itrack = ghb_settings_combo_int(asettings, "AudioTrack");
374 codec = ghb_settings_combo_option(asettings, "AudioEncoderActual");
375 br = ghb_settings_combo_option(asettings, "AudioBitrate");
376 sr = ghb_settings_combo_option(asettings, "AudioSamplerate");
377 mix = ghb_settings_combo_option(asettings, "AudioMixdown");
379 drc = ghb_settings_get_double(asettings, "AudioTrackDRCSlider");
381 s_drc = g_strdup("Off");
383 s_drc = g_strdup_printf("%.1f", drc);
385 gtk_list_store_set(GTK_LIST_STORE(store), &iter,
386 // These are displayed in list
399 audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
401 static gint prev_acodec = 0;
403 GValue *asettings, *gval;
405 g_debug("audio_codec_changed_cb ()");
406 gval = ghb_widget_value(widget);
407 acodec_code = ghb_lookup_combo_int("AudioEncoder", gval);
410 prev_acodec = acodec_code;
411 ghb_grey_combo_options (ud->builder);
415 gval = ghb_widget_value(widget);
416 acodec_code = ghb_lookup_combo_int("AudioEncoder", gval);
417 ghb_value_free(gval);
419 asettings = get_selected_asettings(ud);
420 if (ghb_audio_is_passthru (prev_acodec) &&
421 !ghb_audio_is_passthru (acodec_code))
423 // Transition from passthru to not, put some audio settings back to
427 gint br, sr, mix_code;
429 if (asettings != NULL)
431 br = ghb_settings_get_int(asettings, "AudioBitrate");
432 sr = ghb_settings_combo_int(asettings, "AudioSamplerate");
433 mix_code = ghb_settings_combo_int(asettings, "AudioMixdown");
442 titleindex = ghb_settings_combo_int(ud->settings, "title");
443 track = ghb_settings_combo_int(ud->settings, "AudioTrack");
446 sr = ghb_find_closest_audio_rate(sr);
448 ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(sr));
450 hb_audio_config_t *aconfig;
451 aconfig = ghb_get_scan_audio_info(titleindex, track);
454 sr = aconfig ? aconfig->in.samplerate : 48000;
456 mix_code = ghb_get_best_mix( aconfig, acodec_code, mix_code);
457 br = hb_get_best_audio_bitrate(acodec_code, br, sr, mix_code);
458 ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(br));
460 ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix_code));
462 ghb_adjust_audio_rate_combos(ud);
463 ghb_grey_combo_options (ud->builder);
464 ghb_check_dependency(ud, widget, NULL);
465 prev_acodec = acodec_code;
466 if (asettings != NULL)
468 ghb_widget_to_setting(asettings, widget);
469 ghb_settings_set_value(asettings, "AudioEncoderActual", ghb_settings_get_value(ud->settings, "AudioEncoderActual"));
470 ghb_audio_list_refresh_selected(ud);
472 ghb_update_destination_extension(ud);
477 audio_track_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
481 g_debug("audio_track_changed_cb ()");
482 if (block_updates) return;
484 ghb_adjust_audio_rate_combos(ud);
485 ghb_check_dependency(ud, widget, NULL);
486 ghb_grey_combo_options(ud->builder);
487 asettings = get_selected_asettings(ud);
488 if (asettings != NULL)
492 ghb_widget_to_setting(asettings, widget);
493 ghb_audio_list_refresh_selected(ud);
494 track = ghb_settings_combo_option(asettings, "AudioTrack");
495 ghb_settings_set_string(asettings, "AudioTrackDescription", track);
501 audio_mix_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
505 g_debug("audio_mix_changed_cb ()");
506 if (block_updates) return;
508 ghb_adjust_audio_rate_combos(ud);
509 ghb_check_dependency(ud, widget, NULL);
510 asettings = get_selected_asettings(ud);
511 if (asettings != NULL)
513 ghb_widget_to_setting(asettings, widget);
514 ghb_audio_list_refresh_selected(ud);
520 audio_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
524 g_debug("audio_widget_changed_cb ()");
525 if (block_updates) return;
527 ghb_adjust_audio_rate_combos(ud);
528 ghb_check_dependency(ud, widget, NULL);
529 asettings = get_selected_asettings(ud);
530 if (asettings != NULL)
532 ghb_widget_to_setting(asettings, widget);
533 ghb_audio_list_refresh_selected(ud);
539 drc_widget_changed_cb(GtkWidget *widget, gdouble val, signal_user_data_t *ud)
545 g_debug("drc_widget_changed_cb ()");
546 if (block_updates) return;
548 label = GTK_LABEL(GHB_WIDGET(ud->builder, "drc_label"));
550 drc = g_strdup_printf("Off");
552 drc = g_strdup_printf("%.1f", val);
553 gtk_label_set_text(label, drc);
555 ghb_check_dependency(ud, widget, NULL);
556 asettings = get_selected_asettings(ud);
557 if (asettings != NULL)
559 ghb_widget_to_setting(asettings, widget);
560 ghb_audio_list_refresh_selected(ud);
566 ghb_clear_audio_list(signal_user_data_t *ud)
568 GtkTreeView *treeview;
572 g_debug("clear_audio_list ()");
573 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
574 if (audio_list == NULL)
576 audio_list = ghb_array_value_new(8);
577 ghb_settings_set_value(ud->settings, "audio_list", audio_list);
580 ghb_array_value_reset(audio_list, 8);
581 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
582 store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview));
583 gtk_list_store_clear (store);
587 add_to_audio_list(signal_user_data_t *ud, GValue *settings)
589 GtkTreeView *treeview;
592 GtkTreeSelection *selection;
593 const gchar *track, *codec, *br, *sr, *mix;
598 g_debug("add_to_audio_list ()");
599 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
600 selection = gtk_tree_view_get_selection (treeview);
601 store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview));
603 track = ghb_settings_combo_option(settings, "AudioTrack");
604 itrack = ghb_settings_combo_int(settings, "AudioTrack");
605 codec = ghb_settings_combo_option(settings, "AudioEncoderActual");
606 br = ghb_settings_combo_option(settings, "AudioBitrate");
607 sr = ghb_settings_combo_option(settings, "AudioSamplerate");
608 mix = ghb_settings_combo_option(settings, "AudioMixdown");
610 drc = ghb_settings_get_double(settings, "AudioTrackDRCSlider");
612 s_drc = g_strdup("Off");
614 s_drc = g_strdup_printf("%.1f", drc);
616 gtk_list_store_append(store, &iter);
617 gtk_list_store_set(store, &iter,
618 // These are displayed in list
626 gtk_tree_selection_select_iter(selection, &iter);
631 audio_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t *ud)
637 GtkTreePath *treepath;
640 GValue *asettings = NULL;
642 const GValue *audio_list;
643 g_debug("audio_list_selection_changed_cb ()");
644 if (gtk_tree_selection_get_selected(selection, &store, &iter))
646 //const gchar *actual_codec, *track, *codec, *bitrate, *sample_rate, *mix;
649 // Get the row number
650 treepath = gtk_tree_model_get_path (store, &iter);
651 indices = gtk_tree_path_get_indices (treepath);
653 gtk_tree_path_free(treepath);
654 // find audio settings
656 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
657 if (row >= ghb_array_len(audio_list))
659 asettings = ghb_array_get_nth(audio_list, row);
661 block_updates = TRUE;
662 ghb_ui_update(ud, "AudioTrack", ghb_settings_get_value(asettings, "AudioTrack"));
663 ghb_ui_update(ud, "AudioEncoder", ghb_settings_get_value(asettings, "AudioEncoder"));
664 ghb_settings_set_value(ud->settings, "AudioEncoderActual", ghb_settings_get_value(asettings, "AudioEncoderActual"));
665 ghb_check_dependency(ud, NULL, "AudioEncoderActual");
666 ghb_ui_update(ud, "AudioBitrate", ghb_settings_get_value(asettings, "AudioBitrate"));
667 ghb_ui_update(ud, "AudioSamplerate", ghb_settings_get_value(asettings, "AudioSamplerate"));
668 ghb_ui_update(ud, "AudioMixdown", ghb_settings_get_value(asettings, "AudioMixdown"));
669 ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_settings_get_value(asettings, "AudioTrackDRCSlider"));
670 block_updates = FALSE;
671 widget = GHB_WIDGET (ud->builder, "audio_remove");
672 gtk_widget_set_sensitive(widget, TRUE);
676 widget = GHB_WIDGET (ud->builder, "audio_remove");
677 gtk_widget_set_sensitive(widget, FALSE);
682 ghb_add_audio(signal_user_data_t *ud, GValue *settings)
688 track = ghb_settings_combo_option(settings, "AudioTrack");
689 ghb_settings_set_string(settings, "AudioTrackDescription", track);
691 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
692 if (audio_list == NULL)
694 audio_list = ghb_array_value_new(8);
695 ghb_settings_set_value(ud->settings, "audio_list", audio_list);
697 ghb_array_append(audio_list, settings);
698 add_to_audio_list(ud, settings);
699 count = ghb_array_len(audio_list);
702 GtkWidget * widget = GHB_WIDGET(ud->builder, "audio_add");
703 gtk_widget_set_sensitive(widget, FALSE);
705 ghb_update_destination_extension(ud);
709 audio_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
711 // Add the current audio settings to the list.
715 g_debug("audio_add_clicked_cb ()");
716 asettings = ghb_dict_value_new();
717 widget = GHB_WIDGET(ud->builder, "AudioTrack");
718 ghb_settings_take_value(asettings, "AudioTrack", ghb_widget_value(widget));
719 widget = GHB_WIDGET(ud->builder, "AudioEncoder");
720 ghb_settings_take_value(asettings, "AudioEncoder", ghb_widget_value(widget));
721 ghb_settings_set_value(asettings, "AudioEncoderActual",
722 ghb_settings_get_value(ud->settings, "AudioEncoderActual"));
723 widget = GHB_WIDGET(ud->builder, "AudioBitrate");
724 ghb_settings_take_value(asettings, "AudioBitrate", ghb_widget_value(widget));
725 widget = GHB_WIDGET(ud->builder, "AudioSamplerate");
726 ghb_settings_take_value(asettings, "AudioSamplerate", ghb_widget_value(widget));
727 widget = GHB_WIDGET(ud->builder, "AudioMixdown");
728 ghb_settings_take_value(asettings, "AudioMixdown", ghb_widget_value(widget));
729 widget = GHB_WIDGET(ud->builder, "AudioTrackDRCSlider");
730 ghb_settings_take_value(asettings, "AudioTrackDRCSlider", ghb_widget_value(widget));
732 ghb_add_audio(ud, asettings);
736 audio_remove_clicked_cb(GtkWidget *widget, signal_user_data_t *ud)
738 GtkTreeView *treeview;
739 GtkTreePath *treepath;
740 GtkTreeSelection *selection;
742 GtkTreeIter iter, nextIter;
747 g_debug("audio_remove_clicked_cb ()");
748 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
749 selection = gtk_tree_view_get_selection (treeview);
750 if (gtk_tree_selection_get_selected(selection, &store, &iter))
753 if (!gtk_tree_model_iter_next(store, &nextIter))
756 if (gtk_tree_model_get_iter_first(store, &nextIter))
758 gtk_tree_selection_select_iter (selection, &nextIter);
763 gtk_tree_selection_select_iter (selection, &nextIter);
765 // Get the row number
766 treepath = gtk_tree_model_get_path (store, &iter);
767 indices = gtk_tree_path_get_indices (treepath);
769 gtk_tree_path_free(treepath);
770 // Remove the selected item
771 gtk_list_store_remove (GTK_LIST_STORE(store), &iter);
772 // remove from audio settings list
774 widget = GHB_WIDGET (ud->builder, "audio_add");
775 gtk_widget_set_sensitive(widget, TRUE);
776 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
777 if (row >= ghb_array_len(audio_list))
779 GValue *old = ghb_array_get_nth(audio_list, row);
781 ghb_array_remove(audio_list, row);
786 ghb_set_audio(signal_user_data_t *ud, GValue *settings)
791 GValue *track, *audio, *acodec, *acodec_actual, *bitrate, *rate, *mix, *drc;
794 g_debug("set_audio");
795 // Clear the audio list
796 ghb_clear_audio_list(ud);
797 alist = ghb_settings_get_value(settings, "audio_list");
799 count = ghb_array_len(alist);
800 for (ii = 0; ii < count; ii++)
802 audio = ghb_array_get_nth(alist, ii);
803 track = ghb_settings_get_value(audio, "AudioTrack");
804 acodec = ghb_settings_get_value(audio, "AudioEncoder");
805 acodec_actual = ghb_settings_get_value(audio, "AudioEncoderActual");
806 bitrate = ghb_settings_get_value(audio, "AudioBitrate");
807 rate = ghb_settings_get_value(audio, "AudioSamplerate");
808 mix = ghb_settings_get_value(audio, "AudioMixdown");
809 drc = ghb_settings_get_value(audio, "AudioTrackDRCSlider");
810 acodec_code = ghb_lookup_combo_int("AudioEncoder", acodec);
812 if (acodec_code != 0)
814 GValue *settings = ghb_dict_value_new();
815 ghb_settings_set_value(settings, "AudioTrack", track);
816 ghb_settings_set_value(settings, "AudioEncoder", acodec);
817 ghb_settings_set_value(settings, "AudioEncoderActual", acodec_actual);
819 // This gets set autimatically if the codec is passthru
820 ghb_settings_set_value(settings, "AudioBitrate", bitrate);
821 ghb_settings_set_value(settings, "AudioSamplerate", rate);
822 ghb_settings_set_value(settings, "AudioMixdown", mix);
823 ghb_settings_set_value(settings, "AudioTrackDRCSlider", drc);
824 ghb_add_audio(ud, settings);
825 ghb_adjust_audio_rate_combos(ud);