+ return chapters;
+}
+
+gboolean
+ghb_ac3_in_audio_list(const GValue *audio_list)
+{
+ gint count, ii;
+
+ count = ghb_array_len(audio_list);
+ for (ii = 0; ii < count; ii++)
+ {
+ GValue *asettings;
+ gint acodec;
+
+ asettings = ghb_array_get_nth(audio_list, ii);
+ acodec = ghb_settings_combo_int(asettings, "AudioEncoder");
+ if (acodec == HB_ACODEC_AC3)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void
+audio_bitrate_opts_add(GtkBuilder *builder, const gchar *name, gint rate)
+{
+ GtkTreeIter iter;
+ GtkListStore *store;
+ gchar *str;
+
+ g_debug("audio_rate_opts_add ()\n");
+ store = get_combo_box_store(builder, name);
+ if (!find_combo_item_by_int(GTK_TREE_MODEL(store), rate, &iter))
+ {
+ str = g_strdup_printf ("%d", rate);
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter,
+ 0, str,
+ 1, TRUE,
+ 2, str,
+ 3, rate,
+ 4, str,
+ -1);
+ g_free(str);
+ }
+}
+
+static void
+audio_bitrate_opts_clean(GtkBuilder *builder, const gchar *name, gint last_rate)
+{
+ GtkTreeIter iter;
+ GtkListStore *store;
+ gint ivalue;
+ gboolean done = FALSE;
+ gint ii = 0;
+ guint last = (guint)last_rate;
+
+ g_debug("audio_bitrate_opts_clean ()\n");
+ store = get_combo_box_store(builder, name);
+ if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL(store), &iter))
+ {
+ do
+ {
+ gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 3, &ivalue, -1);
+ if (search_rates(
+ hb_audio_bitrates, ivalue, hb_audio_bitrates_count) < 0)
+ {
+ done = !gtk_list_store_remove(store, &iter);
+ }
+ else if (ivalue > last)
+ {
+ ii++;
+ gtk_list_store_set(store, &iter, 1, FALSE, -1);
+ done = !gtk_tree_model_iter_next (GTK_TREE_MODEL(store), &iter);
+ }
+ else
+ {
+ ii++;
+ gtk_list_store_set(store, &iter, 1, TRUE, -1);
+ done = !gtk_tree_model_iter_next (GTK_TREE_MODEL(store), &iter);
+ }
+ } while (!done);
+ }
+}
+
+static void
+audio_bitrate_opts_set(GtkBuilder *builder, const gchar *name)
+{
+ GtkTreeIter iter;
+ GtkListStore *store;
+ gint ii;
+
+ g_debug("audio_bitrate_opts_set ()\n");
+ store = get_combo_box_store(builder, name);
+ gtk_list_store_clear(store);
+ for (ii = 0; ii < hb_audio_bitrates_count; ii++)
+ {
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter,
+ 0, hb_audio_bitrates[ii].string,
+ 1, TRUE,
+ 2, hb_audio_bitrates[ii].string,
+ 3, hb_audio_bitrates[ii].rate,
+ 4, hb_audio_bitrates[ii].string,
+ -1);
+ }
+}
+
+void
+ghb_set_passthru_bitrate_opts(GtkBuilder *builder, gint bitrate)
+{
+ audio_bitrate_opts_add(builder, "AudioBitrate", bitrate);
+}
+
+void
+ghb_set_default_bitrate_opts(GtkBuilder *builder, gint last_rate)
+{
+ audio_bitrate_opts_clean(builder, "AudioBitrate", last_rate);
+}
+
+static ghb_status_t hb_status;
+
+void
+ghb_combo_init(GtkBuilder *builder)
+{
+ // Set up the list model for the combos
+ init_ui_combo_boxes(builder);
+ // Populate all the combos
+ ghb_update_ui_combo_box(builder, NULL, 0, TRUE);
+}
+
+void
+ghb_backend_init(gint debug)
+{
+ /* Init libhb */
+ h_scan = hb_init( debug, 0 );
+ h_queue = hb_init( debug, 0 );
+}
+
+void
+ghb_backend_close()
+{
+ hb_close(&h_queue);
+ hb_close(&h_scan);
+}
+
+void
+ghb_backend_scan(const gchar *path, gint titleindex, gint preview_count)
+{
+ hb_scan( h_scan, path, titleindex, preview_count, 1 );
+ hb_status.scan.state |= GHB_STATE_SCANNING;
+ // initialize count and cur to something that won't cause FPE
+ // when computing progress
+ hb_status.scan.title_count = 1;
+ hb_status.scan.title_cur = 0;
+}
+
+void
+ghb_backend_queue_scan(const gchar *path, gint titlenum)
+{
+ g_debug("ghb_backend_queue_scan()");
+ hb_scan( h_queue, path, titlenum, 10, 0 );
+ hb_status.queue.state |= GHB_STATE_SCANNING;
+}
+
+gint
+ghb_get_scan_state()
+{
+ return hb_status.scan.state;