/* Crystality Plugin - A plugin for remastering mp3 sound in realtime * * Copyright (C) 2001 Rafal Bosak * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include "crystality.h" static const char about_text[] = "Crystality Plugin v0.92\n\ \n\ Bandwidth Extender, Harmonic Booster and 3D Echo\n\ You will need a good stereo and a good ear to notice quality\n\ improvement, otherwise this is not for you. This plugin tries\n\ to patch mp3 format flaws, not poor audio hardware!\n\ For more info see README file!\n\n\ Copyright (C) 2001 Rafal Bosak \n\ \n\ This program is free software; you can redistribute it and/or modify\n\ it under the terms of the GNU General Public License as published by\n\ the Free Software Foundation; either version 2 of the License, or\n\ (at your option) any later version.\n\ \n\ This program is distributed in the hope that it will be useful,\n\ but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\ GNU General Public License for more details.\n\ \n\ You should have received a copy of the GNU General Public License\n\ along with this program; if not, write to the Free Software\n\ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n\ "; GtkWidget *conf_dialog = NULL, *about_dialog = NULL; GtkObject *bext_adj; GtkObject *filter_adj; GtkObject *echo_adj; GtkObject *stereo_adj; GtkObject *feedback_adj; GtkObject *harmonics_adj; GtkWidget *enable_plugin_button; static void about_close_cb(GtkWidget *w, gpointer data) { gtk_widget_destroy(about_dialog); about_dialog = NULL; } void gui_about(void) { static GtkWidget *button, *label; if (about_dialog) return; about_dialog = gtk_dialog_new(); gtk_window_set_title(GTK_WINDOW(about_dialog), "About Crystality Plugin 0.92"); gtk_container_border_width(GTK_CONTAINER(about_dialog), 5); label = gtk_label_new(about_text); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(about_dialog)->vbox), label, TRUE, TRUE, 0); gtk_widget_show(label); button = gtk_button_new_with_label(" Close "); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(about_close_cb), NULL); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(about_dialog)->action_area), button, FALSE, FALSE, 0); gtk_widget_show(button); gtk_widget_show(about_dialog); gtk_widget_grab_focus(button); } // ******************************************************* static void conf_close_cb(GtkWidget *w, gpointer data) { gtk_widget_destroy(conf_dialog); conf_dialog = NULL; } static void conf_bext_chg_cb(GtkWidget *w, gpointer data) { bext_level = GTK_ADJUSTMENT(bext_adj)->value; bext_level_cb(); } static void conf_echo_chg_cb(GtkWidget *w, gpointer data) { echo_level = GTK_ADJUSTMENT(echo_adj)->value; echo_level_cb(); } static void conf_stereo_chg_cb(GtkWidget *w, gpointer data) { stereo_level = GTK_ADJUSTMENT(stereo_adj)->value; stereo_level_cb(); } static void conf_feedback_chg_cb(GtkWidget *w, gpointer data) { feedback_level = GTK_ADJUSTMENT(feedback_adj)->value; feedback_level_cb(); } static void conf_harmonics_chg_cb(GtkWidget *w, gpointer data) { harmonics_level = GTK_ADJUSTMENT(harmonics_adj)->value; harmonics_level_cb(); } static void conf_filter_chg_cb(GtkWidget *w, gpointer data) { filter_level = GTK_ADJUSTMENT(filter_adj)->value * 10; } static void conf_enable_plugin_cb(GtkWidget *w, gpointer data) { enable_plugin = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(enable_plugin_button)); enable_plugin_cb(); } static void conf_defaults_cb(GtkWidget *w, gpointer data) { set_defaults(); gtk_adjustment_set_value(GTK_ADJUSTMENT(bext_adj), bext_level); gtk_adjustment_set_value(GTK_ADJUSTMENT(echo_adj), echo_level); gtk_adjustment_set_value(GTK_ADJUSTMENT(stereo_adj), stereo_level); gtk_adjustment_set_value(GTK_ADJUSTMENT(filter_adj), (float)filter_level / 10); gtk_adjustment_set_value(GTK_ADJUSTMENT(feedback_adj), feedback_level); gtk_adjustment_set_value(GTK_ADJUSTMENT(harmonics_adj), harmonics_level); bext_level_cb(); echo_level_cb(); stereo_level_cb(); feedback_level_cb(); harmonics_level_cb(); } void gui_configure(void) { GtkWidget *button, *table, *label, *hscale; if (conf_dialog != NULL) return; bext_adj = gtk_adjustment_new(bext_level, 0.0, 100.0, 1, 10, 0); echo_adj = gtk_adjustment_new(echo_level, 0.0, 100.0, 1, 10, 0); stereo_adj = gtk_adjustment_new(stereo_level, 0.0, 100.0, 1, 10, 0); filter_adj = gtk_adjustment_new((float)filter_level / 10, 0.1, 0.3, 0.1, 0.1, 0); feedback_adj = gtk_adjustment_new(feedback_level, 0.0, 100.0, 1, 10, 0); harmonics_adj = gtk_adjustment_new(harmonics_level, 0.0, 100.0, 1, 10, 0); conf_dialog = gtk_dialog_new(); gtk_window_set_title(GTK_WINDOW(conf_dialog), "Configure Crystality"); gtk_signal_connect(GTK_OBJECT(conf_dialog), "destroy", GTK_SIGNAL_FUNC(conf_close_cb), NULL); table = gtk_table_new(2, 6, FALSE); gtk_container_set_border_width(GTK_CONTAINER(table), 1); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(conf_dialog)->vbox), table, TRUE, TRUE, 1); gtk_widget_show(table); label = gtk_label_new("Bandwidth extender: "); gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1); gtk_widget_show(label); hscale = gtk_hscale_new(GTK_ADJUSTMENT(bext_adj)); gtk_widget_set_usize(hscale, 310, 35); gtk_table_attach_defaults(GTK_TABLE(table), hscale, 1, 2, 0, 1); gtk_signal_connect(GTK_OBJECT(hscale), "motion_notify_event", GTK_SIGNAL_FUNC(conf_bext_chg_cb), NULL); gtk_widget_show(hscale); label = gtk_label_new("Extender's\n highpass filter: "); gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2); gtk_widget_show(label); hscale = gtk_hscale_new(GTK_ADJUSTMENT(filter_adj)); gtk_widget_set_usize(hscale, 310, 35); gtk_table_attach_defaults(GTK_TABLE(table), hscale, 1, 2, 1, 2); gtk_signal_connect(GTK_OBJECT(hscale), "motion_notify_event", GTK_SIGNAL_FUNC(conf_filter_chg_cb), NULL); gtk_widget_show(hscale); label = gtk_label_new("Harmonic booster: "); gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 2, 3); gtk_widget_show(label); hscale = gtk_hscale_new(GTK_ADJUSTMENT(harmonics_adj)); gtk_widget_set_usize(hscale, 310, 35); gtk_table_attach_defaults(GTK_TABLE(table), hscale, 1, 2, 2, 3); gtk_signal_connect(GTK_OBJECT(hscale), "motion_notify_event", GTK_SIGNAL_FUNC(conf_harmonics_chg_cb), NULL); gtk_widget_show(hscale); label = gtk_label_new("Echo volume: "); gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 3, 4); gtk_widget_show(label); hscale = gtk_hscale_new(GTK_ADJUSTMENT(echo_adj)); gtk_widget_set_usize(hscale, 310, 35); gtk_table_attach_defaults(GTK_TABLE(table), hscale, 1, 2, 3, 4); gtk_signal_connect(GTK_OBJECT(hscale), "motion_notify_event", GTK_SIGNAL_FUNC(conf_echo_chg_cb), NULL); gtk_widget_show(hscale); label = gtk_label_new("Echo feedback: "); gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 4, 5); gtk_widget_show(label); hscale = gtk_hscale_new(GTK_ADJUSTMENT(feedback_adj)); gtk_widget_set_usize(hscale, 310, 35); gtk_table_attach_defaults(GTK_TABLE(table), hscale, 1, 2, 4, 5); gtk_signal_connect(GTK_OBJECT(hscale), "motion_notify_event", GTK_SIGNAL_FUNC(conf_feedback_chg_cb), NULL); gtk_widget_show(hscale); label = gtk_label_new("Extra stereo: "); gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 5, 6); gtk_widget_show(label); hscale = gtk_hscale_new(GTK_ADJUSTMENT(stereo_adj)); gtk_widget_set_usize(hscale, 310, 25); gtk_table_attach_defaults(GTK_TABLE(table), hscale, 1, 2, 5, 6); gtk_signal_connect(GTK_OBJECT(hscale), "motion_notify_event", GTK_SIGNAL_FUNC(conf_stereo_chg_cb), NULL); gtk_widget_show(hscale); enable_plugin_button = gtk_check_button_new_with_label(" Enabled "); gtk_signal_connect(GTK_OBJECT(enable_plugin_button), "clicked", GTK_SIGNAL_FUNC(conf_enable_plugin_cb), NULL); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(conf_dialog)->action_area), enable_plugin_button, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(enable_plugin_button), 1); gtk_widget_show(enable_plugin_button); button = gtk_button_new_with_label(" Defaults "); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(conf_defaults_cb), NULL); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(conf_dialog)->action_area), button, FALSE, FALSE, 0); gtk_widget_show(button); button = gtk_button_new_with_label(" Close "); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(conf_close_cb), NULL); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(conf_dialog)->action_area), button, FALSE, FALSE, 0); gtk_widget_show(button); button = gtk_button_new_with_label(" About "); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(gui_about), NULL); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(conf_dialog)->action_area), button, FALSE, FALSE, 0); gtk_widget_show(button); gtk_widget_show(conf_dialog); }