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 if (block_updates) return;
408 gval = ghb_widget_value(widget);
409 acodec_code = ghb_lookup_combo_int("AudioEncoder", gval);
410 ghb_value_free(gval);
412 asettings = get_selected_asettings(ud);
413 if (ghb_audio_is_passthru (prev_acodec) &&
414 !ghb_audio_is_passthru (acodec_code))
416 // Transition from passthru to not, put some audio settings back to
420 gint br, sr, mix_code;
422 if (asettings != NULL)
424 br = ghb_settings_get_int(asettings, "AudioBitrate");
425 sr = ghb_settings_combo_int(asettings, "AudioSamplerate");
426 mix_code = ghb_settings_combo_int(asettings, "AudioMixdown");
435 titleindex = ghb_settings_combo_int(ud->settings, "title");
436 track = ghb_settings_combo_int(ud->settings, "AudioTrack");
439 sr = ghb_find_closest_audio_rate(sr);
441 ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(sr));
443 hb_audio_config_t *aconfig;
444 aconfig = ghb_get_scan_audio_info(titleindex, track);
447 sr = aconfig ? aconfig->in.samplerate : 48000;
449 mix_code = ghb_get_best_mix( aconfig, acodec_code, mix_code);
450 br = hb_get_best_audio_bitrate(acodec_code, br, sr, mix_code);
451 ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(br));
453 ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix_code));
455 ghb_adjust_audio_rate_combos(ud);
456 ghb_grey_combo_options (ud->builder);
457 ghb_check_dependency(ud, widget, NULL);
458 prev_acodec = acodec_code;
459 if (asettings != NULL)
461 ghb_widget_to_setting(asettings, widget);
462 ghb_settings_set_value(asettings, "AudioEncoderActual", ghb_settings_get_value(ud->settings, "AudioEncoderActual"));
463 ghb_audio_list_refresh_selected(ud);
465 ghb_update_destination_extension(ud);
470 audio_track_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
474 g_debug("audio_track_changed_cb ()");
475 if (block_updates) return;
477 ghb_adjust_audio_rate_combos(ud);
478 ghb_check_dependency(ud, widget, NULL);
479 ghb_grey_combo_options(ud->builder);
480 asettings = get_selected_asettings(ud);
481 if (asettings != NULL)
485 ghb_widget_to_setting(asettings, widget);
486 ghb_audio_list_refresh_selected(ud);
487 track = ghb_settings_combo_option(asettings, "AudioTrack");
488 ghb_settings_set_string(asettings, "AudioTrackDescription", track);
494 audio_mix_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
498 g_debug("audio_mix_changed_cb ()");
499 if (block_updates) return;
501 ghb_adjust_audio_rate_combos(ud);
502 ghb_check_dependency(ud, widget, NULL);
503 asettings = get_selected_asettings(ud);
504 if (asettings != NULL)
506 ghb_widget_to_setting(asettings, widget);
507 ghb_audio_list_refresh_selected(ud);
513 audio_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
517 g_debug("audio_widget_changed_cb ()");
518 if (block_updates) return;
520 ghb_adjust_audio_rate_combos(ud);
521 ghb_check_dependency(ud, widget, NULL);
522 asettings = get_selected_asettings(ud);
523 if (asettings != NULL)
525 ghb_widget_to_setting(asettings, widget);
526 ghb_audio_list_refresh_selected(ud);
532 drc_widget_changed_cb(GtkWidget *widget, gdouble val, signal_user_data_t *ud)
538 g_debug("drc_widget_changed_cb ()");
539 if (block_updates) return;
541 label = GTK_LABEL(GHB_WIDGET(ud->builder, "drc_label"));
543 drc = g_strdup_printf("Off");
545 drc = g_strdup_printf("%.1f", val);
546 gtk_label_set_text(label, drc);
548 ghb_check_dependency(ud, widget, NULL);
549 asettings = get_selected_asettings(ud);
550 if (asettings != NULL)
552 ghb_widget_to_setting(asettings, widget);
553 ghb_audio_list_refresh_selected(ud);
559 ghb_clear_audio_list(signal_user_data_t *ud)
561 GtkTreeView *treeview;
565 g_debug("clear_audio_list ()");
566 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
567 if (audio_list == NULL)
569 audio_list = ghb_array_value_new(8);
570 ghb_settings_set_value(ud->settings, "audio_list", audio_list);
573 ghb_array_value_reset(audio_list, 8);
574 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
575 store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview));
576 gtk_list_store_clear (store);
580 add_to_audio_list(signal_user_data_t *ud, GValue *settings)
582 GtkTreeView *treeview;
585 GtkTreeSelection *selection;
586 const gchar *track, *codec, *br, *sr, *mix;
591 g_debug("add_to_audio_list ()");
592 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
593 selection = gtk_tree_view_get_selection (treeview);
594 store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview));
596 track = ghb_settings_combo_option(settings, "AudioTrack");
597 itrack = ghb_settings_combo_int(settings, "AudioTrack");
598 codec = ghb_settings_combo_option(settings, "AudioEncoderActual");
599 br = ghb_settings_combo_option(settings, "AudioBitrate");
600 sr = ghb_settings_combo_option(settings, "AudioSamplerate");
601 mix = ghb_settings_combo_option(settings, "AudioMixdown");
603 drc = ghb_settings_get_double(settings, "AudioTrackDRCSlider");
605 s_drc = g_strdup("Off");
607 s_drc = g_strdup_printf("%.1f", drc);
609 gtk_list_store_append(store, &iter);
610 gtk_list_store_set(store, &iter,
611 // These are displayed in list
619 gtk_tree_selection_select_iter(selection, &iter);
624 audio_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t *ud)
630 GtkTreePath *treepath;
633 GValue *asettings = NULL;
635 const GValue *audio_list;
636 g_debug("audio_list_selection_changed_cb ()");
637 if (gtk_tree_selection_get_selected(selection, &store, &iter))
639 //const gchar *actual_codec, *track, *codec, *bitrate, *sample_rate, *mix;
642 // Get the row number
643 treepath = gtk_tree_model_get_path (store, &iter);
644 indices = gtk_tree_path_get_indices (treepath);
646 gtk_tree_path_free(treepath);
647 // find audio settings
649 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
650 if (row >= ghb_array_len(audio_list))
652 asettings = ghb_array_get_nth(audio_list, row);
654 block_updates = TRUE;
655 ghb_ui_update(ud, "AudioTrack", ghb_settings_get_value(asettings, "AudioTrack"));
656 ghb_ui_update(ud, "AudioEncoder", ghb_settings_get_value(asettings, "AudioEncoder"));
657 ghb_settings_set_value(ud->settings, "AudioEncoderActual", ghb_settings_get_value(asettings, "AudioEncoderActual"));
658 ghb_check_dependency(ud, NULL, "AudioEncoderActual");
659 ghb_ui_update(ud, "AudioBitrate", ghb_settings_get_value(asettings, "AudioBitrate"));
660 ghb_ui_update(ud, "AudioSamplerate", ghb_settings_get_value(asettings, "AudioSamplerate"));
661 ghb_ui_update(ud, "AudioMixdown", ghb_settings_get_value(asettings, "AudioMixdown"));
662 ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_settings_get_value(asettings, "AudioTrackDRCSlider"));
663 block_updates = FALSE;
664 widget = GHB_WIDGET (ud->builder, "audio_remove");
665 gtk_widget_set_sensitive(widget, TRUE);
669 widget = GHB_WIDGET (ud->builder, "audio_remove");
670 gtk_widget_set_sensitive(widget, FALSE);
675 ghb_add_audio(signal_user_data_t *ud, GValue *settings)
681 track = ghb_settings_combo_option(settings, "AudioTrack");
682 ghb_settings_set_string(settings, "AudioTrackDescription", track);
684 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
685 if (audio_list == NULL)
687 audio_list = ghb_array_value_new(8);
688 ghb_settings_set_value(ud->settings, "audio_list", audio_list);
690 ghb_array_append(audio_list, settings);
691 add_to_audio_list(ud, settings);
692 count = ghb_array_len(audio_list);
695 GtkWidget * widget = GHB_WIDGET(ud->builder, "audio_add");
696 gtk_widget_set_sensitive(widget, FALSE);
698 ghb_update_destination_extension(ud);
702 audio_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
704 // Add the current audio settings to the list.
708 g_debug("audio_add_clicked_cb ()");
709 asettings = ghb_dict_value_new();
710 widget = GHB_WIDGET(ud->builder, "AudioTrack");
711 ghb_settings_take_value(asettings, "AudioTrack", ghb_widget_value(widget));
712 widget = GHB_WIDGET(ud->builder, "AudioEncoder");
713 ghb_settings_take_value(asettings, "AudioEncoder", ghb_widget_value(widget));
714 ghb_settings_set_value(asettings, "AudioEncoderActual",
715 ghb_settings_get_value(ud->settings, "AudioEncoderActual"));
716 widget = GHB_WIDGET(ud->builder, "AudioBitrate");
717 ghb_settings_take_value(asettings, "AudioBitrate", ghb_widget_value(widget));
718 widget = GHB_WIDGET(ud->builder, "AudioSamplerate");
719 ghb_settings_take_value(asettings, "AudioSamplerate", ghb_widget_value(widget));
720 widget = GHB_WIDGET(ud->builder, "AudioMixdown");
721 ghb_settings_take_value(asettings, "AudioMixdown", ghb_widget_value(widget));
722 widget = GHB_WIDGET(ud->builder, "AudioTrackDRCSlider");
723 ghb_settings_take_value(asettings, "AudioTrackDRCSlider", ghb_widget_value(widget));
725 ghb_add_audio(ud, asettings);
729 audio_remove_clicked_cb(GtkWidget *widget, signal_user_data_t *ud)
731 GtkTreeView *treeview;
732 GtkTreePath *treepath;
733 GtkTreeSelection *selection;
735 GtkTreeIter iter, nextIter;
740 g_debug("audio_remove_clicked_cb ()");
741 treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "audio_list"));
742 selection = gtk_tree_view_get_selection (treeview);
743 if (gtk_tree_selection_get_selected(selection, &store, &iter))
746 if (!gtk_tree_model_iter_next(store, &nextIter))
749 if (gtk_tree_model_get_iter_first(store, &nextIter))
751 gtk_tree_selection_select_iter (selection, &nextIter);
756 gtk_tree_selection_select_iter (selection, &nextIter);
758 // Get the row number
759 treepath = gtk_tree_model_get_path (store, &iter);
760 indices = gtk_tree_path_get_indices (treepath);
762 gtk_tree_path_free(treepath);
763 // Remove the selected item
764 gtk_list_store_remove (GTK_LIST_STORE(store), &iter);
765 // remove from audio settings list
767 widget = GHB_WIDGET (ud->builder, "audio_add");
768 gtk_widget_set_sensitive(widget, TRUE);
769 audio_list = ghb_settings_get_value(ud->settings, "audio_list");
770 if (row >= ghb_array_len(audio_list))
772 GValue *old = ghb_array_get_nth(audio_list, row);
774 ghb_array_remove(audio_list, row);
779 ghb_set_audio(signal_user_data_t *ud, GValue *settings)
784 GValue *track, *audio, *acodec, *acodec_actual, *bitrate, *rate, *mix, *drc;
787 g_debug("set_audio");
788 // Clear the audio list
789 ghb_clear_audio_list(ud);
790 alist = ghb_settings_get_value(settings, "audio_list");
792 count = ghb_array_len(alist);
793 for (ii = 0; ii < count; ii++)
795 audio = ghb_array_get_nth(alist, ii);
796 track = ghb_settings_get_value(audio, "AudioTrack");
797 acodec = ghb_settings_get_value(audio, "AudioEncoder");
798 acodec_actual = ghb_settings_get_value(audio, "AudioEncoderActual");
799 bitrate = ghb_settings_get_value(audio, "AudioBitrate");
800 rate = ghb_settings_get_value(audio, "AudioSamplerate");
801 mix = ghb_settings_get_value(audio, "AudioMixdown");
802 drc = ghb_settings_get_value(audio, "AudioTrackDRCSlider");
803 acodec_code = ghb_lookup_combo_int("AudioEncoder", acodec);
805 if (acodec_code != 0)
807 GValue *settings = ghb_dict_value_new();
808 ghb_settings_set_value(settings, "AudioTrack", track);
809 ghb_settings_set_value(settings, "AudioEncoder", acodec);
810 ghb_settings_set_value(settings, "AudioEncoderActual", acodec_actual);
812 // This gets set autimatically if the codec is passthru
813 ghb_settings_set_value(settings, "AudioBitrate", bitrate);
814 ghb_settings_set_value(settings, "AudioSamplerate", rate);
815 ghb_settings_set_value(settings, "AudioMixdown", mix);
816 ghb_settings_set_value(settings, "AudioTrackDRCSlider", drc);
817 ghb_add_audio(ud, settings);
818 ghb_adjust_audio_rate_combos(ud);