OSDN Git Service

LinGui: fix a problem with parameters to a signal that caused segfaults
[handbrake-jp/handbrake-jp-git.git] / gtk / src / audiohandler.c
index 7967870..0e15b19 100644 (file)
@@ -63,6 +63,7 @@ ghb_adjust_audio_rate_combos(signal_user_data_t *ud)
                        ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(0));
                        ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(0));
                }
+               ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_double_value(0));
        }
        else if (acodec == HB_ACODEC_FAAC && mix != HB_AMIXDOWN_6CH)
        {
@@ -83,22 +84,27 @@ ghb_adjust_audio_rate_combos(signal_user_data_t *ud)
 }
 
 void
+free_audio_index_list(gpointer data)
+{
+       g_free(data);
+}
+
+void
 ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
 {
        gint acodec_code, mix_code, track;
        gchar *source_lang;
        GtkWidget *button;
        ghb_audio_info_t ainfo;
-       gint index;
-       GHashTable *track_indicies;
-       gint *iptr;
+       GHashTable *track_indices;
 
        const GValue *pref_audio;
        const GValue *audio, *acodec, *bitrate, *rate, *mix, *drc;
        gint count, ii, list_count;
        
        g_debug("set_pref_audio");
-       track_indicies = g_hash_table_new(g_int_hash, g_int_equal);
+       track_indices = g_hash_table_new_full(g_int_hash, g_int_equal, 
+                                                                                       NULL, free_audio_index_list);
        // Clear the audio list
        ghb_clear_audio_list(ud);
        // Find "best" audio based on audio preferences
@@ -119,16 +125,10 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
                drc = ghb_settings_get_value(audio, "AudioTrackDRCSlider");
                acodec_code = ghb_lookup_combo_int("AudioEncoder", acodec);
                // If there are multiple audios using the same codec, then
-               // select sequential tracks for each.  This hash keeps track 
-               // of the last used track for each codec.
-               iptr = g_hash_table_lookup(track_indicies, &acodec_code);
-               if (iptr == NULL)
-                       index = 0;
-               else
-                       index = *(gint*)iptr;
-
+               // select sequential tracks for each.  The hash keeps track 
+               // of the tracks used for each codec.
                track = ghb_find_audio_track(titleindex, source_lang, 
-                                                                       acodec_code, index);
+                                                                       acodec_code, track_indices);
                // Check to see if:
                // 1. pref codec is ac3
                // 2. source codec is not ac3
@@ -136,7 +136,8 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
                if (ghb_get_audio_info (&ainfo, titleindex, track) && 
                        ghb_audio_is_passthru (acodec_code))
                {
-                       if (ainfo.codec != acodec_code)
+                       // HB_ACODEC_* are bit fields.  Treat acodec_code as mask
+                       if (!(ainfo.codec & acodec_code))
                        {
                                acodec_code = ghb_get_default_acodec();
                                // If there's more audio to process, or we've already
@@ -147,6 +148,10 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
                                        acodec_code = 0;
                                }
                        }
+                       else
+                       {
+                               acodec_code &= ainfo.codec;
+                       }
                }
                if (titleindex >= 0 && track < 0)
                        acodec_code = 0;
@@ -168,12 +173,10 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
                                ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix_code));
                        }
                        ghb_ui_update(ud, "AudioTrackDRCSlider", drc);
-                       index++;
-                       g_hash_table_insert(track_indicies, &acodec_code, &index);
                }
        }
        g_free(source_lang);
-       g_hash_table_destroy(track_indicies);
+       g_hash_table_destroy(track_indices);
 }
 
 static GValue*
@@ -247,7 +250,6 @@ audio_list_refresh_selected(signal_user_data_t *ud)
                br = ghb_settings_combo_option(asettings, "AudioBitrate");
                sr = ghb_settings_combo_option(asettings, "AudioSamplerate");
                mix = ghb_settings_combo_option(asettings, "AudioMixdown");
-               drc = ghb_settings_get_string(asettings, "AudioTrackDRCSlider");
 
                s_track = ghb_settings_get_string(asettings, "AudioTrack");
                s_codec = ghb_settings_get_string(asettings, "AudioEncoder");
@@ -255,6 +257,10 @@ audio_list_refresh_selected(signal_user_data_t *ud)
                s_sr = ghb_settings_get_string(asettings, "AudioSamplerate");
                s_mix = ghb_settings_get_string(asettings, "AudioMixdown");
                s_drc = ghb_settings_get_double(asettings, "AudioTrackDRCSlider");
+               if (s_drc < 0.1)
+                       drc = g_strdup("Off");
+               else
+                       drc = g_strdup_printf("%.1f", s_drc);
 
                gtk_list_store_set(GTK_LIST_STORE(store), &iter, 
                        // These are displayed in list
@@ -263,8 +269,8 @@ audio_list_refresh_selected(signal_user_data_t *ud)
                        2, br,
                        3, sr,
                        4, mix,
-                       // These are used to set combo values when a list item is selected
                        5, drc,
+                       // These are used to set combo values when a list item is selected
                        6, s_track,
                        7, s_codec,
                        8, s_br,
@@ -281,7 +287,7 @@ audio_list_refresh_selected(signal_user_data_t *ud)
        }
 }
 
-void
+G_MODULE_EXPORT void
 audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 {
        static gint prev_acodec = 0;
@@ -337,7 +343,7 @@ audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        ghb_live_reset(ud);
 }
 
-void
+G_MODULE_EXPORT void
 audio_track_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 {
        GValue *asettings;
@@ -359,12 +365,12 @@ audio_track_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        ghb_live_reset(ud);
 }
 
-void
+G_MODULE_EXPORT void
 audio_mix_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 {
        GValue *asettings;
 
-       g_debug("audio_widget_changed_cb ()");
+       g_debug("audio_mix_changed_cb ()");
        ghb_adjust_audio_rate_combos(ud);
        ghb_check_dependency(ud, widget);
        asettings = get_selected_asettings(ud);
@@ -376,7 +382,7 @@ audio_mix_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        ghb_live_reset(ud);
 }
 
-void
+G_MODULE_EXPORT void
 audio_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 {
        GValue *asettings;
@@ -392,11 +398,43 @@ audio_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        ghb_live_reset(ud);
 }
 
+G_MODULE_EXPORT void
+drc_widget_changed_cb(GtkWidget *widget, gdouble val, signal_user_data_t *ud)
+{
+       GValue *asettings;
+       GtkLabel *label;
+       gchar *drc;
+
+       g_debug("drc_widget_changed_cb ()");
+       if (val > 0.8 && val < 1.0)
+               gtk_scale_button_set_value(GTK_SCALE_BUTTON(widget), 1.0);
+       if (val <= 0.8 && val > 0.5)
+               gtk_scale_button_set_value(GTK_SCALE_BUTTON(widget), 0.0);
+       else if (val > 0.0 && val <= 0.5)
+               gtk_scale_button_set_value(GTK_SCALE_BUTTON(widget), 1.0);
+
+       label = GTK_LABEL(GHB_WIDGET(ud->builder, "drc_label"));
+       if (val < 1.0)
+               drc = g_strdup_printf("Off");
+       else
+               drc = g_strdup_printf("%.1f", val);
+       gtk_label_set_text(label, drc);
+       g_free(drc);
+       ghb_check_dependency(ud, widget);
+       asettings = get_selected_asettings(ud);
+       if (asettings != NULL)
+       {
+               ghb_widget_to_setting(asettings, widget);
+               audio_list_refresh_selected(ud);
+       }
+       ghb_live_reset(ud);
+}
+
 // subtitles differ from other settings in that
 // the selection is updated automaitcally when the title
 // changes.  I don't want the preset selection changed as
 // would happen for regular settings.
-void
+G_MODULE_EXPORT void
 subtitle_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 {
        const gchar *name = gtk_widget_get_name(widget);
@@ -448,7 +486,6 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings)
        br = ghb_settings_combo_option(settings, "AudioBitrate");
        sr = ghb_settings_combo_option(settings, "AudioSamplerate");
        mix = ghb_settings_combo_option(settings, "AudioMixdown");
-       drc = ghb_settings_get_string(settings, "AudioTrackDRCSlider");
 
        s_track = ghb_settings_get_string(settings, "AudioTrack");
        s_codec = ghb_settings_get_string(settings, "AudioEncoder");
@@ -456,6 +493,10 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings)
        s_sr = ghb_settings_get_string(settings, "AudioSamplerate");
        s_mix = ghb_settings_get_string(settings, "AudioMixdown");
        s_drc = ghb_settings_get_double(settings, "AudioTrackDRCSlider");
+       if (s_drc < 0.1)
+               drc = g_strdup("Off");
+       else
+               drc = g_strdup_printf("%.1f", s_drc);
 
        gtk_list_store_append(store, &iter);
        gtk_list_store_set(store, &iter, 
@@ -465,8 +506,8 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings)
                2, br,
                3, sr,
                4, mix,
-               // These are used to set combo box values when a list item is selected
                5, drc,
+               // These are used to set combo box values when a list item is selected
                6, s_track,
                7, s_codec,
                8, s_br,
@@ -483,7 +524,7 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings)
        g_free(s_mix);
 }
 
-void
+G_MODULE_EXPORT void
 audio_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t *ud)
 {
        GtkTreeModel *store;
@@ -520,7 +561,7 @@ audio_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t
        }
 }
 
-void
+G_MODULE_EXPORT void
 audio_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
 {
        // Add the current audio settings to the list.
@@ -557,13 +598,13 @@ audio_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
        ghb_array_append(audio_list, asettings);
        add_to_audio_list(ud, asettings);
        count = ghb_array_len(audio_list);
-       if (count >= 8)
+       if (count >= 99)
        {
                gtk_widget_set_sensitive(xwidget, FALSE);
        }
 }
 
-void
+G_MODULE_EXPORT void
 audio_remove_clicked_cb(GtkWidget *widget, signal_user_data_t *ud)
 {
        GtkTreeView *treeview;