# HG changeset patch # User chainsaw # Date 1176589430 25200 # Node ID 4709ce4e209eef2f1eebb00e43c9c62c5d606a3d # Parent d7a6fd179cd2d8171242788d519a4d544347abd8 [svn] Run indent -ts4 -nut -bli0 -cdw on this messy lot. Upstream is not consistent with whitespace anyway, no loss there. diff -r d7a6fd179cd2 -r 4709ce4e209e ChangeLog --- a/ChangeLog Sat Apr 14 08:48:41 2007 -0700 +++ b/ChangeLog Sat Apr 14 15:23:50 2007 -0700 @@ -1,3 +1,10 @@ +2007-04-14 15:48:41 +0000 Giacomo Lozito + revision [2048] + - changed directory for amidi-plug backends + trunk/configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + + 2007-04-13 16:27:41 +0000 Tony Vroon revision [2040] Now in sync with AdPlug upstream, merging their commit: "Removed superfluous exit() call. This was detected as part of a GCC 4.3 diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/adplug-xmms.cc --- a/src/adplug/adplug-xmms.cc Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/adplug-xmms.cc Sat Apr 14 15:23:50 2007 -0700 @@ -35,7 +35,8 @@ #include "audacious/util.h" #include "audacious/configdb.h" #include -extern "C" { +extern "C" +{ #include "audacious/output.h" } @@ -60,36 +61,42 @@ /***** Global variables *****/ -extern "C" InputPlugin adplug_ip; -static gboolean audio_error = FALSE; -GtkWidget *about_win = NULL; +extern "C" InputPlugin adplug_ip; +static gboolean audio_error = FALSE; +GtkWidget *about_win = NULL; // Configuration (and defaults) -static struct { - gint freq; - gboolean bit16, stereo, endless; - CPlayers players; -} cfg = { 44100l, true, false, false, CAdPlug::players }; +static struct +{ + gint freq; + gboolean bit16, stereo, endless; + CPlayers players; +} cfg = +{ +44100l, true, false, false, CAdPlug::players}; // Player variables -static struct { - CPlayer *p; - CAdPlugDatabase *db; - unsigned int subsong, songlength; - int seek; - char filename[PATH_MAX]; - char *songtitle; - float time_ms; - bool playing; - GThread *play_thread; - GtkLabel *infobox; - GtkDialog *infodlg; -} plr = { 0, 0, 0, 0, -1, "", NULL, 0.0f, false, 0, NULL, NULL }; +static struct +{ + CPlayer *p; + CAdPlugDatabase *db; + unsigned int subsong, songlength; + int seek; + char filename[PATH_MAX]; + char *songtitle; + float time_ms; + bool playing; + GThread *play_thread; + GtkLabel *infobox; + GtkDialog *infodlg; +} plr = +{ +0, 0, 0, 0, -1, "", NULL, 0.0f, false, 0, NULL, NULL}; static InputPlayback *playback; // XXX: this function is not in the public API yet. -extern "C" VFSFile *vfs_buffered_file_new_from_uri(gchar *uri); +extern "C" VFSFile * vfs_buffered_file_new_from_uri (gchar * uri); /***** Debugging *****/ @@ -97,629 +104,755 @@ #include -static void dbg_printf(const char *fmt, ...) +static void +dbg_printf (const char *fmt, ...) { va_list argptr; - va_start(argptr, fmt); - vfprintf(stderr, fmt, argptr); - va_end(argptr); + va_start (argptr, fmt); + vfprintf (stderr, fmt, argptr); + va_end (argptr); } #else -static void dbg_printf(const char *fmt, ...) -{ } +static void +dbg_printf (const char *fmt, ...) +{ +} #endif /***** [Dialog]: Utility functions *****/ -static GtkWidget *make_framed(GtkWidget *what, const gchar *label) +static GtkWidget * +make_framed (GtkWidget * what, const gchar * label) { - GtkWidget *framebox = gtk_frame_new(label); + GtkWidget *framebox = gtk_frame_new (label); - gtk_container_add(GTK_CONTAINER(framebox), what); + gtk_container_add (GTK_CONTAINER (framebox), what); return framebox; } -static GtkWidget *print_left(const gchar *text) +static GtkWidget * +print_left (const gchar * text) { - GtkLabel *label = GTK_LABEL(gtk_label_new(text)); + GtkLabel *label = GTK_LABEL (gtk_label_new (text)); - gtk_label_set_justify(label, GTK_JUSTIFY_LEFT); - gtk_misc_set_padding(GTK_MISC(label), 2, 2); - return GTK_WIDGET(label); + gtk_label_set_justify (label, GTK_JUSTIFY_LEFT); + gtk_misc_set_padding (GTK_MISC (label), 2, 2); + return GTK_WIDGET (label); } -static void MessageBox(const char *title, const char *text, const char *button) +static void +MessageBox (const char *title, const char *text, const char *button) { - char *tmptitle = (char *)malloc(strlen(title) + 1), - *tmptxt = (char *)malloc(strlen(text) + 1), - *tmpbutton = (char *)malloc(strlen(button) + 1); + char *tmptitle = (char *) malloc (strlen (title) + 1), + *tmptxt = (char *) malloc (strlen (text) + 1), + *tmpbutton = (char *) malloc (strlen (button) + 1); - strcpy(tmptitle, title); strcpy(tmptxt, text); strcpy(tmpbutton, button); + strcpy (tmptitle, title); + strcpy (tmptxt, text); + strcpy (tmpbutton, button); - GtkWidget *msgbox = xmms_show_message(tmptitle, tmptxt, tmpbutton, FALSE, - G_CALLBACK(gtk_widget_destroyed), &msgbox); + GtkWidget *msgbox = xmms_show_message (tmptitle, tmptxt, tmpbutton, FALSE, + G_CALLBACK (gtk_widget_destroyed), + &msgbox); - free(tmptitle); free(tmptxt); free(tmpbutton); + free (tmptitle); + free (tmptxt); + free (tmpbutton); } /***** Dialog boxes *****/ -static void adplug_about(void) +static void +adplug_about (void) { - if(!about_win) + if (!about_win) { - gchar * about_title = g_strjoin( "" , _("About ") , ADPLUG_NAME , NULL ); - const gchar * version_text = CAdPlug::get_version().c_str(); - gchar * about_text = g_strjoin( "" , ADPLUG_NAME , - _("\nCopyright (C) 2002, 2003 Simon Peter \n\n" - "This plugin is released under the terms and conditions of the GNU LGPL.\n" - "See http://www.gnu.org/licenses/lgpl.html for details." - "\n\nThis plugin uses the AdPlug library, which is copyright (C) Simon Peter, et al.\n" - "Linked AdPlug library version: ") , - version_text , NULL ); - about_win = xmms_show_message( about_title , about_text , _("Ok") , FALSE , NULL , NULL ); - g_signal_connect( G_OBJECT(about_win) , "destroy" , - G_CALLBACK(gtk_widget_destroyed), &about_win ); - g_free( about_text ); - g_free( about_title ); + gchar *about_title = g_strjoin ("", _("About "), ADPLUG_NAME, NULL); + const gchar *version_text = CAdPlug::get_version ().c_str (); + gchar *about_text = g_strjoin ("", ADPLUG_NAME, + _ + ("\nCopyright (C) 2002, 2003 Simon Peter \n\n" + "This plugin is released under the terms and conditions of the GNU LGPL.\n" + "See http://www.gnu.org/licenses/lgpl.html for details." + "\n\nThis plugin uses the AdPlug library, which is copyright (C) Simon Peter, et al.\n" + "Linked AdPlug library version: "), + version_text, NULL); + about_win = + xmms_show_message (about_title, about_text, _("Ok"), FALSE, NULL, NULL); + g_signal_connect (G_OBJECT (about_win), "destroy", + G_CALLBACK (gtk_widget_destroyed), &about_win); + g_free (about_text); + g_free (about_title); } - gtk_widget_show( about_win ); + gtk_widget_show (about_win); } -static void close_config_box_ok(GtkButton *button, GPtrArray *rblist) +static void +close_config_box_ok (GtkButton * button, GPtrArray * rblist) { // Apply configuration settings - cfg.bit16 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_ptr_array_index(rblist, 0))); - cfg.stereo = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_ptr_array_index(rblist, 1))); - - if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_ptr_array_index(rblist, 2)))) cfg.freq = 11025; - if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_ptr_array_index(rblist, 3)))) cfg.freq = 22050; - if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_ptr_array_index(rblist, 4)))) cfg.freq = 44100; - if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_ptr_array_index(rblist, 5)))) cfg.freq = 48000; - - cfg.endless = !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_ptr_array_index(rblist, 6))); + cfg.bit16 = + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON + (g_ptr_array_index (rblist, 0))); + cfg.stereo = + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON + (g_ptr_array_index (rblist, 1))); - cfg.players = *(CPlayers *)g_ptr_array_index(rblist, 7); - delete (CPlayers *)g_ptr_array_index(rblist, 7); + if (gtk_toggle_button_get_active + (GTK_TOGGLE_BUTTON (g_ptr_array_index (rblist, 2)))) + cfg.freq = 11025; + if (gtk_toggle_button_get_active + (GTK_TOGGLE_BUTTON (g_ptr_array_index (rblist, 3)))) + cfg.freq = 22050; + if (gtk_toggle_button_get_active + (GTK_TOGGLE_BUTTON (g_ptr_array_index (rblist, 4)))) + cfg.freq = 44100; + if (gtk_toggle_button_get_active + (GTK_TOGGLE_BUTTON (g_ptr_array_index (rblist, 5)))) + cfg.freq = 48000; - g_ptr_array_free(rblist, FALSE); -} + cfg.endless = + !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON + (g_ptr_array_index (rblist, 6))); -static void close_config_box_cancel(GtkButton *button, GPtrArray *rblist) -{ - delete (CPlayers *)g_ptr_array_index(rblist, 7); - g_ptr_array_free(rblist, FALSE); + cfg.players = *(CPlayers *) g_ptr_array_index (rblist, 7); + delete (CPlayers *) g_ptr_array_index (rblist, 7); + + g_ptr_array_free (rblist, FALSE); } -static void config_fl_row_select(GtkCList *fl, gint row, gint col, - GdkEventButton *event, CPlayers *pl) +static void +close_config_box_cancel (GtkButton * button, GPtrArray * rblist) { - pl->push_back((CPlayerDesc *)gtk_clist_get_row_data(fl, row)); - pl->unique(); + delete (CPlayers *) g_ptr_array_index (rblist, 7); + g_ptr_array_free (rblist, FALSE); } -static void config_fl_row_unselect(GtkCList *fl, gint row, gint col, - GdkEventButton *event, CPlayers *pl) +static void +config_fl_row_select (GtkCList * fl, gint row, gint col, + GdkEventButton * event, CPlayers * pl) { - pl->remove((CPlayerDesc *)gtk_clist_get_row_data(fl, row)); + pl->push_back ((CPlayerDesc *) gtk_clist_get_row_data (fl, row)); + pl->unique (); } -static void adplug_config(void) +static void +config_fl_row_unselect (GtkCList * fl, gint row, gint col, + GdkEventButton * event, CPlayers * pl) { - GtkDialog *config_dlg = GTK_DIALOG(gtk_dialog_new()); - GtkNotebook *notebook = GTK_NOTEBOOK(gtk_notebook_new()); + pl->remove ((CPlayerDesc *) gtk_clist_get_row_data (fl, row)); +} + +static void +adplug_config (void) +{ + GtkDialog *config_dlg = GTK_DIALOG (gtk_dialog_new ()); + GtkNotebook *notebook = GTK_NOTEBOOK (gtk_notebook_new ()); GtkTable *table; - GtkTooltips *tooltips = gtk_tooltips_new(); - GPtrArray *rblist = g_ptr_array_new(); + GtkTooltips *tooltips = gtk_tooltips_new (); + GPtrArray *rblist = g_ptr_array_new (); - gtk_window_set_title(GTK_WINDOW(config_dlg), "AdPlug :: Configuration"); - gtk_window_set_policy(GTK_WINDOW(config_dlg), FALSE, FALSE, TRUE); // Window is auto sized - gtk_window_set_modal(GTK_WINDOW(config_dlg), TRUE); - gtk_container_add(GTK_CONTAINER(config_dlg->vbox), GTK_WIDGET(notebook)); + gtk_window_set_title (GTK_WINDOW (config_dlg), "AdPlug :: Configuration"); + gtk_window_set_policy (GTK_WINDOW (config_dlg), FALSE, FALSE, TRUE); // Window is auto sized + gtk_window_set_modal (GTK_WINDOW (config_dlg), TRUE); + gtk_container_add (GTK_CONTAINER (config_dlg->vbox), GTK_WIDGET (notebook)); // Add Ok & Cancel buttons { GtkWidget *button; - button = gtk_button_new_with_label("Ok"); - g_signal_connect(G_OBJECT(button), "clicked", - G_CALLBACK(close_config_box_ok), - (gpointer)rblist); - g_signal_connect_data(G_OBJECT(button), "clicked", - G_CALLBACK(gtk_widget_destroy), - GTK_OBJECT(config_dlg),NULL,(GConnectFlags) (G_CONNECT_AFTER|G_CONNECT_SWAPPED)); - gtk_container_add(GTK_CONTAINER(config_dlg->action_area), button); + button = gtk_button_new_with_label ("Ok"); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (close_config_box_ok), (gpointer) rblist); + g_signal_connect_data (G_OBJECT (button), "clicked", + G_CALLBACK (gtk_widget_destroy), + GTK_OBJECT (config_dlg), NULL, + (GConnectFlags) (G_CONNECT_AFTER | + G_CONNECT_SWAPPED)); + gtk_container_add (GTK_CONTAINER (config_dlg->action_area), button); - button = gtk_button_new_with_label("Cancel"); - g_signal_connect(G_OBJECT(button), "clicked", - G_CALLBACK(close_config_box_cancel), - (gpointer)rblist); - g_signal_connect_swapped(G_OBJECT(button), "clicked", - G_CALLBACK(gtk_widget_destroy), - GTK_OBJECT(config_dlg)); - gtk_container_add(GTK_CONTAINER(config_dlg->action_area), button); + button = gtk_button_new_with_label ("Cancel"); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (close_config_box_cancel), + (gpointer) rblist); + g_signal_connect_swapped (G_OBJECT (button), "clicked", + G_CALLBACK (gtk_widget_destroy), + GTK_OBJECT (config_dlg)); + gtk_container_add (GTK_CONTAINER (config_dlg->action_area), button); } /***** Page 1: General *****/ - table = GTK_TABLE(gtk_table_new(1, 2, TRUE)); - gtk_table_set_row_spacings(table, 5); gtk_table_set_col_spacings(table, 5); - gtk_notebook_append_page(notebook, GTK_WIDGET(table), print_left("General")); + table = GTK_TABLE (gtk_table_new (1, 2, TRUE)); + gtk_table_set_row_spacings (table, 5); + gtk_table_set_col_spacings (table, 5); + gtk_notebook_append_page (notebook, GTK_WIDGET (table), + print_left ("General")); // Add "Sound quality" section { - GtkTable *sqt = GTK_TABLE(gtk_table_new(2, 2, FALSE)); + GtkTable *sqt = GTK_TABLE (gtk_table_new (2, 2, FALSE)); GtkVBox *fvb; GtkRadioButton *rb; - gtk_table_set_row_spacings(sqt, 5); - gtk_table_set_col_spacings(sqt, 5); - gtk_table_attach_defaults(table, make_framed(GTK_WIDGET(sqt), "Sound quality"), - 0, 1, 0, 1); + gtk_table_set_row_spacings (sqt, 5); + gtk_table_set_col_spacings (sqt, 5); + gtk_table_attach_defaults (table, + make_framed (GTK_WIDGET (sqt), + "Sound quality"), 0, 1, 0, 1); // Add "Resolution" section - fvb = GTK_VBOX(gtk_vbox_new(TRUE, 0)); - gtk_table_attach_defaults(sqt, make_framed(GTK_WIDGET(fvb), "Resolution"), - 0, 1, 0, 1); - rb = GTK_RADIO_BUTTON(gtk_radio_button_new_with_label(NULL, "8bit")); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rb), !cfg.bit16); - gtk_container_add(GTK_CONTAINER(fvb), GTK_WIDGET(rb)); - rb = GTK_RADIO_BUTTON(gtk_radio_button_new_with_label_from_widget(rb, "16bit")); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rb), cfg.bit16); - gtk_container_add(GTK_CONTAINER(fvb), GTK_WIDGET(rb)); - g_ptr_array_add(rblist, (gpointer)rb); + fvb = GTK_VBOX (gtk_vbox_new (TRUE, 0)); + gtk_table_attach_defaults (sqt, + make_framed (GTK_WIDGET (fvb), "Resolution"), + 0, 1, 0, 1); + rb = GTK_RADIO_BUTTON (gtk_radio_button_new_with_label (NULL, "8bit")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rb), !cfg.bit16); + gtk_container_add (GTK_CONTAINER (fvb), GTK_WIDGET (rb)); + rb = + GTK_RADIO_BUTTON (gtk_radio_button_new_with_label_from_widget + (rb, "16bit")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rb), cfg.bit16); + gtk_container_add (GTK_CONTAINER (fvb), GTK_WIDGET (rb)); + g_ptr_array_add (rblist, (gpointer) rb); // Add "Channels" section - fvb = GTK_VBOX(gtk_vbox_new(TRUE, 0)); - gtk_table_attach_defaults(sqt, make_framed(GTK_WIDGET(fvb), "Channels"), - 0, 1, 1, 2); - rb = GTK_RADIO_BUTTON(gtk_radio_button_new_with_label(NULL, "Mono")); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rb), !cfg.stereo); - gtk_container_add(GTK_CONTAINER(fvb), GTK_WIDGET(rb)); - rb = GTK_RADIO_BUTTON(gtk_radio_button_new_with_label_from_widget(rb, "Stereo")); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rb), cfg.stereo); - gtk_container_add(GTK_CONTAINER(fvb), GTK_WIDGET(rb)); - gtk_tooltips_set_tip(tooltips, GTK_WIDGET(rb), - "Setting stereo is not recommended, unless you need to. " - "This won't add any stereo effects to the sound - OPL2 " - "is just mono - but eats up more CPU power!", NULL); - g_ptr_array_add(rblist, (gpointer)rb); + fvb = GTK_VBOX (gtk_vbox_new (TRUE, 0)); + gtk_table_attach_defaults (sqt, + make_framed (GTK_WIDGET (fvb), "Channels"), 0, + 1, 1, 2); + rb = GTK_RADIO_BUTTON (gtk_radio_button_new_with_label (NULL, "Mono")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rb), !cfg.stereo); + gtk_container_add (GTK_CONTAINER (fvb), GTK_WIDGET (rb)); + rb = + GTK_RADIO_BUTTON (gtk_radio_button_new_with_label_from_widget + (rb, "Stereo")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rb), cfg.stereo); + gtk_container_add (GTK_CONTAINER (fvb), GTK_WIDGET (rb)); + gtk_tooltips_set_tip (tooltips, GTK_WIDGET (rb), + "Setting stereo is not recommended, unless you need to. " + "This won't add any stereo effects to the sound - OPL2 " + "is just mono - but eats up more CPU power!", NULL); + g_ptr_array_add (rblist, (gpointer) rb); // Add "Frequency" section - fvb = GTK_VBOX(gtk_vbox_new(TRUE, 0)); - gtk_table_attach_defaults(sqt, make_framed(GTK_WIDGET(fvb), "Frequency"), - 1, 2, 0, 2); - rb = GTK_RADIO_BUTTON(gtk_radio_button_new_with_label(NULL, "11025")); - if(cfg.freq == 11025) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rb), TRUE); - gtk_container_add(GTK_CONTAINER(fvb), GTK_WIDGET(rb)); - g_ptr_array_add(rblist, (gpointer)rb); - rb = GTK_RADIO_BUTTON(gtk_radio_button_new_with_label_from_widget(rb, "22050")); - if(cfg.freq == 22050) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rb), TRUE); - gtk_container_add(GTK_CONTAINER(fvb), GTK_WIDGET(rb)); - g_ptr_array_add(rblist, (gpointer)rb); - rb = GTK_RADIO_BUTTON(gtk_radio_button_new_with_label_from_widget(rb, "44100")); - if(cfg.freq == 44100) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rb), TRUE); - gtk_container_add(GTK_CONTAINER(fvb), GTK_WIDGET(rb)); - g_ptr_array_add(rblist, (gpointer)rb); - rb = GTK_RADIO_BUTTON(gtk_radio_button_new_with_label_from_widget(rb, "48000")); - if(cfg.freq == 48000) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rb), TRUE); - gtk_container_add(GTK_CONTAINER(fvb), GTK_WIDGET(rb)); - g_ptr_array_add(rblist, (gpointer)rb); + fvb = GTK_VBOX (gtk_vbox_new (TRUE, 0)); + gtk_table_attach_defaults (sqt, + make_framed (GTK_WIDGET (fvb), "Frequency"), 1, + 2, 0, 2); + rb = GTK_RADIO_BUTTON (gtk_radio_button_new_with_label (NULL, "11025")); + if (cfg.freq == 11025) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rb), TRUE); + gtk_container_add (GTK_CONTAINER (fvb), GTK_WIDGET (rb)); + g_ptr_array_add (rblist, (gpointer) rb); + rb = + GTK_RADIO_BUTTON (gtk_radio_button_new_with_label_from_widget + (rb, "22050")); + if (cfg.freq == 22050) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rb), TRUE); + gtk_container_add (GTK_CONTAINER (fvb), GTK_WIDGET (rb)); + g_ptr_array_add (rblist, (gpointer) rb); + rb = + GTK_RADIO_BUTTON (gtk_radio_button_new_with_label_from_widget + (rb, "44100")); + if (cfg.freq == 44100) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rb), TRUE); + gtk_container_add (GTK_CONTAINER (fvb), GTK_WIDGET (rb)); + g_ptr_array_add (rblist, (gpointer) rb); + rb = + GTK_RADIO_BUTTON (gtk_radio_button_new_with_label_from_widget + (rb, "48000")); + if (cfg.freq == 48000) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rb), TRUE); + gtk_container_add (GTK_CONTAINER (fvb), GTK_WIDGET (rb)); + g_ptr_array_add (rblist, (gpointer) rb); } // Add "Playback" section { - GtkVBox *vb = GTK_VBOX(gtk_vbox_new(FALSE, 0)); + GtkVBox *vb = GTK_VBOX (gtk_vbox_new (FALSE, 0)); GtkCheckButton *cb; - gtk_table_attach_defaults(table, make_framed(GTK_WIDGET(vb), "Playback"), - 1, 2, 0, 1); + gtk_table_attach_defaults (table, + make_framed (GTK_WIDGET (vb), "Playback"), 1, + 2, 0, 1); - cb = GTK_CHECK_BUTTON(gtk_check_button_new_with_label("Detect songend")); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb), !cfg.endless); - gtk_container_add(GTK_CONTAINER(vb), GTK_WIDGET(cb)); - gtk_tooltips_set_tip(tooltips, GTK_WIDGET(cb), - "If enabled, XMMS will detect a song's ending, stop " - "it and advance in the playlist. If disabled, XMMS " - "won't take notice of a song's ending and loop it all " - "over again and again.", NULL); - g_ptr_array_add(rblist, (gpointer)cb); + cb = + GTK_CHECK_BUTTON (gtk_check_button_new_with_label ("Detect songend")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb), !cfg.endless); + gtk_container_add (GTK_CONTAINER (vb), GTK_WIDGET (cb)); + gtk_tooltips_set_tip (tooltips, GTK_WIDGET (cb), + "If enabled, XMMS will detect a song's ending, stop " + "it and advance in the playlist. If disabled, XMMS " + "won't take notice of a song's ending and loop it all " + "over again and again.", NULL); + g_ptr_array_add (rblist, (gpointer) cb); } /***** Page 2: Formats *****/ - table = GTK_TABLE(gtk_table_new(1, 1, TRUE)); - gtk_notebook_append_page(notebook, GTK_WIDGET(table), print_left("Formats")); + table = GTK_TABLE (gtk_table_new (1, 1, TRUE)); + gtk_notebook_append_page (notebook, GTK_WIDGET (table), + print_left ("Formats")); // Add "Format selection" section { - GtkHBox *vb = GTK_HBOX(gtk_hbox_new(FALSE, 0)); - gtk_table_attach_defaults(table, make_framed(GTK_WIDGET(vb), "Format selection"), - 0, 1, 0, 1); + GtkHBox *vb = GTK_HBOX (gtk_hbox_new (FALSE, 0)); + gtk_table_attach_defaults (table, + make_framed (GTK_WIDGET (vb), + "Format selection"), 0, 1, 0, 1); // Add scrollable list { - gchar *rowstr[] = {"Format", "Extension"}; - GtkEventBox *eventbox = GTK_EVENT_BOX(gtk_event_box_new()); - GtkScrolledWindow *formatswnd = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL, NULL)); - GtkCList *fl = GTK_CLIST(gtk_clist_new_with_titles(2, rowstr)); + gchar *rowstr[] = { "Format", "Extension" }; + GtkEventBox *eventbox = GTK_EVENT_BOX (gtk_event_box_new ()); + GtkScrolledWindow *formatswnd = + GTK_SCROLLED_WINDOW (gtk_scrolled_window_new (NULL, NULL)); + GtkCList *fl = GTK_CLIST (gtk_clist_new_with_titles (2, rowstr)); CPlayers::const_iterator i; unsigned int j; - gtk_clist_set_selection_mode(fl, GTK_SELECTION_MULTIPLE); + gtk_clist_set_selection_mode (fl, GTK_SELECTION_MULTIPLE); // Build list - for(i = CAdPlug::players.begin(); i != CAdPlug::players.end(); i++) { - gint rownum; + for (i = CAdPlug::players.begin (); i != CAdPlug::players.end (); i++) + { + gint rownum; - gchar *rws[2]; - rws[0] = g_strdup((*i)->filetype.c_str()); - rws[1] = g_strdup((*i)->get_extension(0)); - for(j = 1; (*i)->get_extension(j); j++) - rws[1] = g_strjoin(", ", rws[1], (*i)->get_extension(j), NULL); - rownum = gtk_clist_append(fl, rws); - g_free(rws[0]); g_free(rws[1]); - gtk_clist_set_row_data(fl, rownum, (gpointer)(*i)); - if(find(cfg.players.begin(), cfg.players.end(), *i) != cfg.players.end()) - gtk_clist_select_row(fl, rownum, 0); + gchar *rws[2]; + rws[0] = g_strdup ((*i)->filetype.c_str ()); + rws[1] = g_strdup ((*i)->get_extension (0)); + for (j = 1; (*i)->get_extension (j); j++) + rws[1] = g_strjoin (", ", rws[1], (*i)->get_extension (j), NULL); + rownum = gtk_clist_append (fl, rws); + g_free (rws[0]); + g_free (rws[1]); + gtk_clist_set_row_data (fl, rownum, (gpointer) (*i)); + if (find (cfg.players.begin (), cfg.players.end (), *i) != + cfg.players.end ()) + gtk_clist_select_row (fl, rownum, 0); } - gtk_clist_columns_autosize(fl); - gtk_scrolled_window_set_policy(formatswnd, GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gpointer pl = (gpointer)new CPlayers(cfg.players); - g_signal_connect(G_OBJECT(fl), "select-row", - G_CALLBACK(config_fl_row_select), pl); - g_signal_connect(G_OBJECT(fl), "unselect-row", - G_CALLBACK(config_fl_row_unselect), pl); - gtk_container_add(GTK_CONTAINER(formatswnd), GTK_WIDGET(fl)); - gtk_container_add(GTK_CONTAINER(eventbox), GTK_WIDGET(formatswnd)); - gtk_container_add(GTK_CONTAINER(vb), GTK_WIDGET(eventbox)); - gtk_tooltips_set_tip(tooltips, GTK_WIDGET(eventbox), - "Selected file types will be recognized and played " - "back by this plugin. Deselected types will be " - "ignored to make room for other plugins to play " - "these files.", NULL); - g_ptr_array_add(rblist, pl); + gtk_clist_columns_autosize (fl); + gtk_scrolled_window_set_policy (formatswnd, GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gpointer pl = (gpointer) new CPlayers (cfg.players); + g_signal_connect (G_OBJECT (fl), "select-row", + G_CALLBACK (config_fl_row_select), pl); + g_signal_connect (G_OBJECT (fl), "unselect-row", + G_CALLBACK (config_fl_row_unselect), pl); + gtk_container_add (GTK_CONTAINER (formatswnd), GTK_WIDGET (fl)); + gtk_container_add (GTK_CONTAINER (eventbox), GTK_WIDGET (formatswnd)); + gtk_container_add (GTK_CONTAINER (vb), GTK_WIDGET (eventbox)); + gtk_tooltips_set_tip (tooltips, GTK_WIDGET (eventbox), + "Selected file types will be recognized and played " + "back by this plugin. Deselected types will be " + "ignored to make room for other plugins to play " + "these files.", NULL); + g_ptr_array_add (rblist, pl); } } // Show window - gtk_widget_show_all(GTK_WIDGET(config_dlg)); + gtk_widget_show_all (GTK_WIDGET (config_dlg)); } -static void add_instlist(GtkCList *instlist, const char *t1, const char *t2) +static void +add_instlist (GtkCList * instlist, const char *t1, const char *t2) { gchar *rowstr[2]; - rowstr[0] = g_strdup(t1); rowstr[1] = g_strdup(t2); - gtk_clist_append(instlist, rowstr); - g_free(rowstr[0]); g_free(rowstr[1]); + rowstr[0] = g_strdup (t1); + rowstr[1] = g_strdup (t2); + gtk_clist_append (instlist, rowstr); + g_free (rowstr[0]); + g_free (rowstr[1]); } -static CPlayer *factory(VFSFile *fd, Copl *newopl) +static CPlayer * +factory (VFSFile * fd, Copl * newopl) { - CPlayers::const_iterator i; + CPlayers::const_iterator i; - dbg_printf("factory(%p<%s>,opl): ", fd, fd->uri != NULL ? fd->uri : "unknown"); - return CAdPlug::factory(fd, newopl, cfg.players); + dbg_printf ("factory(%p<%s>,opl): ", fd, + fd->uri != NULL ? fd->uri : "unknown"); + return CAdPlug::factory (fd, newopl, cfg.players); } -static void adplug_stop(InputPlayback *data); -static void adplug_play(InputPlayback *data); +static void adplug_stop (InputPlayback * data); +static void adplug_play (InputPlayback * data); -static void subsong_slider(GtkAdjustment *adj) +static void +subsong_slider (GtkAdjustment * adj) { - adplug_stop(NULL); - plr.subsong = (unsigned int)adj->value - 1; - adplug_play(playback); + adplug_stop (NULL); + plr.subsong = (unsigned int) adj->value - 1; + adplug_play (playback); } -static void close_infobox(GtkDialog *infodlg) +static void +close_infobox (GtkDialog * infodlg) { // Forget our references to the instance of the "currently playing song" info // box. But only if we're really destroying that one... ;) - if(infodlg == plr.infodlg) { + if (infodlg == plr.infodlg) + { plr.infobox = NULL; plr.infodlg = NULL; } } -static void adplug_info_box(char *filename) +static void +adplug_info_box (char *filename) { CSilentopl tmpopl; - VFSFile *fd = vfs_buffered_file_new_from_uri(filename); + VFSFile *fd = vfs_buffered_file_new_from_uri (filename); - if (!fd) return; + if (!fd) + return; - CPlayer *p = (strcmp(filename, plr.filename) || !plr.p) ? - factory(fd, &tmpopl) : plr.p; + CPlayer *p = (strcmp (filename, plr.filename) || !plr.p) ? + factory (fd, &tmpopl) : plr.p; - if(!p) return; // bail out if no player could be created - if(p == plr.p && plr.infodlg) return; // only one info box for active song + if (!p) + return; // bail out if no player could be created + if (p == plr.p && plr.infodlg) + return; // only one info box for active song std::ostringstream infotext; unsigned int i; - GtkDialog *infobox = GTK_DIALOG(gtk_dialog_new()); - GtkButton *okay_button = GTK_BUTTON(gtk_button_new_with_label("Ok")); + GtkDialog *infobox = GTK_DIALOG (gtk_dialog_new ()); + GtkButton *okay_button = GTK_BUTTON (gtk_button_new_with_label ("Ok")); - GtkVBox *box = GTK_VBOX(gtk_vbox_new(TRUE,2)); - GtkHBox *hbox = GTK_HBOX(gtk_hbox_new(TRUE, 2)); - GtkHBox *hbox2 = GTK_HBOX(gtk_hbox_new(TRUE, 2)); + GtkVBox *box = GTK_VBOX (gtk_vbox_new (TRUE, 2)); + GtkHBox *hbox = GTK_HBOX (gtk_hbox_new (TRUE, 2)); + GtkHBox *hbox2 = GTK_HBOX (gtk_hbox_new (TRUE, 2)); // Build file info box - gtk_window_set_title(GTK_WINDOW(infobox), "AdPlug :: File Info"); - gtk_window_set_policy(GTK_WINDOW(infobox), FALSE, FALSE, TRUE); // Window is auto sized + gtk_window_set_title (GTK_WINDOW (infobox), "AdPlug :: File Info"); + gtk_window_set_policy (GTK_WINDOW (infobox), FALSE, FALSE, TRUE); // Window is auto sized - gtk_container_add(GTK_CONTAINER(infobox->vbox), GTK_WIDGET(box)); + gtk_container_add (GTK_CONTAINER (infobox->vbox), GTK_WIDGET (box)); // Former packer layout, for future reproduction // gtk_packer_set_default_border_width(packer, 2); - gtk_box_set_homogeneous(GTK_BOX(hbox), FALSE); - g_signal_connect_swapped(G_OBJECT(okay_button), "clicked", - G_CALLBACK(gtk_widget_destroy), - GTK_OBJECT(infobox)); - g_signal_connect(G_OBJECT(infobox), "destroy", - G_CALLBACK(close_infobox), 0); - gtk_container_add(GTK_CONTAINER(infobox->action_area), GTK_WIDGET(okay_button)); + gtk_box_set_homogeneous (GTK_BOX (hbox), FALSE); + g_signal_connect_swapped (G_OBJECT (okay_button), "clicked", + G_CALLBACK (gtk_widget_destroy), + GTK_OBJECT (infobox)); + g_signal_connect (G_OBJECT (infobox), "destroy", + G_CALLBACK (close_infobox), 0); + gtk_container_add (GTK_CONTAINER (infobox->action_area), + GTK_WIDGET (okay_button)); // Add filename section // Former packer layout, for future reproduction // gtk_packer_add_defaults(packer, make_framed(print_left(filename), "Filename"), -// GTK_SIDE_TOP, GTK_ANCHOR_CENTER, GTK_FILL_X); - gtk_box_pack_end(GTK_BOX(box), GTK_WIDGET(hbox2), TRUE, TRUE, 2); - gtk_box_pack_end(GTK_BOX(box), make_framed(print_left(filename), "Filename"), TRUE, TRUE, 2); +// GTK_SIDE_TOP, GTK_ANCHOR_CENTER, GTK_FILL_X); + gtk_box_pack_end (GTK_BOX (box), GTK_WIDGET (hbox2), TRUE, TRUE, 2); + gtk_box_pack_end (GTK_BOX (box), + make_framed (print_left (filename), "Filename"), TRUE, + TRUE, 2); // Add "Song info" section - infotext << "Title: " << p->gettitle() << std::endl << - "Author: " << p->getauthor() << std::endl << - "File Type: " << p->gettype() << std::endl << - "Subsongs: " << p->getsubsongs() << std::endl << - "Instruments: " << p->getinstruments(); - if(plr.p == p) + infotext << "Title: " << p->gettitle () << std::endl << + "Author: " << p->getauthor () << std::endl << + "File Type: " << p->gettype () << std::endl << + "Subsongs: " << p->getsubsongs () << std::endl << + "Instruments: " << p->getinstruments (); + if (plr.p == p) infotext << std::ends; - else { - infotext << std::endl << "Orders: " << p->getorders() << std::endl << - "Patterns: " << p->getpatterns() << std::ends; + else + { + infotext << std::endl << "Orders: " << p->getorders () << std::endl << + "Patterns: " << p->getpatterns () << std::ends; } - gtk_container_add(GTK_CONTAINER(hbox), - make_framed(print_left(infotext.str().c_str()), "Song")); + gtk_container_add (GTK_CONTAINER (hbox), + make_framed (print_left (infotext.str ().c_str ()), + "Song")); // Add "Playback info" section if currently playing - if(plr.p == p) { - plr.infobox = GTK_LABEL(gtk_label_new("")); - gtk_label_set_justify(plr.infobox, GTK_JUSTIFY_LEFT); - gtk_misc_set_padding(GTK_MISC(plr.infobox), 2, 2); - gtk_container_add(GTK_CONTAINER(hbox), - make_framed(GTK_WIDGET(plr.infobox), "Playback")); + if (plr.p == p) + { + plr.infobox = GTK_LABEL (gtk_label_new ("")); + gtk_label_set_justify (plr.infobox, GTK_JUSTIFY_LEFT); + gtk_misc_set_padding (GTK_MISC (plr.infobox), 2, 2); + gtk_container_add (GTK_CONTAINER (hbox), + make_framed (GTK_WIDGET (plr.infobox), "Playback")); } // Former packer layout, for future reproduction // gtk_packer_add_defaults(packer, GTK_WIDGET(hbox), GTK_SIDE_TOP, -// GTK_ANCHOR_CENTER, GTK_FILL_X); - gtk_box_pack_end(GTK_BOX(hbox2), GTK_WIDGET(hbox), TRUE, TRUE, 2); +// GTK_ANCHOR_CENTER, GTK_FILL_X); + gtk_box_pack_end (GTK_BOX (hbox2), GTK_WIDGET (hbox), TRUE, TRUE, 2); // Add instrument names section - if(p->getinstruments()) { - GtkScrolledWindow *instwnd = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL, NULL)); + if (p->getinstruments ()) + { + GtkScrolledWindow *instwnd = + GTK_SCROLLED_WINDOW (gtk_scrolled_window_new (NULL, NULL)); GtkCList *instnames; gchar tmpstr[10]; { - gchar *rowstr[] = {"#","Instrument name"}; - instnames = GTK_CLIST(gtk_clist_new_with_titles(2, rowstr)); + gchar *rowstr[] = { "#", "Instrument name" }; + instnames = GTK_CLIST (gtk_clist_new_with_titles (2, rowstr)); } - gtk_clist_set_column_justification(instnames, 0, GTK_JUSTIFY_RIGHT); + gtk_clist_set_column_justification (instnames, 0, GTK_JUSTIFY_RIGHT); - for(i=0;igetinstruments();i++) { - sprintf(tmpstr, "%d", i + 1); - add_instlist(instnames, tmpstr, p->getinstrument(i).c_str()); + for (i = 0; i < p->getinstruments (); i++) + { + sprintf (tmpstr, "%d", i + 1); + add_instlist (instnames, tmpstr, p->getinstrument (i).c_str ()); } - gtk_clist_columns_autosize(instnames); - gtk_scrolled_window_set_policy(instwnd, GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_container_add(GTK_CONTAINER(instwnd), GTK_WIDGET(instnames)); + gtk_clist_columns_autosize (instnames); + gtk_scrolled_window_set_policy (instwnd, GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_container_add (GTK_CONTAINER (instwnd), GTK_WIDGET (instnames)); // Former packer layout, for future reproduction // gtk_packer_add(packer, GTK_WIDGET(instwnd), GTK_SIDE_TOP, -// GTK_ANCHOR_CENTER, GTK_FILL_X, 0, 0, 0, 0, 50); - gtk_box_pack_end(GTK_BOX(hbox2), GTK_WIDGET(instwnd), TRUE, TRUE, 2); +// GTK_ANCHOR_CENTER, GTK_FILL_X, 0, 0, 0, 0, 50); + gtk_box_pack_end (GTK_BOX (hbox2), GTK_WIDGET (instwnd), TRUE, TRUE, 2); } // Add "Song message" section - if(!p->getdesc().empty()) { - GtkScrolledWindow *msgwnd = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL, NULL)); - GtkTextView *msg = GTK_TEXT_VIEW(gtk_text_view_new()); + if (!p->getdesc ().empty ()) + { + GtkScrolledWindow *msgwnd = + GTK_SCROLLED_WINDOW (gtk_scrolled_window_new (NULL, NULL)); + GtkTextView *msg = GTK_TEXT_VIEW (gtk_text_view_new ()); - gtk_scrolled_window_set_policy(msgwnd, GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_text_view_set_editable(msg, FALSE); - gtk_text_view_set_wrap_mode(msg, GTK_WRAP_WORD_CHAR); + gtk_scrolled_window_set_policy (msgwnd, GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_text_view_set_editable (msg, FALSE); + gtk_text_view_set_wrap_mode (msg, GTK_WRAP_WORD_CHAR); - gtk_text_buffer_set_text(gtk_text_view_get_buffer(msg),p->getdesc().c_str(),p->getdesc().length()); - gtk_container_add(GTK_CONTAINER(msgwnd), GTK_WIDGET(msg)); - + gtk_text_buffer_set_text (gtk_text_view_get_buffer (msg), + p->getdesc ().c_str (), + p->getdesc ().length ()); + gtk_container_add (GTK_CONTAINER (msgwnd), GTK_WIDGET (msg)); + // Former packer layout, for future reproduction // gtk_packer_add(packer, make_framed(GTK_WIDGET(msgwnd), "Song message"), -// GTK_SIDE_TOP, GTK_ANCHOR_CENTER, GTK_FILL_X, 2, 0, 0, 200, 50); - gtk_box_pack_end(GTK_BOX(hbox2), make_framed(GTK_WIDGET(msgwnd), "Song message"), TRUE, TRUE, 2); +// GTK_SIDE_TOP, GTK_ANCHOR_CENTER, GTK_FILL_X, 2, 0, 0, 200, 50); + gtk_box_pack_end (GTK_BOX (hbox2), + make_framed (GTK_WIDGET (msgwnd), "Song message"), TRUE, + TRUE, 2); } // Add subsong slider section - if(p == plr.p && p->getsubsongs() > 1) { - GtkAdjustment *adj = GTK_ADJUSTMENT(gtk_adjustment_new(plr.subsong + 1, 1, - p->getsubsongs() + 1, - 1, 5, 1)); - GtkHScale *slider = GTK_HSCALE(gtk_hscale_new(adj)); + if (p == plr.p && p->getsubsongs () > 1) + { + GtkAdjustment *adj = + GTK_ADJUSTMENT (gtk_adjustment_new (plr.subsong + 1, 1, + p->getsubsongs () + 1, + 1, 5, 1)); + GtkHScale *slider = GTK_HSCALE (gtk_hscale_new (adj)); - g_signal_connect(G_OBJECT(adj), "value_changed", - G_CALLBACK(subsong_slider), NULL); - gtk_range_set_update_policy(GTK_RANGE(slider), GTK_UPDATE_DISCONTINUOUS); - gtk_scale_set_digits(GTK_SCALE(slider), 0); + g_signal_connect (G_OBJECT (adj), "value_changed", + G_CALLBACK (subsong_slider), NULL); + gtk_range_set_update_policy (GTK_RANGE (slider), + GTK_UPDATE_DISCONTINUOUS); + gtk_scale_set_digits (GTK_SCALE (slider), 0); // Former packer layout, for future reproduction // gtk_packer_add_defaults(packer, make_framed(GTK_WIDGET(slider), "Subsong selection"), -// GTK_SIDE_TOP, GTK_ANCHOR_CENTER, GTK_FILL_X); - gtk_box_pack_end(GTK_BOX(hbox2), make_framed(GTK_WIDGET(slider), "Subsong selection"), TRUE, TRUE, 2); +// GTK_SIDE_TOP, GTK_ANCHOR_CENTER, GTK_FILL_X); + gtk_box_pack_end (GTK_BOX (hbox2), + make_framed (GTK_WIDGET (slider), "Subsong selection"), + TRUE, TRUE, 2); } // Show dialog box - gtk_widget_show_all(GTK_WIDGET(infobox)); - if(p == plr.p) { // Remember widget, so we could destroy it later + gtk_widget_show_all (GTK_WIDGET (infobox)); + if (p == plr.p) + { // Remember widget, so we could destroy it later plr.infodlg = infobox; - } else // Delete temporary player + } + else // Delete temporary player delete p; } /***** Main player (!! threaded !!) *****/ -static void update_infobox(void) +static void +update_infobox (void) { std::ostringstream infotext; // Recreate info string - infotext << "Order: " << plr.p->getorder() << " / " << plr.p->getorders() << - std::endl << "Pattern: " << plr.p->getpattern() << " / " << - plr.p->getpatterns() << std::endl << "Row: " << plr.p->getrow() << - std::endl << "Speed: " << plr.p->getspeed() << std::endl << "Timer: " << - plr.p->getrefresh() << "Hz" << std::ends; + infotext << "Order: " << plr.p->getorder () << " / " << plr.p-> + getorders () << std::endl << "Pattern: " << plr.p-> + getpattern () << " / " << plr.p-> + getpatterns () << std::endl << "Row: " << plr.p-> + getrow () << std::endl << "Speed: " << plr.p-> + getspeed () << std::endl << "Timer: " << plr.p-> + getrefresh () << "Hz" << std::ends; - GDK_THREADS_ENTER(); - gtk_label_set_text(plr.infobox, infotext.str().c_str()); - GDK_THREADS_LEAVE(); + GDK_THREADS_ENTER (); + gtk_label_set_text (plr.infobox, infotext.str ().c_str ()); + GDK_THREADS_LEAVE (); } // Define sampsize macro (only usable inside play_loop()!) #define sampsize ((bit16 ? 2 : 1) * (stereo ? 2 : 1)) -static void *play_loop(void *data) +static void * +play_loop (void *data) /* Main playback thread. Takes the filename to play as argument. */ { InputPlayback *playback = (InputPlayback *) data; char *filename = (char *) playback->filename; - dbg_printf("play_loop(\"%s\"): ", filename); - CEmuopl opl(cfg.freq, cfg.bit16, cfg.stereo); + dbg_printf ("play_loop(\"%s\"): ", filename); + CEmuopl opl (cfg.freq, cfg.bit16, cfg.stereo); long toadd = 0, i, towrite; char *sndbuf, *sndbufpos; - bool playing = true, // Song self-end indicator. - bit16 = cfg.bit16, // Duplicate config, so it doesn't affect us if - stereo = cfg.stereo; // the user changes it while we're playing. + bool playing = true, // Song self-end indicator. + bit16 = cfg.bit16, // Duplicate config, so it doesn't affect us if + stereo = cfg.stereo; // the user changes it while we're playing. unsigned long freq = cfg.freq; // we use VfsBufferedFile class here because adplug does a lot of // probing. a short delay before probing begins is better than // a lot of delay during probing. - VFSFile *fd = vfs_buffered_file_new_from_uri(playback->filename); + VFSFile *fd = vfs_buffered_file_new_from_uri (playback->filename); - if (!fd) { plr.playing = false; g_thread_exit(NULL); } + if (!fd) + { + plr.playing = false; + g_thread_exit (NULL); + } // Try to load module - dbg_printf("factory, "); - if(!(plr.p = factory(fd, &opl))) { - dbg_printf("error!\n"); - // MessageBox("AdPlug :: Error", "File could not be opened!", "Ok"); + dbg_printf ("factory, "); + if (!(plr.p = factory (fd, &opl))) + { + dbg_printf ("error!\n"); + // MessageBox("AdPlug :: Error", "File could not be opened!", "Ok"); plr.playing = false; - g_thread_exit(NULL); + g_thread_exit (NULL); } // Cache song length - dbg_printf("length, "); - plr.songlength = plr.p->songlength(plr.subsong); + dbg_printf ("length, "); + plr.songlength = plr.p->songlength (plr.subsong); // cache song title - dbg_printf("title, "); - if(!plr.p->gettitle().empty()) { - plr.songtitle = (char *)malloc(plr.p->gettitle().length() + 1); - strcpy(plr.songtitle, plr.p->gettitle().c_str()); + dbg_printf ("title, "); + if (!plr.p->gettitle ().empty ()) + { + plr.songtitle = (char *) malloc (plr.p->gettitle ().length () + 1); + strcpy (plr.songtitle, plr.p->gettitle ().c_str ()); } // reset to first subsong on new file - dbg_printf("subsong, "); - if(strcmp(filename, plr.filename)) { - strcpy(plr.filename, filename); + dbg_printf ("subsong, "); + if (strcmp (filename, plr.filename)) + { + strcpy (plr.filename, filename); plr.subsong = 0; } // Allocate audio buffer - dbg_printf("buffer, "); - sndbuf = (char *)malloc(SNDBUFSIZE * sampsize); + dbg_printf ("buffer, "); + sndbuf = (char *) malloc (SNDBUFSIZE * sampsize); // Set XMMS main window information - dbg_printf("xmms, "); - adplug_ip.set_info(plr.songtitle, plr.songlength, freq * sampsize * 8, - freq, stereo ? 2 : 1); + dbg_printf ("xmms, "); + adplug_ip.set_info (plr.songtitle, plr.songlength, freq * sampsize * 8, + freq, stereo ? 2 : 1); // Rewind player to right subsong - dbg_printf("rewind, "); - plr.p->rewind(plr.subsong); + dbg_printf ("rewind, "); + plr.p->rewind (plr.subsong); // main playback loop - dbg_printf("loop.\n"); - while((playing || cfg.endless) && plr.playing) { + dbg_printf ("loop.\n"); + while ((playing || cfg.endless) && plr.playing) + { // seek requested ? - if(plr.seek != -1) { + if (plr.seek != -1) + { // backward seek ? - if(plr.seek < plr.time_ms) { - plr.p->rewind(plr.subsong); + if (plr.seek < plr.time_ms) + { + plr.p->rewind (plr.subsong); plr.time_ms = 0.0f; } // seek to requested position - while((plr.time_ms < plr.seek) && plr.p->update()) - plr.time_ms += 1000 / plr.p->getrefresh(); + while ((plr.time_ms < plr.seek) && plr.p->update ()) + plr.time_ms += 1000 / plr.p->getrefresh (); // Reset output plugin and some values - playback->output->flush((int)plr.time_ms); + playback->output->flush ((int) plr.time_ms); plr.seek = -1; } // fill sound buffer - towrite = SNDBUFSIZE; sndbufpos = sndbuf; - while (towrite > 0) { - while (toadd < 0) { + towrite = SNDBUFSIZE; + sndbufpos = sndbuf; + while (towrite > 0) + { + while (toadd < 0) + { toadd += freq; - playing = plr.p->update(); - plr.time_ms += 1000 / plr.p->getrefresh(); + playing = plr.p->update (); + plr.time_ms += 1000 / plr.p->getrefresh (); } - i = MIN(towrite, (long)(toadd / plr.p->getrefresh() + 4) & ~3); - opl.update((short *)sndbufpos, i); - sndbufpos += i * sampsize; towrite -= i; - toadd -= (long)(plr.p->getrefresh() * i); + i = MIN (towrite, (long) (toadd / plr.p->getrefresh () + 4) & ~3); + opl.update ((short *) sndbufpos, i); + sndbufpos += i * sampsize; + towrite -= i; + toadd -= (long) (plr.p->getrefresh () * i); } // write sound buffer - while(playback->output->buffer_free() < SNDBUFSIZE * sampsize) xmms_usleep(10000); - produce_audio(playback->output->written_time(), - bit16 ? FORMAT_16 : FORMAT_8, - stereo ? 2 : 1, SNDBUFSIZE * sampsize, sndbuf, NULL); + while (playback->output->buffer_free () < SNDBUFSIZE * sampsize) + xmms_usleep (10000); + produce_audio (playback->output->written_time (), + bit16 ? FORMAT_16 : FORMAT_8, + stereo ? 2 : 1, SNDBUFSIZE * sampsize, sndbuf, NULL); // update infobox, if necessary - if(plr.infobox && plr.playing) update_infobox(); + if (plr.infobox && plr.playing) + update_infobox (); } // playback finished - deinit - dbg_printf("play_loop(\"%s\"): ", filename); - if(!playing) { // wait for output plugin to finish if song has self-ended - dbg_printf("wait, "); - while(playback->output->buffer_playing()) xmms_usleep(10000); - } else { // or else, flush its output buffers - dbg_printf("flush, "); - playback->output->buffer_free(); playback->output->buffer_free(); + dbg_printf ("play_loop(\"%s\"): ", filename); + if (!playing) + { // wait for output plugin to finish if song has self-ended + dbg_printf ("wait, "); + while (playback->output->buffer_playing ()) + xmms_usleep (10000); + } + else + { // or else, flush its output buffers + dbg_printf ("flush, "); + playback->output->buffer_free (); + playback->output->buffer_free (); } // free everything and exit - dbg_printf("free"); - delete plr.p; plr.p = 0; - if(plr.songtitle) { free(plr.songtitle); plr.songtitle = NULL; } - free(sndbuf); - plr.playing = false; // important! XMMS won't get a self-ended song without it. - dbg_printf(".\n"); - vfs_fclose(fd); - g_thread_exit(NULL); - return(NULL); + dbg_printf ("free"); + delete plr.p; + plr.p = 0; + if (plr.songtitle) + { + free (plr.songtitle); + plr.songtitle = NULL; + } + free (sndbuf); + plr.playing = false; // important! XMMS won't get a self-ended song without it. + dbg_printf (".\n"); + vfs_fclose (fd); + g_thread_exit (NULL); + return (NULL); } // sampsize macro not useful anymore. @@ -727,97 +860,121 @@ /***** Informational *****/ -static int adplug_is_our_fd(gchar *filename, VFSFile *fd) +static int +adplug_is_our_fd (gchar * filename, VFSFile * fd) { CSilentopl tmpopl; - CPlayer *p = factory(fd,&tmpopl); + CPlayer *p = factory (fd, &tmpopl); - dbg_printf("adplug_is_our_file(\"%s\"): returned ",filename); + dbg_printf ("adplug_is_our_file(\"%s\"): returned ", filename); - if(p) { + if (p) + { delete p; - dbg_printf("TRUE\n"); + dbg_printf ("TRUE\n"); return TRUE; } - dbg_printf("FALSE\n"); + dbg_printf ("FALSE\n"); return FALSE; } -static int adplug_is_our_file(char *filename) +static int +adplug_is_our_file (char *filename) { CSilentopl tmpopl; - VFSFile *fd = vfs_buffered_file_new_from_uri(filename); if (!fd) return FALSE; + VFSFile *fd = vfs_buffered_file_new_from_uri (filename); + if (!fd) + return FALSE; - CPlayer *p = factory(fd,&tmpopl); + CPlayer *p = factory (fd, &tmpopl); - dbg_printf("adplug_is_our_file(\"%s\"): returned ",filename); + dbg_printf ("adplug_is_our_file(\"%s\"): returned ", filename); - if(p) { + if (p) + { delete p; - dbg_printf("TRUE\n"); + dbg_printf ("TRUE\n"); return TRUE; } - dbg_printf("FALSE\n"); + dbg_printf ("FALSE\n"); return FALSE; } -static int adplug_get_time(InputPlayback *data) +static int +adplug_get_time (InputPlayback * data) { - if(audio_error) { dbg_printf("adplug_get_time(): returned -2\n"); return -2; } - if(!plr.playing) { dbg_printf("adplug_get_time(): returned -1\n"); return -1; } - return playback->output->output_time(); + if (audio_error) + { + dbg_printf ("adplug_get_time(): returned -2\n"); + return -2; + } + if (!plr.playing) + { + dbg_printf ("adplug_get_time(): returned -1\n"); + return -1; + } + return playback->output->output_time (); } -static void adplug_song_info(char *filename, char **title, int *length) +static void +adplug_song_info (char *filename, char **title, int *length) { CSilentopl tmpopl; - VFSFile *fd = vfs_buffered_file_new_from_uri(filename); + VFSFile *fd = vfs_buffered_file_new_from_uri (filename); - if (!fd) return; + if (!fd) + return; - CPlayer *p = factory(fd, &tmpopl); + CPlayer *p = factory (fd, &tmpopl); - dbg_printf("adplug_song_info(\"%s\", \"%s\", %d): ", filename, *title, *length); + dbg_printf ("adplug_song_info(\"%s\", \"%s\", %d): ", filename, *title, + *length); - if(p) { + if (p) + { // allocate and set title string - if(p->gettitle().empty()) + if (p->gettitle ().empty ()) *title = 0; - else { - *title = (char *)malloc(p->gettitle().length() + 1); - strcpy(*title, p->gettitle().c_str()); + else + { + *title = (char *) malloc (p->gettitle ().length () + 1); + strcpy (*title, p->gettitle ().c_str ()); } // get song length - *length = p->songlength(plr.subsong); + *length = p->songlength (plr.subsong); // delete temporary player object delete p; } - dbg_printf("title = \"%s\", length = %d\n", *title, *length); + dbg_printf ("title = \"%s\", length = %d\n", *title, *length); } /***** Player control *****/ -static void adplug_play(InputPlayback *data) +static void +adplug_play (InputPlayback * data) { char *filename = data->filename; playback = data; - dbg_printf("adplug_play(\"%s\"): ", filename); + dbg_printf ("adplug_play(\"%s\"): ", filename); audio_error = FALSE; // On new song, re-open "Song info" dialog, if open - dbg_printf("dialog, "); - if(plr.infobox && strcmp(filename, plr.filename)) - gtk_widget_destroy(GTK_WIDGET(plr.infodlg)); + dbg_printf ("dialog, "); + if (plr.infobox && strcmp (filename, plr.filename)) + gtk_widget_destroy (GTK_WIDGET (plr.infodlg)); // open output plugin - dbg_printf("open, "); - if (!playback->output->open_audio(cfg.bit16 ? FORMAT_16 : FORMAT_8, cfg.freq, cfg.stereo ? 2 : 1)) { + dbg_printf ("open, "); + if (!playback->output-> + open_audio (cfg.bit16 ? FORMAT_16 : FORMAT_8, cfg.freq, + cfg.stereo ? 2 : 1)) + { audio_error = TRUE; return; } @@ -825,158 +982,177 @@ // Initialize global player data (this is here to prevent a race condition // between adplug_get_time() returning the playback state and adplug_loop() // initializing the playback state) - dbg_printf("init, "); - plr.playing = true; plr.time_ms = 0.0f; plr.seek = -1; + dbg_printf ("init, "); + plr.playing = true; + plr.time_ms = 0.0f; + plr.seek = -1; // start player thread - dbg_printf("create"); - plr.play_thread = g_thread_create(play_loop, playback, TRUE, NULL); - dbg_printf(".\n"); + dbg_printf ("create"); + plr.play_thread = g_thread_create (play_loop, playback, TRUE, NULL); + dbg_printf (".\n"); } -static void adplug_stop(InputPlayback * playback) +static void +adplug_stop (InputPlayback * playback) { - dbg_printf("adplug_stop(): join, "); - plr.playing = false; g_thread_join(plr.play_thread); // stop player thread - dbg_printf("close"); playback->output->close_audio(); - dbg_printf(".\n"); + dbg_printf ("adplug_stop(): join, "); + plr.playing = false; + g_thread_join (plr.play_thread); // stop player thread + dbg_printf ("close"); + playback->output->close_audio (); + dbg_printf (".\n"); } -static void adplug_pause(InputPlayback * playback, short paused) +static void +adplug_pause (InputPlayback * playback, short paused) { - dbg_printf("adplug_pause(%d)\n", paused); - playback->output->pause(paused); + dbg_printf ("adplug_pause(%d)\n", paused); + playback->output->pause (paused); } -static void adplug_seek(InputPlayback * data, int time) +static void +adplug_seek (InputPlayback * data, int time) { - dbg_printf("adplug_seek(%d)\n", time); - plr.seek = time * 1000; // time is in seconds, but we count in ms + dbg_printf ("adplug_seek(%d)\n", time); + plr.seek = time * 1000; // time is in seconds, but we count in ms } /***** Configuration file handling *****/ #define CFG_VERSION "AdPlug" -static void adplug_init(void) +static void +adplug_init (void) { - dbg_printf("adplug_init(): open, "); - ConfigDb *db = bmp_cfg_db_open(); + dbg_printf ("adplug_init(): open, "); + ConfigDb *db = bmp_cfg_db_open (); // Read configuration - dbg_printf("read, "); - bmp_cfg_db_get_bool(db, CFG_VERSION, "16bit", (gboolean *)&cfg.bit16); - bmp_cfg_db_get_bool(db, CFG_VERSION, "Stereo", (gboolean *)&cfg.stereo); - bmp_cfg_db_get_int(db, CFG_VERSION, "Frequency", (gint *)&cfg.freq); - bmp_cfg_db_get_bool(db, CFG_VERSION, "Endless", (gboolean *)&cfg.endless); + dbg_printf ("read, "); + bmp_cfg_db_get_bool (db, CFG_VERSION, "16bit", (gboolean *) & cfg.bit16); + bmp_cfg_db_get_bool (db, CFG_VERSION, "Stereo", (gboolean *) & cfg.stereo); + bmp_cfg_db_get_int (db, CFG_VERSION, "Frequency", (gint *) & cfg.freq); + bmp_cfg_db_get_bool (db, CFG_VERSION, "Endless", + (gboolean *) & cfg.endless); // Read file type exclusion list - dbg_printf("exclusion, "); + dbg_printf ("exclusion, "); { gchar *cfgstr = "", *exclude; gboolean cfgread; - cfgread = bmp_cfg_db_get_string(db, CFG_VERSION, "Exclude", &cfgstr); - exclude = (char *)malloc(strlen(cfgstr) + 2); strcpy(exclude, cfgstr); - exclude[strlen(exclude) + 1] = '\0'; - if(cfgread) free(cfgstr); - g_strdelimit(exclude, ":", '\0'); - for(gchar *p = exclude; *p; p += strlen(p) + 1) - cfg.players.remove(cfg.players.lookup_filetype(p)); - free(exclude); + cfgread = bmp_cfg_db_get_string (db, CFG_VERSION, "Exclude", &cfgstr); + exclude = (char *) malloc (strlen (cfgstr) + 2); + strcpy (exclude, cfgstr); + exclude[strlen (exclude) + 1] = '\0'; + if (cfgread) + free (cfgstr); + g_strdelimit (exclude, ":", '\0'); + for (gchar * p = exclude; *p; p += strlen (p) + 1) + cfg.players.remove (cfg.players.lookup_filetype (p)); + free (exclude); } - bmp_cfg_db_close(db); + bmp_cfg_db_close (db); // Load database from disk and hand it to AdPlug - dbg_printf("database"); + dbg_printf ("database"); plr.db = new CAdPlugDatabase; { - const char *homedir = getenv("HOME"); + const char *homedir = getenv ("HOME"); - if(homedir) { - char *userdb = (char *)malloc(strlen(homedir) + strlen(ADPLUG_CONFDIR) + - strlen(ADPLUGDB_FILE) + 3); - strcpy(userdb, homedir); strcat(userdb, "/" ADPLUG_CONFDIR "/"); - strcat(userdb, ADPLUGDB_FILE); - plr.db->load(userdb); // load user's database - dbg_printf(" (userdb=\"%s\")", userdb); - free(userdb); + if (homedir) + { + char *userdb = + (char *) malloc (strlen (homedir) + strlen (ADPLUG_CONFDIR) + + strlen (ADPLUGDB_FILE) + 3); + strcpy (userdb, homedir); + strcat (userdb, "/" ADPLUG_CONFDIR "/"); + strcat (userdb, ADPLUGDB_FILE); + plr.db->load (userdb); // load user's database + dbg_printf (" (userdb=\"%s\")", userdb); + free (userdb); } } - CAdPlug::set_database(plr.db); - dbg_printf(".\n"); + CAdPlug::set_database (plr.db); + dbg_printf (".\n"); } -static void adplug_quit(void) +static void +adplug_quit (void) { - dbg_printf("adplug_quit(): open, "); - ConfigDb *db = bmp_cfg_db_open(); + dbg_printf ("adplug_quit(): open, "); + ConfigDb *db = bmp_cfg_db_open (); // Close database - dbg_printf("db, "); - if(plr.db) delete plr.db; + dbg_printf ("db, "); + if (plr.db) + delete plr.db; // Write configuration - dbg_printf("write, "); - bmp_cfg_db_set_bool(db, CFG_VERSION, "16bit", cfg.bit16); - bmp_cfg_db_set_bool(db, CFG_VERSION, "Stereo", cfg.stereo); - bmp_cfg_db_set_int(db, CFG_VERSION, "Frequency", cfg.freq); - bmp_cfg_db_set_bool(db, CFG_VERSION, "Endless", cfg.endless); + dbg_printf ("write, "); + bmp_cfg_db_set_bool (db, CFG_VERSION, "16bit", cfg.bit16); + bmp_cfg_db_set_bool (db, CFG_VERSION, "Stereo", cfg.stereo); + bmp_cfg_db_set_int (db, CFG_VERSION, "Frequency", cfg.freq); + bmp_cfg_db_set_bool (db, CFG_VERSION, "Endless", cfg.endless); - dbg_printf("exclude, "); + dbg_printf ("exclude, "); std::string exclude; - for(CPlayers::const_iterator i = CAdPlug::players.begin(); - i != CAdPlug::players.end(); i++) - if(find(cfg.players.begin(), cfg.players.end(), *i) == cfg.players.end()) { - if(!exclude.empty()) exclude += ":"; + for (CPlayers::const_iterator i = CAdPlug::players.begin (); + i != CAdPlug::players.end (); i++) + if (find (cfg.players.begin (), cfg.players.end (), *i) == + cfg.players.end ()) + { + if (!exclude.empty ()) + exclude += ":"; exclude += (*i)->filetype; } - gchar *cfgval = g_strdup(exclude.c_str()); - bmp_cfg_db_set_string(db, CFG_VERSION, "Exclude", cfgval); - free(cfgval); + gchar *cfgval = g_strdup (exclude.c_str ()); + bmp_cfg_db_set_string (db, CFG_VERSION, "Exclude", cfgval); + free (cfgval); - dbg_printf("close"); - bmp_cfg_db_close(db); - dbg_printf(".\n"); + dbg_printf ("close"); + bmp_cfg_db_close (db); + dbg_printf (".\n"); } /***** Plugin (exported) *****/ -InputPlugin adplug_ip = - { - NULL, // handle (filled by XMMS) - NULL, // filename (filled by XMMS) - ADPLUG_NAME, // plugin description - adplug_init, // plugin functions... - adplug_about, - adplug_config, - adplug_is_our_file, - NULL, // scan_dir (look in Input/cdaudio/cdaudio.c) - adplug_play, - adplug_stop, - adplug_pause, - adplug_seek, - NULL, // set_eq - adplug_get_time, - NULL, // get_volume (handled by output plugin) - NULL, // set_volume (...) - adplug_quit, - NULL, // OBSOLETE - DO NOT USE! - NULL, // add_vis_pcm (filled by XMMS) - NULL, // set_info (filled by XMMS) - NULL, // set_info_text (filled by XMMS) - adplug_song_info, - adplug_info_box, // adplug_info_box was here (but it used deprecated GTK+ functions) - NULL, // output plugin (filled by XMMS) - NULL, - NULL, - NULL, - adplug_is_our_fd, - NULL, - }; +InputPlugin adplug_ip = { + NULL, // handle (filled by XMMS) + NULL, // filename (filled by XMMS) + ADPLUG_NAME, // plugin description + adplug_init, // plugin functions... + adplug_about, + adplug_config, + adplug_is_our_file, + NULL, // scan_dir (look in Input/cdaudio/cdaudio.c) + adplug_play, + adplug_stop, + adplug_pause, + adplug_seek, + NULL, // set_eq + adplug_get_time, + NULL, // get_volume (handled by output plugin) + NULL, // set_volume (...) + adplug_quit, + NULL, // OBSOLETE - DO NOT USE! + NULL, // add_vis_pcm (filled by XMMS) + NULL, // set_info (filled by XMMS) + NULL, // set_info_text (filled by XMMS) + adplug_song_info, + adplug_info_box, // adplug_info_box was here (but it used deprecated GTK+ functions) + NULL, // output plugin (filled by XMMS) + NULL, + NULL, + NULL, + adplug_is_our_fd, + NULL, +}; -extern "C" InputPlugin *get_iplugin_info(void) +extern "C" InputPlugin * +get_iplugin_info (void) { return &adplug_ip; } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/a2m.cxx --- a/src/adplug/core/a2m.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/a2m.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -31,455 +31,563 @@ #include "a2m.h" -const unsigned int Ca2mLoader::MAXFREQ = 2000, -Ca2mLoader::MINCOPY = ADPLUG_A2M_MINCOPY, -Ca2mLoader::MAXCOPY = ADPLUG_A2M_MAXCOPY, -Ca2mLoader::COPYRANGES = ADPLUG_A2M_COPYRANGES, -Ca2mLoader::CODESPERRANGE = ADPLUG_A2M_CODESPERRANGE, -Ca2mLoader::TERMINATE = 256, -Ca2mLoader::FIRSTCODE = ADPLUG_A2M_FIRSTCODE, -Ca2mLoader::MAXCHAR = FIRSTCODE + COPYRANGES * CODESPERRANGE - 1, -Ca2mLoader::SUCCMAX = MAXCHAR + 1, -Ca2mLoader::TWICEMAX = ADPLUG_A2M_TWICEMAX, -Ca2mLoader::ROOT = 1, Ca2mLoader::MAXBUF = 42 * 1024, -Ca2mLoader::MAXDISTANCE = 21389, Ca2mLoader::MAXSIZE = 21389 + MAXCOPY; +const unsigned int + Ca2mLoader::MAXFREQ = 2000, + Ca2mLoader::MINCOPY = ADPLUG_A2M_MINCOPY, + Ca2mLoader::MAXCOPY = ADPLUG_A2M_MAXCOPY, + Ca2mLoader::COPYRANGES = ADPLUG_A2M_COPYRANGES, + Ca2mLoader::CODESPERRANGE = ADPLUG_A2M_CODESPERRANGE, + Ca2mLoader::TERMINATE = 256, + Ca2mLoader::FIRSTCODE = ADPLUG_A2M_FIRSTCODE, + Ca2mLoader::MAXCHAR = FIRSTCODE + COPYRANGES * CODESPERRANGE - 1, + Ca2mLoader::SUCCMAX = MAXCHAR + 1, + Ca2mLoader::TWICEMAX = ADPLUG_A2M_TWICEMAX, + Ca2mLoader::ROOT = 1, Ca2mLoader::MAXBUF = 42 * 1024, + Ca2mLoader::MAXDISTANCE = 21389, Ca2mLoader::MAXSIZE = 21389 + MAXCOPY; -const unsigned short Ca2mLoader::bitvalue[14] = - {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192}; +const unsigned short +Ca2mLoader::bitvalue[14] = + { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192 }; -const signed short Ca2mLoader::copybits[COPYRANGES] = - {4, 6, 8, 10, 12, 14}; +const signed short +Ca2mLoader::copybits[COPYRANGES] = { 4, 6, 8, 10, 12, 14 }; -const signed short Ca2mLoader::copymin[COPYRANGES] = - {0, 16, 80, 336, 1360, 5456}; +const signed short +Ca2mLoader::copymin[COPYRANGES] = { 0, 16, 80, 336, 1360, 5456 }; -CPlayer *Ca2mLoader::factory(Copl *newopl) +CPlayer * +Ca2mLoader::factory (Copl * newopl) { - return new Ca2mLoader(newopl); + return new Ca2mLoader (newopl); } -bool Ca2mLoader::load(VFSFile *fd, const CFileProvider &fp) +bool +Ca2mLoader::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); if(!f) return false; + binistream *f = fp.open (fd); + if (!f) + return false; char id[10]; - int i,j,k,t; + int i, j, k, t; unsigned int l; unsigned char *org, *orgptr, flags = 0, numpats, version; unsigned long crc, alength; unsigned short len[9], *secdata, *secptr; - const unsigned char convfx[16] = {0,1,2,23,24,3,5,4,6,9,17,13,11,19,7,14}; - const unsigned char convinf1[16] = {0,1,2,6,7,8,9,4,5,3,10,11,12,13,14,15}; - const unsigned char newconvfx[] = {0,1,2,3,4,5,6,23,24,21,10,11,17,13,7,19, - 255,255,22,25,255,15,255,255,255,255,255, - 255,255,255,255,255,255,255,255,14,255}; + const unsigned char convfx[16] = + { 0, 1, 2, 23, 24, 3, 5, 4, 6, 9, 17, 13, 11, 19, 7, 14 }; + const unsigned char convinf1[16] = + { 0, 1, 2, 6, 7, 8, 9, 4, 5, 3, 10, 11, 12, 13, 14, 15 }; + const unsigned char newconvfx[] = + { 0, 1, 2, 3, 4, 5, 6, 23, 24, 21, 10, 11, 17, 13, 7, 19, + 255, 255, 22, 25, 255, 15, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 14, 255 + }; // read header - f->readString(id, 10); crc = f->readInt(4); - version = f->readInt(1); numpats = f->readInt(1); + f->readString (id, 10); + crc = f->readInt (4); + version = f->readInt (1); + numpats = f->readInt (1); // file validation section - if(strncmp(id,"_A2module_",10) || (version != 1 && version != 5 && - version != 4 && version != 8)) { - fp.close(f); + if (strncmp (id, "_A2module_", 10) || (version != 1 && version != 5 && + version != 4 && version != 8)) + { + fp.close (f); return false; } // load, depack & convert section - nop = numpats; length = 128; restartpos = 0; - if(version < 5) { - for(i=0;i<5;i++) len[i] = f->readInt(2); + nop = numpats; + length = 128; + restartpos = 0; + if (version < 5) + { + for (i = 0; i < 5; i++) + len[i] = f->readInt (2); t = 9; - } else { // version >= 5 - for(i=0;i<9;i++) len[i] = f->readInt(2); + } + else + { // version >= 5 + for (i = 0; i < 9; i++) + len[i] = f->readInt (2); t = 18; } // block 0 - secdata = new unsigned short [len[0] / 2]; - if(version == 1 || version == 5) { - for(i=0;ireadInt(2); - org = new unsigned char [MAXBUF]; orgptr = org; - sixdepak(secdata,org,len[0]); - } else { - orgptr = (unsigned char *)secdata; - for(i=0;ireadInt(1); + secdata = new unsigned short[len[0] / 2]; + if (version == 1 || version == 5) + { + for (i = 0; i < len[0] / 2; i++) + secdata[i] = f->readInt (2); + org = new unsigned char[MAXBUF]; + orgptr = org; + sixdepak (secdata, org, len[0]); } - memcpy(songname,orgptr,43); orgptr += 43; - memcpy(author,orgptr,43); orgptr += 43; - memcpy(instname,orgptr,250*33); orgptr += 250*33; + else + { + orgptr = (unsigned char *) secdata; + for (i = 0; i < len[0]; i++) + orgptr[i] = f->readInt (1); + } + memcpy (songname, orgptr, 43); + orgptr += 43; + memcpy (author, orgptr, 43); + orgptr += 43; + memcpy (instname, orgptr, 250 * 33); + orgptr += 250 * 33; - for(i=0;i<250;i++) { // instruments - inst[i].data[0] = *(orgptr+i*13+10); - inst[i].data[1] = *(orgptr+i*13); - inst[i].data[2] = *(orgptr+i*13+1); - inst[i].data[3] = *(orgptr+i*13+4); - inst[i].data[4] = *(orgptr+i*13+5); - inst[i].data[5] = *(orgptr+i*13+6); - inst[i].data[6] = *(orgptr+i*13+7); - inst[i].data[7] = *(orgptr+i*13+8); - inst[i].data[8] = *(orgptr+i*13+9); - inst[i].data[9] = *(orgptr+i*13+2); - inst[i].data[10] = *(orgptr+i*13+3); - if(version < 5) - inst[i].misc = *(orgptr+i*13+11); - else { // version >= 5 -> OPL3 format - int pan = *(orgptr+i*13+11); + for (i = 0; i < 250; i++) + { // instruments + inst[i].data[0] = *(orgptr + i * 13 + 10); + inst[i].data[1] = *(orgptr + i * 13); + inst[i].data[2] = *(orgptr + i * 13 + 1); + inst[i].data[3] = *(orgptr + i * 13 + 4); + inst[i].data[4] = *(orgptr + i * 13 + 5); + inst[i].data[5] = *(orgptr + i * 13 + 6); + inst[i].data[6] = *(orgptr + i * 13 + 7); + inst[i].data[7] = *(orgptr + i * 13 + 8); + inst[i].data[8] = *(orgptr + i * 13 + 9); + inst[i].data[9] = *(orgptr + i * 13 + 2); + inst[i].data[10] = *(orgptr + i * 13 + 3); + if (version < 5) + inst[i].misc = *(orgptr + i * 13 + 11); + else + { // version >= 5 -> OPL3 format + int pan = *(orgptr + i * 13 + 11); - if(pan) - inst[i].data[0] |= (pan & 3) << 4; // set pan + if (pan) + inst[i].data[0] |= (pan & 3) << 4; // set pan else - inst[i].data[0] |= 48; // enable both speakers + inst[i].data[0] |= 48; // enable both speakers } - inst[i].slide = *(orgptr+i*13+12); + inst[i].slide = *(orgptr + i * 13 + 12); } - orgptr += 250*13; - memcpy(order,orgptr,128); orgptr += 128; - bpm = *orgptr; orgptr++; - initspeed = *orgptr; orgptr++; - if(version >= 5) flags = *orgptr; - if(version == 1 || version == 5) delete [] org; - delete [] secdata; + orgptr += 250 * 13; + memcpy (order, orgptr, 128); + orgptr += 128; + bpm = *orgptr; + orgptr++; + initspeed = *orgptr; + orgptr++; + if (version >= 5) + flags = *orgptr; + if (version == 1 || version == 5) + delete[]org; + delete[]secdata; // blocks 1-4 or 1-8 alength = len[1]; - for(i = 0; i < (version < 5 ? numpats / 16 : numpats / 8); i++) - alength += len[i+2]; + for (i = 0; i < (version < 5 ? numpats / 16 : numpats / 8); i++) + alength += len[i + 2]; - secdata = new unsigned short [alength / 2]; - if(version == 1 || version == 5) { - for(l=0;lreadInt(2); - org = new unsigned char [MAXBUF * (numpats / (version == 1 ? 16 : 8) + 1)]; - orgptr = org; secptr = secdata; - orgptr += sixdepak(secptr,orgptr,len[1]); secptr += len[1] / 2; - if(version == 1) { - if(numpats > 16) - orgptr += sixdepak(secptr,orgptr,len[2]); secptr += len[2] / 2; - if(numpats > 32) - orgptr += sixdepak(secptr,orgptr,len[3]); secptr += len[3] / 2; - if(numpats > 48) - sixdepak(secptr,orgptr,len[4]); - } else { - if(numpats > 8) - orgptr += sixdepak(secptr,orgptr,len[2]); secptr += len[2] / 2; - if(numpats > 16) - orgptr += sixdepak(secptr,orgptr,len[3]); secptr += len[3] / 2; - if(numpats > 24) - orgptr += sixdepak(secptr,orgptr,len[4]); secptr += len[4] / 2; - if(numpats > 32) - orgptr += sixdepak(secptr,orgptr,len[5]); secptr += len[5] / 2; - if(numpats > 40) - orgptr += sixdepak(secptr,orgptr,len[6]); secptr += len[6] / 2; - if(numpats > 48) - orgptr += sixdepak(secptr,orgptr,len[7]); secptr += len[7] / 2; - if(numpats > 56) - sixdepak(secptr,orgptr,len[8]); + secdata = new unsigned short[alength / 2]; + if (version == 1 || version == 5) + { + for (l = 0; l < alength / 2; l++) + secdata[l] = f->readInt (2); + org = new unsigned char[MAXBUF * (numpats / (version == 1 ? 16 : 8) + 1)]; + orgptr = org; + secptr = secdata; + orgptr += sixdepak (secptr, orgptr, len[1]); + secptr += len[1] / 2; + if (version == 1) + { + if (numpats > 16) + orgptr += sixdepak (secptr, orgptr, len[2]); + secptr += len[2] / 2; + if (numpats > 32) + orgptr += sixdepak (secptr, orgptr, len[3]); + secptr += len[3] / 2; + if (numpats > 48) + sixdepak (secptr, orgptr, len[4]); } - delete [] secdata; secdata = 0; - } else { - org = (unsigned char *)secdata; - for(l=0;lreadInt(1); + else + { + if (numpats > 8) + orgptr += sixdepak (secptr, orgptr, len[2]); + secptr += len[2] / 2; + if (numpats > 16) + orgptr += sixdepak (secptr, orgptr, len[3]); + secptr += len[3] / 2; + if (numpats > 24) + orgptr += sixdepak (secptr, orgptr, len[4]); + secptr += len[4] / 2; + if (numpats > 32) + orgptr += sixdepak (secptr, orgptr, len[5]); + secptr += len[5] / 2; + if (numpats > 40) + orgptr += sixdepak (secptr, orgptr, len[6]); + secptr += len[6] / 2; + if (numpats > 48) + orgptr += sixdepak (secptr, orgptr, len[7]); + secptr += len[7] / 2; + if (numpats > 56) + sixdepak (secptr, orgptr, len[8]); + } + delete[]secdata; + secdata = 0; + } + else + { + org = (unsigned char *) secdata; + for (l = 0; l < alength; l++) + org[l] = f->readInt (1); } - if(version < 5) { - for(i=0;inote = o[0] == 255 ? 127 : o[0]; - track->inst = o[1]; - track->command = convfx[o[2]]; - track->param2 = o[3] & 0x0f; - if(track->command != 14) - track->param1 = o[3] >> 4; - else { - track->param1 = convinf1[o[3] >> 4]; - if(track->param1 == 15 && !track->param2) { // convert key-off - track->command = 8; - track->param1 = 0; - track->param2 = 0; - } - } - if(track->command == 14) { - switch(track->param1) { - case 2: // convert define waveform + track->note = o[0] == 255 ? 127 : o[0]; + track->inst = o[1]; + track->command = convfx[o[2]]; + track->param2 = o[3] & 0x0f; + if (track->command != 14) + track->param1 = o[3] >> 4; + else + { + track->param1 = convinf1[o[3] >> 4]; + if (track->param1 == 15 && !track->param2) + { // convert key-off + track->command = 8; + track->param1 = 0; + track->param2 = 0; + } + } + if (track->command == 14) + { + switch (track->param1) + { + case 2: // convert define waveform track->command = 25; track->param1 = track->param2; track->param2 = 0xf; - break; - case 8: // convert volume slide up + break; + case 8: // convert volume slide up track->command = 26; track->param1 = track->param2; track->param2 = 0; - break; - case 9: // convert volume slide down + break; + case 9: // convert volume slide down track->command = 26; track->param1 = 0; - break; - } - } - } - } else { // version >= 5 - realloc_patterns(64, 64, 18); + break; + } + } + } + } + else + { // version >= 5 + realloc_patterns (64, 64, 18); - for(i=0;inote = o[0] == 255 ? 127 : o[0]; track->inst = o[1]; track->command = newconvfx[o[2]]; track->param1 = o[3] >> 4; track->param2 = o[3] & 0x0f; - + // Convert '&' command - if(o[2] == 36) - switch(track->param1) { - case 0: // pattern delay (frames) + if (o[2] == 36) + switch (track->param1) + { + case 0: // pattern delay (frames) track->command = 29; track->param1 = 0; // param2 already set correctly break; - - case 1: // pattern delay (rows) + + case 1: // pattern delay (rows) track->command = 14; track->param1 = 8; // param2 already set correctly break; } - } + } + } + + init_trackord (); + + if (version == 1 || version == 5) + { + delete[]org; + } + else + { + delete[]secdata; } - init_trackord(); - - if(version == 1 || version == 5) - { - delete [] org; - } - else - { - delete [] secdata; - } + // Process flags + if (version >= 5) + { + CmodPlayer::flags |= Opl3; // All versions >= 5 are OPL3 + if (flags & 8) + CmodPlayer::flags |= Tremolo; // Tremolo depth + if (flags & 16) + CmodPlayer::flags |= Vibrato; // Vibrato depth + } - // Process flags - if(version >= 5) { - CmodPlayer::flags |= Opl3; // All versions >= 5 are OPL3 - if(flags & 8) CmodPlayer::flags |= Tremolo; // Tremolo depth - if(flags & 16) CmodPlayer::flags |= Vibrato; // Vibrato depth - } - - fp.close(f); - rewind(0); - return true; + fp.close (f); + rewind (0); + return true; } -float Ca2mLoader::getrefresh() +float +Ca2mLoader::getrefresh () { - if(tempo != 18) - return (float) (tempo); - else - return 18.2f; + if (tempo != 18) + return (float) (tempo); + else + return 18.2f; } /*** private methods *************************************/ -void Ca2mLoader::inittree() +void +Ca2mLoader::inittree () { - unsigned short i; + unsigned short i; - for(i=2;i<=TWICEMAX;i++) { - dad[i] = i / 2; - freq[i] = 1; - } + for (i = 2; i <= TWICEMAX; i++) + { + dad[i] = i / 2; + freq[i] = 1; + } - for(i=1;i<=MAXCHAR;i++) { - leftc[i] = 2 * i; - rghtc[i] = 2 * i + 1; - } + for (i = 1; i <= MAXCHAR; i++) + { + leftc[i] = 2 * i; + rghtc[i] = 2 * i + 1; + } } -void Ca2mLoader::updatefreq(unsigned short a,unsigned short b) +void +Ca2mLoader::updatefreq (unsigned short a, unsigned short b) { - do { - freq[dad[a]] = freq[a] + freq[b]; - a = dad[a]; - if(a != ROOT) - if(leftc[dad[a]] == a) - b = rghtc[dad[a]]; - else - b = leftc[dad[a]]; - } while(a != ROOT); + do + { + freq[dad[a]] = freq[a] + freq[b]; + a = dad[a]; + if (a != ROOT) + if (leftc[dad[a]] == a) + b = rghtc[dad[a]]; + else + b = leftc[dad[a]]; + } while (a != ROOT); - if(freq[ROOT] == MAXFREQ) - for(a=1;a<=TWICEMAX;a++) - freq[a] >>= 1; + if (freq[ROOT] == MAXFREQ) + for (a = 1; a <= TWICEMAX; a++) + freq[a] >>= 1; } -void Ca2mLoader::updatemodel(unsigned short code) +void +Ca2mLoader::updatemodel (unsigned short code) { - unsigned short a=code+SUCCMAX,b,c,code1,code2; + unsigned short a = code + SUCCMAX, b, c, code1, code2; + + freq[a]++; + if (dad[a] != ROOT) + { + code1 = dad[a]; + if (leftc[code1] == a) + updatefreq (a, rghtc[code1]); + else + updatefreq (a, leftc[code1]); - freq[a]++; - if(dad[a] != ROOT) { - code1 = dad[a]; - if(leftc[code1] == a) - updatefreq(a,rghtc[code1]); - else - updatefreq(a,leftc[code1]); + do + { + code2 = dad[code1]; + if (leftc[code2] == code1) + b = rghtc[code2]; + else + b = leftc[code2]; - do { - code2 = dad[code1]; - if(leftc[code2] == code1) - b = rghtc[code2]; - else - b = leftc[code2]; + if (freq[a] > freq[b]) + { + if (leftc[code2] == code1) + rghtc[code2] = a; + else + leftc[code2] = a; - if(freq[a] > freq[b]) { - if(leftc[code2] == code1) - rghtc[code2] = a; - else - leftc[code2] = a; + if (leftc[code1] == a) + { + leftc[code1] = b; + c = rghtc[code1]; + } + else + { + rghtc[code1] = b; + c = leftc[code1]; + } + + dad[b] = code1; + dad[a] = code2; + updatefreq (b, c); + a = b; + } + + a = dad[a]; + code1 = dad[a]; + } while (code1 != ROOT); + } +} - if(leftc[code1] == a) { - leftc[code1] = b; - c = rghtc[code1]; - } else { - rghtc[code1] = b; - c = leftc[code1]; - } +unsigned short +Ca2mLoader::inputcode (unsigned short bits) +{ + unsigned short i, code = 0; - dad[b] = code1; - dad[a] = code2; - updatefreq(b,c); - a = b; - } + for (i = 1; i <= bits; i++) + { + if (!ibitcount) + { + if (ibitcount == MAXBUF) + ibufcount = 0; + ibitbuffer = wdbuf[ibufcount]; + ibufcount++; + ibitcount = 15; + } + else + ibitcount--; - a = dad[a]; - code1 = dad[a]; - } while(code1 != ROOT); - } + if (ibitbuffer > 0x7fff) + code |= bitvalue[i - 1]; + ibitbuffer <<= 1; + } + + return code; } -unsigned short Ca2mLoader::inputcode(unsigned short bits) +unsigned short +Ca2mLoader::uncompress () { - unsigned short i,code=0; - - for(i=1;i<=bits;i++) { - if(!ibitcount) { - if(ibitcount == MAXBUF) - ibufcount = 0; - ibitbuffer = wdbuf[ibufcount]; - ibufcount++; - ibitcount = 15; - } else - ibitcount--; - - if(ibitbuffer > 0x7fff) - code |= bitvalue[i-1]; - ibitbuffer <<= 1; - } - - return code; -} + unsigned short a = 1; -unsigned short Ca2mLoader::uncompress() -{ - unsigned short a=1; + do + { + if (!ibitcount) + { + if (ibufcount == MAXBUF) + ibufcount = 0; + ibitbuffer = wdbuf[ibufcount]; + ibufcount++; + ibitcount = 15; + } + else + ibitcount--; - do { - if(!ibitcount) { - if(ibufcount == MAXBUF) - ibufcount = 0; - ibitbuffer = wdbuf[ibufcount]; - ibufcount++; - ibitcount = 15; - } else - ibitcount--; + if (ibitbuffer > 0x7fff) + a = rghtc[a]; + else + a = leftc[a]; + ibitbuffer <<= 1; + } while (a <= MAXCHAR); - if(ibitbuffer > 0x7fff) - a = rghtc[a]; - else - a = leftc[a]; - ibitbuffer <<= 1; - } while(a <= MAXCHAR); - - a -= SUCCMAX; - updatemodel(a); - return a; + a -= SUCCMAX; + updatemodel (a); + return a; } -void Ca2mLoader::decode() +void +Ca2mLoader::decode () { - unsigned short i,j,k,t,c,count=0,dist,len,index; + unsigned short i, j, k, t, c, count = 0, dist, len, index; - inittree(); - c = uncompress(); + inittree (); + c = uncompress (); - while(c != TERMINATE) { - if(c < 256) { - obuf[obufcount] = (unsigned char)c; - obufcount++; - if(obufcount == MAXBUF) { - output_size = MAXBUF; - obufcount = 0; - } + while (c != TERMINATE) + { + if (c < 256) + { + obuf[obufcount] = (unsigned char) c; + obufcount++; + if (obufcount == MAXBUF) + { + output_size = MAXBUF; + obufcount = 0; + } - buf[count] = (unsigned char)c; - count++; - if(count == MAXSIZE) - count = 0; - } else { - t = c - FIRSTCODE; - index = t / CODESPERRANGE; - len = t + MINCOPY - index * CODESPERRANGE; - dist = inputcode(copybits[index]) + len + copymin[index]; + buf[count] = (unsigned char) c; + count++; + if (count == MAXSIZE) + count = 0; + } + else + { + t = c - FIRSTCODE; + index = t / CODESPERRANGE; + len = t + MINCOPY - index * CODESPERRANGE; + dist = inputcode (copybits[index]) + len + copymin[index]; - j = count; - k = count - dist; - if(count < dist) - k += MAXSIZE; + j = count; + k = count - dist; + if (count < dist) + k += MAXSIZE; - for(i=0;i<=len-1;i++) { - obuf[obufcount] = buf[k]; - obufcount++; - if(obufcount == MAXBUF) { - output_size = MAXBUF; - obufcount = 0; - } + for (i = 0; i <= len - 1; i++) + { + obuf[obufcount] = buf[k]; + obufcount++; + if (obufcount == MAXBUF) + { + output_size = MAXBUF; + obufcount = 0; + } - buf[j] = buf[k]; - j++; k++; - if(j == MAXSIZE) j = 0; - if(k == MAXSIZE) k = 0; - } + buf[j] = buf[k]; + j++; + k++; + if (j == MAXSIZE) + j = 0; + if (k == MAXSIZE) + k = 0; + } - count += len; - if(count >= MAXSIZE) - count -= MAXSIZE; - } - c = uncompress(); - } - output_size = obufcount; + count += len; + if (count >= MAXSIZE) + count -= MAXSIZE; + } + c = uncompress (); + } + output_size = obufcount; } -unsigned short Ca2mLoader::sixdepak(unsigned short *source, unsigned char *dest, - unsigned short size) +unsigned short +Ca2mLoader::sixdepak (unsigned short *source, unsigned char *dest, + unsigned short size) { - if((unsigned int)size + 4096 > MAXBUF) - return 0; + if ((unsigned int) size + 4096 > MAXBUF) + return 0; - buf = new unsigned char [MAXSIZE]; - input_size = size; - ibitcount = 0; ibitbuffer = 0; - obufcount = 0; ibufcount = 0; - wdbuf = source; obuf = dest; + buf = new unsigned char[MAXSIZE]; + input_size = size; + ibitcount = 0; + ibitbuffer = 0; + obufcount = 0; + ibufcount = 0; + wdbuf = source; + obuf = dest; - decode(); - if (buf) { delete [] buf; buf = 0; } - return output_size; + decode (); + if (buf) + { + delete[]buf; + buf = 0; + } + return output_size; } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/adl.cxx --- a/src/adplug/core/adl.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/adl.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -61,11 +61,13 @@ #else # define kDebugLevelSound 1 -static inline void warning(const char *str, ...) +static inline void +warning (const char *str, ...) { } -static inline void debugC(int i1, int i2, const char *str, ...) +static inline void +debugC (int i1, int i2, const char *str, ...) { } #endif @@ -80,88 +82,100 @@ #define CALLBACKS_PER_SECOND 72 -typedef uint8_t uint8; -typedef int8_t int8; -typedef uint16_t uint16; -typedef int16_t int16; -typedef uint32_t uint32; -typedef int32_t int32; -typedef uint8_t byte; - -static inline uint16 READ_LE_UINT16(const void *ptr) { - const byte *b = (const byte *)ptr; +typedef uint8_t uint8; +typedef int8_t int8; +typedef uint16_t uint16; +typedef int16_t int16; +typedef uint32_t uint32; +typedef int32_t int32; +typedef uint8_t byte; + +static inline uint16 +READ_LE_UINT16 (const void *ptr) +{ + const byte *b = (const byte *) ptr; return (b[1] << 8) + b[0]; } -static inline uint16 READ_BE_UINT16(const void *ptr) { - const byte *b = (const byte *)ptr; +static inline uint16 +READ_BE_UINT16 (const void *ptr) +{ + const byte *b = (const byte *) ptr; return (b[0] << 8) + b[1]; } -class AdlibDriver { +class AdlibDriver +{ public: - AdlibDriver(Copl *opl); - ~AdlibDriver(); - - int callback(int opcode, ...); - void callback(); + AdlibDriver (Copl * opl); + ~AdlibDriver (); + + int callback (int opcode, ...); + void callback (); // AudioStream API - // int readBuffer(int16 *buffer, const int numSamples) { - // int32 samplesLeft = numSamples; - // memset(buffer, 0, sizeof(int16) * numSamples); - // while (samplesLeft) { - // if (!_samplesTillCallback) { - // callback(); - // _samplesTillCallback = _samplesPerCallback; - // _samplesTillCallbackRemainder += _samplesPerCallbackRemainder; - // if (_samplesTillCallbackRemainder >= CALLBACKS_PER_SECOND) { - // _samplesTillCallback++; - // _samplesTillCallbackRemainder -= CALLBACKS_PER_SECOND; - // } - // } - - // int32 render = MIN(samplesLeft, _samplesTillCallback); - // samplesLeft -= render; - // _samplesTillCallback -= render; - // YM3812UpdateOne(_adlib, buffer, render); - // buffer += render; - // } - // return numSamples; - // } - - bool isStereo() const { return false; } - bool endOfData() const { return false; } - // int getRate() const { return _mixer->getOutputRate(); } - - struct OpcodeEntry { - typedef int (AdlibDriver::*DriverOpcode)(va_list &list); + // int readBuffer(int16 *buffer, const int numSamples) { + // int32 samplesLeft = numSamples; + // memset(buffer, 0, sizeof(int16) * numSamples); + // while (samplesLeft) { + // if (!_samplesTillCallback) { + // callback(); + // _samplesTillCallback = _samplesPerCallback; + // _samplesTillCallbackRemainder += _samplesPerCallbackRemainder; + // if (_samplesTillCallbackRemainder >= CALLBACKS_PER_SECOND) { + // _samplesTillCallback++; + // _samplesTillCallbackRemainder -= CALLBACKS_PER_SECOND; + // } + // } + + // int32 render = MIN(samplesLeft, _samplesTillCallback); + // samplesLeft -= render; + // _samplesTillCallback -= render; + // YM3812UpdateOne(_adlib, buffer, render); + // buffer += render; + // } + // return numSamples; + // } + + bool isStereo () const + { + return false; + } + bool endOfData () const + { + return false; + } + // int getRate() const { return _mixer->getOutputRate(); } + + struct OpcodeEntry + { + typedef int (AdlibDriver::*DriverOpcode) (va_list & list); DriverOpcode function; const char *name; }; - void setupOpcodeList(); + void setupOpcodeList (); const OpcodeEntry *_opcodeList; int _opcodesEntries; - int snd_ret0x100(va_list &list); - int snd_ret0x1983(va_list &list); - int snd_initDriver(va_list &list); - int snd_deinitDriver(va_list &list); - int snd_setSoundData(va_list &list); - int snd_unkOpcode1(va_list &list); - int snd_startSong(va_list &list); - int snd_unkOpcode2(va_list &list); - int snd_unkOpcode3(va_list &list); - int snd_readByte(va_list &list); - int snd_writeByte(va_list &list); - int snd_getSoundTrigger(va_list &list); - int snd_unkOpcode4(va_list &list); - int snd_dummy(va_list &list); - int snd_getNullvar4(va_list &list); - int snd_setNullvar3(va_list &list); - int snd_setFlag(va_list &list); - int snd_clearFlag(va_list &list); + int snd_ret0x100 (va_list & list); + int snd_ret0x1983 (va_list & list); + int snd_initDriver (va_list & list); + int snd_deinitDriver (va_list & list); + int snd_setSoundData (va_list & list); + int snd_unkOpcode1 (va_list & list); + int snd_startSong (va_list & list); + int snd_unkOpcode2 (va_list & list); + int snd_unkOpcode3 (va_list & list); + int snd_readByte (va_list & list); + int snd_writeByte (va_list & list); + int snd_getSoundTrigger (va_list & list); + int snd_unkOpcode4 (va_list & list); + int snd_dummy (va_list & list); + int snd_getNullvar4 (va_list & list); + int snd_setNullvar3 (va_list & list); + int snd_setFlag (va_list & list); + int snd_clearFlag (va_list & list); // These variables have not yet been named, but some of them are partly // known nevertheless: @@ -186,7 +200,8 @@ // unk40 - Currently unused, except for updateCallback56() // unk41 - Sound-effect. Used for primaryEffect2() - struct Channel { + struct Channel + { uint8 opExtraLevel2; uint8 *dataptr; uint8 duration; @@ -214,7 +229,7 @@ uint8 position; uint8 regAx; uint8 regBx; - typedef void (AdlibDriver::*Callback)(Channel&); + typedef void (AdlibDriver::*Callback) (Channel &); Callback primaryEffect; Callback secondaryEffect; uint8 fractionalSpacing; @@ -222,7 +237,7 @@ uint8 opLevel2; uint8 opExtraLevel3; uint8 twoChan; - uint8 unk39; + uint8 unk39; uint8 unk40; uint8 spacing1; uint8 durationRandomness; @@ -237,29 +252,30 @@ int8 unk16; }; - void primaryEffect1(Channel &channel); - void primaryEffect2(Channel &channel); - void secondaryEffect1(Channel &channel); - - void resetAdlibState(); - void writeOPL(byte reg, byte val); - void initChannel(Channel &channel); - void noteOff(Channel &channel); - void unkOutput2(uint8 num); - - uint16 getRandomNr(); - void setupDuration(uint8 duration, Channel &channel); - - void setupNote(uint8 rawNote, Channel &channel, bool flag = false); - void setupInstrument(uint8 regOffset, uint8 *dataptr, Channel &channel); - void noteOn(Channel &channel); - - void adjustVolume(Channel &channel); - - uint8 calculateOpLevel1(Channel &channel); - uint8 calculateOpLevel2(Channel &channel); - - uint16 checkValue(int16 val) { + void primaryEffect1 (Channel & channel); + void primaryEffect2 (Channel & channel); + void secondaryEffect1 (Channel & channel); + + void resetAdlibState (); + void writeOPL (byte reg, byte val); + void initChannel (Channel & channel); + void noteOff (Channel & channel); + void unkOutput2 (uint8 num); + + uint16 getRandomNr (); + void setupDuration (uint8 duration, Channel & channel); + + void setupNote (uint8 rawNote, Channel & channel, bool flag = false); + void setupInstrument (uint8 regOffset, uint8 * dataptr, Channel & channel); + void noteOn (Channel & channel); + + void adjustVolume (Channel & channel); + + uint8 calculateOpLevel1 (Channel & channel); + uint8 calculateOpLevel2 (Channel & channel); + + uint16 checkValue (int16 val) + { if (val < 0) val = 0; else if (val > 0x3F) @@ -272,83 +288,115 @@ // * One for programs, starting at offset 0. // * One for instruments, starting at offset 500. - uint8 *getProgram(int progId) { - return _soundData + READ_LE_UINT16(_soundData + 2 * progId); + uint8 *getProgram (int progId) + { + return _soundData + READ_LE_UINT16 (_soundData + 2 * progId); } - uint8 *getInstrument(int instrumentId) { - return _soundData + READ_LE_UINT16(_soundData + 500 + 2 * instrumentId); + uint8 *getInstrument (int instrumentId) + { + return _soundData + READ_LE_UINT16 (_soundData + 500 + 2 * instrumentId); } - void setupPrograms(); - void executePrograms(); - - struct ParserOpcode { - typedef int (AdlibDriver::*POpcode)(uint8 *&dataptr, Channel &channel, uint8 value); + void setupPrograms (); + void executePrograms (); + + struct ParserOpcode + { + typedef int (AdlibDriver::*POpcode) (uint8 * &dataptr, Channel & channel, + uint8 value); POpcode function; const char *name; }; - void setupParserOpcodeTable(); + void setupParserOpcodeTable (); const ParserOpcode *_parserOpcodeTable; int _parserOpcodeTableSize; - int update_setRepeat(uint8 *&dataptr, Channel &channel, uint8 value); - int update_checkRepeat(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setupProgram(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setNoteSpacing(uint8 *&dataptr, Channel &channel, uint8 value); - int update_jump(uint8 *&dataptr, Channel &channel, uint8 value); - int update_jumpToSubroutine(uint8 *&dataptr, Channel &channel, uint8 value); - int update_returnFromSubroutine(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setBaseOctave(uint8 *&dataptr, Channel &channel, uint8 value); - int update_stopChannel(uint8 *&dataptr, Channel &channel, uint8 value); - int update_playRest(uint8 *&dataptr, Channel &channel, uint8 value); - int update_writeAdlib(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setupNoteAndDuration(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setBaseNote(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setupSecondaryEffect1(uint8 *&dataptr, Channel &channel, uint8 value); - int update_stopOtherChannel(uint8 *&dataptr, Channel &channel, uint8 value); - int update_waitForEndOfProgram(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setupInstrument(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setupPrimaryEffect1(uint8 *&dataptr, Channel &channel, uint8 value); - int update_removePrimaryEffect1(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setBaseFreq(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setupPrimaryEffect2(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setPriority(uint8 *&dataptr, Channel &channel, uint8 value); - int updateCallback23(uint8 *&dataptr, Channel &channel, uint8 value); - int updateCallback24(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setExtraLevel1(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setupDuration(uint8 *&dataptr, Channel &channel, uint8 value); - int update_playNote(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setFractionalNoteSpacing(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setTempo(uint8 *&dataptr, Channel &channel, uint8 value); - int update_removeSecondaryEffect1(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setChannelTempo(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setExtraLevel3(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setExtraLevel2(uint8 *&dataptr, Channel &channel, uint8 value); - int update_changeExtraLevel2(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setAMDepth(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setVibratoDepth(uint8 *&dataptr, Channel &channel, uint8 value); - int update_changeExtraLevel1(uint8 *&dataptr, Channel &channel, uint8 value); - int updateCallback38(uint8 *&dataptr, Channel &channel, uint8 value); - int updateCallback39(uint8 *&dataptr, Channel &channel, uint8 value); - int update_removePrimaryEffect2(uint8 *&dataptr, Channel &channel, uint8 value); - int updateCallback41(uint8 *&dataptr, Channel &channel, uint8 value); - int update_resetToGlobalTempo(uint8 *&dataptr, Channel &channel, uint8 value); - int update_nop1(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setDurationRandomness(uint8 *&dataptr, Channel &channel, uint8 value); - int update_changeChannelTempo(uint8 *&dataptr, Channel &channel, uint8 value); - int updateCallback46(uint8 *&dataptr, Channel &channel, uint8 value); - int update_nop2(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setupRhythmSection(uint8 *&dataptr, Channel &channel, uint8 value); - int update_playRhythmSection(uint8 *&dataptr, Channel &channel, uint8 value); - int update_removeRhythmSection(uint8 *&dataptr, Channel &channel, uint8 value); - int updateCallback51(uint8 *&dataptr, Channel &channel, uint8 value); - int updateCallback52(uint8 *&dataptr, Channel &channel, uint8 value); - int updateCallback53(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setSoundTrigger(uint8 *&dataptr, Channel &channel, uint8 value); - int update_setTempoReset(uint8 *&dataptr, Channel &channel, uint8 value); - int updateCallback56(uint8 *&dataptr, Channel &channel, uint8 value); + int update_setRepeat (uint8 * &dataptr, Channel & channel, uint8 value); + int update_checkRepeat (uint8 * &dataptr, Channel & channel, uint8 value); + int update_setupProgram (uint8 * &dataptr, Channel & channel, uint8 value); + int update_setNoteSpacing (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_jump (uint8 * &dataptr, Channel & channel, uint8 value); + int update_jumpToSubroutine (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_returnFromSubroutine (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_setBaseOctave (uint8 * &dataptr, Channel & channel, uint8 value); + int update_stopChannel (uint8 * &dataptr, Channel & channel, uint8 value); + int update_playRest (uint8 * &dataptr, Channel & channel, uint8 value); + int update_writeAdlib (uint8 * &dataptr, Channel & channel, uint8 value); + int update_setupNoteAndDuration (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_setBaseNote (uint8 * &dataptr, Channel & channel, uint8 value); + int update_setupSecondaryEffect1 (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_stopOtherChannel (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_waitForEndOfProgram (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_setupInstrument (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_setupPrimaryEffect1 (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_removePrimaryEffect1 (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_setBaseFreq (uint8 * &dataptr, Channel & channel, uint8 value); + int update_setupPrimaryEffect2 (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_setPriority (uint8 * &dataptr, Channel & channel, uint8 value); + int updateCallback23 (uint8 * &dataptr, Channel & channel, uint8 value); + int updateCallback24 (uint8 * &dataptr, Channel & channel, uint8 value); + int update_setExtraLevel1 (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_setupDuration (uint8 * &dataptr, Channel & channel, uint8 value); + int update_playNote (uint8 * &dataptr, Channel & channel, uint8 value); + int update_setFractionalNoteSpacing (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_setTempo (uint8 * &dataptr, Channel & channel, uint8 value); + int update_removeSecondaryEffect1 (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_setChannelTempo (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_setExtraLevel3 (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_setExtraLevel2 (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_changeExtraLevel2 (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_setAMDepth (uint8 * &dataptr, Channel & channel, uint8 value); + int update_setVibratoDepth (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_changeExtraLevel1 (uint8 * &dataptr, Channel & channel, + uint8 value); + int updateCallback38 (uint8 * &dataptr, Channel & channel, uint8 value); + int updateCallback39 (uint8 * &dataptr, Channel & channel, uint8 value); + int update_removePrimaryEffect2 (uint8 * &dataptr, Channel & channel, + uint8 value); + int updateCallback41 (uint8 * &dataptr, Channel & channel, uint8 value); + int update_resetToGlobalTempo (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_nop1 (uint8 * &dataptr, Channel & channel, uint8 value); + int update_setDurationRandomness (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_changeChannelTempo (uint8 * &dataptr, Channel & channel, + uint8 value); + int updateCallback46 (uint8 * &dataptr, Channel & channel, uint8 value); + int update_nop2 (uint8 * &dataptr, Channel & channel, uint8 value); + int update_setupRhythmSection (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_playRhythmSection (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_removeRhythmSection (uint8 * &dataptr, Channel & channel, + uint8 value); + int updateCallback51 (uint8 * &dataptr, Channel & channel, uint8 value); + int updateCallback52 (uint8 * &dataptr, Channel & channel, uint8 value); + int updateCallback53 (uint8 * &dataptr, Channel & channel, uint8 value); + int update_setSoundTrigger (uint8 * &dataptr, Channel & channel, + uint8 value); + int update_setTempoReset (uint8 * &dataptr, Channel & channel, uint8 value); + int updateCallback56 (uint8 * &dataptr, Channel & channel, uint8 value); // These variables have not yet been named, but some of them are partly // known nevertheless: @@ -440,19 +488,18 @@ Copl *opl; }; -AdlibDriver::AdlibDriver(Copl *newopl) - : opl(newopl) +AdlibDriver::AdlibDriver (Copl * newopl):opl (newopl) { - setupOpcodeList(); - setupParserOpcodeTable(); - - // _mixer = mixer; + setupOpcodeList (); + setupParserOpcodeTable (); + + // _mixer = mixer; _flags = 0; - // _adlib = makeAdlibOPL(getRate()); - // assert(_adlib); - - memset(_channels, 0, sizeof(_channels)); + // _adlib = makeAdlibOPL(getRate()); + // assert(_adlib); + + memset (_channels, 0, sizeof (_channels)); _soundData = 0; _vibratoAndAMDepthBits = _curRegOffset = 0; @@ -472,87 +519,111 @@ _tablePtr1 = _tablePtr2 = 0; - // _mixer->setupPremix(this); - - // _samplesPerCallback = getRate() / CALLBACKS_PER_SECOND; - // _samplesPerCallbackRemainder = getRate() % CALLBACKS_PER_SECOND; + // _mixer->setupPremix(this); + + // _samplesPerCallback = getRate() / CALLBACKS_PER_SECOND; + // _samplesPerCallbackRemainder = getRate() % CALLBACKS_PER_SECOND; _samplesTillCallback = 0; _samplesTillCallbackRemainder = 0; } -AdlibDriver::~AdlibDriver() { - // _mixer->setupPremix(0); - // OPLDestroy(_adlib); - // _adlib = 0; +AdlibDriver::~AdlibDriver () +{ + // _mixer->setupPremix(0); + // OPLDestroy(_adlib); + // _adlib = 0; } -int AdlibDriver::callback(int opcode, ...) { - // lock(); - if (opcode >= _opcodesEntries || opcode < 0) { - warning("AdlibDriver: calling unknown opcode '%d'", opcode); +int +AdlibDriver::callback (int opcode, ...) +{ + // lock(); + if (opcode >= _opcodesEntries || opcode < 0) + { + warning ("AdlibDriver: calling unknown opcode '%d'", opcode); return 0; } - debugC(9, kDebugLevelSound, "Calling opcode '%s' (%d)", _opcodeList[opcode].name, opcode); + debugC (9, kDebugLevelSound, "Calling opcode '%s' (%d)", + _opcodeList[opcode].name, opcode); va_list args; - va_start(args, opcode); - int returnValue = (this->*(_opcodeList[opcode].function))(args); - va_end(args); - // unlock(); + va_start (args, opcode); + int returnValue = (this->*(_opcodeList[opcode].function)) (args); + va_end (args); + // unlock(); return returnValue; } // Opcodes -int AdlibDriver::snd_ret0x100(va_list &list) { +int +AdlibDriver::snd_ret0x100 (va_list & list) +{ return 0x100; } -int AdlibDriver::snd_ret0x1983(va_list &list) { +int +AdlibDriver::snd_ret0x1983 (va_list & list) +{ return 0x1983; } -int AdlibDriver::snd_initDriver(va_list &list) { +int +AdlibDriver::snd_initDriver (va_list & list) +{ _lastProcessed = _soundsPlaying = 0; - resetAdlibState(); + resetAdlibState (); return 0; } -int AdlibDriver::snd_deinitDriver(va_list &list) { - resetAdlibState(); +int +AdlibDriver::snd_deinitDriver (va_list & list) +{ + resetAdlibState (); return 0; } -int AdlibDriver::snd_setSoundData(va_list &list) { - if (_soundData) { - delete [] _soundData; +int +AdlibDriver::snd_setSoundData (va_list & list) +{ + if (_soundData) + { + delete[]_soundData; _soundData = 0; } - _soundData = va_arg(list, uint8*); + _soundData = va_arg (list, uint8 *); return 0; } -int AdlibDriver::snd_unkOpcode1(va_list &list) { - warning("unimplemented snd_unkOpcode1"); +int +AdlibDriver::snd_unkOpcode1 (va_list & list) +{ + warning ("unimplemented snd_unkOpcode1"); return 0; } -int AdlibDriver::snd_startSong(va_list &list) { - int songId = va_arg(list, int); +int +AdlibDriver::snd_startSong (va_list & list) +{ + int songId = va_arg (list, int); _flags |= 8; _flagTrigger = 1; - uint8 *ptr = getProgram(songId); + uint8 *ptr = getProgram (songId); uint8 chan = *ptr; - if ((songId << 1) != 0) { - if (chan == 9) { + if ((songId << 1) != 0) + { + if (chan == 9) + { if (_flags & 2) - return 0; - } else { + return 0; + } + else + { if (_flags & 1) - return 0; + return 0; } } @@ -562,28 +633,35 @@ return 0; } -int AdlibDriver::snd_unkOpcode2(va_list &list) { - warning("unimplemented snd_unkOpcode2"); +int +AdlibDriver::snd_unkOpcode2 (va_list & list) +{ + warning ("unimplemented snd_unkOpcode2"); return 0; } -int AdlibDriver::snd_unkOpcode3(va_list &list) { - int value = va_arg(list, int); +int +AdlibDriver::snd_unkOpcode3 (va_list & list) +{ + int value = va_arg (list, int); int loop = value; - if (value < 0) { + if (value < 0) + { value = 0; loop = 9; } loop -= value; ++loop; - while (loop--) { + while (loop--) + { _curChannel = value; - Channel &channel = _channels[_curChannel]; + Channel & channel = _channels[_curChannel]; channel.priority = 0; channel.dataptr = 0; - if (value != 9) { - noteOff(channel); + if (value != 9) + { + noteOff (channel); } ++value; } @@ -591,98 +669,124 @@ return 0; } -int AdlibDriver::snd_readByte(va_list &list) { - int a = va_arg(list, int); - int b = va_arg(list, int); - uint8 *ptr = getProgram(a) + b; +int +AdlibDriver::snd_readByte (va_list & list) +{ + int a = va_arg (list, int); + int b = va_arg (list, int); + uint8 *ptr = getProgram (a) + b; return *ptr; } -int AdlibDriver::snd_writeByte(va_list &list) { - int a = va_arg(list, int); - int b = va_arg(list, int); - int c = va_arg(list, int); - uint8 *ptr = getProgram(a) + b; +int +AdlibDriver::snd_writeByte (va_list & list) +{ + int a = va_arg (list, int); + int b = va_arg (list, int); + int c = va_arg (list, int); + uint8 *ptr = getProgram (a) + b; uint8 oldValue = *ptr; - *ptr = (uint8)c; + *ptr = (uint8) c; return oldValue; } -int AdlibDriver::snd_getSoundTrigger(va_list &list) { +int +AdlibDriver::snd_getSoundTrigger (va_list & list) +{ return _soundTrigger; } -int AdlibDriver::snd_unkOpcode4(va_list &list) { - warning("unimplemented snd_unkOpcode4"); +int +AdlibDriver::snd_unkOpcode4 (va_list & list) +{ + warning ("unimplemented snd_unkOpcode4"); return 0; } -int AdlibDriver::snd_dummy(va_list &list) { +int +AdlibDriver::snd_dummy (va_list & list) +{ return 0; } -int AdlibDriver::snd_getNullvar4(va_list &list) { - warning("unimplemented snd_getNullvar4"); +int +AdlibDriver::snd_getNullvar4 (va_list & list) +{ + warning ("unimplemented snd_getNullvar4"); return 0; } -int AdlibDriver::snd_setNullvar3(va_list &list) { - warning("unimplemented snd_setNullvar3"); +int +AdlibDriver::snd_setNullvar3 (va_list & list) +{ + warning ("unimplemented snd_setNullvar3"); return 0; } -int AdlibDriver::snd_setFlag(va_list &list) { +int +AdlibDriver::snd_setFlag (va_list & list) +{ int oldFlags = _flags; - _flags |= va_arg(list, int); + _flags |= va_arg (list, int); return oldFlags; } -int AdlibDriver::snd_clearFlag(va_list &list) { +int +AdlibDriver::snd_clearFlag (va_list & list) +{ int oldFlags = _flags; - _flags &= ~(va_arg(list, int)); + _flags &= ~(va_arg (list, int)); return oldFlags; } // timer callback -void AdlibDriver::callback() { - // lock(); +void +AdlibDriver::callback () +{ + // lock(); --_flagTrigger; if (_flagTrigger < 0) _flags &= ~8; - setupPrograms(); - executePrograms(); + setupPrograms (); + executePrograms (); uint8 temp = _unkValue3; _unkValue3 += _tempo; - if (_unkValue3 < temp) { - if (!(--_unkValue2)) { + if (_unkValue3 < temp) + { + if (!(--_unkValue2)) + { _unkValue2 = _unkValue1; ++_unkValue4; } } - // unlock(); + // unlock(); } -void AdlibDriver::setupPrograms() { - while (_lastProcessed != _soundsPlaying) { - uint8 *ptr = getProgram(_soundIdTable[_lastProcessed]); +void +AdlibDriver::setupPrograms () +{ + while (_lastProcessed != _soundsPlaying) + { + uint8 *ptr = getProgram (_soundIdTable[_lastProcessed]); uint8 chan = *ptr++; uint8 priority = *ptr++; // Only start this sound if its priority is higher than the one // already playing. - Channel &channel = _channels[chan]; - - if (priority >= channel.priority) { - initChannel(channel); + Channel & channel = _channels[chan]; + + if (priority >= channel.priority) + { + initChannel (channel); channel.priority = priority; channel.dataptr = ptr; channel.tempo = 0xFF; channel.position = 0xFF; channel.duration = 1; - unkOutput2(chan); + unkOutput2 (chan); } ++_lastProcessed; @@ -724,116 +828,147 @@ // effects callbacks. The final opcode in a set can prevent this, if it's a // function and it returns anything other than 1. -void AdlibDriver::executePrograms() { +void +AdlibDriver::executePrograms () +{ // Each channel runs its own program. There are ten channels: One for // each Adlib channel (0-8), plus one "control channel" (9) which is // the one that tells the other channels what to do. - for (_curChannel = 9; _curChannel >= 0; --_curChannel) { + for (_curChannel = 9; _curChannel >= 0; --_curChannel) + { int result = 1; - if (!_channels[_curChannel].dataptr) { + if (!_channels[_curChannel].dataptr) + { continue; } - - Channel &channel = _channels[_curChannel]; + + Channel & channel = _channels[_curChannel]; _curRegOffset = _regOffset[_curChannel]; - if (channel.tempoReset) { + if (channel.tempoReset) + { channel.tempo = _tempo; } uint8 backup = channel.position; channel.position += channel.tempo; - if (channel.position < backup) { - if (--channel.duration) { - if (channel.duration == channel.spacing2) - noteOff(channel); - if (channel.duration == channel.spacing1 && _curChannel != 9) - noteOff(channel); - } else { - // An opcode is not allowed to modify its own - // data pointer except through the 'dataptr' - // parameter. To enforce that, we have to work - // on a copy of the data pointer. - // - // This fixes a subtle music bug where the - // wrong music would play when getting the - // quill in Kyra 1. - uint8 *dataptr = channel.dataptr; - while (dataptr) { - uint8 opcode = *dataptr++; - uint8 param = *dataptr++; - - if (opcode & 0x80) { - opcode &= 0x7F; - if (opcode >= _parserOpcodeTableSize) - opcode = _parserOpcodeTableSize - 1; - debugC(9, kDebugLevelSound, "Calling opcode '%s' (%d) (channel: %d)", _parserOpcodeTable[opcode].name, opcode, _curChannel); - result = (this->*(_parserOpcodeTable[opcode].function))(dataptr, channel, param); - channel.dataptr = dataptr; - if (result) - break; - } else { - debugC(9, kDebugLevelSound, "Note on opcode 0x%02X (duration: %d) (channel: %d)", opcode, param, _curChannel); - setupNote(opcode, channel); - noteOn(channel); - setupDuration(param, channel); - if (param) { - channel.dataptr = dataptr; - break; - } - } - } + if (channel.position < backup) + { + if (--channel.duration) + { + if (channel.duration == channel.spacing2) + noteOff (channel); + if (channel.duration == channel.spacing1 && _curChannel != 9) + noteOff (channel); + } + else + { + // An opcode is not allowed to modify its own + // data pointer except through the 'dataptr' + // parameter. To enforce that, we have to work + // on a copy of the data pointer. + // + // This fixes a subtle music bug where the + // wrong music would play when getting the + // quill in Kyra 1. + uint8 *dataptr = channel.dataptr; + while (dataptr) + { + uint8 opcode = *dataptr++; + uint8 param = *dataptr++; + + if (opcode & 0x80) + { + opcode &= 0x7F; + if (opcode >= _parserOpcodeTableSize) + opcode = _parserOpcodeTableSize - 1; + debugC (9, kDebugLevelSound, + "Calling opcode '%s' (%d) (channel: %d)", + _parserOpcodeTable[opcode].name, opcode, _curChannel); + result = + (this->*(_parserOpcodeTable[opcode].function)) (dataptr, + channel, param); + channel.dataptr = dataptr; + if (result) + break; + } + else + { + debugC (9, kDebugLevelSound, + "Note on opcode 0x%02X (duration: %d) (channel: %d)", + opcode, param, _curChannel); + setupNote (opcode, channel); + noteOn (channel); + setupDuration (param, channel); + if (param) + { + channel.dataptr = dataptr; + break; + } + } + } } } - if (result == 1) { + if (result == 1) + { if (channel.primaryEffect) - (this->*(channel.primaryEffect))(channel); + (this->*(channel.primaryEffect)) (channel); if (channel.secondaryEffect) - (this->*(channel.secondaryEffect))(channel); + (this->*(channel.secondaryEffect)) (channel); } } } // -void AdlibDriver::resetAdlibState() { - debugC(9, kDebugLevelSound, "resetAdlibState()"); +void +AdlibDriver::resetAdlibState () +{ + debugC (9, kDebugLevelSound, "resetAdlibState()"); _rnd = 0x1234; // Authorize the control of the waveforms - writeOPL(0x01, 0x20); + writeOPL (0x01, 0x20); // Select FM music mode - writeOPL(0x08, 0x00); + writeOPL (0x08, 0x00); // I would guess the main purpose of this is to turn off the rhythm, // thus allowing us to use 9 melodic voices instead of 6. - writeOPL(0xBD, 0x00); + writeOPL (0xBD, 0x00); int loop = 10; - while (loop--) { - if (loop != 9) { + while (loop--) + { + if (loop != 9) + { // Silence the channel - writeOPL(0x40 + _regOffset[loop], 0x3F); - writeOPL(0x43 + _regOffset[loop], 0x3F); + writeOPL (0x40 + _regOffset[loop], 0x3F); + writeOPL (0x43 + _regOffset[loop], 0x3F); } - initChannel(_channels[loop]); + initChannel (_channels[loop]); } } // Old calling style: output0x388(0xABCD) // New calling style: writeOPL(0xAB, 0xCD) -void AdlibDriver::writeOPL(byte reg, byte val) { - opl->write(reg, val); +void +AdlibDriver::writeOPL (byte reg, byte val) +{ + opl->write (reg, val); } -void AdlibDriver::initChannel(Channel &channel) { - debugC(9, kDebugLevelSound, "initChannel(%lu)", (long)(&channel - _channels)); - memset(&channel.dataptr, 0, sizeof(Channel) - ((char*)&channel.dataptr - (char*)&channel)); +void +AdlibDriver::initChannel (Channel & channel) +{ + debugC (9, kDebugLevelSound, "initChannel(%lu)", + (long) (&channel - _channels)); + memset (&channel.dataptr, 0, + sizeof (Channel) - ((char *) &channel.dataptr - (char *) &channel)); channel.tempo = 0xFF; channel.priority = 0; @@ -843,8 +978,10 @@ channel.spacing1 = 1; } -void AdlibDriver::noteOff(Channel &channel) { - debugC(9, kDebugLevelSound, "noteOff(%lu)", (long)(&channel - _channels)); +void +AdlibDriver::noteOff (Channel & channel) +{ + debugC (9, kDebugLevelSound, "noteOff(%lu)", (long) (&channel - _channels)); // The control channel has no corresponding Adlib channel @@ -860,11 +997,13 @@ channel.regBx &= 0xDF; // Octave / F-Number / Key-On - writeOPL(0xB0 + _curChannel, channel.regBx); + writeOPL (0xB0 + _curChannel, channel.regBx); } -void AdlibDriver::unkOutput2(uint8 chan) { - debugC(9, kDebugLevelSound, "unkOutput2(%d)", chan); +void +AdlibDriver::unkOutput2 (uint8 chan) +{ + debugC (9, kDebugLevelSound, "unkOutput2(%d)", chan); // The control channel has no corresponding Adlib channel @@ -882,13 +1021,13 @@ // The channel is cleared: First the attack/delay rate, then the // sustain level/release rate, and finally the note is turned off. - writeOPL(0x60 + offset, 0xFF); - writeOPL(0x63 + offset, 0xFF); - - writeOPL(0x80 + offset, 0xFF); - writeOPL(0x83 + offset, 0xFF); - - writeOPL(0xB0 + chan, 0x00); + writeOPL (0x60 + offset, 0xFF); + writeOPL (0x63 + offset, 0xFF); + + writeOPL (0x80 + offset, 0xFF); + writeOPL (0x83 + offset, 0xFF); + + writeOPL (0xB0 + chan, 0x00); // ...and then the note is turned on again, with whatever value is // still lurking in the A0 + chan register, but everything else - @@ -907,14 +1046,16 @@ // http://www.advsys.net/ken - and as part of AdPlug) also seems to be // immune, but is apparently not as feature complete as MAME's. - writeOPL(0xB0 + chan, 0x20); + writeOPL (0xB0 + chan, 0x20); } // I believe this is a random number generator. It actually does seem to // generate an even distribution of almost all numbers from 0 through 65535, // though in my tests some numbers were never generated. -uint16 AdlibDriver::getRandomNr() { +uint16 +AdlibDriver::getRandomNr () +{ _rnd += 0x9248; uint16 lowBits = _rnd & 7; _rnd >>= 3; @@ -922,13 +1063,19 @@ return _rnd; } -void AdlibDriver::setupDuration(uint8 duration, Channel &channel) { - debugC(9, kDebugLevelSound, "setupDuration(%d, %lu)", duration, (long)(&channel - _channels)); - if (channel.durationRandomness) { - channel.duration = duration + (getRandomNr() & channel.durationRandomness); +void +AdlibDriver::setupDuration (uint8 duration, Channel & channel) +{ + debugC (9, kDebugLevelSound, "setupDuration(%d, %lu)", duration, + (long) (&channel - _channels)); + if (channel.durationRandomness) + { + channel.duration = + duration + (getRandomNr () & channel.durationRandomness); return; } - if (channel.fractionalSpacing) { + if (channel.fractionalSpacing) + { channel.spacing2 = (duration >> 3) * channel.fractionalSpacing; } channel.duration = duration; @@ -937,8 +1084,11 @@ // This function may or may not play the note. It's usually followed by a call // to noteOn(), which will always play the current note. -void AdlibDriver::setupNote(uint8 rawNote, Channel &channel, bool flag) { - debugC(9, kDebugLevelSound, "setupNote(%d, %lu)", rawNote, (long)(&channel - _channels)); +void +AdlibDriver::setupNote (uint8 rawNote, Channel & channel, bool flag) +{ + debugC (9, kDebugLevelSound, "setupNote(%d, %lu)", rawNote, + (long) (&channel - _channels)); channel.rawNote = rawNote; @@ -948,10 +1098,13 @@ // There are only twelve notes. If we go outside that, we have to // adjust the note and octave. - if (note >= 12) { + if (note >= 12) + { note -= 12; octave++; - } else if (note < 0) { + } + else if (note < 0) + { note += 12; octave--; } @@ -971,32 +1124,41 @@ // When called from callback 41, the behaviour is slightly different: // We adjust the frequency, even when channel.unk16 is 0. - if (channel.unk16 || flag) { + if (channel.unk16 || flag) + { const uint8 *table; - if (channel.unk16 >= 0) { + if (channel.unk16 >= 0) + { table = _unkTables[(channel.rawNote & 0x0F) + 2]; freq += table[channel.unk16]; - } else { + } + else + { table = _unkTables[channel.rawNote & 0x0F]; freq -= table[-channel.unk16]; } } channel.regAx = freq & 0xFF; - channel.regBx = (channel.regBx & 0x20) | (octave << 2) | ((freq >> 8) & 0x03); + channel.regBx = + (channel.regBx & 0x20) | (octave << 2) | ((freq >> 8) & 0x03); // Keep the note on or off - writeOPL(0xA0 + _curChannel, channel.regAx); - writeOPL(0xB0 + _curChannel, channel.regBx); + writeOPL (0xA0 + _curChannel, channel.regAx); + writeOPL (0xB0 + _curChannel, channel.regBx); } -void AdlibDriver::setupInstrument(uint8 regOffset, uint8 *dataptr, Channel &channel) { - debugC(9, kDebugLevelSound, "setupInstrument(%d, %p, %lu)", regOffset, (const void *)dataptr, (long)(&channel - _channels)); +void +AdlibDriver::setupInstrument (uint8 regOffset, uint8 * dataptr, + Channel & channel) +{ + debugC (9, kDebugLevelSound, "setupInstrument(%d, %p, %lu)", regOffset, + (const void *) dataptr, (long) (&channel - _channels)); // Amplitude Modulation / Vibrato / Envelope Generator Type / // Keyboard Scaling Rate / Modulator Frequency Multiple - writeOPL(0x20 + regOffset, *dataptr++); - writeOPL(0x23 + regOffset, *dataptr++); + writeOPL (0x20 + regOffset, *dataptr++); + writeOPL (0x23 + regOffset, *dataptr++); uint8 temp = *dataptr++; @@ -1005,7 +1167,7 @@ // It is very likely that _curChannel really does refer to the same // channel as regOffset, but there's only one Cx register per channel. - writeOPL(0xC0 + _curChannel, temp); + writeOPL (0xC0 + _curChannel, temp); // The algorithm bit. I don't pretend to understand this fully, but // "If set to 0, operator 1 modulates operator 2. In this case, @@ -1016,35 +1178,37 @@ channel.twoChan = temp & 1; // Waveform Select - writeOPL(0xE0 + regOffset, *dataptr++); - writeOPL(0xE3 + regOffset, *dataptr++); + writeOPL (0xE0 + regOffset, *dataptr++); + writeOPL (0xE3 + regOffset, *dataptr++); channel.opLevel1 = *dataptr++; channel.opLevel2 = *dataptr++; // Level Key Scaling / Total Level - writeOPL(0x40 + regOffset, calculateOpLevel1(channel)); - writeOPL(0x43 + regOffset, calculateOpLevel2(channel)); + writeOPL (0x40 + regOffset, calculateOpLevel1 (channel)); + writeOPL (0x43 + regOffset, calculateOpLevel2 (channel)); // Attack Rate / Decay Rate - writeOPL(0x60 + regOffset, *dataptr++); - writeOPL(0x63 + regOffset, *dataptr++); + writeOPL (0x60 + regOffset, *dataptr++); + writeOPL (0x63 + regOffset, *dataptr++); // Sustain Level / Release Rate - writeOPL(0x80 + regOffset, *dataptr++); - writeOPL(0x83 + regOffset, *dataptr++); + writeOPL (0x80 + regOffset, *dataptr++); + writeOPL (0x83 + regOffset, *dataptr++); } // Apart from playing the note, this function also updates the variables for // primary effect 2. -void AdlibDriver::noteOn(Channel &channel) { - debugC(9, kDebugLevelSound, "noteOn(%lu)", (long)(&channel - _channels)); +void +AdlibDriver::noteOn (Channel & channel) +{ + debugC (9, kDebugLevelSound, "noteOn(%lu)", (long) (&channel - _channels)); // The "note on" bit is set, and the current note is played. channel.regBx |= 0x20; - writeOPL(0xB0 + _curChannel, channel.regBx); + writeOPL (0xB0 + _curChannel, channel.regBx); int8 shift = 9 - channel.unk33; uint16 temp = channel.regAx | (channel.regBx << 8); @@ -1052,13 +1216,16 @@ channel.unk38 = channel.unk36; } -void AdlibDriver::adjustVolume(Channel &channel) { - debugC(9, kDebugLevelSound, "adjustVolume(%lu)", (long)(&channel - _channels)); +void +AdlibDriver::adjustVolume (Channel & channel) +{ + debugC (9, kDebugLevelSound, "adjustVolume(%lu)", + (long) (&channel - _channels)); // Level Key Scaling / Total Level - writeOPL(0x43 + _regOffset[_curChannel], calculateOpLevel2(channel)); + writeOPL (0x43 + _regOffset[_curChannel], calculateOpLevel2 (channel)); if (channel.twoChan) - writeOPL(0x40 + _regOffset[_curChannel], calculateOpLevel1(channel)); + writeOPL (0x40 + _regOffset[_curChannel], calculateOpLevel1 (channel)); } // This is presumably only used for some sound effects, e.g. Malcolm blowing up @@ -1077,8 +1244,11 @@ // unk30 - modifies the frequency // unk31 - determines how often the notes are played -void AdlibDriver::primaryEffect1(Channel &channel) { - debugC(9, kDebugLevelSound, "Calling primaryEffect1 (channel: %d)", _curChannel); +void +AdlibDriver::primaryEffect1 (Channel & channel) +{ + debugC (9, kDebugLevelSound, "Calling primaryEffect1 (channel: %d)", + _curChannel); uint8 temp = channel.unk31; channel.unk31 += channel.unk29; if (channel.unk31 >= temp) @@ -1091,27 +1261,32 @@ // that it won't be affected by any of the calculations below. uint16 unk2 = ((channel.regBx & 0x20) << 8) | (channel.regBx & 0x1C); - int16 unk3 = (int16)channel.unk30; - - if (unk3 >= 0) { + int16 unk3 = (int16) channel.unk30; + + if (unk3 >= 0) + { unk1 += unk3; - if (unk1 >= 734) { + if (unk1 >= 734) + { // The new frequency is too high. Shift it down and go // up one octave. unk1 >>= 1; if (!(unk1 & 0x3FF)) - ++unk1; + ++unk1; unk2 = (unk2 & 0xFF00) | ((unk2 + 4) & 0xFF); unk2 &= 0xFF1C; } - } else { + } + else + { unk1 += unk3; - if (unk1 < 388) { + if (unk1 < 388) + { // The new frequency is too low. Shift it up and go // down one octave. unk1 <<= 1; if (!(unk1 & 0x3FF)) - --unk1; + --unk1; unk2 = (unk2 & 0xFF00) | ((unk2 - 4) & 0xFF); unk2 &= 0xFF1C; } @@ -1120,7 +1295,7 @@ // Make sure that the new frequency is still a 10-bit value. unk1 &= 0x3FF; - writeOPL(0xA0 + _curChannel, unk1 & 0xFF); + writeOPL (0xA0 + _curChannel, unk1 & 0xFF); channel.regAx = unk1 & 0xFF; // Shift down the "note on" bit again. @@ -1128,7 +1303,7 @@ value |= (unk2 >> 8) & 0xFF; value |= unk2 & 0xFF; - writeOPL(0xB0 + _curChannel, value); + writeOPL (0xB0 + _curChannel, value); channel.regBx = value; } @@ -1160,18 +1335,24 @@ // Note that unk41 is never initialised. Not that it should matter much, but it // is a bit sloppy. -void AdlibDriver::primaryEffect2(Channel &channel) { - debugC(9, kDebugLevelSound, "Calling primaryEffect2 (channel: %d)", _curChannel); - if (channel.unk38) { +void +AdlibDriver::primaryEffect2 (Channel & channel) +{ + debugC (9, kDebugLevelSound, "Calling primaryEffect2 (channel: %d)", + _curChannel); + if (channel.unk38) + { --channel.unk38; return; } uint8 temp = channel.unk41; channel.unk41 += channel.unk32; - if (channel.unk41 < temp) { + if (channel.unk41 < temp) + { uint16 unk1 = channel.unk37; - if (!(--channel.unk34)) { + if (!(--channel.unk34)) + { unk1 ^= 0xFFFF; ++unk1; channel.unk37 = unk1; @@ -1180,13 +1361,13 @@ uint16 unk2 = (channel.regAx | (channel.regBx << 8)) & 0x3FF; unk2 += unk1; - + channel.regAx = unk2 & 0xFF; channel.regBx = (channel.regBx & 0xFC) | (unk2 >> 8); // Octave / F-Number / Key-On - writeOPL(0xA0 + _curChannel, channel.regAx); - writeOPL(0xB0 + _curChannel, channel.regBx); + writeOPL (0xA0 + _curChannel, channel.regAx); + writeOPL (0xB0 + _curChannel, channel.regBx); } } @@ -1215,22 +1396,31 @@ // unk22 - the operation to perform // offset - the offset to the data chunk -void AdlibDriver::secondaryEffect1(Channel &channel) { - debugC(9, kDebugLevelSound, "Calling secondaryEffect1 (channel: %d)", _curChannel); +void +AdlibDriver::secondaryEffect1 (Channel & channel) +{ + debugC (9, kDebugLevelSound, "Calling secondaryEffect1 (channel: %d)", + _curChannel); uint8 temp = channel.unk18; channel.unk18 += channel.unk19; - if (channel.unk18 < temp) { - if (--channel.unk21 < 0) { + if (channel.unk18 < temp) + { + if (--channel.unk21 < 0) + { channel.unk21 = channel.unk20; } - writeOPL(channel.unk22 + _curRegOffset, _soundData[channel.offset + channel.unk21]); + writeOPL (channel.unk22 + _curRegOffset, + _soundData[channel.offset + channel.unk21]); } } -uint8 AdlibDriver::calculateOpLevel1(Channel &channel) { +uint8 +AdlibDriver::calculateOpLevel1 (Channel & channel) +{ int8 value = channel.opLevel1 & 0x3F; - if (channel.twoChan) { + if (channel.twoChan) + { value += channel.opExtraLevel1; value += channel.opExtraLevel2; value += channel.opExtraLevel3; @@ -1238,10 +1428,12 @@ // Preserve the scaling level bits from opLevel1 - return checkValue(value) | (channel.opLevel1 & 0xC0); + return checkValue (value) | (channel.opLevel1 & 0xC0); } -uint8 AdlibDriver::calculateOpLevel2(Channel &channel) { +uint8 +AdlibDriver::calculateOpLevel2 (Channel & channel) +{ int8 value = channel.opLevel2 & 0x3F; value += channel.opExtraLevel1; @@ -1250,135 +1442,189 @@ // Preserve the scaling level bits from opLevel2 - return checkValue(value) | (channel.opLevel2 & 0xC0); + return checkValue (value) | (channel.opLevel2 & 0xC0); } // parser opcodes -int AdlibDriver::update_setRepeat(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_setRepeat (uint8 * &dataptr, Channel & channel, + uint8 value) +{ channel.repeatCounter = value; return 0; } -int AdlibDriver::update_checkRepeat(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_checkRepeat (uint8 * &dataptr, Channel & channel, + uint8 value) +{ ++dataptr; - if (--channel.repeatCounter) { - int16 add = READ_LE_UINT16(dataptr - 2); + if (--channel.repeatCounter) + { + int16 add = READ_LE_UINT16 (dataptr - 2); dataptr += add; } return 0; } -int AdlibDriver::update_setupProgram(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_setupProgram (uint8 * &dataptr, Channel & channel, + uint8 value) +{ if (value == 0xFF) return 0; - uint8 *ptr = getProgram(value); + uint8 *ptr = getProgram (value); uint8 chan = *ptr++; uint8 priority = *ptr++; - Channel &channel2 = _channels[chan]; - - if (priority >= channel2.priority) { + Channel & channel2 = _channels[chan]; + + if (priority >= channel2.priority) + { _flagTrigger = 1; _flags |= 8; - initChannel(channel2); + initChannel (channel2); channel2.priority = priority; channel2.dataptr = ptr; channel2.tempo = 0xFF; channel2.position = 0xFF; channel2.duration = 1; - unkOutput2(chan); + unkOutput2 (chan); } return 0; } -int AdlibDriver::update_setNoteSpacing(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_setNoteSpacing (uint8 * &dataptr, Channel & channel, + uint8 value) +{ channel.spacing1 = value; return 0; } -int AdlibDriver::update_jump(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_jump (uint8 * &dataptr, Channel & channel, uint8 value) +{ --dataptr; - int16 add = READ_LE_UINT16(dataptr); dataptr += 2; + int16 add = READ_LE_UINT16 (dataptr); + dataptr += 2; dataptr += add; return 0; } -int AdlibDriver::update_jumpToSubroutine(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_jumpToSubroutine (uint8 * &dataptr, Channel & channel, + uint8 value) +{ --dataptr; - int16 add = READ_LE_UINT16(dataptr); dataptr += 2; + int16 add = READ_LE_UINT16 (dataptr); + dataptr += 2; channel.dataptrStack[channel.dataptrStackPos++] = dataptr; dataptr += add; return 0; } -int AdlibDriver::update_returnFromSubroutine(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_returnFromSubroutine (uint8 * &dataptr, Channel & channel, + uint8 value) +{ dataptr = channel.dataptrStack[--channel.dataptrStackPos]; return 0; } -int AdlibDriver::update_setBaseOctave(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_setBaseOctave (uint8 * &dataptr, Channel & channel, + uint8 value) +{ channel.baseOctave = value; return 0; } -int AdlibDriver::update_stopChannel(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_stopChannel (uint8 * &dataptr, Channel & channel, + uint8 value) +{ channel.priority = 0; - if (_curChannel != 9) { - noteOff(channel); + if (_curChannel != 9) + { + noteOff (channel); } dataptr = 0; return 2; } -int AdlibDriver::update_playRest(uint8 *&dataptr, Channel &channel, uint8 value) { - setupDuration(value, channel); - noteOff(channel); +int +AdlibDriver::update_playRest (uint8 * &dataptr, Channel & channel, + uint8 value) +{ + setupDuration (value, channel); + noteOff (channel); return (value != 0); } -int AdlibDriver::update_writeAdlib(uint8 *&dataptr, Channel &channel, uint8 value) { - writeOPL(value, *dataptr++); +int +AdlibDriver::update_writeAdlib (uint8 * &dataptr, Channel & channel, + uint8 value) +{ + writeOPL (value, *dataptr++); return 0; } -int AdlibDriver::update_setupNoteAndDuration(uint8 *&dataptr, Channel &channel, uint8 value) { - setupNote(value, channel); +int +AdlibDriver::update_setupNoteAndDuration (uint8 * &dataptr, Channel & channel, + uint8 value) +{ + setupNote (value, channel); value = *dataptr++; - setupDuration(value, channel); + setupDuration (value, channel); return (value != 0); } -int AdlibDriver::update_setBaseNote(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_setBaseNote (uint8 * &dataptr, Channel & channel, + uint8 value) +{ channel.baseNote = value; return 0; } -int AdlibDriver::update_setupSecondaryEffect1(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_setupSecondaryEffect1 (uint8 * &dataptr, + Channel & channel, uint8 value) +{ channel.unk18 = value; channel.unk19 = value; channel.unk20 = channel.unk21 = *dataptr++; channel.unk22 = *dataptr++; - channel.offset = READ_LE_UINT16(dataptr); dataptr += 2; + channel.offset = READ_LE_UINT16 (dataptr); + dataptr += 2; channel.secondaryEffect = &AdlibDriver::secondaryEffect1; return 0; } -int AdlibDriver::update_stopOtherChannel(uint8 *&dataptr, Channel &channel, uint8 value) { - Channel &channel2 = _channels[value]; +int +AdlibDriver::update_stopOtherChannel (uint8 * &dataptr, Channel & channel, + uint8 value) +{ + Channel & channel2 = _channels[value]; channel2.duration = 0; channel2.priority = 0; channel2.dataptr = 0; return 0; } -int AdlibDriver::update_waitForEndOfProgram(uint8 *&dataptr, Channel &channel, uint8 value) { - uint8 *ptr = getProgram(value); +int +AdlibDriver::update_waitForEndOfProgram (uint8 * &dataptr, Channel & channel, + uint8 value) +{ + uint8 *ptr = getProgram (value); uint8 chan = *ptr; - if (!_channels[chan].dataptr) { + if (!_channels[chan].dataptr) + { return 0; } @@ -1386,33 +1632,48 @@ return 2; } -int AdlibDriver::update_setupInstrument(uint8 *&dataptr, Channel &channel, uint8 value) { - setupInstrument(_curRegOffset, getInstrument(value), channel); +int +AdlibDriver::update_setupInstrument (uint8 * &dataptr, Channel & channel, + uint8 value) +{ + setupInstrument (_curRegOffset, getInstrument (value), channel); return 0; } -int AdlibDriver::update_setupPrimaryEffect1(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_setupPrimaryEffect1 (uint8 * &dataptr, Channel & channel, + uint8 value) +{ channel.unk29 = value; - channel.unk30 = READ_BE_UINT16(dataptr); + channel.unk30 = READ_BE_UINT16 (dataptr); dataptr += 2; channel.primaryEffect = &AdlibDriver::primaryEffect1; channel.unk31 = 0xFF; return 0; } -int AdlibDriver::update_removePrimaryEffect1(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_removePrimaryEffect1 (uint8 * &dataptr, Channel & channel, + uint8 value) +{ --dataptr; channel.primaryEffect = 0; channel.unk30 = 0; return 0; } -int AdlibDriver::update_setBaseFreq(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_setBaseFreq (uint8 * &dataptr, Channel & channel, + uint8 value) +{ channel.baseFreq = value; return 0; } -int AdlibDriver::update_setupPrimaryEffect2(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_setupPrimaryEffect2 (uint8 * &dataptr, Channel & channel, + uint8 value) +{ channel.unk32 = value; channel.unk33 = *dataptr++; uint8 temp = *dataptr++; @@ -1423,12 +1684,18 @@ return 0; } -int AdlibDriver::update_setPriority(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_setPriority (uint8 * &dataptr, Channel & channel, + uint8 value) +{ channel.priority = value; return 0; } -int AdlibDriver::updateCallback23(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::updateCallback23 (uint8 * &dataptr, Channel & channel, + uint8 value) +{ value >>= 1; _unkValue1 = _unkValue2 = value; _unkValue3 = 0xFF; @@ -1436,15 +1703,21 @@ return 0; } -int AdlibDriver::updateCallback24(uint8 *&dataptr, Channel &channel, uint8 value) { - if (_unkValue5) { - if (_unkValue4 & value) { +int +AdlibDriver::updateCallback24 (uint8 * &dataptr, Channel & channel, + uint8 value) +{ + if (_unkValue5) + { + if (_unkValue4 & value) + { _unkValue5 = 0; return 0; } } - if (!(value & _unkValue4)) { + if (!(value & _unkValue4)) + { ++_unkValue5; } @@ -1453,68 +1726,98 @@ return 2; } -int AdlibDriver::update_setExtraLevel1(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_setExtraLevel1 (uint8 * &dataptr, Channel & channel, + uint8 value) +{ channel.opExtraLevel1 = value; - adjustVolume(channel); + adjustVolume (channel); return 0; } -int AdlibDriver::update_setupDuration(uint8 *&dataptr, Channel &channel, uint8 value) { - setupDuration(value, channel); +int +AdlibDriver::update_setupDuration (uint8 * &dataptr, Channel & channel, + uint8 value) +{ + setupDuration (value, channel); return (value != 0); } -int AdlibDriver::update_playNote(uint8 *&dataptr, Channel &channel, uint8 value) { - setupDuration(value, channel); - noteOn(channel); +int +AdlibDriver::update_playNote (uint8 * &dataptr, Channel & channel, + uint8 value) +{ + setupDuration (value, channel); + noteOn (channel); return (value != 0); } -int AdlibDriver::update_setFractionalNoteSpacing(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_setFractionalNoteSpacing (uint8 * &dataptr, + Channel & channel, uint8 value) +{ channel.fractionalSpacing = value & 7; return 0; } -int AdlibDriver::update_setTempo(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_setTempo (uint8 * &dataptr, Channel & channel, + uint8 value) +{ _tempo = value; return 0; } -int AdlibDriver::update_removeSecondaryEffect1(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_removeSecondaryEffect1 (uint8 * &dataptr, + Channel & channel, uint8 value) +{ --dataptr; channel.secondaryEffect = 0; return 0; } -int AdlibDriver::update_setChannelTempo(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_setChannelTempo (uint8 * &dataptr, Channel & channel, + uint8 value) +{ channel.tempo = value; return 0; } -int AdlibDriver::update_setExtraLevel3(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_setExtraLevel3 (uint8 * &dataptr, Channel & channel, + uint8 value) +{ channel.opExtraLevel3 = value; return 0; } -int AdlibDriver::update_setExtraLevel2(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_setExtraLevel2 (uint8 * &dataptr, Channel & channel, + uint8 value) +{ int channelBackUp = _curChannel; _curChannel = value; - Channel &channel2 = _channels[value]; + Channel & channel2 = _channels[value]; channel2.opExtraLevel2 = *dataptr++; - adjustVolume(channel2); + adjustVolume (channel2); _curChannel = channelBackUp; return 0; } -int AdlibDriver::update_changeExtraLevel2(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_changeExtraLevel2 (uint8 * &dataptr, Channel & channel, + uint8 value) +{ int channelBackUp = _curChannel; _curChannel = value; - Channel &channel2 = _channels[value]; + Channel & channel2 = _channels[value]; channel2.opExtraLevel2 += *dataptr++; - adjustVolume(channel2); + adjustVolume (channel2); _curChannel = channelBackUp; return 0; @@ -1523,109 +1826,142 @@ // Apart from initialising to zero, these two functions are the only ones that // modify _vibratoAndAMDepthBits. -int AdlibDriver::update_setAMDepth(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_setAMDepth (uint8 * &dataptr, Channel & channel, + uint8 value) +{ if (value & 1) _vibratoAndAMDepthBits |= 0x80; else _vibratoAndAMDepthBits &= 0x7F; - writeOPL(0xBD, _vibratoAndAMDepthBits); + writeOPL (0xBD, _vibratoAndAMDepthBits); return 0; } -int AdlibDriver::update_setVibratoDepth(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_setVibratoDepth (uint8 * &dataptr, Channel & channel, + uint8 value) +{ if (value & 1) _vibratoAndAMDepthBits |= 0x40; else _vibratoAndAMDepthBits &= 0xBF; - writeOPL(0xBD, _vibratoAndAMDepthBits); + writeOPL (0xBD, _vibratoAndAMDepthBits); return 0; } -int AdlibDriver::update_changeExtraLevel1(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_changeExtraLevel1 (uint8 * &dataptr, Channel & channel, + uint8 value) +{ channel.opExtraLevel1 += value; - adjustVolume(channel); + adjustVolume (channel); return 0; } -int AdlibDriver::updateCallback38(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::updateCallback38 (uint8 * &dataptr, Channel & channel, + uint8 value) +{ int channelBackUp = _curChannel; _curChannel = value; - Channel &channel2 = _channels[value]; + Channel & channel2 = _channels[value]; channel2.duration = channel2.priority = 0; channel2.dataptr = 0; channel2.opExtraLevel2 = 0; - if (value != 9) { + if (value != 9) + { uint8 outValue = _regOffset[value]; // Feedback strength / Connection type - writeOPL(0xC0 + _curChannel, 0x00); + writeOPL (0xC0 + _curChannel, 0x00); // Key scaling level / Operator output level - writeOPL(0x43 + outValue, 0x3F); + writeOPL (0x43 + outValue, 0x3F); // Sustain Level / Release Rate - writeOPL(0x83 + outValue, 0xFF); + writeOPL (0x83 + outValue, 0xFF); // Key On / Octave / Frequency - writeOPL(0xB0 + _curChannel, 0x00); + writeOPL (0xB0 + _curChannel, 0x00); } _curChannel = channelBackUp; return 0; } -int AdlibDriver::updateCallback39(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::updateCallback39 (uint8 * &dataptr, Channel & channel, + uint8 value) +{ uint16 unk = *dataptr++; unk |= value << 8; - unk &= getRandomNr(); + unk &= getRandomNr (); uint16 unk2 = ((channel.regBx & 0x1F) << 8) | channel.regAx; unk2 += unk; unk2 |= ((channel.regBx & 0x20) << 8); // Frequency - writeOPL(0xA0 + _curChannel, unk2 & 0xFF); + writeOPL (0xA0 + _curChannel, unk2 & 0xFF); // Key On / Octave / Frequency - writeOPL(0xB0 + _curChannel, (unk2 & 0xFF00) >> 8); + writeOPL (0xB0 + _curChannel, (unk2 & 0xFF00) >> 8); return 0; } -int AdlibDriver::update_removePrimaryEffect2(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_removePrimaryEffect2 (uint8 * &dataptr, Channel & channel, + uint8 value) +{ --dataptr; channel.primaryEffect = 0; return 0; } -int AdlibDriver::updateCallback41(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::updateCallback41 (uint8 * &dataptr, Channel & channel, + uint8 value) +{ channel.unk16 = value; - setupNote(channel.rawNote, channel, true); + setupNote (channel.rawNote, channel, true); return 0; } -int AdlibDriver::update_resetToGlobalTempo(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_resetToGlobalTempo (uint8 * &dataptr, Channel & channel, + uint8 value) +{ --dataptr; channel.tempo = _tempo; return 0; } -int AdlibDriver::update_nop1(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_nop1 (uint8 * &dataptr, Channel & channel, uint8 value) +{ --dataptr; return 0; } -int AdlibDriver::update_setDurationRandomness(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_setDurationRandomness (uint8 * &dataptr, + Channel & channel, uint8 value) +{ channel.durationRandomness = value; return 0; } -int AdlibDriver::update_changeChannelTempo(uint8 *&dataptr, Channel &channel, uint8 value) { - int tempo = channel.tempo + (int8)value; +int +AdlibDriver::update_changeChannelTempo (uint8 * &dataptr, Channel & channel, + uint8 value) +{ + int tempo = channel.tempo + (int8) value; if (tempo <= 0) tempo = 1; @@ -1636,13 +1972,17 @@ return 0; } -int AdlibDriver::updateCallback46(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::updateCallback46 (uint8 * &dataptr, Channel & channel, + uint8 value) +{ uint8 entry = *dataptr++; _tablePtr1 = _unkTable2[entry++]; _tablePtr2 = _unkTable2[entry]; - if (value == 2) { + if (value == 2) + { // Frequency - writeOPL(0xA0, _tablePtr2[0]); + writeOPL (0xA0, _tablePtr2[0]); } return 0; } @@ -1650,48 +1990,53 @@ // TODO: This is really the same as update_nop1(), so they should be combined // into one single update_nop(). -int AdlibDriver::update_nop2(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_nop2 (uint8 * &dataptr, Channel & channel, uint8 value) +{ --dataptr; return 0; } -int AdlibDriver::update_setupRhythmSection(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_setupRhythmSection (uint8 * &dataptr, Channel & channel, + uint8 value) +{ int channelBackUp = _curChannel; int regOffsetBackUp = _curRegOffset; _curChannel = 6; _curRegOffset = _regOffset[6]; - setupInstrument(_curRegOffset, getInstrument(value), channel); + setupInstrument (_curRegOffset, getInstrument (value), channel); _unkValue6 = channel.opLevel2; _curChannel = 7; _curRegOffset = _regOffset[7]; - setupInstrument(_curRegOffset, getInstrument(*dataptr++), channel); + setupInstrument (_curRegOffset, getInstrument (*dataptr++), channel); _unkValue7 = channel.opLevel1; _unkValue8 = channel.opLevel2; _curChannel = 8; _curRegOffset = _regOffset[8]; - setupInstrument(_curRegOffset, getInstrument(*dataptr++), channel); + setupInstrument (_curRegOffset, getInstrument (*dataptr++), channel); _unkValue9 = channel.opLevel1; _unkValue10 = channel.opLevel2; // Octave / F-Number / Key-On for channels 6, 7 and 8 _channels[6].regBx = *dataptr++ & 0x2F; - writeOPL(0xB6, _channels[6].regBx); - writeOPL(0xA6, *dataptr++); + writeOPL (0xB6, _channels[6].regBx); + writeOPL (0xA6, *dataptr++); _channels[7].regBx = *dataptr++ & 0x2F; - writeOPL(0xB7, _channels[7].regBx); - writeOPL(0xA7, *dataptr++); + writeOPL (0xB7, _channels[7].regBx); + writeOPL (0xA7, *dataptr++); _channels[8].regBx = *dataptr++ & 0x2F; - writeOPL(0xB8, _channels[8].regBx); - writeOPL(0xA8, *dataptr++); + writeOPL (0xB8, _channels[8].regBx); + writeOPL (0xA8, *dataptr++); _rhythmSectionBits = 0x20; @@ -1700,14 +2045,17 @@ return 0; } -int AdlibDriver::update_playRhythmSection(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_playRhythmSection (uint8 * &dataptr, Channel & channel, + uint8 value) +{ // Any instrument that we want to play, and which was already playing, // is temporarily keyed off. Instruments that were off already, or // which we don't want to play, retain their old on/off status. This is // probably so that the instrument's envelope is played from its // beginning again... - writeOPL(0xBD, (_rhythmSectionBits & ~(value & 0x1F)) | 0x20); + writeOPL (0xBD, (_rhythmSectionBits & ~(value & 0x1F)) | 0x20); // ...but since we only set the rhythm instrument bits, and never clear // them (until the entire rhythm section is disabled), I'm not sure how @@ -1716,155 +2064,201 @@ _rhythmSectionBits |= value; - writeOPL(0xBD, _vibratoAndAMDepthBits | 0x20 | _rhythmSectionBits); + writeOPL (0xBD, _vibratoAndAMDepthBits | 0x20 | _rhythmSectionBits); return 0; } -int AdlibDriver::update_removeRhythmSection(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_removeRhythmSection (uint8 * &dataptr, Channel & channel, + uint8 value) +{ --dataptr; _rhythmSectionBits = 0; // All the rhythm bits are cleared. The AM and Vibrato depth bits // remain unchanged. - writeOPL(0xBD, _vibratoAndAMDepthBits); + writeOPL (0xBD, _vibratoAndAMDepthBits); return 0; } -int AdlibDriver::updateCallback51(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::updateCallback51 (uint8 * &dataptr, Channel & channel, + uint8 value) +{ uint8 value2 = *dataptr++; - if (value & 1) { + if (value & 1) + { _unkValue12 = value2; // Channel 7, op1: Level Key Scaling / Total Level - writeOPL(0x51, checkValue(value2 + _unkValue7 + _unkValue11 + _unkValue12)); + writeOPL (0x51, + checkValue (value2 + _unkValue7 + _unkValue11 + _unkValue12)); } - if (value & 2) { + if (value & 2) + { _unkValue14 = value2; // Channel 8, op2: Level Key Scaling / Total Level - writeOPL(0x55, checkValue(value2 + _unkValue10 + _unkValue13 + _unkValue14)); + writeOPL (0x55, + checkValue (value2 + _unkValue10 + _unkValue13 + _unkValue14)); } - if (value & 4) { + if (value & 4) + { _unkValue15 = value2; // Channel 8, op1: Level Key Scaling / Total Level - writeOPL(0x52, checkValue(value2 + _unkValue9 + _unkValue16 + _unkValue15)); + writeOPL (0x52, + checkValue (value2 + _unkValue9 + _unkValue16 + _unkValue15)); } - if (value & 8) { + if (value & 8) + { _unkValue18 = value2; // Channel 7, op2: Level Key Scaling / Total Level - writeOPL(0x54, checkValue(value2 + _unkValue8 + _unkValue17 + _unkValue18)); + writeOPL (0x54, + checkValue (value2 + _unkValue8 + _unkValue17 + _unkValue18)); } - if (value & 16) { + if (value & 16) + { _unkValue20 = value2; // Channel 6, op2: Level Key Scaling / Total Level - writeOPL(0x53, checkValue(value2 + _unkValue6 + _unkValue19 + _unkValue20)); + writeOPL (0x53, + checkValue (value2 + _unkValue6 + _unkValue19 + _unkValue20)); } return 0; } -int AdlibDriver::updateCallback52(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::updateCallback52 (uint8 * &dataptr, Channel & channel, + uint8 value) +{ uint8 value2 = *dataptr++; - if (value & 1) { - _unkValue11 = checkValue(value2 + _unkValue7 + _unkValue11 + _unkValue12); + if (value & 1) + { + _unkValue11 = + checkValue (value2 + _unkValue7 + _unkValue11 + _unkValue12); // Channel 7, op1: Level Key Scaling / Total Level - writeOPL(0x51, _unkValue11); + writeOPL (0x51, _unkValue11); } - if (value & 2) { - _unkValue13 = checkValue(value2 + _unkValue10 + _unkValue13 + _unkValue14); + if (value & 2) + { + _unkValue13 = + checkValue (value2 + _unkValue10 + _unkValue13 + _unkValue14); // Channel 8, op2: Level Key Scaling / Total Level - writeOPL(0x55, _unkValue13); + writeOPL (0x55, _unkValue13); } - if (value & 4) { - _unkValue16 = checkValue(value2 + _unkValue9 + _unkValue16 + _unkValue15); + if (value & 4) + { + _unkValue16 = + checkValue (value2 + _unkValue9 + _unkValue16 + _unkValue15); // Channel 8, op1: Level Key Scaling / Total Level - writeOPL(0x52, _unkValue16); + writeOPL (0x52, _unkValue16); } - if (value & 8) { - _unkValue17 = checkValue(value2 + _unkValue8 + _unkValue17 + _unkValue18); + if (value & 8) + { + _unkValue17 = + checkValue (value2 + _unkValue8 + _unkValue17 + _unkValue18); // Channel 7, op2: Level Key Scaling / Total Level - writeOPL(0x54, _unkValue17); + writeOPL (0x54, _unkValue17); } - if (value & 16) { - _unkValue19 = checkValue(value2 + _unkValue6 + _unkValue19 + _unkValue20); + if (value & 16) + { + _unkValue19 = + checkValue (value2 + _unkValue6 + _unkValue19 + _unkValue20); // Channel 6, op2: Level Key Scaling / Total Level - writeOPL(0x53, _unkValue19); + writeOPL (0x53, _unkValue19); } return 0; } -int AdlibDriver::updateCallback53(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::updateCallback53 (uint8 * &dataptr, Channel & channel, + uint8 value) +{ uint8 value2 = *dataptr++; - if (value & 1) { + if (value & 1) + { _unkValue11 = value2; // Channel 7, op1: Level Key Scaling / Total Level - writeOPL(0x51, checkValue(value2 + _unkValue7 + _unkValue12)); + writeOPL (0x51, checkValue (value2 + _unkValue7 + _unkValue12)); } - if (value & 2) { + if (value & 2) + { _unkValue13 = value2; // Channel 8, op2: Level Key Scaling / Total Level - writeOPL(0x55, checkValue(value2 + _unkValue10 + _unkValue14)); + writeOPL (0x55, checkValue (value2 + _unkValue10 + _unkValue14)); } - if (value & 4) { + if (value & 4) + { _unkValue16 = value2; // Channel 8, op1: Level Key Scaling / Total Level - writeOPL(0x52, checkValue(value2 + _unkValue9 + _unkValue15)); + writeOPL (0x52, checkValue (value2 + _unkValue9 + _unkValue15)); } - if (value & 8) { + if (value & 8) + { _unkValue17 = value2; // Channel 7, op2: Level Key Scaling / Total Level - writeOPL(0x54, checkValue(value2 + _unkValue8 + _unkValue18)); + writeOPL (0x54, checkValue (value2 + _unkValue8 + _unkValue18)); } - if (value & 16) { + if (value & 16) + { _unkValue19 = value2; // Channel 6, op2: Level Key Scaling / Total Level - writeOPL(0x53, checkValue(value2 + _unkValue6 + _unkValue20)); + writeOPL (0x53, checkValue (value2 + _unkValue6 + _unkValue20)); } return 0; } -int AdlibDriver::update_setSoundTrigger(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_setSoundTrigger (uint8 * &dataptr, Channel & channel, + uint8 value) +{ _soundTrigger = value; return 0; } -int AdlibDriver::update_setTempoReset(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::update_setTempoReset (uint8 * &dataptr, Channel & channel, + uint8 value) +{ channel.tempoReset = value; return 0; } -int AdlibDriver::updateCallback56(uint8 *&dataptr, Channel &channel, uint8 value) { +int +AdlibDriver::updateCallback56 (uint8 * &dataptr, Channel & channel, + uint8 value) +{ channel.unk39 = value; channel.unk40 = *dataptr++; return 0; @@ -1874,157 +2268,163 @@ #define COMMAND(x) { &AdlibDriver::x, #x } -void AdlibDriver::setupOpcodeList() { +void +AdlibDriver::setupOpcodeList () +{ static const OpcodeEntry opcodeList[] = { - COMMAND(snd_ret0x100), - COMMAND(snd_ret0x1983), - COMMAND(snd_initDriver), - COMMAND(snd_deinitDriver), - COMMAND(snd_setSoundData), - COMMAND(snd_unkOpcode1), - COMMAND(snd_startSong), - COMMAND(snd_unkOpcode2), - COMMAND(snd_unkOpcode3), - COMMAND(snd_readByte), - COMMAND(snd_writeByte), - COMMAND(snd_getSoundTrigger), - COMMAND(snd_unkOpcode4), - COMMAND(snd_dummy), - COMMAND(snd_getNullvar4), - COMMAND(snd_setNullvar3), - COMMAND(snd_setFlag), - COMMAND(snd_clearFlag) + COMMAND (snd_ret0x100), + COMMAND (snd_ret0x1983), + COMMAND (snd_initDriver), + COMMAND (snd_deinitDriver), + COMMAND (snd_setSoundData), + COMMAND (snd_unkOpcode1), + COMMAND (snd_startSong), + COMMAND (snd_unkOpcode2), + COMMAND (snd_unkOpcode3), + COMMAND (snd_readByte), + COMMAND (snd_writeByte), + COMMAND (snd_getSoundTrigger), + COMMAND (snd_unkOpcode4), + COMMAND (snd_dummy), + COMMAND (snd_getNullvar4), + COMMAND (snd_setNullvar3), + COMMAND (snd_setFlag), + COMMAND (snd_clearFlag) }; _opcodeList = opcodeList; - _opcodesEntries = ARRAYSIZE(opcodeList); + _opcodesEntries = ARRAYSIZE (opcodeList); } -void AdlibDriver::setupParserOpcodeTable() { +void +AdlibDriver::setupParserOpcodeTable () +{ static const ParserOpcode parserOpcodeTable[] = { // 0 - COMMAND(update_setRepeat), - COMMAND(update_checkRepeat), - COMMAND(update_setupProgram), - COMMAND(update_setNoteSpacing), + COMMAND (update_setRepeat), + COMMAND (update_checkRepeat), + COMMAND (update_setupProgram), + COMMAND (update_setNoteSpacing), // 4 - COMMAND(update_jump), - COMMAND(update_jumpToSubroutine), - COMMAND(update_returnFromSubroutine), - COMMAND(update_setBaseOctave), + COMMAND (update_jump), + COMMAND (update_jumpToSubroutine), + COMMAND (update_returnFromSubroutine), + COMMAND (update_setBaseOctave), // 8 - COMMAND(update_stopChannel), - COMMAND(update_playRest), - COMMAND(update_writeAdlib), - COMMAND(update_setupNoteAndDuration), + COMMAND (update_stopChannel), + COMMAND (update_playRest), + COMMAND (update_writeAdlib), + COMMAND (update_setupNoteAndDuration), // 12 - COMMAND(update_setBaseNote), - COMMAND(update_setupSecondaryEffect1), - COMMAND(update_stopOtherChannel), - COMMAND(update_waitForEndOfProgram), + COMMAND (update_setBaseNote), + COMMAND (update_setupSecondaryEffect1), + COMMAND (update_stopOtherChannel), + COMMAND (update_waitForEndOfProgram), // 16 - COMMAND(update_setupInstrument), - COMMAND(update_setupPrimaryEffect1), - COMMAND(update_removePrimaryEffect1), - COMMAND(update_setBaseFreq), + COMMAND (update_setupInstrument), + COMMAND (update_setupPrimaryEffect1), + COMMAND (update_removePrimaryEffect1), + COMMAND (update_setBaseFreq), // 20 - COMMAND(update_stopChannel), - COMMAND(update_setupPrimaryEffect2), - COMMAND(update_stopChannel), - COMMAND(update_stopChannel), + COMMAND (update_stopChannel), + COMMAND (update_setupPrimaryEffect2), + COMMAND (update_stopChannel), + COMMAND (update_stopChannel), // 24 - COMMAND(update_stopChannel), - COMMAND(update_stopChannel), - COMMAND(update_setPriority), - COMMAND(update_stopChannel), + COMMAND (update_stopChannel), + COMMAND (update_stopChannel), + COMMAND (update_setPriority), + COMMAND (update_stopChannel), // 28 - COMMAND(updateCallback23), - COMMAND(updateCallback24), - COMMAND(update_setExtraLevel1), - COMMAND(update_stopChannel), + COMMAND (updateCallback23), + COMMAND (updateCallback24), + COMMAND (update_setExtraLevel1), + COMMAND (update_stopChannel), // 32 - COMMAND(update_setupDuration), - COMMAND(update_playNote), - COMMAND(update_stopChannel), - COMMAND(update_stopChannel), + COMMAND (update_setupDuration), + COMMAND (update_playNote), + COMMAND (update_stopChannel), + COMMAND (update_stopChannel), // 36 - COMMAND(update_setFractionalNoteSpacing), - COMMAND(update_stopChannel), - COMMAND(update_setTempo), - COMMAND(update_removeSecondaryEffect1), + COMMAND (update_setFractionalNoteSpacing), + COMMAND (update_stopChannel), + COMMAND (update_setTempo), + COMMAND (update_removeSecondaryEffect1), // 40 - COMMAND(update_stopChannel), - COMMAND(update_setChannelTempo), - COMMAND(update_stopChannel), - COMMAND(update_setExtraLevel3), + COMMAND (update_stopChannel), + COMMAND (update_setChannelTempo), + COMMAND (update_stopChannel), + COMMAND (update_setExtraLevel3), // 44 - COMMAND(update_setExtraLevel2), - COMMAND(update_changeExtraLevel2), - COMMAND(update_setAMDepth), - COMMAND(update_setVibratoDepth), + COMMAND (update_setExtraLevel2), + COMMAND (update_changeExtraLevel2), + COMMAND (update_setAMDepth), + COMMAND (update_setVibratoDepth), // 48 - COMMAND(update_changeExtraLevel1), - COMMAND(update_stopChannel), - COMMAND(update_stopChannel), - COMMAND(updateCallback38), + COMMAND (update_changeExtraLevel1), + COMMAND (update_stopChannel), + COMMAND (update_stopChannel), + COMMAND (updateCallback38), // 52 - COMMAND(update_stopChannel), - COMMAND(updateCallback39), - COMMAND(update_removePrimaryEffect2), - COMMAND(update_stopChannel), + COMMAND (update_stopChannel), + COMMAND (updateCallback39), + COMMAND (update_removePrimaryEffect2), + COMMAND (update_stopChannel), // 56 - COMMAND(update_stopChannel), - COMMAND(updateCallback41), - COMMAND(update_resetToGlobalTempo), - COMMAND(update_nop1), + COMMAND (update_stopChannel), + COMMAND (updateCallback41), + COMMAND (update_resetToGlobalTempo), + COMMAND (update_nop1), // 60 - COMMAND(update_setDurationRandomness), - COMMAND(update_changeChannelTempo), - COMMAND(update_stopChannel), - COMMAND(updateCallback46), + COMMAND (update_setDurationRandomness), + COMMAND (update_changeChannelTempo), + COMMAND (update_stopChannel), + COMMAND (updateCallback46), // 64 - COMMAND(update_nop2), - COMMAND(update_setupRhythmSection), - COMMAND(update_playRhythmSection), - COMMAND(update_removeRhythmSection), + COMMAND (update_nop2), + COMMAND (update_setupRhythmSection), + COMMAND (update_playRhythmSection), + COMMAND (update_removeRhythmSection), // 68 - COMMAND(updateCallback51), - COMMAND(updateCallback52), - COMMAND(updateCallback53), - COMMAND(update_setSoundTrigger), + COMMAND (updateCallback51), + COMMAND (updateCallback52), + COMMAND (updateCallback53), + COMMAND (update_setSoundTrigger), // 72 - COMMAND(update_setTempoReset), - COMMAND(updateCallback56), - COMMAND(update_stopChannel) + COMMAND (update_setTempoReset), + COMMAND (updateCallback56), + COMMAND (update_stopChannel) }; _parserOpcodeTable = parserOpcodeTable; - _parserOpcodeTableSize = ARRAYSIZE(parserOpcodeTable); + _parserOpcodeTableSize = ARRAYSIZE (parserOpcodeTable); } + #undef COMMAND // This table holds the register offset for operator 1 for each of the nine // channels. To get the register offset for operator 2, simply add 3. -const uint8 AdlibDriver::_regOffset[] = { +const uint8 + AdlibDriver::_regOffset[] = { 0x00, 0x01, 0x02, 0x08, 0x09, 0x0A, 0x10, 0x11, 0x12 }; @@ -2033,7 +2433,8 @@ // F-Numbers (10 bits) for the notes of the 12-tone scale. However, it does not // match the table in the Adlib documentation I've seen. -const uint16 AdlibDriver::_unkTable[] = { +const uint16 + AdlibDriver::_unkTable[] = { 0x0134, 0x0147, 0x015A, 0x016F, 0x0184, 0x019C, 0x01B4, 0x01CE, 0x01E9, 0x0207, 0x0225, 0x0246 }; @@ -2041,7 +2442,8 @@ // These tables are currently only used by updateCallback46(), which only ever // uses the first element of one of the sub-tables. -const uint8 *AdlibDriver::_unkTable2[] = { +const uint8 * + AdlibDriver::_unkTable2[] = { AdlibDriver::_unkTable2_1, AdlibDriver::_unkTable2_2, AdlibDriver::_unkTable2_1, @@ -2050,7 +2452,8 @@ AdlibDriver::_unkTable2_2 }; -const uint8 AdlibDriver::_unkTable2_1[] = { +const uint8 + AdlibDriver::_unkTable2_1[] = { 0x50, 0x50, 0x4F, 0x4F, 0x4E, 0x4E, 0x4D, 0x4D, 0x4C, 0x4C, 0x4B, 0x4B, 0x4A, 0x4A, 0x49, 0x49, 0x48, 0x48, 0x47, 0x47, 0x46, 0x46, 0x45, 0x45, @@ -2071,7 +2474,8 @@ }; // no don't ask me WHY this table exsits! -const uint8 AdlibDriver::_unkTable2_2[] = { +const uint8 + AdlibDriver::_unkTable2_2[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, @@ -2090,7 +2494,8 @@ 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F }; -const uint8 AdlibDriver::_unkTable2_3[] = { +const uint8 + AdlibDriver::_unkTable2_3[] = { 0x40, 0x40, 0x40, 0x3F, 0x3F, 0x3F, 0x3E, 0x3E, 0x3E, 0x3D, 0x3D, 0x3D, 0x3C, 0x3C, 0x3C, 0x3B, 0x3B, 0x3B, 0x3A, 0x3A, 0x3A, 0x39, 0x39, 0x39, @@ -2117,77 +2522,78 @@ // This could be some sort of pitch bend, but I have yet to see it used for // anything so it's hard to say. -const uint8 AdlibDriver::_unkTables[][32] = { +const uint8 + AdlibDriver::_unkTables[][32] = { // 0 - { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x08, - 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, - 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x19, - 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21 }, + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x08, + 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x19, + 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21}, // 1 - { 0x00, 0x01, 0x02, 0x03, 0x04, 0x06, 0x07, 0x09, - 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, - 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x1A, - 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x22, 0x24 }, + {0x00, 0x01, 0x02, 0x03, 0x04, 0x06, 0x07, 0x09, + 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, + 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x1A, + 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x22, 0x24}, // 2 - { 0x00, 0x01, 0x02, 0x03, 0x04, 0x06, 0x08, 0x09, - 0x0A, 0x0C, 0x0D, 0x0E, 0x0F, 0x11, 0x12, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x19, 0x1A, 0x1C, 0x1D, - 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26 }, + {0x00, 0x01, 0x02, 0x03, 0x04, 0x06, 0x08, 0x09, + 0x0A, 0x0C, 0x0D, 0x0E, 0x0F, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x19, 0x1A, 0x1C, 0x1D, + 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26}, // 3 - { 0x00, 0x01, 0x02, 0x03, 0x04, 0x06, 0x08, 0x0A, - 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x11, 0x12, 0x13, - 0x14, 0x15, 0x16, 0x17, 0x18, 0x1A, 0x1C, 0x1D, - 0x1E, 0x1F, 0x20, 0x21, 0x23, 0x25, 0x27, 0x28 }, + {0x00, 0x01, 0x02, 0x03, 0x04, 0x06, 0x08, 0x0A, + 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x1A, 0x1C, 0x1D, + 0x1E, 0x1F, 0x20, 0x21, 0x23, 0x25, 0x27, 0x28}, // 4 - { 0x00, 0x01, 0x02, 0x03, 0x04, 0x06, 0x08, 0x0A, - 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x11, 0x13, 0x15, - 0x16, 0x17, 0x18, 0x19, 0x1B, 0x1D, 0x1F, 0x20, - 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x28, 0x2A }, + {0x00, 0x01, 0x02, 0x03, 0x04, 0x06, 0x08, 0x0A, + 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x11, 0x13, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1B, 0x1D, 0x1F, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x28, 0x2A}, // 5 - { 0x00, 0x01, 0x02, 0x03, 0x05, 0x07, 0x09, 0x0B, - 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x13, 0x15, - 0x16, 0x17, 0x18, 0x19, 0x1B, 0x1D, 0x1F, 0x20, - 0x21, 0x22, 0x23, 0x25, 0x27, 0x29, 0x2B, 0x2D }, + {0x00, 0x01, 0x02, 0x03, 0x05, 0x07, 0x09, 0x0B, + 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x13, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1B, 0x1D, 0x1F, 0x20, + 0x21, 0x22, 0x23, 0x25, 0x27, 0x29, 0x2B, 0x2D}, // 6 - { 0x00, 0x01, 0x02, 0x03, 0x05, 0x07, 0x09, 0x0B, - 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x13, 0x15, - 0x16, 0x17, 0x18, 0x1A, 0x1C, 0x1E, 0x21, 0x24, - 0x25, 0x26, 0x27, 0x29, 0x2B, 0x2D, 0x2F, 0x30 }, + {0x00, 0x01, 0x02, 0x03, 0x05, 0x07, 0x09, 0x0B, + 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x13, 0x15, + 0x16, 0x17, 0x18, 0x1A, 0x1C, 0x1E, 0x21, 0x24, + 0x25, 0x26, 0x27, 0x29, 0x2B, 0x2D, 0x2F, 0x30}, // 7 - { 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, - 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x18, - 0x19, 0x1A, 0x1C, 0x1D, 0x1F, 0x21, 0x23, 0x25, - 0x26, 0x27, 0x29, 0x2B, 0x2D, 0x2F, 0x30, 0x32 }, + {0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, + 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x18, + 0x19, 0x1A, 0x1C, 0x1D, 0x1F, 0x21, 0x23, 0x25, + 0x26, 0x27, 0x29, 0x2B, 0x2D, 0x2F, 0x30, 0x32}, // 8 - { 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0D, - 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x14, 0x17, 0x1A, - 0x19, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x25, 0x28, - 0x29, 0x2A, 0x2B, 0x2D, 0x2F, 0x31, 0x33, 0x35 }, + {0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0D, + 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x14, 0x17, 0x1A, + 0x19, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x25, 0x28, + 0x29, 0x2A, 0x2B, 0x2D, 0x2F, 0x31, 0x33, 0x35}, // 9 - { 0x00, 0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0E, - 0x0F, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1A, 0x1B, - 0x1C, 0x1D, 0x1E, 0x20, 0x22, 0x24, 0x26, 0x29, - 0x2A, 0x2C, 0x2E, 0x30, 0x32, 0x34, 0x36, 0x39 }, + {0x00, 0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0E, + 0x0F, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1A, 0x1B, + 0x1C, 0x1D, 0x1E, 0x20, 0x22, 0x24, 0x26, 0x29, + 0x2A, 0x2C, 0x2E, 0x30, 0x32, 0x34, 0x36, 0x39}, // 10 - { 0x00, 0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0E, - 0x0F, 0x10, 0x12, 0x14, 0x16, 0x19, 0x1B, 0x1E, - 0x1F, 0x21, 0x23, 0x25, 0x27, 0x29, 0x2B, 0x2D, - 0x2E, 0x2F, 0x31, 0x32, 0x34, 0x36, 0x39, 0x3C }, + {0x00, 0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0E, + 0x0F, 0x10, 0x12, 0x14, 0x16, 0x19, 0x1B, 0x1E, + 0x1F, 0x21, 0x23, 0x25, 0x27, 0x29, 0x2B, 0x2D, + 0x2E, 0x2F, 0x31, 0x32, 0x34, 0x36, 0x39, 0x3C}, // 11 - { 0x00, 0x01, 0x03, 0x05, 0x07, 0x0A, 0x0C, 0x0F, - 0x10, 0x11, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1E, - 0x1F, 0x20, 0x22, 0x24, 0x26, 0x28, 0x2B, 0x2E, - 0x2F, 0x30, 0x32, 0x34, 0x36, 0x39, 0x3C, 0x3F }, + {0x00, 0x01, 0x03, 0x05, 0x07, 0x0A, 0x0C, 0x0F, + 0x10, 0x11, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1E, + 0x1F, 0x20, 0x22, 0x24, 0x26, 0x28, 0x2B, 0x2E, + 0x2F, 0x30, 0x32, 0x34, 0x36, 0x39, 0x3C, 0x3F}, // 12 - { 0x00, 0x02, 0x04, 0x06, 0x08, 0x0B, 0x0D, 0x10, - 0x11, 0x12, 0x14, 0x16, 0x18, 0x1B, 0x1E, 0x21, - 0x22, 0x23, 0x25, 0x27, 0x29, 0x2C, 0x2F, 0x32, - 0x33, 0x34, 0x36, 0x38, 0x3B, 0x34, 0x41, 0x44 }, + {0x00, 0x02, 0x04, 0x06, 0x08, 0x0B, 0x0D, 0x10, + 0x11, 0x12, 0x14, 0x16, 0x18, 0x1B, 0x1E, 0x21, + 0x22, 0x23, 0x25, 0x27, 0x29, 0x2C, 0x2F, 0x32, + 0x33, 0x34, 0x36, 0x38, 0x3B, 0x34, 0x41, 0x44}, // 13 - { 0x00, 0x02, 0x04, 0x06, 0x08, 0x0B, 0x0D, 0x11, - 0x12, 0x13, 0x15, 0x17, 0x1A, 0x1D, 0x20, 0x23, - 0x24, 0x25, 0x27, 0x29, 0x2C, 0x2F, 0x32, 0x35, - 0x36, 0x37, 0x39, 0x3B, 0x3E, 0x41, 0x44, 0x47 } + {0x00, 0x02, 0x04, 0x06, 0x08, 0x0B, 0x0D, 0x11, + 0x12, 0x13, 0x15, 0x17, 0x1A, 0x1D, 0x20, 0x23, + 0x24, 0x25, 0x27, 0x29, 0x2C, 0x2F, 0x32, 0x35, + 0x36, 0x37, 0x39, 0x3B, 0x3E, 0x41, 0x44, 0x47} }; // #pragma mark - @@ -2195,50 +2601,64 @@ // At the time of writing, the only known case where Kyra 1 uses sound triggers // is in the castle, to cycle between three different songs. -const int CadlPlayer::_kyra1SoundTriggers[] = { +const int + CadlPlayer::_kyra1SoundTriggers[] = { 0, 4, 5, 3 }; -const int CadlPlayer::_kyra1NumSoundTriggers = ARRAYSIZE(CadlPlayer::_kyra1SoundTriggers); - -CadlPlayer::CadlPlayer(Copl *newopl) - : CPlayer(newopl), numsubsongs(0), _trackEntries(), _soundDataPtr(0) +const int + CadlPlayer::_kyra1NumSoundTriggers = +ARRAYSIZE (CadlPlayer::_kyra1SoundTriggers); + +CadlPlayer::CadlPlayer (Copl * newopl):CPlayer (newopl), numsubsongs (0), _trackEntries (), +_soundDataPtr (0) { - memset(_trackEntries, 0, sizeof(_trackEntries)); - _driver = new AdlibDriver(newopl); - assert(_driver); + memset (_trackEntries, 0, sizeof (_trackEntries)); + _driver = new AdlibDriver (newopl); + assert (_driver); _sfxPlayingSound = -1; - // _soundFileLoaded = ""; + // _soundFileLoaded = ""; _soundTriggers = _kyra1SoundTriggers; _numSoundTriggers = _kyra1NumSoundTriggers; - init(); + init (); } -CadlPlayer::~CadlPlayer() { - delete [] _soundDataPtr; _soundDataPtr = 0; - delete _driver; _driver = 0; +CadlPlayer::~CadlPlayer () +{ + delete[]_soundDataPtr; + _soundDataPtr = 0; + delete _driver; + _driver = 0; } -bool CadlPlayer::init() { - _driver->callback(2); - _driver->callback(16, int(4)); +bool +CadlPlayer::init () +{ + _driver->callback (2); + _driver->callback (16, int (4)); return true; } -void CadlPlayer::process() { - uint8 trigger = _driver->callback(11); - - if (trigger < _numSoundTriggers) { +void +CadlPlayer::process () +{ + uint8 trigger = _driver->callback (11); + + if (trigger < _numSoundTriggers) + { int soundId = _soundTriggers[trigger]; - if (soundId) { - playTrack(soundId); + if (soundId) + { + playTrack (soundId); } - } else { - warning("Unknown sound trigger %d", trigger); + } + else + { + warning ("Unknown sound trigger %d", trigger); // TODO: At this point, we really want to clear the trigger... } } @@ -2247,50 +2667,59 @@ // } // int CadlPlayer::getVolume() { -// return 0; +// return 0; // } // void CadlPlayer::loadMusicFile(const char *file) { -// loadSoundFile(file); +// loadSoundFile(file); // } -void CadlPlayer::playTrack(uint8 track) { - play(track); +void +CadlPlayer::playTrack (uint8 track) +{ + play (track); } // void CadlPlayer::haltTrack() { -// unk1(); -// unk2(); -// //_engine->_system->delayMillis(3 * 60); +// unk1(); +// unk2(); +// //_engine->_system->delayMillis(3 * 60); // } -void CadlPlayer::playSoundEffect(uint8_t track) { - play(track); +void +CadlPlayer::playSoundEffect (uint8_t track) +{ + play (track); } -void CadlPlayer::play(uint8_t track) { +void +CadlPlayer::play (uint8_t track) +{ uint8 soundId = _trackEntries[track]; - if ((int8)soundId == -1 || !_soundDataPtr) + if ((int8) soundId == -1 || !_soundDataPtr) return; soundId &= 0xFF; - _driver->callback(16, 0); - // while ((_driver->callback(16, 0) & 8)) { + _driver->callback (16, 0); + // while ((_driver->callback(16, 0) & 8)) { // We call the system delay and not the game delay to avoid concurrency issues. - // _engine->_system->delayMillis(10); - // } - if (_sfxPlayingSound != -1) { + // _engine->_system->delayMillis(10); + // } + if (_sfxPlayingSound != -1) + { // Restore the sounds's normal values. - _driver->callback(10, _sfxPlayingSound, int(1), int(_sfxPriority)); - _driver->callback(10, _sfxPlayingSound, int(3), int(_sfxFourthByteOfSong)); + _driver->callback (10, _sfxPlayingSound, int (1), int (_sfxPriority)); + _driver->callback (10, _sfxPlayingSound, int (3), + int (_sfxFourthByteOfSong)); _sfxPlayingSound = -1; } - int chan = _driver->callback(9, soundId, int(0)); - - if (chan != 9) { + int chan = _driver->callback (9, soundId, int (0)); + + if (chan != 9) + { _sfxPlayingSound = soundId; - _sfxPriority = _driver->callback(9, soundId, int(1)); - _sfxFourthByteOfSong = _driver->callback(9, soundId, int(3)); + _sfxPriority = _driver->callback (9, soundId, int (1)); + _sfxFourthByteOfSong = _driver->callback (9, soundId, int (3)); // In the cases I've seen, the mysterious fourth byte has been // the parameter for the update_setExtraLevel3() callback. @@ -2305,124 +2734,135 @@ int newVal = ((((-_sfxFourthByteOfSong) + 63) * 0xFF) >> 8) & 0xFF; newVal = -newVal + 63; - _driver->callback(10, soundId, int(3), newVal); + _driver->callback (10, soundId, int (3), newVal); newVal = ((_sfxPriority * 0xFF) >> 8) & 0xFF; - _driver->callback(10, soundId, int(1), newVal); + _driver->callback (10, soundId, int (1), newVal); } - _driver->callback(6, soundId); + _driver->callback (6, soundId); } // void CadlPlayer::beginFadeOut() { -// playSoundEffect(1); +// playSoundEffect(1); // } -bool CadlPlayer::load(VFSFile *fd, const CFileProvider &fp) +bool +CadlPlayer::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); - std::string filename(fd->uri); + binistream *f = fp.open (fd); + std::string filename (fd->uri); // file validation section - if(!f || !fp.extension(filename, ".adl")) { - fp.close(f); + if (!f || !fp.extension (filename, ".adl")) + { + fp.close (f); return false; } - // if (_soundFileLoaded == file) - // return; - - // if (_soundDataPtr) { - // haltTrack(); - // } - - uint8 *file_data = 0; uint32 file_size = 0; - - // char filename[25]; - // sprintf(filename, "%s.ADL", file); - - // file_data = _engine->resource()->fileData(filename, &file_size); - // if (!file_data) { - // warning("Couldn't find music file: '%s'", filename); - // return; - // } - - unk2(); - unk1(); - - file_size = fp.filesize(f); - file_data = new uint8 [file_size]; - f->readString((char *)file_data, file_size); - - _driver->callback(8, int(-1)); + // if (_soundFileLoaded == file) + // return; + + // if (_soundDataPtr) { + // haltTrack(); + // } + + uint8 *file_data = 0; + uint32 file_size = 0; + + // char filename[25]; + // sprintf(filename, "%s.ADL", file); + + // file_data = _engine->resource()->fileData(filename, &file_size); + // if (!file_data) { + // warning("Couldn't find music file: '%s'", filename); + // return; + // } + + unk2 (); + unk1 (); + + file_size = fp.filesize (f); + file_data = new uint8[file_size]; + f->readString ((char *) file_data, file_size); + + _driver->callback (8, int (-1)); _soundDataPtr = 0; uint8 *p = file_data; - memcpy(_trackEntries, p, 120*sizeof(uint8)); + memcpy (_trackEntries, p, 120 * sizeof (uint8)); p += 120; int soundDataSize = file_size - 120; _soundDataPtr = new uint8[soundDataSize]; - assert(_soundDataPtr); - - memcpy(_soundDataPtr, p, soundDataSize*sizeof(uint8)); - - delete [] file_data; + assert (_soundDataPtr); + + memcpy (_soundDataPtr, p, soundDataSize * sizeof (uint8)); + + delete[]file_data; file_data = p = 0; file_size = 0; - _driver->callback(4, _soundDataPtr); - - // _soundFileLoaded = file; - - for(int i = 0; i < 200; i++) - if(_trackEntries[i] != 0xff) + _driver->callback (4, _soundDataPtr); + + // _soundFileLoaded = file; + + for (int i = 0; i < 200; i++) + if (_trackEntries[i] != 0xff) numsubsongs = i + 1; - fp.close(f); + fp.close (f); return true; } -void CadlPlayer::rewind(int subsong) +void +CadlPlayer::rewind (int subsong) { - opl->init(); - opl->write(1,32); - playSoundEffect(subsong); + opl->init (); + opl->write (1, 32); + playSoundEffect (subsong); cursubsong = subsong; - update(); + update (); } -unsigned int CadlPlayer::getsubsongs() +unsigned int +CadlPlayer::getsubsongs () { return numsubsongs; } -bool CadlPlayer::update() +bool +CadlPlayer::update () { bool songend = true; // if(_trackEntries[cursubsong] == 0xff) // return false; - _driver->callback(); - - for(int i = 0; i < 10; i++) - if(_driver->_channels[i].dataptr != NULL) + _driver->callback (); + + for (int i = 0; i < 10; i++) + if (_driver->_channels[i].dataptr != NULL) songend = false; return !songend; } -void CadlPlayer::unk1() { - playSoundEffect(0); +void +CadlPlayer::unk1 () +{ + playSoundEffect (0); //_engine->_system->delayMillis(5 * 60); } -void CadlPlayer::unk2() { - playSoundEffect(0); +void +CadlPlayer::unk2 () +{ + playSoundEffect (0); } -CPlayer *CadlPlayer::factory(Copl *newopl) +CPlayer * +CadlPlayer::factory (Copl * newopl) { - return new CadlPlayer(newopl); + return new CadlPlayer (newopl); } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/adplug.cxx --- a/src/adplug/core/adplug.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/adplug.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -67,120 +67,136 @@ /***** Defines *****/ -#define VERSION "1.6" // AdPlug library version string +#define VERSION "1.6" // AdPlug library version string /***** CAdPlug *****/ // List of all players that come with the standard AdPlug distribution -const CPlayerDesc CAdPlug::allplayers[] = { - CPlayerDesc(ChscPlayer::factory, "HSC-Tracker", ".hsc\0"), - CPlayerDesc(CsngPlayer::factory, "SNGPlay", ".sng\0"), - CPlayerDesc(CimfPlayer::factory, "Apogee IMF", ".imf\0.wlf\0.adlib\0"), - CPlayerDesc(Ca2mLoader::factory, "Adlib Tracker 2", ".a2m\0"), - CPlayerDesc(CadtrackLoader::factory, "Adlib Tracker", ".sng\0"), - CPlayerDesc(CamdLoader::factory, "AMUSIC", ".amd\0"), - CPlayerDesc(CbamPlayer::factory, "Bob's Adlib Music", ".bam\0"), - CPlayerDesc(Cd00Player::factory, "Packed EdLib", ".d00\0"), - CPlayerDesc(CdfmLoader::factory, "Digital-FM", ".dfm\0"), - CPlayerDesc(ChspLoader::factory, "HSC Packed", ".hsp\0"), - CPlayerDesc(CksmPlayer::factory, "Ken Silverman Music", ".ksm\0"), - CPlayerDesc(CmadLoader::factory, "Mlat Adlib Tracker", ".mad\0"), - CPlayerDesc(CmidPlayer::factory, "MIDI", ".cmf\0.sci\0.laa\0"), - CPlayerDesc(CmkjPlayer::factory, "MKJamz", ".mkj\0"), - CPlayerDesc(CcffLoader::factory, "Boomtracker", ".cff\0"), - CPlayerDesc(CdmoLoader::factory, "TwinTeam", ".dmo\0"), - CPlayerDesc(Cs3mPlayer::factory, "Scream Tracker 3", ".s3m\0"), - CPlayerDesc(CdtmLoader::factory, "DeFy Adlib Tracker", ".dtm\0"), - CPlayerDesc(CfmcLoader::factory, "Faust Music Creator", ".sng\0"), - CPlayerDesc(CmtkLoader::factory, "MPU-401 Trakker", ".mtk\0"), - CPlayerDesc(CradLoader::factory, "Reality Adlib Tracker", ".rad\0"), - CPlayerDesc(CrawPlayer::factory, "RdosPlay RAW", ".raw\0"), - CPlayerDesc(Csa2Loader::factory, "Surprise! Adlib Tracker", ".sat\0.sa2\0"), - CPlayerDesc(CxadbmfPlayer::factory, "BMF Adlib Tracker", ".xad\0"), - CPlayerDesc(CxadflashPlayer::factory, "Flash", ".xad\0"), - CPlayerDesc(CxadhybridPlayer::factory, "Hybrid", ".xad\0"), - CPlayerDesc(CxadhypPlayer::factory, "Hypnosis", ".xad\0"), - CPlayerDesc(CxadpsiPlayer::factory, "PSI", ".xad\0"), - CPlayerDesc(CxadratPlayer::factory, "rat", ".xad\0"), - CPlayerDesc(CldsPlayer::factory, "LOUDNESS Sound System", ".lds\0"), - CPlayerDesc(Cu6mPlayer::factory, "Ultima 6 Music", ".m\0"), - CPlayerDesc(CrolPlayer::factory, "Adlib Visual Composer", ".rol\0"), - CPlayerDesc(CxsmPlayer::factory, "eXtra Simple Music", ".xsm\0"), - CPlayerDesc(CdroPlayer::factory, "DOSBox Raw OPL", ".dro\0"), - CPlayerDesc(CmscPlayer::factory, "Adlib MSC Player", ".msc\0"), - CPlayerDesc(CrixPlayer::factory, "Softstar RIX OPL Music", ".rix\0"), - CPlayerDesc(CadlPlayer::factory, "Westwood ADL", ".adl\0"), - CPlayerDesc() +const CPlayerDesc + CAdPlug::allplayers[] = { + CPlayerDesc (ChscPlayer::factory, "HSC-Tracker", ".hsc\0"), + CPlayerDesc (CsngPlayer::factory, "SNGPlay", ".sng\0"), + CPlayerDesc (CimfPlayer::factory, "Apogee IMF", ".imf\0.wlf\0.adlib\0"), + CPlayerDesc (Ca2mLoader::factory, "Adlib Tracker 2", ".a2m\0"), + CPlayerDesc (CadtrackLoader::factory, "Adlib Tracker", ".sng\0"), + CPlayerDesc (CamdLoader::factory, "AMUSIC", ".amd\0"), + CPlayerDesc (CbamPlayer::factory, "Bob's Adlib Music", ".bam\0"), + CPlayerDesc (Cd00Player::factory, "Packed EdLib", ".d00\0"), + CPlayerDesc (CdfmLoader::factory, "Digital-FM", ".dfm\0"), + CPlayerDesc (ChspLoader::factory, "HSC Packed", ".hsp\0"), + CPlayerDesc (CksmPlayer::factory, "Ken Silverman Music", ".ksm\0"), + CPlayerDesc (CmadLoader::factory, "Mlat Adlib Tracker", ".mad\0"), + CPlayerDesc (CmidPlayer::factory, "MIDI", ".cmf\0.sci\0.laa\0"), + CPlayerDesc (CmkjPlayer::factory, "MKJamz", ".mkj\0"), + CPlayerDesc (CcffLoader::factory, "Boomtracker", ".cff\0"), + CPlayerDesc (CdmoLoader::factory, "TwinTeam", ".dmo\0"), + CPlayerDesc (Cs3mPlayer::factory, "Scream Tracker 3", ".s3m\0"), + CPlayerDesc (CdtmLoader::factory, "DeFy Adlib Tracker", ".dtm\0"), + CPlayerDesc (CfmcLoader::factory, "Faust Music Creator", ".sng\0"), + CPlayerDesc (CmtkLoader::factory, "MPU-401 Trakker", ".mtk\0"), + CPlayerDesc (CradLoader::factory, "Reality Adlib Tracker", ".rad\0"), + CPlayerDesc (CrawPlayer::factory, "RdosPlay RAW", ".raw\0"), + CPlayerDesc (Csa2Loader::factory, "Surprise! Adlib Tracker", + ".sat\0.sa2\0"), + CPlayerDesc (CxadbmfPlayer::factory, "BMF Adlib Tracker", ".xad\0"), + CPlayerDesc (CxadflashPlayer::factory, "Flash", ".xad\0"), + CPlayerDesc (CxadhybridPlayer::factory, "Hybrid", ".xad\0"), + CPlayerDesc (CxadhypPlayer::factory, "Hypnosis", ".xad\0"), + CPlayerDesc (CxadpsiPlayer::factory, "PSI", ".xad\0"), + CPlayerDesc (CxadratPlayer::factory, "rat", ".xad\0"), + CPlayerDesc (CldsPlayer::factory, "LOUDNESS Sound System", ".lds\0"), + CPlayerDesc (Cu6mPlayer::factory, "Ultima 6 Music", ".m\0"), + CPlayerDesc (CrolPlayer::factory, "Adlib Visual Composer", ".rol\0"), + CPlayerDesc (CxsmPlayer::factory, "eXtra Simple Music", ".xsm\0"), + CPlayerDesc (CdroPlayer::factory, "DOSBox Raw OPL", ".dro\0"), + CPlayerDesc (CmscPlayer::factory, "Adlib MSC Player", ".msc\0"), + CPlayerDesc (CrixPlayer::factory, "Softstar RIX OPL Music", ".rix\0"), + CPlayerDesc (CadlPlayer::factory, "Westwood ADL", ".adl\0"), + CPlayerDesc () }; -const CPlayers &CAdPlug::init_players(const CPlayerDesc pd[]) +const + CPlayers & +CAdPlug::init_players (const CPlayerDesc pd[]) { - static CPlayers initplayers; - unsigned int i; + static CPlayers initplayers; + unsigned int i; - for(i = 0; pd[i].factory; i++) - initplayers.push_back(&pd[i]); + for (i = 0; pd[i].factory; i++) + initplayers.push_back (&pd[i]); return initplayers; } -const CPlayers CAdPlug::players = CAdPlug::init_players(CAdPlug::allplayers); -CAdPlugDatabase *CAdPlug::database = 0; +const CPlayers + CAdPlug::players = CAdPlug::init_players (CAdPlug::allplayers); +CAdPlugDatabase * + CAdPlug::database = 0; -CPlayer *CAdPlug::factory(VFSFile *fd, Copl *opl, const CPlayers &pl, - const CFileProvider &fp) +CPlayer * +CAdPlug::factory (VFSFile * fd, Copl * opl, const CPlayers & pl, + const CFileProvider & fp) { - CPlayer *p; - CPlayers::const_iterator i; - unsigned int j; + CPlayer *p; + CPlayers::const_iterator i; + unsigned int j; // Try a direct hit by file extension - for(i = pl.begin(); i != pl.end(); i++) - for(j = 0; (*i)->get_extension(j); j++) - if(fp.extension(fd->uri, (*i)->get_extension(j))) { - AdPlug_LogWrite("Trying direct hit: %s\n", (*i)->filetype.c_str()); - vfs_rewind(fd); - if((p = (*i)->factory(opl))) - if(p->load(fd, fp)) { - AdPlug_LogWrite("got it!\n"); - AdPlug_LogWrite("--- CAdPlug::factory ---\n"); - return p; - } else - delete p; + for (i = pl.begin (); i != pl.end (); i++) + for (j = 0; (*i)->get_extension (j); j++) + if (fp.extension (fd->uri, (*i)->get_extension (j))) + { + AdPlug_LogWrite ("Trying direct hit: %s\n", (*i)->filetype.c_str ()); + vfs_rewind (fd); + if ((p = (*i)->factory (opl))) + if (p->load (fd, fp)) + { + AdPlug_LogWrite ("got it!\n"); + AdPlug_LogWrite ("--- CAdPlug::factory ---\n"); + return p; + } + else + delete p; } #if 0 // Try all players, one by one - for(i = pl.begin(); i != pl.end(); i++) { - AdPlug_LogWrite("Trying: %s\n", (*i)->filetype.c_str()); - if((p = (*i)->factory(opl))) - if(p->load(fd, fp)) { - AdPlug_LogWrite("got it!\n"); - AdPlug_LogWrite("--- CAdPlug::factory ---\n"); - return p; - } else - delete p; + for (i = pl.begin (); i != pl.end (); i++) + { + AdPlug_LogWrite ("Trying: %s\n", (*i)->filetype.c_str ()); + if ((p = (*i)->factory (opl))) + if (p->load (fd, fp)) + { + AdPlug_LogWrite ("got it!\n"); + AdPlug_LogWrite ("--- CAdPlug::factory ---\n"); + return p; + } + else + delete p; } #endif // Unknown file - AdPlug_LogWrite("End of list!\n"); - AdPlug_LogWrite("--- CAdPlug::factory ---\n"); + AdPlug_LogWrite ("End of list!\n"); + AdPlug_LogWrite ("--- CAdPlug::factory ---\n"); return 0; } -void CAdPlug::set_database(CAdPlugDatabase *db) +void +CAdPlug::set_database (CAdPlugDatabase * db) { database = db; } -std::string CAdPlug::get_version() +std::string CAdPlug::get_version () { - return std::string(VERSION); + return std::string (VERSION); } -void CAdPlug::debug_output(const std::string &filename) +void +CAdPlug::debug_output (const std::string & filename) { - AdPlug_LogFile(filename.c_str()); - AdPlug_LogWrite("CAdPlug::debug_output(\"%s\"): Redirected.\n",filename.c_str()); + AdPlug_LogFile (filename.c_str ()); + AdPlug_LogWrite ("CAdPlug::debug_output(\"%s\"): Redirected.\n", + filename.c_str ()); } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/adtrack.cxx --- a/src/adplug/core/adtrack.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/adtrack.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -37,117 +37,177 @@ /*** Public methods ***/ -CPlayer *CadtrackLoader::factory(Copl *newopl) +CPlayer * +CadtrackLoader::factory (Copl * newopl) { - return new CadtrackLoader(newopl); + return new CadtrackLoader (newopl); } -bool CadtrackLoader::load(VFSFile *fd, const CFileProvider &fp) +bool +CadtrackLoader::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); if(!f) return false; + binistream *f = fp.open (fd); + if (!f) + return false; binistream *instf; char note[2]; unsigned short rwp; unsigned char chp, octave, pnote = 0; - int i,j; + int i, j; AdTrackInst myinst; - std::string filename(fd->uri); + std::string filename (fd->uri); // file validation - if(!fp.extension(filename, ".sng") || fp.filesize(f) != 36000) - { fp.close(f); return false; } + if (!fp.extension (filename, ".sng") || fp.filesize (f) != 36000) + { + fp.close (f); + return false; + } // check for instruments file - std::string instfilename(filename, 0, filename.find_last_of('.')); + std::string instfilename (filename, 0, filename.find_last_of ('.')); instfilename += ".ins"; - AdPlug_LogWrite("CadtrackLoader::load(,\"%s\"): Checking for \"%s\"...\n", - filename.c_str(), instfilename.c_str()); + AdPlug_LogWrite ("CadtrackLoader::load(,\"%s\"): Checking for \"%s\"...\n", + filename.c_str (), instfilename.c_str ()); - VFSFile *instfd = vfs_fopen(instfilename.c_str(), "rb"); - instf = fp.open(instfd); - if(!instf || fp.filesize(instf) != 468) { fp.close(f); vfs_fclose(instfd); return false; } + VFSFile *instfd = vfs_fopen (instfilename.c_str (), "rb"); + instf = fp.open (instfd); + if (!instf || fp.filesize (instf) != 468) + { + fp.close (f); + vfs_fclose (instfd); + return false; + } // give CmodPlayer a hint on what we're up to - realloc_patterns(1,1000,9); realloc_instruments(9); realloc_order(1); - init_trackord(); flags = NoKeyOn; - (*order) = 0; length = 1; restartpos = 0; bpm = 120; initspeed = 3; + realloc_patterns (1, 1000, 9); + realloc_instruments (9); + realloc_order (1); + init_trackord (); + flags = NoKeyOn; + (*order) = 0; + length = 1; + restartpos = 0; + bpm = 120; + initspeed = 3; // load instruments from instruments file - for(i=0;i<9;i++) { - for(j=0;j<2;j++) { - myinst.op[j].appampmod = instf->readInt(2); - myinst.op[j].appvib = instf->readInt(2); - myinst.op[j].maintsuslvl = instf->readInt(2); - myinst.op[j].keybscale = instf->readInt(2); - myinst.op[j].octave = instf->readInt(2); - myinst.op[j].freqrisevollvldn = instf->readInt(2); - myinst.op[j].softness = instf->readInt(2); - myinst.op[j].attack = instf->readInt(2); - myinst.op[j].decay = instf->readInt(2); - myinst.op[j].release = instf->readInt(2); - myinst.op[j].sustain = instf->readInt(2); - myinst.op[j].feedback = instf->readInt(2); - myinst.op[j].waveform = instf->readInt(2); + for (i = 0; i < 9; i++) + { + for (j = 0; j < 2; j++) + { + myinst.op[j].appampmod = instf->readInt (2); + myinst.op[j].appvib = instf->readInt (2); + myinst.op[j].maintsuslvl = instf->readInt (2); + myinst.op[j].keybscale = instf->readInt (2); + myinst.op[j].octave = instf->readInt (2); + myinst.op[j].freqrisevollvldn = instf->readInt (2); + myinst.op[j].softness = instf->readInt (2); + myinst.op[j].attack = instf->readInt (2); + myinst.op[j].decay = instf->readInt (2); + myinst.op[j].release = instf->readInt (2); + myinst.op[j].sustain = instf->readInt (2); + myinst.op[j].feedback = instf->readInt (2); + myinst.op[j].waveform = instf->readInt (2); } - convert_instrument(i, &myinst); + convert_instrument (i, &myinst); } - fp.close(instf); + fp.close (instf); // load file - for(rwp=0;rwp<1000;rwp++) - for(chp=0;chp<9;chp++) { + for (rwp = 0; rwp < 1000; rwp++) + for (chp = 0; chp < 9; chp++) + { // read next record - f->readString(note, 2); octave = f->readInt(1); f->ignore(); - switch(*note) { - case 'C': if(note[1] == '#') pnote = 2; else pnote = 1; break; - case 'D': if(note[1] == '#') pnote = 4; else pnote = 3; break; - case 'E': pnote = 5; break; - case 'F': if(note[1] == '#') pnote = 7; else pnote = 6; break; - case 'G': if(note[1] == '#') pnote = 9; else pnote = 8; break; - case 'A': if(note[1] == '#') pnote = 11; else pnote = 10; break; - case 'B': pnote = 12; break; + f->readString (note, 2); + octave = f->readInt (1); + f->ignore (); + switch (*note) + { + case 'C': + if (note[1] == '#') + pnote = 2; + else + pnote = 1; + break; + case 'D': + if (note[1] == '#') + pnote = 4; + else + pnote = 3; + break; + case 'E': + pnote = 5; + break; + case 'F': + if (note[1] == '#') + pnote = 7; + else + pnote = 6; + break; + case 'G': + if (note[1] == '#') + pnote = 9; + else + pnote = 8; + break; + case 'A': + if (note[1] == '#') + pnote = 11; + else + pnote = 10; + break; + case 'B': + pnote = 12; + break; case '\0': - if(note[1] == '\0') - tracks[chp][rwp].note = 127; - else { - fp.close(f); - return false; - } - break; - default: fp.close(f); return false; + if (note[1] == '\0') + tracks[chp][rwp].note = 127; + else + { + fp.close (f); + return false; + } + break; + default: + fp.close (f); + return false; } - if((*note) != '\0') { - tracks[chp][rwp].note = pnote + (octave * 12); - tracks[chp][rwp].inst = chp + 1; + if ((*note) != '\0') + { + tracks[chp][rwp].note = pnote + (octave * 12); + tracks[chp][rwp].inst = chp + 1; } } - fp.close(f); - rewind(0); + fp.close (f); + rewind (0); return true; } -float CadtrackLoader::getrefresh() +float +CadtrackLoader::getrefresh () { return 18.2f; } /*** Private methods ***/ -void CadtrackLoader::convert_instrument(unsigned int n, AdTrackInst *i) +void +CadtrackLoader::convert_instrument (unsigned int n, AdTrackInst * i) { // Carrier "Amp Mod / Vib / Env Type / KSR / Multiple" register inst[n].data[2] = i->op[Carrier].appampmod ? 1 << 7 : 0; inst[n].data[2] += i->op[Carrier].appvib ? 1 << 6 : 0; inst[n].data[2] += i->op[Carrier].maintsuslvl ? 1 << 5 : 0; inst[n].data[2] += i->op[Carrier].keybscale ? 1 << 4 : 0; - inst[n].data[2] += (i->op[Carrier].octave + 1) & 0xffff; // Bug in original tracker + inst[n].data[2] += (i->op[Carrier].octave + 1) & 0xffff; // Bug in original tracker // Modulator... inst[n].data[1] = i->op[Modulator].appampmod ? 1 << 7 : 0; inst[n].data[1] += i->op[Modulator].appvib ? 1 << 6 : 0; inst[n].data[1] += i->op[Modulator].maintsuslvl ? 1 << 5 : 0; inst[n].data[1] += i->op[Modulator].keybscale ? 1 << 4 : 0; - inst[n].data[1] += (i->op[Modulator].octave + 1) & 0xffff; // Bug in original tracker + inst[n].data[1] += (i->op[Modulator].octave + 1) & 0xffff; // Bug in original tracker // Carrier "Key Scaling / Level" register inst[n].data[10] = (i->op[Carrier].freqrisevollvldn & 3) << 6; diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/amd.cxx --- a/src/adplug/core/amd.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/amd.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -24,21 +24,26 @@ #include "amd.h" #include "debug.h" -CPlayer *CamdLoader::factory(Copl *newopl) +CPlayer * +CamdLoader::factory (Copl * newopl) { - return new CamdLoader(newopl); + return new CamdLoader (newopl); } -bool CamdLoader::load(VFSFile *fd, const CFileProvider &fp) +bool +CamdLoader::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); if(!f) return false; - struct { - char id[9]; - unsigned char version; - } header; - int i, j, k, t, numtrax, maxi = 0; - unsigned char buf, buf2, buf3; - const unsigned char convfx[10] = {0,1,2,9,17,11,13,18,3,14}; + binistream *f = fp.open (fd); + if (!f) + return false; + struct + { + char id[9]; + unsigned char version; + } header; + int i, j, k, t, numtrax, maxi = 0; + unsigned char buf, buf2, buf3; + const unsigned char convfx[10] = { 0, 1, 2, 9, 17, 11, 13, 18, 3, 14 }; const unsigned char convvol[64] = { 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 0xa, 0xa, 0xb, 0xc, 0xc, 0xd, 0xe, 0xe, 0xf, 0x10, 0x10, 0x11, 0x12, 0x13, 0x14, 0x14, @@ -47,147 +52,180 @@ 0x37, 0x3a, 0x3c, 0x3f }; - // file validation section - if(fp.filesize(f) < 1072) { fp.close(f); return false; } - f->seek(1062); f->readString(header.id, 9); - header.version = f->readInt(1); - if(strncmp(header.id, "seek (1062); + f->readString (header.id, 9); + header.version = f->readInt (1); + if (strncmp (header.id, "seek(0); - f->readString(songname, sizeof(songname)); - f->readString(author, sizeof(author)); - for(i = 0; i < 26; i++) { - f->readString(instname[i], 23); - for(j = 0; j < 11; j++) inst[i].data[j] = f->readInt(1); - } - length = f->readInt(1); nop = f->readInt(1) + 1; - for(i=0;i<128;i++) order[i] = f->readInt(1); - f->seek(10, binio::Add); - if(header.version == 0x10) { // unpacked module - maxi = nop * 9; - for(i=0;i<64*9;i++) - trackord[i/9][i%9] = i+1; - t = 0; - while(!f->ateof()) { - for(j=0;j<64;j++) - for(i=t;ireadInt(1); - tracks[i][j].param2 = (buf&127) % 10; - tracks[i][j].param1 = (buf&127) / 10; - buf = f->readInt(1); - tracks[i][j].inst = buf >> 4; - tracks[i][j].command = buf & 0x0f; - buf = f->readInt(1); - if(buf >> 4) // fix bug in AMD save routine - tracks[i][j].note = ((buf & 14) >> 1) * 12 + (buf >> 4); - else - tracks[i][j].note = 0; - tracks[i][j].inst += (buf & 1) << 4; - } - t += 9; - } - } else { // packed module - for(i=0;ireadInt(2) + 1; - numtrax = f->readInt(2); - for(k=0;kreadInt(2); - if(i > 575) i = 575; // fix corrupted modules - maxi = (i + 1 > maxi ? i + 1 : maxi); - j = 0; - do { - buf = f->readInt(1); - if(buf & 128) { - for(t = j; t < j + (buf & 127) && t < 64; t++) { - tracks[i][t].command = 0; - tracks[i][t].inst = 0; - tracks[i][t].note = 0; - tracks[i][t].param1 = 0; - tracks[i][t].param2 = 0; - } - j += buf & 127; - continue; - } - tracks[i][j].param2 = buf % 10; - tracks[i][j].param1 = buf / 10; - buf = f->readInt(1); - tracks[i][j].inst = buf >> 4; - tracks[i][j].command = buf & 0x0f; - buf = f->readInt(1); - if(buf >> 4) // fix bug in AMD save routine - tracks[i][j].note = ((buf & 14) >> 1) * 12 + (buf >> 4); - else - tracks[i][j].note = 0; - tracks[i][j].inst += (buf & 1) << 4; - j++; - } while(j<64); - } - } - fp.close(f); + // load section + memset (inst, 0, sizeof (inst)); + f->seek (0); + f->readString (songname, sizeof (songname)); + f->readString (author, sizeof (author)); + for (i = 0; i < 26; i++) + { + f->readString (instname[i], 23); + for (j = 0; j < 11; j++) + inst[i].data[j] = f->readInt (1); + } + length = f->readInt (1); + nop = f->readInt (1) + 1; + for (i = 0; i < 128; i++) + order[i] = f->readInt (1); + f->seek (10, binio::Add); + if (header.version == 0x10) + { // unpacked module + maxi = nop * 9; + for (i = 0; i < 64 * 9; i++) + trackord[i / 9][i % 9] = i + 1; + t = 0; + while (!f->ateof ()) + { + for (j = 0; j < 64; j++) + for (i = t; i < t + 9; i++) + { + buf = f->readInt (1); + tracks[i][j].param2 = (buf & 127) % 10; + tracks[i][j].param1 = (buf & 127) / 10; + buf = f->readInt (1); + tracks[i][j].inst = buf >> 4; + tracks[i][j].command = buf & 0x0f; + buf = f->readInt (1); + if (buf >> 4) // fix bug in AMD save routine + tracks[i][j].note = ((buf & 14) >> 1) * 12 + (buf >> 4); + else + tracks[i][j].note = 0; + tracks[i][j].inst += (buf & 1) << 4; + } + t += 9; + } + } + else + { // packed module + for (i = 0; i < nop; i++) + for (j = 0; j < 9; j++) + trackord[i][j] = f->readInt (2) + 1; + numtrax = f->readInt (2); + for (k = 0; k < numtrax; k++) + { + i = f->readInt (2); + if (i > 575) + i = 575; // fix corrupted modules + maxi = (i + 1 > maxi ? i + 1 : maxi); + j = 0; + do + { + buf = f->readInt (1); + if (buf & 128) + { + for (t = j; t < j + (buf & 127) && t < 64; t++) + { + tracks[i][t].command = 0; + tracks[i][t].inst = 0; + tracks[i][t].note = 0; + tracks[i][t].param1 = 0; + tracks[i][t].param2 = 0; + } + j += buf & 127; + continue; + } + tracks[i][j].param2 = buf % 10; + tracks[i][j].param1 = buf / 10; + buf = f->readInt (1); + tracks[i][j].inst = buf >> 4; + tracks[i][j].command = buf & 0x0f; + buf = f->readInt (1); + if (buf >> 4) // fix bug in AMD save routine + tracks[i][j].note = ((buf & 14) >> 1) * 12 + (buf >> 4); + else + tracks[i][j].note = 0; + tracks[i][j].inst += (buf & 1) << 4; + j++; + } while (j < 64); + } + } + fp.close (f); - // convert to protracker replay data - bpm = 50; restartpos = 0; flags = Decimal; - for(i=0;i<26;i++) { // convert instruments - buf = inst[i].data[0]; - buf2 = inst[i].data[1]; - inst[i].data[0] = inst[i].data[10]; - inst[i].data[1] = buf; - buf = inst[i].data[2]; - inst[i].data[2] = inst[i].data[5]; - buf3 = inst[i].data[3]; - inst[i].data[3] = buf; - buf = inst[i].data[4]; - inst[i].data[4] = inst[i].data[7]; - inst[i].data[5] = buf3; - buf3 = inst[i].data[6]; - inst[i].data[6] = inst[i].data[8]; - inst[i].data[7] = buf; - inst[i].data[8] = inst[i].data[9]; - inst[i].data[9] = buf2; - inst[i].data[10] = buf3; - for(j=0;j<23;j++) // convert names - if(instname[i][j] == '\xff') - instname[i][j] = '\x20'; - } - for(i=0;i 63) vol = 63; - tracks[i][j].param1 = vol / 10; - tracks[i][j].param2 = vol % 10; + if (vol > 63) + vol = 63; + tracks[i][j].param1 = vol / 10; + tracks[i][j].param2 = vol % 10; } - } + } - rewind(0); - return true; + rewind (0); + return true; } -float CamdLoader::getrefresh() +float +CamdLoader::getrefresh () { - if(tempo) - return (float) (tempo); - else - return 18.2f; + if (tempo) + return (float) (tempo); + else + return 18.2f; } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/bam.cxx --- a/src/adplug/core/bam.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/bam.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -50,154 +50,195 @@ #include #include "bam.h" -const unsigned short CbamPlayer::freq[] = {172,182,193,205,217,230,243,258,274, -290,307,326,345,365,387,410,435,460,489,517,547,580,614,651,1369,1389,1411, -1434,1459,1484,1513,1541,1571,1604,1638,1675,2393,2413,2435,2458,2483,2508, -2537,2565,2595,2628,2662,2699,3417,3437,3459,3482,3507,3532,3561,3589,3619, -3652,3686,3723,4441,4461,4483,4506,4531,4556,4585,4613,4643,4676,4710,4747, -5465,5485,5507,5530,5555,5580,5609,5637,5667,5700,5734,5771,6489,6509,6531, -6554,6579,6604,6633,6661,6691,6724,6758,6795,7513,7533,7555,7578,7603,7628, -7657,7685,7715,7748,7782,7819,7858,7898,7942,7988,8037,8089,8143,8191,8191, -8191,8191,8191,8191,8191,8191,8191,8191,8191,8191}; +const unsigned short + CbamPlayer::freq[] = { 172, 182, 193, 205, 217, 230, 243, 258, 274, + 290, 307, 326, 345, 365, 387, 410, 435, 460, 489, 517, 547, 580, 614, 651, + 1369, 1389, 1411, + 1434, 1459, 1484, 1513, 1541, 1571, 1604, 1638, 1675, 2393, 2413, 2435, + 2458, 2483, 2508, + 2537, 2565, 2595, 2628, 2662, 2699, 3417, 3437, 3459, 3482, 3507, 3532, + 3561, 3589, 3619, + 3652, 3686, 3723, 4441, 4461, 4483, 4506, 4531, 4556, 4585, 4613, 4643, + 4676, 4710, 4747, + 5465, 5485, 5507, 5530, 5555, 5580, 5609, 5637, 5667, 5700, 5734, 5771, + 6489, 6509, 6531, + 6554, 6579, 6604, 6633, 6661, 6691, 6724, 6758, 6795, 7513, 7533, 7555, + 7578, 7603, 7628, + 7657, 7685, 7715, 7748, 7782, 7819, 7858, 7898, 7942, 7988, 8037, 8089, + 8143, 8191, 8191, + 8191, 8191, 8191, 8191, 8191, 8191, 8191, 8191, 8191, 8191 +}; -CPlayer *CbamPlayer::factory(Copl *newopl) +CPlayer * +CbamPlayer::factory (Copl * newopl) { - return new CbamPlayer(newopl); + return new CbamPlayer (newopl); } -bool CbamPlayer::load(VFSFile *fd, const CFileProvider &fp) +bool +CbamPlayer::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); if(!f) return false; - char id[4]; - unsigned int i; + binistream *f = fp.open (fd); + if (!f) + return false; + char id[4]; + unsigned int i; - size = fp.filesize(f) - 4; // filesize minus header - f->readString(id, 4); - if(strncmp(id,"CBMF",4)) { fp.close(f); return false; } + size = fp.filesize (f) - 4; // filesize minus header + f->readString (id, 4); + if (strncmp (id, "CBMF", 4)) + { + fp.close (f); + return false; + } - song = new unsigned char [size]; - for(i = 0; i < size; i++) song[i] = f->readInt(1); + song = new unsigned char[size]; + for (i = 0; i < size; i++) + song[i] = f->readInt (1); - fp.close(f); - rewind(0); - return true; + fp.close (f); + rewind (0); + return true; } -bool CbamPlayer::update() +bool +CbamPlayer::update () { - unsigned char cmd,c; + unsigned char cmd, c; - if(del) { - del--; - return !songend; - } + if (del) + { + del--; + return !songend; + } - if(pos >= size) { // EOF detection - pos = 0; - songend = true; - } + if (pos >= size) + { // EOF detection + pos = 0; + songend = true; + } - while(song[pos] < 128) { - cmd = song[pos] & 240; - c = song[pos] & 15; - switch(cmd) { - case 0: // stop song - pos = 0; - songend = true; - break; - case 16: // start note - if(c < 9) { - opl->write(0xa0 + c, freq[song[++pos]] & 255); - opl->write(0xb0 + c, (freq[song[pos]] >> 8) + 32); - } else - pos++; - pos++; - break; - case 32: // stop note - if(c < 9) - opl->write(0xb0 + c, 0); - pos++; - break; - case 48: // define instrument - if(c < 9) { - opl->write(0x20 + op_table[c],song[pos+1]); - opl->write(0x23 + op_table[c],song[pos+2]); - opl->write(0x40 + op_table[c],song[pos+3]); - opl->write(0x43 + op_table[c],song[pos+4]); - opl->write(0x60 + op_table[c],song[pos+5]); - opl->write(0x63 + op_table[c],song[pos+6]); - opl->write(0x80 + op_table[c],song[pos+7]); - opl->write(0x83 + op_table[c],song[pos+8]); - opl->write(0xe0 + op_table[c],song[pos+9]); - opl->write(0xe3 + op_table[c],song[pos+10]); - opl->write(0xc0 + c,song[pos+11]); - } - pos += 12; - break; - case 80: // set label - label[c].target = ++pos; - label[c].defined = true; - break; - case 96: // jump - if(label[c].defined) - switch(song[pos+1]) { - case 254: // infinite loop - if(label[c].defined) { - pos = label[c].target; - songend = true; - break; - } - // fall through... - case 255: // chorus - if(!chorus && label[c].defined) { - chorus = true; - gosub = pos + 2; - pos = label[c].target; - break; - } - // fall through... - case 0: // end of loop - pos += 2; - break; - default: // finite loop - if(!label[c].count) { // loop elapsed - label[c].count = 255; - pos += 2; - break; - } - if(label[c].count < 255) // loop defined - label[c].count--; - else // loop undefined - label[c].count = song[pos+1] - 1; - pos = label[c].target; - break; - } - break; - case 112: // end of chorus - if(chorus) { - pos = gosub; - chorus = false; - } else - pos++; - break; - default: // reserved command (skip) - pos++; - break; - } - } - if(song[pos] >= 128) { // wait - del = song[pos] - 127; - pos++; - } - return !songend; + while (song[pos] < 128) + { + cmd = song[pos] & 240; + c = song[pos] & 15; + switch (cmd) + { + case 0: // stop song + pos = 0; + songend = true; + break; + case 16: // start note + if (c < 9) + { + opl->write (0xa0 + c, freq[song[++pos]] & 255); + opl->write (0xb0 + c, (freq[song[pos]] >> 8) + 32); + } + else + pos++; + pos++; + break; + case 32: // stop note + if (c < 9) + opl->write (0xb0 + c, 0); + pos++; + break; + case 48: // define instrument + if (c < 9) + { + opl->write (0x20 + op_table[c], song[pos + 1]); + opl->write (0x23 + op_table[c], song[pos + 2]); + opl->write (0x40 + op_table[c], song[pos + 3]); + opl->write (0x43 + op_table[c], song[pos + 4]); + opl->write (0x60 + op_table[c], song[pos + 5]); + opl->write (0x63 + op_table[c], song[pos + 6]); + opl->write (0x80 + op_table[c], song[pos + 7]); + opl->write (0x83 + op_table[c], song[pos + 8]); + opl->write (0xe0 + op_table[c], song[pos + 9]); + opl->write (0xe3 + op_table[c], song[pos + 10]); + opl->write (0xc0 + c, song[pos + 11]); + } + pos += 12; + break; + case 80: // set label + label[c].target = ++pos; + label[c].defined = true; + break; + case 96: // jump + if (label[c].defined) + switch (song[pos + 1]) + { + case 254: // infinite loop + if (label[c].defined) + { + pos = label[c].target; + songend = true; + break; + } + // fall through... + case 255: // chorus + if (!chorus && label[c].defined) + { + chorus = true; + gosub = pos + 2; + pos = label[c].target; + break; + } + // fall through... + case 0: // end of loop + pos += 2; + break; + default: // finite loop + if (!label[c].count) + { // loop elapsed + label[c].count = 255; + pos += 2; + break; + } + if (label[c].count < 255) // loop defined + label[c].count--; + else // loop undefined + label[c].count = song[pos + 1] - 1; + pos = label[c].target; + break; + } + break; + case 112: // end of chorus + if (chorus) + { + pos = gosub; + chorus = false; + } + else + pos++; + break; + default: // reserved command (skip) + pos++; + break; + } + } + if (song[pos] >= 128) + { // wait + del = song[pos] - 127; + pos++; + } + return !songend; } -void CbamPlayer::rewind(int subsong) +void +CbamPlayer::rewind (int subsong) { - int i; + int i; - pos = 0; songend = false; del = 0; gosub = 0; chorus = false; - memset(label, 0, sizeof(label)); label[0].defined = true; - for(i = 0; i < 16; i++) label[i].count = 255; // 255 = undefined - opl->init(); opl->write(1,32); + pos = 0; + songend = false; + del = 0; + gosub = 0; + chorus = false; + memset (label, 0, sizeof (label)); + label[0].defined = true; + for (i = 0; i < 16; i++) + label[i].count = 255; // 255 = undefined + opl->init (); + opl->write (1, 32); } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/bmf.cxx --- a/src/adplug/core/bmf.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/bmf.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -43,57 +43,69 @@ #include "bmf.h" #include "debug.h" -const unsigned char CxadbmfPlayer::bmf_adlib_registers[117] = -{ - 0x20, 0x23, 0x40, 0x43, 0x60, 0x63, 0x80, 0x83, 0xA0, 0xB0, 0xC0, 0xE0, 0xE3, - 0x21, 0x24, 0x41, 0x44, 0x61, 0x64, 0x81, 0x84, 0xA1, 0xB1, 0xC1, 0xE1, 0xE4, - 0x22, 0x25, 0x42, 0x45, 0x62, 0x65, 0x82, 0x85, 0xA2, 0xB2, 0xC2, 0xE2, 0xE5, - 0x28, 0x2B, 0x48, 0x4B, 0x68, 0x6B, 0x88, 0x8B, 0xA3, 0xB3, 0xC3, 0xE8, 0xEB, - 0x29, 0x2C, 0x49, 0x4C, 0x69, 0x6C, 0x89, 0x8C, 0xA4, 0xB4, 0xC4, 0xE9, 0xEC, - 0x2A, 0x2D, 0x4A, 0x4D, 0x6A, 0x6D, 0x8A, 0x8D, 0xA5, 0xB5, 0xC5, 0xEA, 0xED, - 0x30, 0x33, 0x50, 0x53, 0x70, 0x73, 0x90, 0x93, 0xA6, 0xB6, 0xC6, 0xF0, 0xF3, - 0x31, 0x34, 0x51, 0x54, 0x71, 0x74, 0x91, 0x94, 0xA7, 0xB7, 0xC7, 0xF1, 0xF4, +const unsigned char + CxadbmfPlayer::bmf_adlib_registers[117] = { + 0x20, 0x23, 0x40, 0x43, 0x60, 0x63, 0x80, 0x83, 0xA0, 0xB0, 0xC0, 0xE0, + 0xE3, + 0x21, 0x24, 0x41, 0x44, 0x61, 0x64, 0x81, 0x84, 0xA1, 0xB1, 0xC1, 0xE1, + 0xE4, + 0x22, 0x25, 0x42, 0x45, 0x62, 0x65, 0x82, 0x85, 0xA2, 0xB2, 0xC2, 0xE2, + 0xE5, + 0x28, 0x2B, 0x48, 0x4B, 0x68, 0x6B, 0x88, 0x8B, 0xA3, 0xB3, 0xC3, 0xE8, + 0xEB, + 0x29, 0x2C, 0x49, 0x4C, 0x69, 0x6C, 0x89, 0x8C, 0xA4, 0xB4, 0xC4, 0xE9, + 0xEC, + 0x2A, 0x2D, 0x4A, 0x4D, 0x6A, 0x6D, 0x8A, 0x8D, 0xA5, 0xB5, 0xC5, 0xEA, + 0xED, + 0x30, 0x33, 0x50, 0x53, 0x70, 0x73, 0x90, 0x93, 0xA6, 0xB6, 0xC6, 0xF0, + 0xF3, + 0x31, 0x34, 0x51, 0x54, 0x71, 0x74, 0x91, 0x94, 0xA7, 0xB7, 0xC7, 0xF1, + 0xF4, 0x32, 0x35, 0x52, 0x55, 0x72, 0x75, 0x92, 0x95, 0xA8, 0xB8, 0xC8, 0xF2, 0xF5 }; -const unsigned short CxadbmfPlayer::bmf_notes[12] = -{ - 0x157, 0x16B, 0x181, 0x198, 0x1B0, 0x1CA, 0x1E5, 0x202, 0x220, 0x241, 0x263, 0x287 +const unsigned short + CxadbmfPlayer::bmf_notes[12] = { + 0x157, 0x16B, 0x181, 0x198, 0x1B0, 0x1CA, 0x1E5, 0x202, 0x220, 0x241, 0x263, + 0x287 }; /* for 1.1 */ -const unsigned short CxadbmfPlayer::bmf_notes_2[12] = -{ - 0x159, 0x16D, 0x183, 0x19A, 0x1B2, 0x1CC, 0x1E8, 0x205, 0x223, 0x244, 0x267, 0x28B +const unsigned short + CxadbmfPlayer::bmf_notes_2[12] = { + 0x159, 0x16D, 0x183, 0x19A, 0x1B2, 0x1CC, 0x1E8, 0x205, 0x223, 0x244, 0x267, + 0x28B }; -const unsigned char CxadbmfPlayer::bmf_default_instrument[13] = -{ +const unsigned char + CxadbmfPlayer::bmf_default_instrument[13] = { 0x01, 0x01, 0x3F, 0x3F, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00 }; -CPlayer *CxadbmfPlayer::factory(Copl *newopl) +CPlayer * +CxadbmfPlayer::factory (Copl * newopl) { - return new CxadbmfPlayer(newopl); + return new CxadbmfPlayer (newopl); } -bool CxadbmfPlayer::xadplayer_load() +bool +CxadbmfPlayer::xadplayer_load () { unsigned short ptr = 0; int i; - if(xad.fmt != BMF) + if (xad.fmt != BMF) return false; #ifdef DEBUG - AdPlug_LogWrite("\nbmf_load():\n\n"); + AdPlug_LogWrite ("\nbmf_load():\n\n"); #endif - if (!strncmp((char *)&tune[0],"BMF1.2",6)) + if (!strncmp ((char *) &tune[0], "BMF1.2", 6)) { bmf.version = BMF1_2; bmf.timer = 70.0f; } - else if (!strncmp((char *)&tune[0],"BMF1.1",6)) + else if (!strncmp ((char *) &tune[0], "BMF1.1", 6)) { bmf.version = BMF1_1; bmf.timer = 60.0f; @@ -109,94 +121,105 @@ { ptr = 6; - strncpy(bmf.title,(char *)&tune[ptr],36); + strncpy (bmf.title, (char *) &tune[ptr], 36); - while (tune[ptr]) { ptr++; } - ptr++; + while (tune[ptr]) + { + ptr++; + } + ptr++; - strncpy(bmf.author,(char *)&tune[ptr],36); + strncpy (bmf.author, (char *) &tune[ptr], 36); - while (tune[ptr]) { ptr++; } - ptr++; + while (tune[ptr]) + { + ptr++; + } + ptr++; } else { - strncpy(bmf.title,xad.title,36); - strncpy(bmf.author,xad.author,36); + strncpy (bmf.title, xad.title, 36); + strncpy (bmf.author, xad.author, 36); } // speed if (bmf.version > BMF0_9B) bmf.speed = tune[ptr++]; else - bmf.speed = ((tune[ptr++] << 8) / 3) >> 8; // strange, yeh ? + bmf.speed = ((tune[ptr++] << 8) / 3) >> 8; // strange, yeh ? // load instruments if (bmf.version > BMF0_9B) { - unsigned long iflags = (tune[ptr] << 24) | (tune[ptr+1] << 16) | (tune[ptr+2] << 8) | tune[ptr+3]; - ptr+=4; + unsigned long iflags = + (tune[ptr] << 24) | (tune[ptr + 1] << 16) | (tune[ptr + 2] << 8) | + tune[ptr + 3]; + ptr += 4; - for(i=0;i<32;i++) - if (iflags & (1 << (31-i))) - { - strcpy(bmf.instruments[i].name, (char *)&tune[ptr]); - memcpy(bmf.instruments[i].data, &tune[ptr+11], 13); + for (i = 0; i < 32; i++) + if (iflags & (1 << (31 - i))) + { + strcpy (bmf.instruments[i].name, (char *) &tune[ptr]); + memcpy (bmf.instruments[i].data, &tune[ptr + 11], 13); ptr += 24; - } + } else - { + { bmf.instruments[i].name[0] = 0; - + if (bmf.version == BMF1_1) - for(int j=0;j<13;j++) - bmf.instruments[i].data[j] = bmf_default_instrument[j]; + for (int j = 0; j < 13; j++) + bmf.instruments[i].data[j] = bmf_default_instrument[j]; else - for(int j=0;j<13;j++) - bmf.instruments[i].data[j] = 0; - } + for (int j = 0; j < 13; j++) + bmf.instruments[i].data[j] = 0; + } } else { ptr = 6; - for(i=0;i<32;i++) + for (i = 0; i < 32; i++) { bmf.instruments[i].name[0] = 0; - memcpy(bmf.instruments[tune[ptr]].data, &tune[ptr+2],13); // bug no.1 (no instrument-table-end detection) - ptr+=15; + memcpy (bmf.instruments[tune[ptr]].data, &tune[ptr + 2], 13); // bug no.1 (no instrument-table-end detection) + ptr += 15; } } - + // load streams if (bmf.version > BMF0_9B) { - unsigned long sflags = (tune[ptr] << 24) | (tune[ptr+1] << 16) | (tune[ptr+2] << 8) | tune[ptr+3]; - ptr+=4; + unsigned long sflags = + (tune[ptr] << 24) | (tune[ptr + 1] << 16) | (tune[ptr + 2] << 8) | + tune[ptr + 3]; + ptr += 4; - for(i=0;i<9;i++) - if (sflags & (1 << (31-i))) - ptr+=__bmf_convert_stream(&tune[ptr],i); + for (i = 0; i < 9; i++) + if (sflags & (1 << (31 - i))) + ptr += __bmf_convert_stream (&tune[ptr], i); else bmf.streams[i][0].cmd = 0xFF; } else { - for(i=0;i BMF0_9B) { - opl_write(0x01, 0x20); - + opl_write (0x01, 0x20); + /* 1.1 */ if (bmf.version == BMF1_1) - for(i=0;i<9;i++) - for(j=0;j<13;j++) - opl_write(bmf_adlib_registers[13*i+j], bmf_default_instrument[j]); + for (i = 0; i < 9; i++) + for (j = 0; j < 13; j++) + opl_write (bmf_adlib_registers[13 * i + j], + bmf_default_instrument[j]); /* 1.2 */ else if (bmf.version == BMF1_2) - for(i=0x20; i<0x100; i++) - opl_write(i,0xFF); // very interesting, really! + for (i = 0x20; i < 0x100; i++) + opl_write (i, 0xFF); // very interesting, really! } /* ALL */ - opl_write(0x08, 0x00); - opl_write(0xBD, 0xC0); + opl_write (0x08, 0x00); + opl_write (0xBD, 0xC0); } -void CxadbmfPlayer::xadplayer_update() +void +CxadbmfPlayer::xadplayer_update () { - for(int i=0;i<9;i++) + for (int i = 0; i < 9; i++) if (bmf.channel[i].stream_position != 0xFFFF) - if (bmf.channel[i].delay) - bmf.channel[i].delay--; - else - { + if (bmf.channel[i].delay) + bmf.channel[i].delay--; + else + { #ifdef DEBUG - AdPlug_LogWrite("channel %02X:\n", i); + AdPlug_LogWrite ("channel %02X:\n", i); #endif - bmf_event event; + bmf_event event; - // process so-called cross-events - while (true) - { - memcpy(&event, &bmf.streams[i][bmf.channel[i].stream_position], sizeof(bmf_event)); + // process so-called cross-events + while (true) + { + memcpy (&event, &bmf.streams[i][bmf.channel[i].stream_position], + sizeof (bmf_event)); #ifdef DEBUG - AdPlug_LogWrite("%02X %02X %02X %02X %02X %02X\n", - event.note,event.delay,event.volume,event.instrument, - event.cmd,event.cmd_data); + AdPlug_LogWrite ("%02X %02X %02X %02X %02X %02X\n", + event.note, event.delay, event.volume, + event.instrument, event.cmd, event.cmd_data); #endif - if (event.cmd == 0xFF) - { - bmf.channel[i].stream_position = 0xFFFF; - bmf.active_streams--; - break; - } - else if (event.cmd == 0xFE) - { - bmf.channel[i].loop_position = bmf.channel[i].stream_position+1; - bmf.channel[i].loop_counter = event.cmd_data; - } - else if (event.cmd == 0xFD) - { - if (bmf.channel[i].loop_counter) + if (event.cmd == 0xFF) { - bmf.channel[i].stream_position = bmf.channel[i].loop_position-1; - bmf.channel[i].loop_counter--; + bmf.channel[i].stream_position = 0xFFFF; + bmf.active_streams--; + break; } - } - else - break; - - bmf.channel[i].stream_position++; - } // while (true) - - // process normal event - unsigned short pos = bmf.channel[i].stream_position; - - if (pos != 0xFFFF) - { - bmf.channel[i].delay = bmf.streams[i][pos].delay; - - // command ? - if (bmf.streams[i][pos].cmd) - { - unsigned char cmd = bmf.streams[i][pos].cmd; - - // 0x01: Set Modulator Volume - if (cmd == 0x01) - { - unsigned char reg = bmf_adlib_registers[13*i+2]; - - opl_write(reg, (adlib[reg] | 0x3F) - bmf.streams[i][pos].cmd_data); - } - // 0x10: Set Speed - else if (cmd == 0x10) - { - plr.speed = bmf.streams[i][pos].cmd_data; - plr.speed_counter = plr.speed; - } - } // if (bmf.streams[i][pos].cmd) - - // instrument ? - if (bmf.streams[i][pos].instrument) - { - unsigned char ins = bmf.streams[i][pos].instrument-1; - - if (bmf.version != BMF1_1) - opl_write(0xB0+i, adlib[0xB0+i] & 0xDF); - - for(int j=0;j<13;j++) - opl_write(bmf_adlib_registers[i*13+j], bmf.instruments[ins].data[j]); - } // if (bmf.streams[i][pos].instrument) - - // volume ? - if (bmf.streams[i][pos].volume) - { - unsigned char vol = bmf.streams[i][pos].volume-1; - unsigned char reg = bmf_adlib_registers[13*i+3]; - - opl_write(reg, (adlib[reg] | 0x3F) - vol); - } // if (bmf.streams[i][pos].volume) - - // note ? - if (bmf.streams[i][pos].note) - { - unsigned short note = bmf.streams[i][pos].note; - unsigned short freq = 0; - - // mute channel - opl_write(0xB0+i, adlib[0xB0+i] & 0xDF); - - // get frequency - if (bmf.version == BMF1_1) + else if (event.cmd == 0xFE) + { + bmf.channel[i].loop_position = bmf.channel[i].stream_position + 1; + bmf.channel[i].loop_counter = event.cmd_data; + } + else if (event.cmd == 0xFD) { - if (note <= 0x60) - freq = bmf_notes_2[--note % 12]; + if (bmf.channel[i].loop_counter) + { + bmf.channel[i].stream_position = + bmf.channel[i].loop_position - 1; + bmf.channel[i].loop_counter--; + } } else - { - if (note != 0x7F) - freq = bmf_notes[--note % 12]; - } + break; + + bmf.channel[i].stream_position++; + } // while (true) + + // process normal event + unsigned short pos = bmf.channel[i].stream_position; + + if (pos != 0xFFFF) + { + bmf.channel[i].delay = bmf.streams[i][pos].delay; + + // command ? + if (bmf.streams[i][pos].cmd) + { + unsigned char cmd = bmf.streams[i][pos].cmd; - // play note - if (freq) + // 0x01: Set Modulator Volume + if (cmd == 0x01) + { + unsigned char reg = bmf_adlib_registers[13 * i + 2]; + + opl_write (reg, + (adlib[reg] | 0x3F) - bmf.streams[i][pos].cmd_data); + } + // 0x10: Set Speed + else if (cmd == 0x10) + { + plr.speed = bmf.streams[i][pos].cmd_data; + plr.speed_counter = plr.speed; + } + } // if (bmf.streams[i][pos].cmd) + + // instrument ? + if (bmf.streams[i][pos].instrument) { - opl_write(0xB0+i, (freq >> 8) | ((note / 12) << 2) | 0x20); - opl_write(0xA0+i, freq & 0xFF); - } - } // if (bmf.streams[i][pos].note) + unsigned char ins = bmf.streams[i][pos].instrument - 1; + + if (bmf.version != BMF1_1) + opl_write (0xB0 + i, adlib[0xB0 + i] & 0xDF); + + for (int j = 0; j < 13; j++) + opl_write (bmf_adlib_registers[i * 13 + j], + bmf.instruments[ins].data[j]); + } // if (bmf.streams[i][pos].instrument) + + // volume ? + if (bmf.streams[i][pos].volume) + { + unsigned char vol = bmf.streams[i][pos].volume - 1; + unsigned char reg = bmf_adlib_registers[13 * i + 3]; + + opl_write (reg, (adlib[reg] | 0x3F) - vol); + } // if (bmf.streams[i][pos].volume) + + // note ? + if (bmf.streams[i][pos].note) + { + unsigned short note = bmf.streams[i][pos].note; + unsigned short freq = 0; - bmf.channel[i].stream_position++; - } // if (pos != 0xFFFF) + // mute channel + opl_write (0xB0 + i, adlib[0xB0 + i] & 0xDF); - } // if (!bmf.channel[i].delay) + // get frequency + if (bmf.version == BMF1_1) + { + if (note <= 0x60) + freq = bmf_notes_2[--note % 12]; + } + else + { + if (note != 0x7F) + freq = bmf_notes[--note % 12]; + } + + // play note + if (freq) + { + opl_write (0xB0 + i, (freq >> 8) | ((note / 12) << 2) | 0x20); + opl_write (0xA0 + i, freq & 0xFF); + } + } // if (bmf.streams[i][pos].note) + + bmf.channel[i].stream_position++; + } // if (pos != 0xFFFF) + + } // if (!bmf.channel[i].delay) // is module loop ? if (!bmf.active_streams) { - for(int j=0;j<9;j++) + for (int j = 0; j < 9; j++) bmf.channel[j].stream_position = 0; - bmf.active_streams = 9; + bmf.active_streams = 9; plr.looping = 1; } } -float CxadbmfPlayer::xadplayer_getrefresh() +float +CxadbmfPlayer::xadplayer_getrefresh () { return bmf.timer; } -std::string CxadbmfPlayer::xadplayer_gettype() +std::string CxadbmfPlayer::xadplayer_gettype () { - return std::string("xad: BMF Adlib Tracker"); + return std::string ("xad: BMF Adlib Tracker"); } -std::string CxadbmfPlayer::xadplayer_gettitle() +std::string CxadbmfPlayer::xadplayer_gettitle () { - return std::string(bmf.title); + return std::string (bmf.title); } -std::string CxadbmfPlayer::xadplayer_getauthor() +std::string CxadbmfPlayer::xadplayer_getauthor () { - return std::string(bmf.author); + return std::string (bmf.author); } -unsigned int CxadbmfPlayer::xadplayer_getinstruments() +unsigned int +CxadbmfPlayer::xadplayer_getinstruments () { return 32; } -std::string CxadbmfPlayer::xadplayer_getinstrument(unsigned int i) +std::string CxadbmfPlayer::xadplayer_getinstrument (unsigned int i) { - return std::string(bmf.instruments[i].name); + return std::string (bmf.instruments[i].name); } /* -------- Internal Functions ---------------------------- */ -int CxadbmfPlayer::__bmf_convert_stream(unsigned char *stream, int channel) +int +CxadbmfPlayer::__bmf_convert_stream (unsigned char *stream, int channel) { #ifdef DEBUG - AdPlug_LogWrite("channel %02X (note,delay,volume,instrument,command,command_data):\n",channel); + AdPlug_LogWrite + ("channel %02X (note,delay,volume,instrument,command,command_data):\n", + channel); unsigned char *last = stream; #endif unsigned char *stream_start = stream; @@ -419,62 +453,63 @@ while (true) { - memset(&bmf.streams[channel][pos], 0, sizeof(bmf_event)); + memset (&bmf.streams[channel][pos], 0, sizeof (bmf_event)); bool is_cmd = false; if (*stream == 0xFE) - { + { // 0xFE -> 0xFF: End of Stream bmf.streams[channel][pos].cmd = 0xFF; - stream++; + stream++; break; - } + } else if (*stream == 0xFC) - { + { // 0xFC -> 0xFE xx: Save Loop Position bmf.streams[channel][pos].cmd = 0xFE; - bmf.streams[channel][pos].cmd_data = (*(stream+1) & ((bmf.version == BMF0_9B) ? 0x7F : 0x3F)) - 1; + bmf.streams[channel][pos].cmd_data = + (*(stream + 1) & ((bmf.version == BMF0_9B) ? 0x7F : 0x3F)) - 1; - stream+=2; + stream += 2; } else if (*stream == 0x7D) - { + { // 0x7D -> 0xFD: Loop Saved Position bmf.streams[channel][pos].cmd = 0xFD; - stream++; - } - else + stream++; + } + else { - if (*stream & 0x80) + if (*stream & 0x80) { - if (*(stream+1) & 0x80) + if (*(stream + 1) & 0x80) { - if (*(stream+1) & 0x40) + if (*(stream + 1) & 0x40) { // byte0: 1aaaaaaa = NOTE bmf.streams[channel][pos].note = *stream & 0x7F; // byte1: 11bbbbbb = DELAY - bmf.streams[channel][pos].delay = *(stream+1) & 0x3F; + bmf.streams[channel][pos].delay = *(stream + 1) & 0x3F; // byte2: cccccccc = COMMAND - stream+=2; + stream += 2; is_cmd = true; } - else + else { // byte0: 1aaaaaaa = NOTE bmf.streams[channel][pos].note = *stream & 0x7F; // byte1: 11bbbbbb = DELAY - bmf.streams[channel][pos].delay = *(stream+1) & 0x3F; + bmf.streams[channel][pos].delay = *(stream + 1) & 0x3F; - stream+=2; - } // if (*(stream+1) & 0x40) - } + stream += 2; + } // if (*(stream+1) & 0x40) + } else { // byte0: 1aaaaaaa = NOTE @@ -484,18 +519,18 @@ stream++; is_cmd = true; - } // if (*(stream+1) & 0x80) - } - else + } // if (*(stream+1) & 0x80) + } + else { // byte0: 0aaaaaaa = NOTE bmf.streams[channel][pos].note = *stream & 0x7F; - stream++; - } // if (*stream & 0x80) - } // if (*stream == 0xFE) + stream++; + } // if (*stream & 0x80) + } // if (*stream == 0xFE) - // is command ? + // is command ? if (is_cmd) { @@ -506,14 +541,14 @@ // 0x20 or higher; 0x3F or lower: Set Instrument bmf.streams[channel][pos].instrument = *stream - 0x20 + 1; - stream++; + stream++; } else if (0x40 <= *stream) { // 0x40 or higher: Set Volume bmf.streams[channel][pos].volume = *stream - 0x40 + 1; - stream++; + stream++; } else { @@ -521,76 +556,75 @@ /* 0.9b */ if (bmf.version == BMF0_9B) - if (*stream < 0x20) - { - // 0x1F or lower: ? - stream++; - } + if (*stream < 0x20) + { + // 0x1F or lower: ? + stream++; + } /* 1.2 */ if (bmf.version == BMF1_2) - if (*stream == 0x01) - { - // 0x01: Set Modulator Volume -> 0x01 - bmf.streams[channel][pos].cmd = 0x01; - bmf.streams[channel][pos].cmd_data = *(stream+1); + if (*stream == 0x01) + { + // 0x01: Set Modulator Volume -> 0x01 + bmf.streams[channel][pos].cmd = 0x01; + bmf.streams[channel][pos].cmd_data = *(stream + 1); - stream+=2; - } - else if (*stream == 0x02) - { - // 0x02: ? - stream+=2; - } - else if (*stream == 0x03) - { - // 0x03: ? - stream+=2; - } - else if (*stream == 0x04) - { - // 0x04: Set Speed -> 0x10 - bmf.streams[channel][pos].cmd = 0x10; - bmf.streams[channel][pos].cmd_data = *(stream+1); + stream += 2; + } + else if (*stream == 0x02) + { + // 0x02: ? + stream += 2; + } + else if (*stream == 0x03) + { + // 0x03: ? + stream += 2; + } + else if (*stream == 0x04) + { + // 0x04: Set Speed -> 0x10 + bmf.streams[channel][pos].cmd = 0x10; + bmf.streams[channel][pos].cmd_data = *(stream + 1); - stream+=2; - } - else if (*stream == 0x05) - { - // 0x05: Set Carrier Volume (port 380) - bmf.streams[channel][pos].volume = *(stream+1) + 1; + stream += 2; + } + else if (*stream == 0x05) + { + // 0x05: Set Carrier Volume (port 380) + bmf.streams[channel][pos].volume = *(stream + 1) + 1; - stream+=2; - } - else if (*stream == 0x06) - { - // 0x06: Set Carrier Volume (port 382) - bmf.streams[channel][pos].volume = *(stream+1) + 1; + stream += 2; + } + else if (*stream == 0x06) + { + // 0x06: Set Carrier Volume (port 382) + bmf.streams[channel][pos].volume = *(stream + 1) + 1; - stream+=2; - } // if (bmf.version == BMF1_2) + stream += 2; + } // if (bmf.version == BMF1_2) - } // if ((0x20 <= *stream) && (*stream <= 0x3F)) + } // if ((0x20 <= *stream) && (*stream <= 0x3F)) - } // if (is_cmd) + } // if (is_cmd) #ifdef DEBUG - AdPlug_LogWrite("%02X %02X %02X %02X %02X %02X <---- ", - bmf.streams[channel][pos].note, - bmf.streams[channel][pos].delay, - bmf.streams[channel][pos].volume, - bmf.streams[channel][pos].instrument, - bmf.streams[channel][pos].cmd, - bmf.streams[channel][pos].cmd_data - ); - for(int zz=0;zz<(stream-last);zz++) - AdPlug_LogWrite("%02X ",last[zz]); - AdPlug_LogWrite("\n"); - last=stream; + AdPlug_LogWrite ("%02X %02X %02X %02X %02X %02X <---- ", + bmf.streams[channel][pos].note, + bmf.streams[channel][pos].delay, + bmf.streams[channel][pos].volume, + bmf.streams[channel][pos].instrument, + bmf.streams[channel][pos].cmd, + bmf.streams[channel][pos].cmd_data); + for (int zz = 0; zz < (stream - last); zz++) + AdPlug_LogWrite ("%02X ", last[zz]); + AdPlug_LogWrite ("\n"); + last = stream; #endif pos++; - } // while (true) + } // while (true) return (stream - stream_start); } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/cff.cxx --- a/src/adplug/core/cff.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/cff.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -30,275 +30,288 @@ /* -------- Public Methods -------------------------------- */ -CPlayer *CcffLoader::factory(Copl *newopl) +CPlayer * +CcffLoader::factory (Copl * newopl) { - return new CcffLoader(newopl); + return new CcffLoader (newopl); } -bool CcffLoader::load(VFSFile *fd, const CFileProvider &fp) +bool +CcffLoader::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); if(!f) return false; - const unsigned char conv_inst[11] = { 2,1,10,9,4,3,6,5,0,8,7 }; - const unsigned short conv_note[12] = { 0x16B, 0x181, 0x198, 0x1B0, 0x1CA, 0x1E5, 0x202, 0x220, 0x241, 0x263, 0x287, 0x2AE }; - - int i,j,k,t=0; + binistream *f = fp.open (fd); + if (!f) + return false; + const unsigned char conv_inst[11] = { 2, 1, 10, 9, 4, 3, 6, 5, 0, 8, 7 }; + const unsigned short conv_note[12] = + { 0x16B, 0x181, 0x198, 0x1B0, 0x1CA, 0x1E5, 0x202, 0x220, 0x241, 0x263, +0x287, 0x2AE }; - // '' - signed ? - f->readString(header.id, 16); - header.version = f->readInt(1); header.size = f->readInt(2); - header.packed = f->readInt(1); f->readString((char *)header.reserved, 12); - if (memcmp(header.id,"""\x1A\xDE\xE0",16)) - { fp.close(f); return false; } - - unsigned char *module = new unsigned char [0x10000]; + int i, j, k, t = 0; - // packed ? - if (header.packed) - { - cff_unpacker *unpacker = new cff_unpacker; - - unsigned char *packed_module = new unsigned char [header.size + 4]; - - memset(packed_module,0,header.size + 4); + // '' - signed ? + f->readString (header.id, 16); + header.version = f->readInt (1); + header.size = f->readInt (2); + header.packed = f->readInt (1); + f->readString ((char *) header.reserved, 12); + if (memcmp (header.id, "" "\x1A\xDE\xE0", 16)) + { + fp.close (f); + return false; + } - f->readString((char *)packed_module, header.size); - fp.close(f); + unsigned char *module = new unsigned char[0x10000]; - if (!unpacker->unpack(packed_module,module)) - { - delete unpacker; - delete packed_module; - delete module; - return false; - } + // packed ? + if (header.packed) + { + cff_unpacker *unpacker = new cff_unpacker; + + unsigned char *packed_module = new unsigned char[header.size + 4]; + + memset (packed_module, 0, header.size + 4); - delete unpacker; - delete packed_module; + f->readString ((char *) packed_module, header.size); + fp.close (f); - if (memcmp(&module[0x5E1],"CUD-FM-File - SEND A POSTCARD -",31)) - { - delete module; - return false; - } - } - else - { - f->readString((char *)module, header.size); - fp.close(f); - } + if (!unpacker->unpack (packed_module, module)) + { + delete unpacker; + delete packed_module; + delete module; + return false; + } + + delete unpacker; + delete packed_module; - // init CmodPlayer - realloc_instruments(47); - realloc_order(64); - realloc_patterns(36,64,9); - init_notetable(conv_note); - init_trackord(); - - // load instruments - for (i=0;i<47;i++) - { - memcpy(&instruments[i],&module[i*32],sizeof(cff_instrument)); + if (memcmp (&module[0x5E1], "CUD-FM-File - SEND A POSTCARD -", 31)) + { + delete module; + return false; + } + } + else + { + f->readString ((char *) module, header.size); + fp.close (f); + } - for (j=0;j<11;j++) - inst[i].data[conv_inst[j]] = instruments[i].data[j]; - - instruments[i].name[20] = 0; - } + // init CmodPlayer + realloc_instruments (47); + realloc_order (64); + realloc_patterns (36, 64, 9); + init_notetable (conv_note); + init_trackord (); - // number of patterns - nop = module[0x5E0]; + // load instruments + for (i = 0; i < 47; i++) + { + memcpy (&instruments[i], &module[i * 32], sizeof (cff_instrument)); - // load title & author - memcpy(song_title,&module[0x614],20); - memcpy(song_author,&module[0x600],20); + for (j = 0; j < 11; j++) + inst[i].data[conv_inst[j]] = instruments[i].data[j]; - // load order - memcpy(order,&module[0x628],64); + instruments[i].name[20] = 0; + } - // load tracks - for (i=0;ibyte0 == 0x6D) - tracks[t][k].note = 127; - else - if (event->byte0) - tracks[t][k].note = event->byte0; + memset (old_event_byte2, 0, 9); + + for (j = 0; j < 9; j++) + { + for (k = 0; k < 64; k++) + { + cff_event *event = + (cff_event *) & module[0x669 + ((i * 64 + k) * 9 + j) * 3]; - if (event->byte2) - old_event_byte2[j] = event->byte2; + // convert note + if (event->byte0 == 0x6D) + tracks[t][k].note = 127; + else if (event->byte0) + tracks[t][k].note = event->byte0; - // convert effect - switch (event->byte1) - { - case 'I': // set instrument - tracks[t][k].inst = event->byte2 + 1; - tracks[t][k].param1 = tracks[t][k].param2 = 0; - break; + if (event->byte2) + old_event_byte2[j] = event->byte2; - case 'H': // set tempo - tracks[t][k].command = 7; - if (event->byte2 < 16) - { - tracks[t][k].param1 = 0x07; - tracks[t][k].param2 = 0x0D; - } - break; + // convert effect + switch (event->byte1) + { + case 'I': // set instrument + tracks[t][k].inst = event->byte2 + 1; + tracks[t][k].param1 = tracks[t][k].param2 = 0; + break; - case 'A': // set speed - tracks[t][k].command = 19; - tracks[t][k].param1 = event->byte2 >> 4; - tracks[t][k].param2 = event->byte2 & 15; - break; + case 'H': // set tempo + tracks[t][k].command = 7; + if (event->byte2 < 16) + { + tracks[t][k].param1 = 0x07; + tracks[t][k].param2 = 0x0D; + } + break; - case 'L': // pattern break - tracks[t][k].command = 13; - tracks[t][k].param1 = event->byte2 >> 4; - tracks[t][k].param2 = event->byte2 & 15; - break; + case 'A': // set speed + tracks[t][k].command = 19; + tracks[t][k].param1 = event->byte2 >> 4; + tracks[t][k].param2 = event->byte2 & 15; + break; + + case 'L': // pattern break + tracks[t][k].command = 13; + tracks[t][k].param1 = event->byte2 >> 4; + tracks[t][k].param2 = event->byte2 & 15; + break; - case 'K': // order jump - tracks[t][k].command = 11; - tracks[t][k].param1 = event->byte2 >> 4; - tracks[t][k].param2 = event->byte2 & 15; - break; + case 'K': // order jump + tracks[t][k].command = 11; + tracks[t][k].param1 = event->byte2 >> 4; + tracks[t][k].param2 = event->byte2 & 15; + break; - case 'M': // set vibrato/tremolo - tracks[t][k].command = 27; - tracks[t][k].param1 = event->byte2 >> 4; - tracks[t][k].param2 = event->byte2 & 15; - break; + case 'M': // set vibrato/tremolo + tracks[t][k].command = 27; + tracks[t][k].param1 = event->byte2 >> 4; + tracks[t][k].param2 = event->byte2 & 15; + break; - case 'C': // set modulator volume - tracks[t][k].command = 21; - tracks[t][k].param1 = (0x3F - event->byte2) >> 4; - tracks[t][k].param2 = (0x3F - event->byte2) & 15; - break; + case 'C': // set modulator volume + tracks[t][k].command = 21; + tracks[t][k].param1 = (0x3F - event->byte2) >> 4; + tracks[t][k].param2 = (0x3F - event->byte2) & 15; + break; - case 'G': // set carrier volume - tracks[t][k].command = 22; - tracks[t][k].param1 = (0x3F - event->byte2) >> 4; - tracks[t][k].param2 = (0x3F - event->byte2) & 15; - break; + case 'G': // set carrier volume + tracks[t][k].command = 22; + tracks[t][k].param1 = (0x3F - event->byte2) >> 4; + tracks[t][k].param2 = (0x3F - event->byte2) & 15; + break; - case 'B': // set carrier waveform - tracks[t][k].command = 25; - tracks[t][k].param1 = event->byte2; - tracks[t][k].param2 = 0x0F; - break; + case 'B': // set carrier waveform + tracks[t][k].command = 25; + tracks[t][k].param1 = event->byte2; + tracks[t][k].param2 = 0x0F; + break; - case 'E': // fine frequency slide down - tracks[t][k].command = 24; - tracks[t][k].param1 = old_event_byte2[j] >> 4; - tracks[t][k].param2 = old_event_byte2[j] & 15; - break; + case 'E': // fine frequency slide down + tracks[t][k].command = 24; + tracks[t][k].param1 = old_event_byte2[j] >> 4; + tracks[t][k].param2 = old_event_byte2[j] & 15; + break; - case 'F': // fine frequency slide up - tracks[t][k].command = 23; - tracks[t][k].param1 = old_event_byte2[j] >> 4; - tracks[t][k].param2 = old_event_byte2[j] & 15; - break; + case 'F': // fine frequency slide up + tracks[t][k].command = 23; + tracks[t][k].param1 = old_event_byte2[j] >> 4; + tracks[t][k].param2 = old_event_byte2[j] & 15; + break; - case 'D': // fine volume slide - tracks[t][k].command = 14; - if (old_event_byte2[j] & 15) - { - // slide down - tracks[t][k].param1 = 5; - tracks[t][k].param2 = old_event_byte2[j] & 15; - } - else - { - // slide up - tracks[t][k].param1 = 4; - tracks[t][k].param2 = old_event_byte2[j] >> 4; - } - break; + case 'D': // fine volume slide + tracks[t][k].command = 14; + if (old_event_byte2[j] & 15) + { + // slide down + tracks[t][k].param1 = 5; + tracks[t][k].param2 = old_event_byte2[j] & 15; + } + else + { + // slide up + tracks[t][k].param1 = 4; + tracks[t][k].param2 = old_event_byte2[j] >> 4; + } + break; - case 'J': // arpeggio - tracks[t][k].param1 = old_event_byte2[j] >> 4; - tracks[t][k].param2 = old_event_byte2[j] & 15; - break; - } - } + case 'J': // arpeggio + tracks[t][k].param1 = old_event_byte2[j] >> 4; + tracks[t][k].param2 = old_event_byte2[j] & 15; + break; + } + } - t++; - } - } + t++; + } + } - delete [] module; + delete[]module; - // order loop - restartpos = 0; + // order loop + restartpos = 0; - // order length - for (i=0;i<64;i++) - { - if (order[i] >= 0x80) - { - length = i; - break; - } - } + // order length + for (i = 0; i < 64; i++) + { + if (order[i] >= 0x80) + { + length = i; + break; + } + } - // default tempo - bpm = 0x7D; + // default tempo + bpm = 0x7D; - rewind(0); + rewind (0); - return true; + return true; } -void CcffLoader::rewind(int subsong) +void +CcffLoader::rewind (int subsong) { - CmodPlayer::rewind(subsong); + CmodPlayer::rewind (subsong); - // default instruments - for (int i=0;i<9;i++) - { - channel[i].inst = i; + // default instruments + for (int i = 0; i < 9; i++) + { + channel[i].inst = i; - channel[i].vol1 = 63 - (inst[i].data[10] & 63); - channel[i].vol2 = 63 - (inst[i].data[9] & 63); - } + channel[i].vol1 = 63 - (inst[i].data[10] & 63); + channel[i].vol2 = 63 - (inst[i].data[9] & 63); + } } -std::string CcffLoader::gettype() +std::string CcffLoader::gettype () { - if (header.packed) - return std::string("BoomTracker 4, packed"); - else - return std::string("BoomTracker 4"); + if (header.packed) + return std::string ("BoomTracker 4, packed"); + else + return std::string ("BoomTracker 4"); } -std::string CcffLoader::gettitle() +std::string CcffLoader::gettitle () { - return std::string(song_title,20); + return std::string (song_title, 20); } -std::string CcffLoader::getauthor() +std::string CcffLoader::getauthor () { - return std::string(song_author,20); + return std::string (song_author, 20); } -std::string CcffLoader::getinstrument(unsigned int n) +std::string CcffLoader::getinstrument (unsigned int n) { - return std::string(instruments[n].name); + return std::string (instruments[n].name); } -unsigned int CcffLoader::getinstruments() +unsigned int +CcffLoader::getinstruments () { - return 47; + return 47; } /* -------- Private Methods ------------------------------- */ @@ -311,194 +324,211 @@ /* Lempel-Ziv-Tyr ;-) */ -long CcffLoader::cff_unpacker::unpack(unsigned char *ibuf, unsigned char *obuf) +long +CcffLoader::cff_unpacker::unpack (unsigned char *ibuf, unsigned char *obuf) { - if (memcmp(ibuf,"YsComp""\x07""CUD1997""\x1A\x04",16)) - return 0; + if (memcmp (ibuf, "YsComp" "\x07" "CUD1997" "\x1A\x04", 16)) + return 0; - input = ibuf + 16; - output = obuf; + input = ibuf + 16; + output = obuf; - output_length = 0; + output_length = 0; - heap = (unsigned char *)malloc(0x10000); - dictionary = (unsigned char **)malloc(sizeof(unsigned char *)*0x8000); + heap = (unsigned char *) malloc (0x10000); + dictionary = (unsigned char **) malloc (sizeof (unsigned char *) * 0x8000); - memset(heap,0,0x10000); - memset(dictionary,0,0x8000); + memset (heap, 0, 0x10000); + memset (dictionary, 0, 0x8000); - cleanup(); - if(!startup()) + cleanup (); + if (!startup ()) goto out; - // LZW - while (1) - { - new_code = get_code(); + // LZW + while (1) + { + new_code = get_code (); - // 0x00: end of data - if (new_code == 0) - break; + // 0x00: end of data + if (new_code == 0) + break; - // 0x01: end of block - if (new_code == 1) - { - cleanup(); - if(!startup()) - goto out; + // 0x01: end of block + if (new_code == 1) + { + cleanup (); + if (!startup ()) + goto out; - continue; - } + continue; + } + + // 0x02: expand code length + if (new_code == 2) + { + code_length++; - // 0x02: expand code length - if (new_code == 2) - { - code_length++; + continue; + } - continue; - } + // 0x03: RLE + if (new_code == 3) + { + unsigned char + old_code_length = code_length; - // 0x03: RLE - if (new_code == 3) - { - unsigned char old_code_length = code_length; + code_length = 2; - code_length = 2; + unsigned char + repeat_length = get_code () + 1; - unsigned char repeat_length = get_code() + 1; - - code_length = 4 << get_code(); + code_length = 4 << get_code (); - unsigned long repeat_counter = get_code(); + unsigned long + repeat_counter = get_code (); - if(output_length + repeat_counter * repeat_length > 0x10000) { - output_length = 0; - goto out; - } + if (output_length + repeat_counter * repeat_length > 0x10000) + { + output_length = 0; + goto out; + } - for (unsigned int i=0;i= (0x104 + dictionary_length)) - { - // dictionary <- old.code.string + old.code.char - the_string[++the_string[0]] = the_string[1]; - } - else - { - // dictionary <- old.code.string + new.code.char - unsigned char temp_string[256]; + if (new_code >= (0x104 + dictionary_length)) + { + // dictionary <- old.code.string + old.code.char + the_string[++the_string[0]] = the_string[1]; + } + else + { + // dictionary <- old.code.string + new.code.char + unsigned char + temp_string[256]; - translate_code(new_code,temp_string); + translate_code (new_code, temp_string); - the_string[++the_string[0]] = temp_string[1]; - } + the_string[++the_string[0]] = temp_string[1]; + } - expand_dictionary(the_string); + expand_dictionary (the_string); - // output <- new.code.string - translate_code(new_code,the_string); + // output <- new.code.string + translate_code (new_code, the_string); - if(output_length + the_string[0] > 0x10000) { - output_length = 0; - goto out; - } - - for (int i=0;i 0x10000) + { + output_length = 0; + goto out; + } - old_code = new_code; - } + for (int i = 0; i < the_string[0]; i++) + output[output_length++] = the_string[i + 1]; - out: - free(heap); - free(dictionary); - return output_length; + old_code = new_code; + } + +out: + free (heap); + free (dictionary); + return output_length; } -unsigned long CcffLoader::cff_unpacker::get_code() +unsigned long +CcffLoader::cff_unpacker::get_code () { - unsigned long code; + unsigned long + code; - while (bits_left < code_length) - { - bits_buffer |= ((*input++) << bits_left); - bits_left += 8; - } + while (bits_left < code_length) + { + bits_buffer |= ((*input++) << bits_left); + bits_left += 8; + } - code = bits_buffer & ((1 << code_length) - 1); + code = bits_buffer & ((1 << code_length) - 1); - bits_buffer >>= code_length; - bits_left -= code_length; + bits_buffer >>= code_length; + bits_left -= code_length; - return code; + return code; } -void CcffLoader::cff_unpacker::translate_code(unsigned long code, unsigned char *string) +void +CcffLoader::cff_unpacker::translate_code (unsigned long code, + unsigned char *string) { - unsigned char translated_string[256]; + unsigned char + translated_string[256]; - if (code >= 0x104) - { - memcpy(translated_string,dictionary[code - 0x104],(*(dictionary[code - 0x104])) + 1); - } - else - { - translated_string[0] = 1; - translated_string[1] = (code - 4) & 0xFF; - } + if (code >= 0x104) + { + memcpy (translated_string, dictionary[code - 0x104], + (*(dictionary[code - 0x104])) + 1); + } + else + { + translated_string[0] = 1; + translated_string[1] = (code - 4) & 0xFF; + } - memcpy(string,translated_string,256); + memcpy (string, translated_string, 256); } -void CcffLoader::cff_unpacker::cleanup() +void +CcffLoader::cff_unpacker::cleanup () { - code_length = 9; + code_length = 9; - bits_buffer = 0; - bits_left = 0; + bits_buffer = 0; + bits_left = 0; - heap_length = 0; - dictionary_length = 0; + heap_length = 0; + dictionary_length = 0; } -int CcffLoader::cff_unpacker::startup() +int +CcffLoader::cff_unpacker::startup () { - old_code = get_code(); + old_code = get_code (); - translate_code(old_code,the_string); + translate_code (old_code, the_string); - if(output_length + the_string[0] > 0x10000) { + if (output_length + the_string[0] > 0x10000) + { output_length = 0; return 0; } - for (int i=0;i= 0xF0) - return; + if (string[0] >= 0xF0) + return; - memcpy(&heap[heap_length],string,string[0] + 1); + memcpy (&heap[heap_length], string, string[0] + 1); - dictionary[dictionary_length] = &heap[heap_length]; + dictionary[dictionary_length] = &heap[heap_length]; - dictionary_length++; + dictionary_length++; - heap_length += (string[0] + 1); + heap_length += (string[0] + 1); } #ifdef _WIN32 diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/d00.cxx --- a/src/adplug/core/d00.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/d00.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -37,94 +37,121 @@ #define HIBYTE(val) (val >> 8) #define LOBYTE(val) (val & 0xff) -static const unsigned short notetable[12] = // D00 note table - {340,363,385,408,432,458,485,514,544,577,611,647}; +static const unsigned short notetable[12] = // D00 note table +{ 340, 363, 385, 408, 432, 458, 485, 514, 544, 577, 611, 647 }; -static inline uint16_t LE_WORD(const uint16_t *val) +static inline uint16_t +LE_WORD (const uint16_t * val) { - const uint8_t *b = (const uint8_t *)val; + const uint8_t *b = (const uint8_t *) val; return (b[1] << 8) + b[0]; } /*** public methods *************************************/ -CPlayer *Cd00Player::factory(Copl *newopl) +CPlayer * +Cd00Player::factory (Copl * newopl) { - return new Cd00Player(newopl); + return new Cd00Player (newopl); } -bool Cd00Player::load(VFSFile *fd, const CFileProvider &fp) +bool +Cd00Player::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); if(!f) return false; - d00header *checkhead; - d00header1 *ch; - unsigned long filesize; - int i,ver1=0; - char *str; - std::string filename(fd->uri); + binistream *f = fp.open (fd); + if (!f) + return false; + d00header *checkhead; + d00header1 *ch; + unsigned long filesize; + int i, ver1 = 0; + char *str; + std::string filename (fd->uri); // file validation section checkhead = new d00header; - f->readString((char *)checkhead, sizeof(d00header)); + f->readString ((char *) checkhead, sizeof (d00header)); // Check for version 2-4 header - if(strncmp(checkhead->id,"JCH\x26\x02\x66",6) || checkhead->type || - !checkhead->subsongs || checkhead->soundcard) { + if (strncmp (checkhead->id, "JCH\x26\x02\x66", 6) || checkhead->type || + !checkhead->subsongs || checkhead->soundcard) + { // Check for version 0 or 1 header (and .d00 file extension) delete checkhead; - if(!fp.extension(filename, ".d00")) { fp.close(f); return false; } + if (!fp.extension (filename, ".d00")) + { + fp.close (f); + return false; + } ch = new d00header1; - f->seek(0); f->readString((char *)ch, sizeof(d00header1)); - if(ch->version > 1 || !ch->subsongs) - { delete ch; fp.close(f); return false; } + f->seek (0); + f->readString ((char *) ch, sizeof (d00header1)); + if (ch->version > 1 || !ch->subsongs) + { + delete ch; + fp.close (f); + return false; + } delete ch; ver1 = 1; - } else + } + else delete checkhead; - AdPlug_LogWrite("Cd00Player::load(f,\"%s\"): %s format D00 file detected!\n", - filename.c_str(), ver1 ? "Old" : "New"); + AdPlug_LogWrite + ("Cd00Player::load(f,\"%s\"): %s format D00 file detected!\n", + filename.c_str (), ver1 ? "Old" : "New"); // load section - filesize = fp.filesize(f); f->seek(0); - filedata = new char [filesize + 1]; // 1 byte is needed for old-style DataInfo block - f->readString((char *)filedata, filesize); - fp.close(f); - if(!ver1) { // version 2 and above - header = (struct d00header *)filedata; + filesize = fp.filesize (f); + f->seek (0); + filedata = new char[filesize + 1]; // 1 byte is needed for old-style DataInfo block + f->readString ((char *) filedata, filesize); + fp.close (f); + if (!ver1) + { // version 2 and above + header = (struct d00header *) filedata; version = header->version; - datainfo = (char *)filedata + LE_WORD(&header->infoptr); - inst = (struct Sinsts *)((char *)filedata + LE_WORD(&header->instptr)); - seqptr = (unsigned short *)((char *)filedata + LE_WORD(&header->seqptr)); - for(i=31;i>=0;i--) // erase whitespace - if(header->songname[i] == ' ') - header->songname[i] = '\0'; + datainfo = (char *) filedata + LE_WORD (&header->infoptr); + inst = (struct Sinsts *) ((char *) filedata + LE_WORD (&header->instptr)); + seqptr = + (unsigned short *) ((char *) filedata + LE_WORD (&header->seqptr)); + for (i = 31; i >= 0; i--) // erase whitespace + if (header->songname[i] == ' ') + header->songname[i] = '\0'; else - break; - for(i=31;i>=0;i--) - if(header->author[i] == ' ') - header->author[i] = '\0'; + break; + for (i = 31; i >= 0; i--) + if (header->author[i] == ' ') + header->author[i] = '\0'; else - break; - } else { // version 1 - header1 = (struct d00header1 *)filedata; + break; + } + else + { // version 1 + header1 = (struct d00header1 *) filedata; version = header1->version; - datainfo = (char *)filedata + LE_WORD(&header1->infoptr); - inst = (struct Sinsts *)((char *)filedata + LE_WORD(&header1->instptr)); - seqptr = (unsigned short *)((char *)filedata + LE_WORD(&header1->seqptr)); + datainfo = (char *) filedata + LE_WORD (&header1->infoptr); + inst = + (struct Sinsts *) ((char *) filedata + LE_WORD (&header1->instptr)); + seqptr = + (unsigned short *) ((char *) filedata + LE_WORD (&header1->seqptr)); } - switch(version) { + switch (version) + { case 0: levpuls = 0; spfx = 0; - header1->speed = 70; // v0 files default to 70Hz + header1->speed = 70; // v0 files default to 70Hz break; case 1: - levpuls = (struct Slevpuls *)((char *)filedata + LE_WORD(&header1->lpulptr)); + levpuls = + (struct Slevpuls *) ((char *) filedata + LE_WORD (&header1->lpulptr)); spfx = 0; break; case 2: - levpuls = (struct Slevpuls *)((char *)filedata + LE_WORD(&header->spfxptr)); + levpuls = + (struct Slevpuls *) ((char *) filedata + LE_WORD (&header->spfxptr)); spfx = 0; break; case 3: @@ -132,338 +159,396 @@ levpuls = 0; break; case 4: - spfx = (struct Sspfx *)((char *)filedata + LE_WORD(&header->spfxptr)); + spfx = (struct Sspfx *) ((char *) filedata + LE_WORD (&header->spfxptr)); levpuls = 0; break; } - if((str = strstr(datainfo,"\xff\xff"))) - while((*str == '\xff' || *str == ' ') && str >= datainfo) { - *str = '\0'; str--; + if ((str = strstr (datainfo, "\xff\xff"))) + while ((*str == '\xff' || *str == ' ') && str >= datainfo) + { + *str = '\0'; + str--; } - else // old-style block - memset((char *)filedata+filesize,0,1); + else // old-style block + memset ((char *) filedata + filesize, 0, 1); - rewind(0); + rewind (0); return true; } -bool Cd00Player::update() +bool +Cd00Player::update () { - unsigned char c,cnt,trackend=0,fx,note; - unsigned short ord,*patt,buf,fxop,pattpos; + unsigned char c, cnt, trackend = 0, fx, note; + unsigned short ord, *patt, buf, fxop, pattpos; // effect handling (timer dependant) - for(c=0;c<9;c++) { - channel[c].slideval += channel[c].slide; setfreq(c); // sliding - vibrato(c); // vibrato + for (c = 0; c < 9; c++) + { + channel[c].slideval += channel[c].slide; + setfreq (c); // sliding + vibrato (c); // vibrato - if(channel[c].spfx != 0xffff) { // SpFX - if(channel[c].fxdel) - channel[c].fxdel--; - else { - channel[c].spfx = LE_WORD(&spfx[channel[c].spfx].ptr); - channel[c].fxdel = spfx[channel[c].spfx].duration; - channel[c].inst = LE_WORD(&spfx[channel[c].spfx].instnr) & 0xfff; - if(spfx[channel[c].spfx].modlev != 0xff) - channel[c].modvol = spfx[channel[c].spfx].modlev; - setinst(c); - if(LE_WORD(&spfx[channel[c].spfx].instnr) & 0x8000) // locked frequency - note = spfx[channel[c].spfx].halfnote; - else // unlocked frequency - note = spfx[channel[c].spfx].halfnote + channel[c].note; - channel[c].freq = notetable[note%12] + ((note/12) << 10); - setfreq(c); + if (channel[c].spfx != 0xffff) + { // SpFX + if (channel[c].fxdel) + channel[c].fxdel--; + else + { + channel[c].spfx = LE_WORD (&spfx[channel[c].spfx].ptr); + channel[c].fxdel = spfx[channel[c].spfx].duration; + channel[c].inst = LE_WORD (&spfx[channel[c].spfx].instnr) & 0xfff; + if (spfx[channel[c].spfx].modlev != 0xff) + channel[c].modvol = spfx[channel[c].spfx].modlev; + setinst (c); + if (LE_WORD (&spfx[channel[c].spfx].instnr) & 0x8000) // locked frequency + note = spfx[channel[c].spfx].halfnote; + else // unlocked frequency + note = spfx[channel[c].spfx].halfnote + channel[c].note; + channel[c].freq = notetable[note % 12] + ((note / 12) << 10); + setfreq (c); } - channel[c].modvol += spfx[channel[c].spfx].modlevadd; channel[c].modvol &= 63; - setvolume(c); + channel[c].modvol += spfx[channel[c].spfx].modlevadd; + channel[c].modvol &= 63; + setvolume (c); } - if(channel[c].levpuls != 0xff) // Levelpuls - if(channel[c].frameskip) - channel[c].frameskip--; - else { - channel[c].frameskip = inst[channel[c].inst].timer; - if(channel[c].fxdel) - channel[c].fxdel--; - else { - channel[c].levpuls = levpuls[channel[c].levpuls].ptr - 1; - channel[c].fxdel = levpuls[channel[c].levpuls].duration; - if(levpuls[channel[c].levpuls].level != 0xff) - channel[c].modvol = levpuls[channel[c].levpuls].level; - } - channel[c].modvol += levpuls[channel[c].levpuls].voladd; channel[c].modvol &= 63; - setvolume(c); + if (channel[c].levpuls != 0xff) // Levelpuls + if (channel[c].frameskip) + channel[c].frameskip--; + else + { + channel[c].frameskip = inst[channel[c].inst].timer; + if (channel[c].fxdel) + channel[c].fxdel--; + else + { + channel[c].levpuls = levpuls[channel[c].levpuls].ptr - 1; + channel[c].fxdel = levpuls[channel[c].levpuls].duration; + if (levpuls[channel[c].levpuls].level != 0xff) + channel[c].modvol = levpuls[channel[c].levpuls].level; + } + channel[c].modvol += levpuls[channel[c].levpuls].voladd; + channel[c].modvol &= 63; + setvolume (c); } } // song handling - for(c=0;c<9;c++) - if(version < 3 ? channel[c].del : channel[c].del <= 0x7f) { - if(version == 4) // v4: hard restart SR - if(channel[c].del == inst[channel[c].inst].timer) - if(channel[c].nextnote) - opl->write(0x83 + op_table[c], inst[channel[c].inst].sr); - if(version < 3) - channel[c].del--; + for (c = 0; c < 9; c++) + if (version < 3 ? channel[c].del : channel[c].del <= 0x7f) + { + if (version == 4) // v4: hard restart SR + if (channel[c].del == inst[channel[c].inst].timer) + if (channel[c].nextnote) + opl->write (0x83 + op_table[c], inst[channel[c].inst].sr); + if (version < 3) + channel[c].del--; + else if (channel[c].speed) + channel[c].del += channel[c].speed; else - if(channel[c].speed) - channel[c].del += channel[c].speed; - else { - channel[c].seqend = 1; - continue; - } - } else { - if(channel[c].speed) { - if(version < 3) - channel[c].del = channel[c].speed; - else { - channel[c].del &= 0x7f; - channel[c].del += channel[c].speed; - } - } else { - channel[c].seqend = 1; - continue; + { + channel[c].seqend = 1; + continue; } - if(channel[c].rhcnt) { // process pending REST/HOLD events - channel[c].rhcnt--; - continue; + } + else + { + if (channel[c].speed) + { + if (version < 3) + channel[c].del = channel[c].speed; + else + { + channel[c].del &= 0x7f; + channel[c].del += channel[c].speed; + } + } + else + { + channel[c].seqend = 1; + continue; + } + if (channel[c].rhcnt) + { // process pending REST/HOLD events + channel[c].rhcnt--; + continue; } - readorder: // process arrangement (orderlist) - ord = LE_WORD(&channel[c].order[channel[c].ordpos]); - switch(ord) { - case 0xfffe: channel[c].seqend = 1; continue; // end of arrangement stream - case 0xffff: // jump to order - channel[c].ordpos = LE_WORD(&channel[c].order[channel[c].ordpos + 1]); - channel[c].seqend = 1; - goto readorder; + readorder: // process arrangement (orderlist) + ord = LE_WORD (&channel[c].order[channel[c].ordpos]); + switch (ord) + { + case 0xfffe: + channel[c].seqend = 1; + continue; // end of arrangement stream + case 0xffff: // jump to order + channel[c].ordpos = + LE_WORD (&channel[c].order[channel[c].ordpos + 1]); + channel[c].seqend = 1; + goto readorder; default: - if(ord >= 0x9000) { // set speed - channel[c].speed = ord & 0xff; - ord = LE_WORD(&channel[c].order[channel[c].ordpos - 1]); - channel[c].ordpos++; - } else - if(ord >= 0x8000) { // transpose track - channel[c].transpose = ord & 0xff; - if(ord & 0x100) - channel[c].transpose = -channel[c].transpose; - ord = LE_WORD(&channel[c].order[++channel[c].ordpos]); - } - patt = (unsigned short *)((char *)filedata + LE_WORD(&seqptr[ord])); - break; + if (ord >= 0x9000) + { // set speed + channel[c].speed = ord & 0xff; + ord = LE_WORD (&channel[c].order[channel[c].ordpos - 1]); + channel[c].ordpos++; + } + else if (ord >= 0x8000) + { // transpose track + channel[c].transpose = ord & 0xff; + if (ord & 0x100) + channel[c].transpose = -channel[c].transpose; + ord = LE_WORD (&channel[c].order[++channel[c].ordpos]); + } + patt = + (unsigned short *) ((char *) filedata + LE_WORD (&seqptr[ord])); + break; } - channel[c].fxflag = 0; - readseq: // process sequence (pattern) - if(!version) // v0: always initialize rhcnt - channel[c].rhcnt = channel[c].irhcnt; - pattpos = LE_WORD(&patt[channel[c].pattpos]); - if(pattpos == 0xffff) { // pattern ended? - channel[c].pattpos = 0; - channel[c].ordpos++; - goto readorder; + channel[c].fxflag = 0; + readseq: // process sequence (pattern) + if (!version) // v0: always initialize rhcnt + channel[c].rhcnt = channel[c].irhcnt; + pattpos = LE_WORD (&patt[channel[c].pattpos]); + if (pattpos == 0xffff) + { // pattern ended? + channel[c].pattpos = 0; + channel[c].ordpos++; + goto readorder; } - cnt = HIBYTE(pattpos); - note = LOBYTE(pattpos); + cnt = HIBYTE (pattpos); + note = LOBYTE (pattpos); fx = pattpos >> 12; fxop = pattpos & 0x0fff; - channel[c].pattpos++; pattpos = LE_WORD(&patt[channel[c].pattpos]); - channel[c].nextnote = LOBYTE(pattpos) & 0x7f; - if(version ? cnt < 0x40 : !fx) { // note event - switch(note) { - case 0: // REST event - case 0x80: - if(!note || version) { - channel[c].key = 0; - setfreq(c); - } - // fall through... - case 0x7e: // HOLD event - if(version) - channel[c].rhcnt = cnt; - channel[c].nextnote = 0; - break; - default: // play note - // restart fx - if(!(channel[c].fxflag & 1)) - channel[c].vibdepth = 0; - if(!(channel[c].fxflag & 2)) - channel[c].slideval = channel[c].slide = 0; + channel[c].pattpos++; + pattpos = LE_WORD (&patt[channel[c].pattpos]); + channel[c].nextnote = LOBYTE (pattpos) & 0x7f; + if (version ? cnt < 0x40 : !fx) + { // note event + switch (note) + { + case 0: // REST event + case 0x80: + if (!note || version) + { + channel[c].key = 0; + setfreq (c); + } + // fall through... + case 0x7e: // HOLD event + if (version) + channel[c].rhcnt = cnt; + channel[c].nextnote = 0; + break; + default: // play note + // restart fx + if (!(channel[c].fxflag & 1)) + channel[c].vibdepth = 0; + if (!(channel[c].fxflag & 2)) + channel[c].slideval = channel[c].slide = 0; - if(version) { // note handling for v1 and above - if(note > 0x80) // locked note (no channel transpose) - note -= 0x80; - else // unlocked note - note += channel[c].transpose; - channel[c].note = note; // remember note for SpFX + if (version) + { // note handling for v1 and above + if (note > 0x80) // locked note (no channel transpose) + note -= 0x80; + else // unlocked note + note += channel[c].transpose; + channel[c].note = note; // remember note for SpFX - if(channel[c].ispfx != 0xffff && cnt < 0x20) { // reset SpFX - channel[c].spfx = channel[c].ispfx; - if(LE_WORD(&spfx[channel[c].spfx].instnr) & 0x8000) // locked frequency - note = spfx[channel[c].spfx].halfnote; - else // unlocked frequency - note += spfx[channel[c].spfx].halfnote; - channel[c].inst = LE_WORD(&spfx[channel[c].spfx].instnr) & 0xfff; - channel[c].fxdel = spfx[channel[c].spfx].duration; - if(spfx[channel[c].spfx].modlev != 0xff) - channel[c].modvol = spfx[channel[c].spfx].modlev; - else - channel[c].modvol = inst[channel[c].inst].data[7] & 63; - } + if (channel[c].ispfx != 0xffff && cnt < 0x20) + { // reset SpFX + channel[c].spfx = channel[c].ispfx; + if (LE_WORD (&spfx[channel[c].spfx].instnr) & 0x8000) // locked frequency + note = spfx[channel[c].spfx].halfnote; + else // unlocked frequency + note += spfx[channel[c].spfx].halfnote; + channel[c].inst = + LE_WORD (&spfx[channel[c].spfx].instnr) & 0xfff; + channel[c].fxdel = spfx[channel[c].spfx].duration; + if (spfx[channel[c].spfx].modlev != 0xff) + channel[c].modvol = spfx[channel[c].spfx].modlev; + else + channel[c].modvol = inst[channel[c].inst].data[7] & 63; + } - if(channel[c].ilevpuls != 0xff && cnt < 0x20) { // reset LevelPuls - channel[c].levpuls = channel[c].ilevpuls; - channel[c].fxdel = levpuls[channel[c].levpuls].duration; - channel[c].frameskip = inst[channel[c].inst].timer; - if(levpuls[channel[c].levpuls].level != 0xff) - channel[c].modvol = levpuls[channel[c].levpuls].level; - else - channel[c].modvol = inst[channel[c].inst].data[7] & 63; - } + if (channel[c].ilevpuls != 0xff && cnt < 0x20) + { // reset LevelPuls + channel[c].levpuls = channel[c].ilevpuls; + channel[c].fxdel = levpuls[channel[c].levpuls].duration; + channel[c].frameskip = inst[channel[c].inst].timer; + if (levpuls[channel[c].levpuls].level != 0xff) + channel[c].modvol = levpuls[channel[c].levpuls].level; + else + channel[c].modvol = inst[channel[c].inst].data[7] & 63; + } - channel[c].freq = notetable[note%12] + ((note/12) << 10); - if(cnt < 0x20) // normal note - playnote(c); - else { // tienote - setfreq(c); - cnt -= 0x20; // make count proper - } - channel[c].rhcnt = cnt; - } else { // note handling for v0 - if(cnt < 2) // unlocked note - note += channel[c].transpose; - channel[c].note = note; + channel[c].freq = notetable[note % 12] + ((note / 12) << 10); + if (cnt < 0x20) // normal note + playnote (c); + else + { // tienote + setfreq (c); + cnt -= 0x20; // make count proper + } + channel[c].rhcnt = cnt; + } + else + { // note handling for v0 + if (cnt < 2) // unlocked note + note += channel[c].transpose; + channel[c].note = note; - channel[c].freq = notetable[note%12] + ((note/12) << 10); - if(cnt == 1) // tienote - setfreq(c); - else // normal note - playnote(c); - } - break; - } - continue; // event is complete - } else { // effect event - switch(fx) { - case 6: // Cut/Stop Voice - buf = channel[c].inst; - channel[c].inst = 0; - playnote(c); - channel[c].inst = buf; - channel[c].rhcnt = fxop; - continue; // no note follows this event - case 7: // Vibrato - channel[c].vibspeed = fxop & 0xff; - channel[c].vibdepth = fxop >> 8; - channel[c].trigger = fxop >> 9; - channel[c].fxflag |= 1; - break; - case 8: // v0: Duration - if(!version) - channel[c].irhcnt = fxop; - break; - case 9: // New Level - channel[c].vol = fxop & 63; - if(channel[c].vol + channel[c].cvol < 63) // apply channel volume - channel[c].vol += channel[c].cvol; - else - channel[c].vol = 63; - setvolume(c); - break; - case 0xb: // v4: Set SpFX - if(version == 4) - channel[c].ispfx = fxop; - break; - case 0xc: // Set Instrument - channel[c].ispfx = 0xffff; - channel[c].spfx = 0xffff; - channel[c].inst = fxop; - channel[c].modvol = inst[fxop].data[7] & 63; - if(version < 3 && version && inst[fxop].tunelev) // Set LevelPuls - channel[c].ilevpuls = inst[fxop].tunelev - 1; - else { - channel[c].ilevpuls = 0xff; - channel[c].levpuls = 0xff; - } - break; - case 0xd: // Slide up - channel[c].slide = fxop; - channel[c].fxflag |= 2; - break; - case 0xe: // Slide down - channel[c].slide = -fxop; - channel[c].fxflag |= 2; - break; - } - goto readseq; // event is incomplete, note follows + channel[c].freq = notetable[note % 12] + ((note / 12) << 10); + if (cnt == 1) // tienote + setfreq (c); + else // normal note + playnote (c); + } + break; + } + continue; // event is complete + } + else + { // effect event + switch (fx) + { + case 6: // Cut/Stop Voice + buf = channel[c].inst; + channel[c].inst = 0; + playnote (c); + channel[c].inst = buf; + channel[c].rhcnt = fxop; + continue; // no note follows this event + case 7: // Vibrato + channel[c].vibspeed = fxop & 0xff; + channel[c].vibdepth = fxop >> 8; + channel[c].trigger = fxop >> 9; + channel[c].fxflag |= 1; + break; + case 8: // v0: Duration + if (!version) + channel[c].irhcnt = fxop; + break; + case 9: // New Level + channel[c].vol = fxop & 63; + if (channel[c].vol + channel[c].cvol < 63) // apply channel volume + channel[c].vol += channel[c].cvol; + else + channel[c].vol = 63; + setvolume (c); + break; + case 0xb: // v4: Set SpFX + if (version == 4) + channel[c].ispfx = fxop; + break; + case 0xc: // Set Instrument + channel[c].ispfx = 0xffff; + channel[c].spfx = 0xffff; + channel[c].inst = fxop; + channel[c].modvol = inst[fxop].data[7] & 63; + if (version < 3 && version && inst[fxop].tunelev) // Set LevelPuls + channel[c].ilevpuls = inst[fxop].tunelev - 1; + else + { + channel[c].ilevpuls = 0xff; + channel[c].levpuls = 0xff; + } + break; + case 0xd: // Slide up + channel[c].slide = fxop; + channel[c].fxflag |= 2; + break; + case 0xe: // Slide down + channel[c].slide = -fxop; + channel[c].fxflag |= 2; + break; + } + goto readseq; // event is incomplete, note follows } } - for(c=0;c<9;c++) - if(channel[c].seqend) + for (c = 0; c < 9; c++) + if (channel[c].seqend) trackend++; - if(trackend == 9) + if (trackend == 9) songend = 1; return !songend; } -void Cd00Player::rewind(int subsong) +void +Cd00Player::rewind (int subsong) { - struct Stpoin { + struct Stpoin + { unsigned short ptr[9]; - unsigned char volume[9],dummy[5]; + unsigned char volume[9], dummy[5]; } *tpoin; int i; - if(version > 1) { // do nothing if subsong > number of subsongs - if(subsong >= header->subsongs) + if (version > 1) + { // do nothing if subsong > number of subsongs + if (subsong >= header->subsongs) return; - } else - if(subsong >= header1->subsongs) - return; + } + else if (subsong >= header1->subsongs) + return; - memset(channel,0,sizeof(channel)); - if(version > 1) - tpoin = (struct Stpoin *)((char *)filedata + LE_WORD(&header->tpoin)); + memset (channel, 0, sizeof (channel)); + if (version > 1) + tpoin = (struct Stpoin *) ((char *) filedata + LE_WORD (&header->tpoin)); else - tpoin = (struct Stpoin *)((char *)filedata + LE_WORD(&header1->tpoin)); - for(i=0;i<9;i++) { - if(LE_WORD(&tpoin[subsong].ptr[i])) { // track enabled - channel[i].speed = LE_WORD((unsigned short *) - ((char *)filedata + LE_WORD(&tpoin[subsong].ptr[i]))); - channel[i].order = (unsigned short *) - ((char *)filedata + LE_WORD(&tpoin[subsong].ptr[i]) + 2); - } else { // track disabled + tpoin = (struct Stpoin *) ((char *) filedata + LE_WORD (&header1->tpoin)); + for (i = 0; i < 9; i++) + { + if (LE_WORD (&tpoin[subsong].ptr[i])) + { // track enabled + channel[i].speed = LE_WORD ((unsigned short *) + ((char *) filedata + + LE_WORD (&tpoin[subsong].ptr[i]))); + channel[i].order = + (unsigned short *) ((char *) filedata + + LE_WORD (&tpoin[subsong].ptr[i]) + 2); + } + else + { // track disabled channel[i].speed = 0; channel[i].order = 0; } - channel[i].ispfx = 0xffff; channel[i].spfx = 0xffff; // no SpFX - channel[i].ilevpuls = 0xff; channel[i].levpuls = 0xff; // no LevelPuls - channel[i].cvol = tpoin[subsong].volume[i] & 0x7f; // our player may savely ignore bit 7 - channel[i].vol = channel[i].cvol; // initialize volume + channel[i].ispfx = 0xffff; + channel[i].spfx = 0xffff; // no SpFX + channel[i].ilevpuls = 0xff; + channel[i].levpuls = 0xff; // no LevelPuls + channel[i].cvol = tpoin[subsong].volume[i] & 0x7f; // our player may savely ignore bit 7 + channel[i].vol = channel[i].cvol; // initialize volume } songend = 0; - opl->init(); opl->write(1,32); // reset OPL chip + opl->init (); + opl->write (1, 32); // reset OPL chip } -std::string Cd00Player::gettype() +std::string Cd00Player::gettype () { - char tmpstr[40]; + char + tmpstr[40]; - sprintf(tmpstr,"EdLib packed (version %d)",version > 1 ? header->version : header1->version); - return std::string(tmpstr); + sprintf (tmpstr, "EdLib packed (version %d)", + version > 1 ? header->version : header1->version); + return std::string (tmpstr); } -float Cd00Player::getrefresh() +float +Cd00Player::getrefresh () { - if(version > 1) + if (version > 1) return header->speed; else return header1->speed; } -unsigned int Cd00Player::getsubsongs() +unsigned int +Cd00Player::getsubsongs () { - if(version <= 1) // return number of subsongs + if (version <= 1) // return number of subsongs return header1->subsongs; else return header->subsongs; @@ -471,76 +556,93 @@ /*** private methods *************************************/ -void Cd00Player::setvolume(unsigned char chan) +void +Cd00Player::setvolume (unsigned char chan) { - unsigned char op = op_table[chan]; - unsigned short insnr = channel[chan].inst; + unsigned char op = op_table[chan]; + unsigned short insnr = channel[chan].inst; - opl->write(0x43 + op,(int)(63-((63-(inst[insnr].data[2] & 63))/63.0)*(63-channel[chan].vol)) + - (inst[insnr].data[2] & 192)); - if(inst[insnr].data[10] & 1) - opl->write(0x40 + op,(int)(63-((63-channel[chan].modvol)/63.0)*(63-channel[chan].vol)) + - (inst[insnr].data[7] & 192)); + opl->write (0x43 + op, + (int) (63 - + ((63 - (inst[insnr].data[2] & 63)) / 63.0) * (63 - + channel + [chan]. + vol)) + + (inst[insnr].data[2] & 192)); + if (inst[insnr].data[10] & 1) + opl->write (0x40 + op, + (int) (63 - + ((63 - channel[chan].modvol) / 63.0) * (63 - + channel[chan]. + vol)) + + (inst[insnr].data[7] & 192)); else - opl->write(0x40 + op,channel[chan].modvol + (inst[insnr].data[7] & 192)); + opl->write (0x40 + op, + channel[chan].modvol + (inst[insnr].data[7] & 192)); } -void Cd00Player::setfreq(unsigned char chan) +void +Cd00Player::setfreq (unsigned char chan) { unsigned short freq = channel[chan].freq; - if(version == 4) // v4: apply instrument finetune + if (version == 4) // v4: apply instrument finetune freq += inst[channel[chan].inst].tunelev; freq += channel[chan].slideval; - opl->write(0xa0 + chan, freq & 255); - if(channel[chan].key) - opl->write(0xb0 + chan, ((freq >> 8) & 31) | 32); + opl->write (0xa0 + chan, freq & 255); + if (channel[chan].key) + opl->write (0xb0 + chan, ((freq >> 8) & 31) | 32); else - opl->write(0xb0 + chan, (freq >> 8) & 31); + opl->write (0xb0 + chan, (freq >> 8) & 31); } -void Cd00Player::setinst(unsigned char chan) +void +Cd00Player::setinst (unsigned char chan) { - unsigned char op = op_table[chan]; - unsigned short insnr = channel[chan].inst; + unsigned char op = op_table[chan]; + unsigned short insnr = channel[chan].inst; // set instrument data - opl->write(0x63 + op, inst[insnr].data[0]); - opl->write(0x83 + op, inst[insnr].data[1]); - opl->write(0x23 + op, inst[insnr].data[3]); - opl->write(0xe3 + op, inst[insnr].data[4]); - opl->write(0x60 + op, inst[insnr].data[5]); - opl->write(0x80 + op, inst[insnr].data[6]); - opl->write(0x20 + op, inst[insnr].data[8]); - opl->write(0xe0 + op, inst[insnr].data[9]); - if(version) - opl->write(0xc0 + chan, inst[insnr].data[10]); + opl->write (0x63 + op, inst[insnr].data[0]); + opl->write (0x83 + op, inst[insnr].data[1]); + opl->write (0x23 + op, inst[insnr].data[3]); + opl->write (0xe3 + op, inst[insnr].data[4]); + opl->write (0x60 + op, inst[insnr].data[5]); + opl->write (0x80 + op, inst[insnr].data[6]); + opl->write (0x20 + op, inst[insnr].data[8]); + opl->write (0xe0 + op, inst[insnr].data[9]); + if (version) + opl->write (0xc0 + chan, inst[insnr].data[10]); else - opl->write(0xc0 + chan, (inst[insnr].data[10] << 1) + (inst[insnr].tunelev & 1)); + opl->write (0xc0 + chan, + (inst[insnr].data[10] << 1) + (inst[insnr].tunelev & 1)); } -void Cd00Player::playnote(unsigned char chan) +void +Cd00Player::playnote (unsigned char chan) { // set misc vars & play - opl->write(0xb0 + chan, 0); // stop old note - setinst(chan); + opl->write (0xb0 + chan, 0); // stop old note + setinst (chan); channel[chan].key = 1; - setfreq(chan); - setvolume(chan); + setfreq (chan); + setvolume (chan); } -void Cd00Player::vibrato(unsigned char chan) +void +Cd00Player::vibrato (unsigned char chan) { - if(!channel[chan].vibdepth) + if (!channel[chan].vibdepth) return; - if(channel[chan].trigger) + if (channel[chan].trigger) channel[chan].trigger--; - else { + else + { channel[chan].trigger = channel[chan].vibdepth; channel[chan].vibspeed = -channel[chan].vibspeed; } channel[chan].freq += channel[chan].vibspeed; - setfreq(chan); + setfreq (chan); } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/database.cxx --- a/src/adplug/core/database.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/database.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -30,98 +30,114 @@ /***** CAdPlugDatabase *****/ -const unsigned short CAdPlugDatabase::hash_radix = 0xfff1; // should be prime +const unsigned short + CAdPlugDatabase::hash_radix = 0xfff1; // should be prime -CAdPlugDatabase::CAdPlugDatabase() - : linear_index(0), linear_logic_length(0), linear_length(0) +CAdPlugDatabase::CAdPlugDatabase ():linear_index (0), linear_logic_length (0), +linear_length (0) { - db_linear = new DB_Bucket * [hash_radix]; - db_hashed = new DB_Bucket * [hash_radix]; - memset(db_linear, 0, sizeof(DB_Bucket *) * hash_radix); - memset(db_hashed, 0, sizeof(DB_Bucket *) * hash_radix); + db_linear = new DB_Bucket *[hash_radix]; + db_hashed = new DB_Bucket *[hash_radix]; + memset (db_linear, 0, sizeof (DB_Bucket *) * hash_radix); + memset (db_hashed, 0, sizeof (DB_Bucket *) * hash_radix); } -CAdPlugDatabase::~CAdPlugDatabase() +CAdPlugDatabase::~CAdPlugDatabase () { unsigned long i; - for(i = 0; i < linear_length; i++) + for (i = 0; i < linear_length; i++) delete db_linear[i]; - delete [] db_linear; - delete [] db_hashed; + delete[]db_linear; + delete[]db_hashed; } -bool CAdPlugDatabase::load(std::string db_name) +bool +CAdPlugDatabase::load (std::string db_name) { - vfsistream f(db_name); - if(f.error()) return false; - return load(f); + vfsistream f (db_name); + if (f.error ()) + return false; + return load (f); } -bool CAdPlugDatabase::load(binistream &f) +bool +CAdPlugDatabase::load (binistream & f) { - unsigned int idlen = strlen(DB_FILEID_V10); - char *id = new char [idlen]; + unsigned int idlen = strlen (DB_FILEID_V10); + char *id = new char[idlen]; unsigned long length; // Open database as little endian with IEEE floats - f.setFlag(binio::BigEndian, false); f.setFlag(binio::FloatIEEE); + f.setFlag (binio::BigEndian, false); + f.setFlag (binio::FloatIEEE); - f.readString(id,idlen); - if(memcmp(id,DB_FILEID_V10,idlen)) { - delete [] id; + f.readString (id, idlen); + if (memcmp (id, DB_FILEID_V10, idlen)) + { + delete[]id; return false; } - delete [] id; - length = f.readInt(4); + delete[]id; + length = f.readInt (4); // read records - for(unsigned long i = 0; i < length; i++) - insert(CRecord::factory(f)); + for (unsigned long i = 0; i < length; i++) + insert (CRecord::factory (f)); return true; } -bool CAdPlugDatabase::save(std::string db_name) +bool +CAdPlugDatabase::save (std::string db_name) { - vfsostream f(db_name); - if(f.error()) return false; - return save(f); + vfsostream f (db_name); + if (f.error ()) + return false; + return save (f); } -bool CAdPlugDatabase::save(binostream &f) +bool +CAdPlugDatabase::save (binostream & f) { unsigned long i; // Save database as little endian with IEEE floats - f.setFlag(binio::BigEndian, false); f.setFlag(binio::FloatIEEE); + f.setFlag (binio::BigEndian, false); + f.setFlag (binio::FloatIEEE); - f.writeString(DB_FILEID_V10); - f.writeInt(linear_logic_length, 4); + f.writeString (DB_FILEID_V10); + f.writeInt (linear_logic_length, 4); // write records - for(i = 0; i < linear_length; i++) - if(!db_linear[i]->deleted) - db_linear[i]->record->write(f); + for (i = 0; i < linear_length; i++) + if (!db_linear[i]->deleted) + db_linear[i]->record->write (f); return true; } -CAdPlugDatabase::CRecord *CAdPlugDatabase::search(CKey const &key) +CAdPlugDatabase::CRecord * CAdPlugDatabase::search (CKey const &key) { - if(lookup(key)) return get_record(); else return 0; + if (lookup (key)) + return get_record (); + else + return 0; } -bool CAdPlugDatabase::lookup(CKey const &key) +bool +CAdPlugDatabase::lookup (CKey const &key) { - unsigned long index = make_hash(key); - if(!db_hashed[index]) return false; + unsigned long index = make_hash (key); + if (!db_hashed[index]) + return false; // immediate hit ? DB_Bucket *bucket = db_hashed[index]; - if(!bucket->deleted && bucket->record->key == key) { + if (!bucket->deleted && bucket->record->key == key) + { linear_index = bucket->index; return true; } @@ -129,8 +145,10 @@ // in-chain hit ? bucket = db_hashed[index]->chain; - while(bucket) { - if(!bucket->deleted && bucket->record->key == key) { + while (bucket) + { + if (!bucket->deleted && bucket->record->key == key) + { linear_index = bucket->index; return true; } @@ -141,248 +159,320 @@ return false; } -bool CAdPlugDatabase::insert(CRecord *record) +bool +CAdPlugDatabase::insert (CRecord * record) { long index; // sanity checks - if(!record) return false; // null-pointer given - if(linear_length == hash_radix) return false; // max. db size exceeded - if(lookup(record->key)) return false; // record already in db + if (!record) + return false; // null-pointer given + if (linear_length == hash_radix) + return false; // max. db size exceeded + if (lookup (record->key)) + return false; // record already in db // make bucket - DB_Bucket *bucket = new DB_Bucket(linear_length, record); - if(!bucket) return false; + DB_Bucket *bucket = new DB_Bucket (linear_length, record); + if (!bucket) + return false; // add to linear list db_linear[linear_length] = bucket; - linear_logic_length++; linear_length++; + linear_logic_length++; + linear_length++; // add to hashed list - index = make_hash(record->key); + index = make_hash (record->key); - if(!db_hashed[index]) // First entry in hashtable + if (!db_hashed[index]) // First entry in hashtable db_hashed[index] = bucket; - else { // Add entry in chained list + else + { // Add entry in chained list DB_Bucket *chain = db_hashed[index]; - while(chain->chain) chain = chain->chain; + while (chain->chain) + chain = chain->chain; chain->chain = bucket; } return true; } -void CAdPlugDatabase::wipe(CRecord *record) +void +CAdPlugDatabase::wipe (CRecord * record) { - if(!lookup(record->key)) return; - wipe(); + if (!lookup (record->key)) + return; + wipe (); } -void CAdPlugDatabase::wipe() +void +CAdPlugDatabase::wipe () { - if(!linear_length) return; + if (!linear_length) + return; DB_Bucket *bucket = db_linear[linear_index]; - if(!bucket->deleted) { + if (!bucket->deleted) + { delete bucket->record; linear_logic_length--; bucket->deleted = true; } } -CAdPlugDatabase::CRecord *CAdPlugDatabase::get_record() +CAdPlugDatabase::CRecord * CAdPlugDatabase::get_record () { - if(!linear_length) return 0; + if (!linear_length) + return 0; return db_linear[linear_index]->record; } -bool CAdPlugDatabase::go_forward() +bool +CAdPlugDatabase::go_forward () { - if(linear_index + 1 < linear_length) { + if (linear_index + 1 < linear_length) + { linear_index++; return true; - } else + } + else return false; } -bool CAdPlugDatabase::go_backward() +bool +CAdPlugDatabase::go_backward () { - if(!linear_index) return false; + if (!linear_index) + return false; linear_index--; return true; } -void CAdPlugDatabase::goto_begin() -{ - if(linear_length) linear_index = 0; +void +CAdPlugDatabase::goto_begin () +{ + if (linear_length) + linear_index = 0; } -void CAdPlugDatabase::goto_end() +void +CAdPlugDatabase::goto_end () { - if(linear_length) linear_index = linear_length - 1; + if (linear_length) + linear_index = linear_length - 1; } -inline unsigned long CAdPlugDatabase::make_hash(CKey const &key) +inline unsigned long +CAdPlugDatabase::make_hash (CKey const &key) { return (key.crc32 + key.crc16) % hash_radix; } /***** CAdPlugDatabase::DB_Bucket *****/ -CAdPlugDatabase::DB_Bucket::DB_Bucket(unsigned long nindex, CRecord *newrecord, DB_Bucket *newchain) - : index(nindex), deleted(false), chain(newchain), record(newrecord) +CAdPlugDatabase::DB_Bucket::DB_Bucket (unsigned long nindex, CRecord * newrecord, DB_Bucket * newchain):index (nindex), deleted (false), chain (newchain), +record +(newrecord) { } -CAdPlugDatabase::DB_Bucket::~DB_Bucket() +CAdPlugDatabase::DB_Bucket::~DB_Bucket () { - if(!deleted) delete record; + if (!deleted) + delete + record; } /***** CAdPlugDatabase::CRecord *****/ -CAdPlugDatabase::CRecord *CAdPlugDatabase::CRecord::factory(RecordType type) +CAdPlugDatabase::CRecord * CAdPlugDatabase::CRecord::factory (RecordType type) { - switch(type) { - case Plain: return new CPlainRecord; - case SongInfo: return new CInfoRecord; - case ClockSpeed: return new CClockRecord; - default: return 0; + switch (type) + { + case Plain: + return new CPlainRecord; + case SongInfo: + return new CInfoRecord; + case ClockSpeed: + return new CClockRecord; + default: + return 0; } } -CAdPlugDatabase::CRecord *CAdPlugDatabase::CRecord::factory(binistream &in) +CAdPlugDatabase::CRecord * CAdPlugDatabase::CRecord::factory (binistream & in) { - RecordType type; - unsigned long size; - CRecord *rec; + RecordType + type; + unsigned long + size; + CRecord * + rec; - type = (RecordType)in.readInt(1); size = in.readInt(4); - rec = factory(type); + type = (RecordType) in.readInt (1); + size = in.readInt (4); + rec = factory (type); - if(rec) { - rec->key.crc16 = in.readInt(2); rec->key.crc32 = in.readInt(4); - rec->filetype = in.readString('\0'); rec->comment = in.readString('\0'); - rec->read_own(in); + if (rec) + { + rec->key.crc16 = in.readInt (2); + rec->key.crc32 = in.readInt (4); + rec->filetype = in.readString ('\0'); + rec->comment = in.readString ('\0'); + rec->read_own (in); return rec; - } else { + } + else + { // skip this record, cause we don't know about it - in.seek(size, binio::Add); + in.seek (size, binio::Add); return 0; } } -void CAdPlugDatabase::CRecord::write(binostream &out) +void +CAdPlugDatabase::CRecord::write (binostream & out) { - out.writeInt(type, 1); - out.writeInt(get_size() + filetype.length() + comment.length() + 8, 4); - out.writeInt(key.crc16, 2); out.writeInt(key.crc32, 4); - out.writeString(filetype); out.writeInt('\0', 1); - out.writeString(comment); out.writeInt('\0', 1); + out.writeInt (type, 1); + out.writeInt (get_size () + filetype.length () + comment.length () + 8, 4); + out.writeInt (key.crc16, 2); + out.writeInt (key.crc32, 4); + out.writeString (filetype); + out.writeInt ('\0', 1); + out.writeString (comment); + out.writeInt ('\0', 1); - write_own(out); + write_own (out); +} + +bool +CAdPlugDatabase::CRecord::user_read (std::istream & in, std::ostream & out) +{ + return user_read_own (in, out); } -bool CAdPlugDatabase::CRecord::user_read(std::istream &in, std::ostream &out) -{ - return user_read_own(in, out); -} - -bool CAdPlugDatabase::CRecord::user_write(std::ostream &out) +bool +CAdPlugDatabase::CRecord::user_write (std::ostream & out) { out << "Record type: "; - switch(type) { - case Plain: out << "Plain"; break; - case SongInfo: out << "SongInfo"; break; - case ClockSpeed: out << "ClockSpeed"; break; - default: out << "*** Unknown ***"; break; + switch (type) + { + case Plain: + out << "Plain"; + break; + case SongInfo: + out << "SongInfo"; + break; + case ClockSpeed: + out << "ClockSpeed"; + break; + default: + out << "*** Unknown ***"; + break; } out << std::endl; - out << "Key: " << std::hex << key.crc16 << ":" << key.crc32 << std::dec << std::endl; + out << "Key: " << std::hex << key.crc16 << ":" << key. + crc32 << std::dec << std::endl; out << "File type: " << filetype << std::endl; out << "Comment: " << comment << std::endl; - return user_write_own(out); + return user_write_own (out); } /***** CAdPlugDatabase::CRecord::CKey *****/ -CAdPlugDatabase::CKey::CKey(binistream &buf) +CAdPlugDatabase::CKey::CKey (binistream & buf) { - make(buf); + make (buf); } -bool CAdPlugDatabase::CKey::operator==(const CKey &key) +bool +CAdPlugDatabase::CKey::operator== (const CKey & key) { return ((crc16 == key.crc16) && (crc32 == key.crc32)); } -void CAdPlugDatabase::CKey::make(binistream &buf) +void +CAdPlugDatabase::CKey::make (binistream & buf) // Key is CRC16:CRC32 pair. CRC16 and CRC32 calculation routines (c) Zhengxi { - static const unsigned short magic16 = 0xa001; - static const unsigned long magic32 = 0xedb88320; + static const unsigned short + magic16 = 0xa001; + static const unsigned long + magic32 = 0xedb88320; - crc16 = 0; crc32 = ~0; + crc16 = 0; + crc32 = ~0; - while(!buf.eof()) - { - unsigned char byte = buf.readInt(1); + while (!buf.eof ()) + { + unsigned char + byte = buf.readInt (1); - for (int j=0;j<8;j++) - { - if ((crc16 ^ byte) & 1) - crc16 = (crc16 >> 1) ^ magic16; - else - crc16 >>= 1; + for (int j = 0; j < 8; j++) + { + if ((crc16 ^ byte) & 1) + crc16 = (crc16 >> 1) ^ magic16; + else + crc16 >>= 1; - if ((crc32 ^ byte) & 1) - crc32 = (crc32 >> 1) ^ magic32; - else - crc32 >>= 1; + if ((crc32 ^ byte) & 1) + crc32 = (crc32 >> 1) ^ magic32; + else + crc32 >>= 1; - byte >>= 1; - } + byte >>= 1; } + } crc16 &= 0xffff; - crc32 = ~crc32; + crc32 = ~crc32; } /***** CInfoRecord *****/ -CInfoRecord::CInfoRecord() +CInfoRecord::CInfoRecord () { type = SongInfo; } -void CInfoRecord::read_own(binistream &in) +void +CInfoRecord::read_own (binistream & in) { - title = in.readString('\0'); - author = in.readString('\0'); + title = in.readString ('\0'); + author = in.readString ('\0'); } -void CInfoRecord::write_own(binostream &out) +void +CInfoRecord::write_own (binostream & out) { - out.writeString(title); out.writeInt('\0', 1); - out.writeString(author); out.writeInt('\0', 1); + out.writeString (title); + out.writeInt ('\0', 1); + out.writeString (author); + out.writeInt ('\0', 1); } -unsigned long CInfoRecord::get_size() +unsigned long +CInfoRecord::get_size () { - return title.length() + author.length() + 2; + return title.length () + author.length () + 2; } -bool CInfoRecord::user_read_own(std::istream &in, std::ostream &out) +bool +CInfoRecord::user_read_own (std::istream & in, std::ostream & out) { - out << "Title: "; in >> title; - out << "Author: "; in >> author; + out << "Title: "; + in >> title; + out << "Author: "; + in >> author; return true; } -bool CInfoRecord::user_write_own(std::ostream &out) +bool +CInfoRecord::user_write_own (std::ostream & out) { out << "Title: " << title << std::endl; out << "Author: " << author << std::endl; @@ -391,34 +481,39 @@ /***** CClockRecord *****/ -CClockRecord::CClockRecord() - : clock(0.0f) +CClockRecord::CClockRecord ():clock (0.0f) { type = ClockSpeed; } -void CClockRecord::read_own(binistream &in) +void +CClockRecord::read_own (binistream & in) { - clock = in.readFloat(binio::Single); + clock = in.readFloat (binio::Single); } -void CClockRecord::write_own(binostream &out) +void +CClockRecord::write_own (binostream & out) { - out.writeFloat(clock, binio::Single); + out.writeFloat (clock, binio::Single); } -unsigned long CClockRecord::get_size() +unsigned long +CClockRecord::get_size () { return 4; } -bool CClockRecord::user_read_own(std::istream &in, std::ostream &out) +bool +CClockRecord::user_read_own (std::istream & in, std::ostream & out) { - out << "Clockspeed: "; in >> clock; + out << "Clockspeed: "; + in >> clock; return true; } -bool CClockRecord::user_write_own(std::ostream &out) +bool +CClockRecord::user_write_own (std::ostream & out) { out << "Clock speed: " << clock << " Hz" << std::endl; return true; diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/dfm.cxx --- a/src/adplug/core/dfm.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/dfm.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -25,91 +25,113 @@ #include "dfm.h" #include "debug.h" -CPlayer *CdfmLoader::factory(Copl *newopl) +CPlayer * +CdfmLoader::factory (Copl * newopl) { - return new CdfmLoader(newopl); + return new CdfmLoader (newopl); } -bool CdfmLoader::load(VFSFile *fd, const CFileProvider &fp) +bool +CdfmLoader::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); if(!f) return false; - unsigned char npats,n,note,fx,c,r,param; - unsigned int i; - const unsigned char convfx[8] = {255,255,17,19,23,24,255,13}; + binistream *f = fp.open (fd); + if (!f) + return false; + unsigned char npats, n, note, fx, c, r, param; + unsigned int i; + const unsigned char convfx[8] = { 255, 255, 17, 19, 23, 24, 255, 13 }; // file validation - f->readString(header.id, 4); - header.hiver = f->readInt(1); header.lover = f->readInt(1); - if(strncmp(header.id,"DFM\x1a",4) || header.hiver > 1) - { fp.close(f); return false; } + f->readString (header.id, 4); + header.hiver = f->readInt (1); + header.lover = f->readInt (1); + if (strncmp (header.id, "DFM\x1a", 4) || header.hiver > 1) + { + fp.close (f); + return false; + } // load - restartpos = 0; flags = Standard; bpm = 0; - init_trackord(); - f->readString(songinfo, 33); - initspeed = f->readInt(1); - for(i = 0; i < 32; i++) - f->readString(instname[i], 12); - for(i = 0; i < 32; i++) { - inst[i].data[1] = f->readInt(1); - inst[i].data[2] = f->readInt(1); - inst[i].data[9] = f->readInt(1); - inst[i].data[10] = f->readInt(1); - inst[i].data[3] = f->readInt(1); - inst[i].data[4] = f->readInt(1); - inst[i].data[5] = f->readInt(1); - inst[i].data[6] = f->readInt(1); - inst[i].data[7] = f->readInt(1); - inst[i].data[8] = f->readInt(1); - inst[i].data[0] = f->readInt(1); + restartpos = 0; + flags = Standard; + bpm = 0; + init_trackord (); + f->readString (songinfo, 33); + initspeed = f->readInt (1); + for (i = 0; i < 32; i++) + f->readString (instname[i], 12); + for (i = 0; i < 32; i++) + { + inst[i].data[1] = f->readInt (1); + inst[i].data[2] = f->readInt (1); + inst[i].data[9] = f->readInt (1); + inst[i].data[10] = f->readInt (1); + inst[i].data[3] = f->readInt (1); + inst[i].data[4] = f->readInt (1); + inst[i].data[5] = f->readInt (1); + inst[i].data[6] = f->readInt (1); + inst[i].data[7] = f->readInt (1); + inst[i].data[8] = f->readInt (1); + inst[i].data[0] = f->readInt (1); } - for(i = 0; i < 128; i++) order[i] = f->readInt(1); - for(i = 0; i < 128 && order[i] != 128; i++) ; length = i; - npats = f->readInt(1); - for(i = 0; i < npats; i++) { - n = f->readInt(1); - for(r = 0; r < 64; r++) - for(c = 0; c < 9; c++) { - note = f->readInt(1); - if((note & 15) == 15) - tracks[n*9+c][r].note = 127; // key off - else - tracks[n*9+c][r].note = ((note & 127) >> 4) * 12 + (note & 15); - if(note & 128) { // additional effect byte - fx = f->readInt(1); - if(fx >> 5 == 1) - tracks[n*9+c][r].inst = (fx & 31) + 1; - else { - tracks[n*9+c][r].command = convfx[fx >> 5]; - if(tracks[n*9+c][r].command == 17) { // set volume - param = fx & 31; - param = 63 - param * 2; - tracks[n*9+c][r].param1 = param >> 4; - tracks[n*9+c][r].param2 = param & 15; - } else { - tracks[n*9+c][r].param1 = (fx & 31) >> 4; - tracks[n*9+c][r].param2 = fx & 15; - } - } - } + for (i = 0; i < 128; i++) + order[i] = f->readInt (1); + for (i = 0; i < 128 && order[i] != 128; i++); + length = i; + npats = f->readInt (1); + for (i = 0; i < npats; i++) + { + n = f->readInt (1); + for (r = 0; r < 64; r++) + for (c = 0; c < 9; c++) + { + note = f->readInt (1); + if ((note & 15) == 15) + tracks[n * 9 + c][r].note = 127; // key off + else + tracks[n * 9 + c][r].note = ((note & 127) >> 4) * 12 + (note & 15); + if (note & 128) + { // additional effect byte + fx = f->readInt (1); + if (fx >> 5 == 1) + tracks[n * 9 + c][r].inst = (fx & 31) + 1; + else + { + tracks[n * 9 + c][r].command = convfx[fx >> 5]; + if (tracks[n * 9 + c][r].command == 17) + { // set volume + param = fx & 31; + param = 63 - param * 2; + tracks[n * 9 + c][r].param1 = param >> 4; + tracks[n * 9 + c][r].param2 = param & 15; + } + else + { + tracks[n * 9 + c][r].param1 = (fx & 31) >> 4; + tracks[n * 9 + c][r].param2 = fx & 15; + } + } + } } } - fp.close(f); - rewind(0); + fp.close (f); + rewind (0); return true; } -std::string CdfmLoader::gettype() +std::string CdfmLoader::gettype () { - char tmpstr[20]; + char + tmpstr[20]; - sprintf(tmpstr,"Digital-FM %d.%d",header.hiver,header.lover); - return std::string(tmpstr); + sprintf (tmpstr, "Digital-FM %d.%d", header.hiver, header.lover); + return std::string (tmpstr); } -float CdfmLoader::getrefresh() +float +CdfmLoader::getrefresh () { - return 125.0f; + return 125.0f; } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/diskopl.cxx --- a/src/adplug/core/diskopl.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/diskopl.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -22,69 +22,82 @@ #include "diskopl.h" //static const unsigned short note_table[12] = {363,385,408,432,458,485,514,544,577,611,647,686}; -const unsigned char CDiskopl::op_table[9] = {0x00, 0x01, 0x02, 0x08, 0x09, 0x0a, 0x10, 0x11, 0x12}; +const unsigned char +CDiskopl::op_table[9] = + { 0x00, 0x01, 0x02, 0x08, 0x09, 0x0a, 0x10, 0x11, 0x12 }; -CDiskopl::CDiskopl(std::string filename) - : old_freq(0.0f), del(1), nowrite(false) +CDiskopl::CDiskopl (std::string filename):old_freq (0.0f), del (1), +nowrite (false) { - unsigned short clock = 0xffff; + unsigned short + clock = 0xffff; currType = TYPE_OPL3; - f = fopen(filename.c_str(),"wb"); - fwrite("RAWADATA",8,1,f); - fwrite(&clock,sizeof(clock),1,f); + f = fopen (filename.c_str (), "wb"); + fwrite ("RAWADATA", 8, 1, f); + fwrite (&clock, sizeof (clock), 1, f); } -CDiskopl::~CDiskopl() +CDiskopl::~CDiskopl () { - fclose(f); + fclose (f); } -void CDiskopl::update(CPlayer *p) +void +CDiskopl::update (CPlayer * p) { - unsigned short clock; - unsigned int wait; + unsigned short clock; + unsigned int wait; - if(p->getrefresh() != old_freq) { - old_freq = p->getrefresh(); - del = wait = (unsigned int)(18.2f / old_freq); - clock = (unsigned short)(1192737/(old_freq*(wait+1))); - fputc(0,f); fputc(2,f); - fwrite(&clock,2,1,f); + if (p->getrefresh () != old_freq) + { + old_freq = p->getrefresh (); + del = wait = (unsigned int) (18.2f / old_freq); + clock = (unsigned short) (1192737 / (old_freq * (wait + 1))); + fputc (0, f); + fputc (2, f); + fwrite (&clock, 2, 1, f); } - if(!nowrite) { - fputc(del+1,f); - fputc(0,f); + if (!nowrite) + { + fputc (del + 1, f); + fputc (0, f); } } -void CDiskopl::setchip(int n) +void +CDiskopl::setchip (int n) { - Copl::setchip(n); + Copl::setchip (n); - if(!nowrite) { - fputc(currChip + 1, f); - fputc(2, f); + if (!nowrite) + { + fputc (currChip + 1, f); + fputc (2, f); } } -void CDiskopl::write(int reg, int val) +void +CDiskopl::write (int reg, int val) { - if(!nowrite) - diskwrite(reg,val); + if (!nowrite) + diskwrite (reg, val); } -void CDiskopl::init() +void +CDiskopl::init () { - for (int i=0;i<9;i++) { // stop instruments - diskwrite(0xb0 + i,0); // key off - diskwrite(0x80 + op_table[i],0xff); // fastest release + for (int i = 0; i < 9; i++) + { // stop instruments + diskwrite (0xb0 + i, 0); // key off + diskwrite (0x80 + op_table[i], 0xff); // fastest release } - diskwrite(0xbd,0); // clear misc. register + diskwrite (0xbd, 0); // clear misc. register } -void CDiskopl::diskwrite(int reg, int val) +void +CDiskopl::diskwrite (int reg, int val) { - fputc(val,f); - fputc(reg,f); + fputc (val, f); + fputc (reg, f); } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/dmo.cxx --- a/src/adplug/core/dmo.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/dmo.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -44,361 +44,401 @@ /* -------- Public Methods -------------------------------- */ -CPlayer *CdmoLoader::factory(Copl *newopl) +CPlayer * +CdmoLoader::factory (Copl * newopl) { - return new CdmoLoader(newopl); + return new CdmoLoader (newopl); } -bool CdmoLoader::load(VFSFile *fd, const CFileProvider &fp) +bool +CdmoLoader::load (VFSFile * fd, const CFileProvider & fp) { - int i,j; + int i, j; binistream *f; - std::string filename(fd->uri); + std::string filename (fd->uri); // check header dmo_unpacker *unpacker = new dmo_unpacker; unsigned char chkhdr[16]; - f = fp.open(fd); if(!f) return false; - if(!fp.extension(filename, ".dmo")) return false; - - f->readString((char *)chkhdr, 16); + f = fp.open (fd); + if (!f) + return false; + if (!fp.extension (filename, ".dmo")) + return false; - if (!unpacker->decrypt(chkhdr, 16)) - { - delete unpacker; - fp.close(f); - return false; - } + f->readString ((char *) chkhdr, 16); + + if (!unpacker->decrypt (chkhdr, 16)) + { + delete unpacker; + fp.close (f); + return false; + } // get file size - long packed_length = fp.filesize(f); - f->seek(0); + long packed_length = fp.filesize (f); + f->seek (0); - unsigned char *packed_module = new unsigned char [packed_length]; + unsigned char *packed_module = new unsigned char[packed_length]; // load file - f->readString((char *)packed_module, packed_length); - fp.close(f); + f->readString ((char *) packed_module, packed_length); + fp.close (f); // decrypt - unpacker->decrypt(packed_module,packed_length); + unpacker->decrypt (packed_module, packed_length); - long unpacked_length = 0x2000 * ARRAY_AS_WORD(packed_module, 12); - unsigned char *module = new unsigned char [unpacked_length]; + long unpacked_length = 0x2000 * ARRAY_AS_WORD (packed_module, 12); + unsigned char *module = new unsigned char[unpacked_length]; // unpack - if (!unpacker->unpack(packed_module+12,module,unpacked_length)) - { - delete unpacker; - delete [] packed_module; - delete [] module; - return false; - } + if (!unpacker->unpack (packed_module + 12, module, unpacked_length)) + { + delete unpacker; + delete[]packed_module; + delete[]module; + return false; + } delete unpacker; - delete [] packed_module; + delete[]packed_module; // "TwinTeam" - signed ? - if (memcmp(module,"TwinTeam Module File""\x0D\x0A",22)) - { - delete module; - return false; - } + if (memcmp (module, "TwinTeam Module File" "\x0D\x0A", 22)) + { + delete module; + return false; + } // load header - binisstream uf(module, unpacked_length); - uf.setFlag(binio::BigEndian, false); uf.setFlag(binio::FloatIEEE); + binisstream uf (module, unpacked_length); + uf.setFlag (binio::BigEndian, false); + uf.setFlag (binio::FloatIEEE); - memset(&header,0,sizeof(s3mheader)); + memset (&header, 0, sizeof (s3mheader)); - uf.ignore(22); // ignore DMO header ID string - uf.readString(header.name, 28); + uf.ignore (22); // ignore DMO header ID string + uf.readString (header.name, 28); - uf.ignore(2); // _unk_1 - header.ordnum = uf.readInt(2); - header.insnum = uf.readInt(2); - header.patnum = uf.readInt(2); - uf.ignore(2); // _unk_2 - header.is = uf.readInt(2); - header.it = uf.readInt(2); + uf.ignore (2); // _unk_1 + header.ordnum = uf.readInt (2); + header.insnum = uf.readInt (2); + header.patnum = uf.readInt (2); + uf.ignore (2); // _unk_2 + header.is = uf.readInt (2); + header.it = uf.readInt (2); - memset(header.chanset,0xFF,32); + memset (header.chanset, 0xFF, 32); - for (i=0;i<9;i++) + for (i = 0; i < 9; i++) header.chanset[i] = 0x10 + i; - uf.ignore(32); // ignore panning settings for all 32 channels + uf.ignore (32); // ignore panning settings for all 32 channels // load orders - for(i = 0; i < 256; i++) orders[i] = uf.readInt(1); + for (i = 0; i < 256; i++) + orders[i] = uf.readInt (1); orders[header.ordnum] = 0xFF; // load pattern lengths unsigned short my_patlen[100]; - for(i = 0; i < 100; i++) my_patlen[i] = uf.readInt(2); + for (i = 0; i < 100; i++) + my_patlen[i] = uf.readInt (2); // load instruments for (i = 0; i < header.insnum; i++) - { - memset(&inst[i],0,sizeof(s3minst)); + { + memset (&inst[i], 0, sizeof (s3minst)); - uf.readString(inst[i].name, 28); + uf.readString (inst[i].name, 28); - inst[i].volume = uf.readInt(1); - inst[i].dsk = uf.readInt(1); - inst[i].c2spd = uf.readInt(4); - inst[i].type = uf.readInt(1); - inst[i].d00 = uf.readInt(1); - inst[i].d01 = uf.readInt(1); - inst[i].d02 = uf.readInt(1); - inst[i].d03 = uf.readInt(1); - inst[i].d04 = uf.readInt(1); - inst[i].d05 = uf.readInt(1); - inst[i].d06 = uf.readInt(1); - inst[i].d07 = uf.readInt(1); - inst[i].d08 = uf.readInt(1); - inst[i].d09 = uf.readInt(1); - inst[i].d0a = uf.readInt(1); - /* - * Originally, riven sets d0b = d0a and ignores 1 byte in the - * stream, but i guess this was a typo, so i read it here. - */ - inst[i].d0b = uf.readInt(1); - } + inst[i].volume = uf.readInt (1); + inst[i].dsk = uf.readInt (1); + inst[i].c2spd = uf.readInt (4); + inst[i].type = uf.readInt (1); + inst[i].d00 = uf.readInt (1); + inst[i].d01 = uf.readInt (1); + inst[i].d02 = uf.readInt (1); + inst[i].d03 = uf.readInt (1); + inst[i].d04 = uf.readInt (1); + inst[i].d05 = uf.readInt (1); + inst[i].d06 = uf.readInt (1); + inst[i].d07 = uf.readInt (1); + inst[i].d08 = uf.readInt (1); + inst[i].d09 = uf.readInt (1); + inst[i].d0a = uf.readInt (1); + /* + * Originally, riven sets d0b = d0a and ignores 1 byte in the + * stream, but i guess this was a typo, so i read it here. + */ + inst[i].d0b = uf.readInt (1); + } // load patterns - for (i = 0; i < header.patnum; i++) { - long cur_pos = uf.pos(); + for (i = 0; i < header.patnum; i++) + { + long cur_pos = uf.pos (); - for (j = 0; j < 64; j++) { - while (1) { - unsigned char token = uf.readInt(1); + for (j = 0; j < 64; j++) + { + while (1) + { + unsigned char token = uf.readInt (1); - if (!token) - break; + if (!token) + break; - unsigned char chan = token & 31; + unsigned char chan = token & 31; - // note + instrument ? - if (token & 32) { - unsigned char bufbyte = uf.readInt(1); + // note + instrument ? + if (token & 32) + { + unsigned char bufbyte = uf.readInt (1); - pattern[i][j][chan].note = bufbyte & 15; - pattern[i][j][chan].oct = bufbyte >> 4; - pattern[i][j][chan].instrument = uf.readInt(1); - } + pattern[i][j][chan].note = bufbyte & 15; + pattern[i][j][chan].oct = bufbyte >> 4; + pattern[i][j][chan].instrument = uf.readInt (1); + } - // volume ? - if (token & 64) - pattern[i][j][chan].volume = uf.readInt(1); + // volume ? + if (token & 64) + pattern[i][j][chan].volume = uf.readInt (1); - // command ? - if (token & 128) { - pattern[i][j][chan].command = uf.readInt(1); - pattern[i][j][chan].info = uf.readInt(1); - } + // command ? + if (token & 128) + { + pattern[i][j][chan].command = uf.readInt (1); + pattern[i][j][chan].info = uf.readInt (1); + } } } - uf.seek(cur_pos + my_patlen[i]); + uf.seek (cur_pos + my_patlen[i]); } - delete [] module; - rewind(0); + delete[]module; + rewind (0); return true; } -std::string CdmoLoader::gettype() +std::string CdmoLoader::gettype () { - return std::string("TwinTeam (packed S3M)"); + return std::string ("TwinTeam (packed S3M)"); } -std::string CdmoLoader::getauthor() +std::string CdmoLoader::getauthor () { /* - All available .DMO modules written by one composer. And because all .DMO - stuff was lost due to hd crash (TwinTeam guys said this), there are - never(?) be another. - */ - return std::string("Benjamin GERARDIN"); + All available .DMO modules written by one composer. And because all .DMO + stuff was lost due to hd crash (TwinTeam guys said this), there are + never(?) be another. + */ + return std::string ("Benjamin GERARDIN"); } /* -------- Private Methods ------------------------------- */ -unsigned short CdmoLoader::dmo_unpacker::brand(unsigned short range) +unsigned short +CdmoLoader::dmo_unpacker::brand (unsigned short range) { - unsigned short ax,bx,cx,dx; + unsigned short + ax, + bx, + cx, + dx; - ax = LOWORD(bseed); - bx = HIWORD(bseed); + ax = LOWORD (bseed); + bx = HIWORD (bseed); cx = ax; - ax = LOWORD(cx * 0x8405); - dx = HIWORD(cx * 0x8405); + ax = LOWORD (cx * 0x8405); + dx = HIWORD (cx * 0x8405); cx <<= 3; - cx = (((HIBYTE(cx) + LOBYTE(cx)) & 0xFF) << 8) + LOBYTE(cx); + cx = (((HIBYTE (cx) + LOBYTE (cx)) & 0xFF) << 8) + LOBYTE (cx); dx += cx; dx += bx; bx <<= 2; dx += bx; - dx = (((HIBYTE(dx) + LOBYTE(bx)) & 0xFF) << 8) + LOBYTE(dx); + dx = (((HIBYTE (dx) + LOBYTE (bx)) & 0xFF) << 8) + LOBYTE (dx); bx <<= 5; - dx = (((HIBYTE(dx) + LOBYTE(bx)) & 0xFF) << 8) + LOBYTE(dx); + dx = (((HIBYTE (dx) + LOBYTE (bx)) & 0xFF) << 8) + LOBYTE (dx); ax += 1; - if (!ax) dx += 1; + if (!ax) + dx += 1; // leave it that way or amd64 might get it wrong bseed = dx; bseed <<= 16; bseed += ax; - return HIWORD(HIWORD(LOWORD(bseed) * range) + HIWORD(bseed) * range); + return HIWORD (HIWORD (LOWORD (bseed) * range) + HIWORD (bseed) * range); } -bool CdmoLoader::dmo_unpacker::decrypt(unsigned char *buf, long len) +bool +CdmoLoader::dmo_unpacker::decrypt (unsigned char *buf, long len) { - unsigned long seed = 0; - int i; - - bseed = ARRAY_AS_DWORD(buf, 0); + unsigned long + seed = 0; + int + i; - for (i=0; i < ARRAY_AS_WORD(buf, 4) + 1; i++) - seed += brand(0xffff); + bseed = ARRAY_AS_DWORD (buf, 0); - bseed = seed ^ ARRAY_AS_DWORD(buf, 6); + for (i = 0; i < ARRAY_AS_WORD (buf, 4) + 1; i++) + seed += brand (0xffff); - if (ARRAY_AS_WORD(buf, 10) != brand(0xffff)) + bseed = seed ^ ARRAY_AS_DWORD (buf, 6); + + if (ARRAY_AS_WORD (buf, 10) != brand (0xffff)) return false; - for (i=0;i<(len-12);i++) - buf[12+i] ^= brand(0x100); + for (i = 0; i < (len - 12); i++) + buf[12 + i] ^= brand (0x100); buf[len - 2] = buf[len - 1] = 0; return true; } -short CdmoLoader::dmo_unpacker::unpack_block(unsigned char *ibuf, long ilen, unsigned char *obuf) +short +CdmoLoader::dmo_unpacker::unpack_block (unsigned char *ibuf, long ilen, + unsigned char *obuf) { - unsigned char code,par1,par2; - unsigned short ax,bx,cx; + unsigned char + code, + par1, + par2; + unsigned short + ax, + bx, + cx; - unsigned char *ipos = ibuf; - unsigned char *opos = obuf; + unsigned char * + ipos = ibuf; + unsigned char * + opos = obuf; // LZ77 child while (ipos - ibuf < ilen) - { - code = *ipos++; + { + code = *ipos++; - // 00xxxxxx: copy (xxxxxx + 1) bytes - if ((code >> 6) == 0) - { - cx = (code & 0x3F) + 1; + // 00xxxxxx: copy (xxxxxx + 1) bytes + if ((code >> 6) == 0) + { + cx = (code & 0x3F) + 1; - if(opos + cx >= oend) - return -1; + if (opos + cx >= oend) + return -1; - for (int i=0;i> 6) == 1) - { - par1 = *ipos++; + // 01xxxxxx xxxyyyyy: copy (Y + 3) bytes from (X + 1) + if ((code >> 6) == 1) + { + par1 = *ipos++; - ax = ((code & 0x3F) << 3) + ((par1 & 0xE0) >> 5) + 1; - cx = (par1 & 0x1F) + 3; + ax = ((code & 0x3F) << 3) + ((par1 & 0xE0) >> 5) + 1; + cx = (par1 & 0x1F) + 3; - if(opos + cx >= oend) - return -1; + if (opos + cx >= oend) + return -1; - for(int i=0;i> 6) == 2) - { - int i; + // 10xxxxxx xyyyzzzz: copy (Y + 3) bytes from (X + 1); copy Z bytes + if ((code >> 6) == 2) + { + int + i; - par1 = *ipos++; + par1 = *ipos++; - ax = ((code & 0x3F) << 1) + (par1 >> 7) + 1; - cx = ((par1 & 0x70) >> 4) + 3; - bx = par1 & 0x0F; + ax = ((code & 0x3F) << 1) + (par1 >> 7) + 1; + cx = ((par1 & 0x70) >> 4) + 3; + bx = par1 & 0x0F; - if(opos + bx + cx >= oend) - return -1; + if (opos + bx + cx >= oend) + return -1; - for(i=0;i> 6) == 3) - { - int i; + // 11xxxxxx xxxxxxxy yyyyzzzz: copy (Y + 4) from X; copy Z bytes + if ((code >> 6) == 3) + { + int + i; - par1 = *ipos++; - par2 = *ipos++; + par1 = *ipos++; + par2 = *ipos++; - bx = ((code & 0x3F) << 7) + (par1 >> 1); - cx = ((par1 & 0x01) << 4) + (par2 >> 4) + 4; - ax = par2 & 0x0F; + bx = ((code & 0x3F) << 7) + (par1 >> 1); + cx = ((par1 & 0x01) << 4) + (par2 >> 4) + 4; + ax = par2 & 0x0F; - if(opos + ax + cx >= oend) - return -1; + if (opos + ax + cx >= oend) + return -1; - for(i=0;igettype() == Copl::TYPE_OPL2) + if (opl->gettype () == Copl::TYPE_OPL2) opl3_mode = 0; else opl3_mode = 1; } -bool CdroPlayer::load(VFSFile *fd, const CFileProvider &fp) +bool +CdroPlayer::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); if(!f) return false; + binistream *f = fp.open (fd); + if (!f) + return false; char id[8]; unsigned long i; // file validation section - f->readString(id, 8); - if(strncmp(id,"DBRAWOPL",8)) { fp.close (f); return false; } - int version = f->readInt(4); // not very useful just yet - if(version != 0x10000) { fp.close(f); return false; } + f->readString (id, 8); + if (strncmp (id, "DBRAWOPL", 8)) + { + fp.close (f); + return false; + } + int version = f->readInt (4); // not very useful just yet + if (version != 0x10000) + { + fp.close (f); + return false; + } // load section - mstotal = f->readInt(4); // Total milliseconds in file - length = f->readInt(4); // Total data bytes in file - f->ignore(1); // Type of opl data this can contain - ignored - data = new unsigned char [length]; - for (i=0;ireadInt(1); - fp.close(f); - rewind(0); + mstotal = f->readInt (4); // Total milliseconds in file + length = f->readInt (4); // Total data bytes in file + f->ignore (1); // Type of opl data this can contain - ignored + data = new unsigned char[length]; + for (i = 0; i < length; i++) + data[i] = f->readInt (1); + fp.close (f); + rewind (0); return true; } -bool CdroPlayer::update() +bool +CdroPlayer::update () { - if (delay>500) { - delay-=500; + if (delay > 500) + { + delay -= 500; return true; - } else - delay=0; + } + else + delay = 0; - while (pos < length) { + while (pos < length) + { unsigned char cmd = data[pos++]; - switch(cmd) { - case 0: + switch (cmd) + { + case 0: delay = 1 + data[pos++]; return true; - case 1: - delay = 1 + data[pos] + (data[pos+1]<<8); - pos+=2; + case 1: + delay = 1 + data[pos] + (data[pos + 1] << 8); + pos += 2; return true; case 2: index = 0; - opl->setchip(0); + opl->setchip (0); break; case 3: index = 1; - opl->setchip(1); + opl->setchip (1); break; default: - if(cmd==4) cmd = data[pos++]; //data override - if(index == 0 || opl3_mode) - opl->write(cmd,data[pos++]); + if (cmd == 4) + cmd = data[pos++]; //data override + if (index == 0 || opl3_mode) + opl->write (cmd, data[pos++]); break; } } - return posinit(); + delay = 1; + pos = index = 0; + opl->init (); //dro assumes all registers are initialized to 0 //registers not initialized to 0 will be corrected //in the data stream - for(int i=0;i<256;i++) - opl->write(i,0); - - opl->setchip(1); - for(int i=0;i<256;i++) - opl->write(i,0); - opl->setchip(0); + for (int i = 0; i < 256; i++) + opl->write (i, 0); + + opl->setchip (1); + for (int i = 0; i < 256; i++) + opl->write (i, 0); + opl->setchip (0); } -float CdroPlayer::getrefresh() +float +CdroPlayer::getrefresh () { - if (delay > 500) return 1000 / 500; - else return 1000 / (double)delay; + if (delay > 500) + return 1000 / 500; + else + return 1000 / (double) delay; } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/dtm.cxx --- a/src/adplug/core/dtm.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/dtm.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -26,292 +26,311 @@ /* -------- Public Methods -------------------------------- */ -CPlayer *CdtmLoader::factory(Copl *newopl) +CPlayer * +CdtmLoader::factory (Copl * newopl) { - return new CdtmLoader(newopl); + return new CdtmLoader (newopl); } -bool CdtmLoader::load(VFSFile *fd, const CFileProvider &fp) +bool +CdtmLoader::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); if(!f) return false; - const unsigned char conv_inst[11] = { 2,1,10,9,4,3,6,5,0,8,7 }; - const unsigned short conv_note[12] = { 0x16B, 0x181, 0x198, 0x1B0, 0x1CA, 0x1E5, 0x202, 0x220, 0x241, 0x263, 0x287, 0x2AE }; + binistream *f = fp.open (fd); + if (!f) + return false; + const unsigned char conv_inst[11] = { 2, 1, 10, 9, 4, 3, 6, 5, 0, 8, 7 }; + const unsigned short conv_note[12] = + { 0x16B, 0x181, 0x198, 0x1B0, 0x1CA, 0x1E5, 0x202, 0x220, 0x241, 0x263, +0x287, 0x2AE }; + + int i, j, k, t = 0; + + // read header + f->readString (header.id, 12); + header.version = f->readInt (1); + f->readString (header.title, 20); + f->readString (header.author, 20); + header.numpat = f->readInt (1); + header.numinst = f->readInt (1); + + // signature exists ? good version ? + if (memcmp (header.id, "DeFy DTM ", 9) || header.version != 0x10) + { + fp.close (f); + return false; + } + + header.numinst++; + + // load description + memset (desc, 0, 80 * 16); + + char bufstr[80]; + + for (i = 0; i < 16; i++) + { + // get line length + unsigned char bufstr_length = f->readInt (1); - int i,j,k,t=0; + if (bufstr_length > 80) + { + fp.close (f); + return false; + } + + // read line + if (bufstr_length) + { + f->readString (bufstr, bufstr_length); + + for (j = 0; j < bufstr_length; j++) + if (!bufstr[j]) + bufstr[j] = 0x20; + + bufstr[bufstr_length] = 0; + + strcat (desc, bufstr); + } + + strcat (desc, "\n"); + } - // read header - f->readString(header.id, 12); - header.version = f->readInt(1); - f->readString(header.title, 20); f->readString(header.author, 20); - header.numpat = f->readInt(1); header.numinst = f->readInt(1); + // init CmodPlayer + realloc_instruments (header.numinst); + realloc_order (100); + realloc_patterns (header.numpat, 64, 9); + init_notetable (conv_note); + init_trackord (); + + // load instruments + for (i = 0; i < header.numinst; i++) + { + unsigned char name_length = f->readInt (1); + + if (name_length) + f->readString (instruments[i].name, name_length); + + instruments[i].name[name_length] = 0; + + for (j = 0; j < 12; j++) + instruments[i].data[j] = f->readInt (1); + + for (j = 0; j < 11; j++) + inst[i].data[conv_inst[j]] = instruments[i].data[j]; + } + + // load order + for (i = 0; i < 100; i++) + order[i] = f->readInt (1); - // signature exists ? good version ? - if(memcmp(header.id,"DeFy DTM ",9) || header.version != 0x10) - { fp.close (f); return false; } + nop = header.numpat; + + unsigned char *pattern = new unsigned char[0x480]; + + // load tracks + for (i = 0; i < nop; i++) + { + unsigned short packed_length; + + packed_length = f->readInt (2); + + unsigned char *packed_pattern = new unsigned char[packed_length]; + + for (j = 0; j < packed_length; j++) + packed_pattern[j] = f->readInt (1); + + long unpacked_length = + unpack_pattern (packed_pattern, packed_length, pattern, 0x480); + + delete[]packed_pattern; - header.numinst++; + if (!unpacked_length) + { + delete pattern; + fp.close (f); + return false; + } - // load description - memset(desc,0,80*16); + // convert pattern + for (j = 0; j < 9; j++) + { + for (k = 0; k < 64; k++) + { + dtm_event *event = (dtm_event *) & pattern[(k * 9 + j) * 2]; + + // instrument + if (event->byte0 == 0x80) + { + if (event->byte1 <= 0x80) + tracks[t][k].inst = event->byte1 + 1; + } - char bufstr[80]; + // note + effect + else + { + tracks[t][k].note = event->byte0; + + if ((event->byte0 != 0) && (event->byte0 != 127)) + tracks[t][k].note++; + + // convert effects + switch (event->byte1 >> 4) + { + case 0x0: // pattern break + if ((event->byte1 & 15) == 1) + tracks[t][k].command = 13; + break; + + case 0x1: // freq. slide up + tracks[t][k].command = 28; + tracks[t][k].param1 = event->byte1 & 15; + break; - for (i=0;i<16;i++) - { - // get line length - unsigned char bufstr_length = f->readInt(1); + case 0x2: // freq. slide down + tracks[t][k].command = 28; + tracks[t][k].param2 = event->byte1 & 15; + break; + + case 0xA: // set carrier volume + case 0xC: // set instrument volume + tracks[t][k].command = 22; + tracks[t][k].param1 = (0x3F - (event->byte1 & 15)) >> 4; + tracks[t][k].param2 = (0x3F - (event->byte1 & 15)) & 15; + break; - if(bufstr_length > 80) { - fp.close(f); - return false; + case 0xB: // set modulator volume + tracks[t][k].command = 21; + tracks[t][k].param1 = (0x3F - (event->byte1 & 15)) >> 4; + tracks[t][k].param2 = (0x3F - (event->byte1 & 15)) & 15; + break; + + case 0xE: // set panning + break; + + case 0xF: // set speed + tracks[t][k].command = 13; + tracks[t][k].param2 = event->byte1 & 15; + break; + } + } } - // read line - if (bufstr_length) - { - f->readString(bufstr,bufstr_length); - - for (j=0;jreadInt(1); - - if (name_length) - f->readString(instruments[i].name, name_length); - - instruments[i].name[name_length] = 0; - - for(j = 0; j < 12; j++) - instruments[i].data[j] = f->readInt(1); + delete[]pattern; + fp.close (f); - for (j=0;j<11;j++) - inst[i].data[conv_inst[j]] = instruments[i].data[j]; - } - - // load order - for(i = 0; i < 100; i++) order[i] = f->readInt(1); - - nop = header.numpat; - - unsigned char *pattern = new unsigned char [0x480]; - - // load tracks - for (i=0;ireadInt(2); - - unsigned char *packed_pattern = new unsigned char [packed_length]; - - for(j = 0; j < packed_length; j++) - packed_pattern[j] = f->readInt(1); - - long unpacked_length = unpack_pattern(packed_pattern,packed_length,pattern,0x480); - - delete [] packed_pattern; - - if (!unpacked_length) - { - delete pattern; - fp.close(f); - return false; - } - - // convert pattern - for (j=0;j<9;j++) - { - for (k=0;k<64;k++) - { - dtm_event *event = (dtm_event *)&pattern[(k*9+j)*2]; + // order length + for (i = 0; i < 100; i++) + { + if (order[i] >= 0x80) + { + length = i; - // instrument - if (event->byte0 == 0x80) - { - if (event->byte1 <= 0x80) - tracks[t][k].inst = event->byte1 + 1; - } - - // note + effect - else - { - tracks[t][k].note = event->byte0; - - if ((event->byte0 != 0) && (event->byte0 != 127)) - tracks[t][k].note++; - - // convert effects - switch (event->byte1 >> 4) - { - case 0x0: // pattern break - if ((event->byte1 & 15) == 1) - tracks[t][k].command = 13; - break; - - case 0x1: // freq. slide up - tracks[t][k].command = 28; - tracks[t][k].param1 = event->byte1 & 15; - break; - - case 0x2: // freq. slide down - tracks[t][k].command = 28; - tracks[t][k].param2 = event->byte1 & 15; - break; - - case 0xA: // set carrier volume - case 0xC: // set instrument volume - tracks[t][k].command = 22; - tracks[t][k].param1 = (0x3F - (event->byte1 & 15)) >> 4; - tracks[t][k].param2 = (0x3F - (event->byte1 & 15)) & 15; - break; + if (order[i] == 0xFF) + restartpos = 0; + else + restartpos = order[i] - 0x80; - case 0xB: // set modulator volume - tracks[t][k].command = 21; - tracks[t][k].param1 = (0x3F - (event->byte1 & 15)) >> 4; - tracks[t][k].param2 = (0x3F - (event->byte1 & 15)) & 15; - break; - - case 0xE: // set panning - break; - - case 0xF: // set speed - tracks[t][k].command = 13; - tracks[t][k].param2 = event->byte1 & 15; - break; - } - } - } - - t++; - } - } + break; + } + } - delete [] pattern; - fp.close(f); - - // order length - for (i=0;i<100;i++) - { - if (order[i] >= 0x80) - { - length = i; + // initial speed + initspeed = 2; - if (order[i] == 0xFF) - restartpos = 0; - else - restartpos = order[i] - 0x80; + rewind (0); - break; - } - } - - // initial speed - initspeed = 2; - - rewind(0); - - return true; + return true; } -void CdtmLoader::rewind(int subsong) +void +CdtmLoader::rewind (int subsong) { - CmodPlayer::rewind(subsong); + CmodPlayer::rewind (subsong); - // default instruments - for (int i=0;i<9;i++) - { - channel[i].inst = i; + // default instruments + for (int i = 0; i < 9; i++) + { + channel[i].inst = i; - channel[i].vol1 = 63 - (inst[i].data[10] & 63); - channel[i].vol2 = 63 - (inst[i].data[9] & 63); - } + channel[i].vol1 = 63 - (inst[i].data[10] & 63); + channel[i].vol2 = 63 - (inst[i].data[9] & 63); + } } -float CdtmLoader::getrefresh() +float +CdtmLoader::getrefresh () { - return 18.2f; -} - -std::string CdtmLoader::gettype() -{ - return std::string("DeFy Adlib Tracker"); + return 18.2f; } -std::string CdtmLoader::gettitle() +std::string CdtmLoader::gettype () { - return std::string(header.title); + return std::string ("DeFy Adlib Tracker"); } -std::string CdtmLoader::getauthor() +std::string CdtmLoader::gettitle () { - return std::string(header.author); + return std::string (header.title); +} + +std::string CdtmLoader::getauthor () +{ + return std::string (header.author); } -std::string CdtmLoader::getdesc() +std::string CdtmLoader::getdesc () { - return std::string(desc); + return std::string (desc); } -std::string CdtmLoader::getinstrument(unsigned int n) +std::string CdtmLoader::getinstrument (unsigned int n) { - return std::string(instruments[n].name); + return std::string (instruments[n].name); } -unsigned int CdtmLoader::getinstruments() +unsigned int +CdtmLoader::getinstruments () { - return header.numinst; + return header.numinst; } /* -------- Private Methods ------------------------------- */ -long CdtmLoader::unpack_pattern(unsigned char *ibuf, long ilen, unsigned char *obuf, long olen) +long +CdtmLoader::unpack_pattern (unsigned char *ibuf, long ilen, + unsigned char *obuf, long olen) { - unsigned char *input = ibuf; - unsigned char *output = obuf; + unsigned char *input = ibuf; + unsigned char *output = obuf; - long input_length = 0; - long output_length = 0; + long input_length = 0; + long output_length = 0; - unsigned char repeat_byte, repeat_counter; + unsigned char repeat_byte, repeat_counter; - // RLE - while (input_length < ilen) - { - repeat_byte = input[input_length++]; + // RLE + while (input_length < ilen) + { + repeat_byte = input[input_length++]; - if ((repeat_byte & 0xF0) == 0xD0) - { - repeat_counter = repeat_byte & 15; - repeat_byte = input[input_length++]; - } - else - repeat_counter = 1; + if ((repeat_byte & 0xF0) == 0xD0) + { + repeat_counter = repeat_byte & 15; + repeat_byte = input[input_length++]; + } + else + repeat_counter = 1; - for (int i=0;i=0;i--) { - outbuf[i*2] = outbuf[i]; - outbuf[i*2+1] = outbuf[i]; + if (stereo) + for (i = samples - 1; i >= 0; i--) + { + outbuf[i * 2] = outbuf[i]; + outbuf[i * 2 + 1] = outbuf[i]; } break; - case TYPE_OPL3: // unsupported + case TYPE_OPL3: // unsupported break; case TYPE_DUAL_OPL2: //for dual opl2 mode: //render each chip to a different tempbuffer - YM3812UpdateOne(opl[0],tempbuf2,samples); - YM3812UpdateOne(opl[1],tempbuf,samples); + YM3812UpdateOne (opl[0], tempbuf2, samples); + YM3812UpdateOne (opl[1], tempbuf, samples); //output stereo: //then we need to interleave the two buffers - if(stereo){ + if (stereo) + { //first, spread tempbuf's samples across left channel //left channel - for(i=0;i>1) + (tempbuf2[i]>>1); + for (i = 0; i < samples; i++) + outbuf[i] = (tempbuf[i] >> 1) + (tempbuf2[i] >> 1); break; } //now reduce to 8bit if we need to - if(!use16bit) - for(i=0;i<(stereo ? samples*2 : samples);i++) - ((char *)buf)[i] = (outbuf[i] >> 8) ^ 0x80; + if (!use16bit) + for (i = 0; i < (stereo ? samples * 2 : samples); i++) + ((char *) buf)[i] = (outbuf[i] >> 8) ^ 0x80; } -void CEmuopl::write(int reg, int val) +void +CEmuopl::write (int reg, int val) { - switch(currType){ + switch (currType) + { case TYPE_OPL2: case TYPE_DUAL_OPL2: - OPLWrite(opl[currChip], 0, reg); - OPLWrite(opl[currChip], 1, val); + OPLWrite (opl[currChip], 0, reg); + OPLWrite (opl[currChip], 1, val); break; - case TYPE_OPL3: // unsupported + case TYPE_OPL3: // unsupported break; } } -void CEmuopl::init() +void +CEmuopl::init () { - OPLResetChip(opl[0]); OPLResetChip(opl[1]); + OPLResetChip (opl[0]); + OPLResetChip (opl[1]); currChip = 0; } -void CEmuopl::settype(ChipType type) +void +CEmuopl::settype (ChipType type) { currType = type; } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/flash.cxx --- a/src/adplug/core/flash.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/flash.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -31,8 +31,8 @@ #include "flash.h" #include "debug.h" -const unsigned char CxadflashPlayer::flash_adlib_registers[99] = -{ +const unsigned char + CxadflashPlayer::flash_adlib_registers[99] = { 0x23, 0x20, 0x43, 0x40, 0x63, 0x60, 0x83, 0x80, 0xC0, 0xE3, 0xE0, 0x24, 0x21, 0x44, 0x41, 0x64, 0x61, 0x84, 0x81, 0xC1, 0xE4, 0xE1, 0x25, 0x22, 0x45, 0x42, 0x65, 0x62, 0x85, 0x82, 0xC2, 0xE5, 0xE2, @@ -44,49 +44,73 @@ 0x35, 0x32, 0x55, 0x52, 0x75, 0x72, 0x95, 0x92, 0xC8, 0xF5, 0xF2 }; -const unsigned short CxadflashPlayer::flash_notes_encoded[268] = -{ +const unsigned short + CxadflashPlayer::flash_notes_encoded[268] = { 0x000, - 0x100, 0x200, 0x300, 0x400, 0x500, 0x600, 0x700, 0x800, 0x900, 0xA00, 0xB00, 0xC00, - 0x101, 0x201, 0x301, 0x401, 0x501, 0x601, 0x701, 0x801, 0x901, 0xA01, 0xB01, 0xC01, - 0x102, 0x202, 0x302, 0x402, 0x502, 0x602, 0x702, 0x802, 0x902, 0xA02, 0xB02, 0xC02, - 0x103, 0x203, 0x303, 0x403, 0x503, 0x603, 0x703, 0x803, 0x903, 0xA03, 0xB03, 0xC03, - 0x104, 0x204, 0x304, 0x404, 0x504, 0x604, 0x704, 0x804, 0x904, 0xA04, 0xB04, 0xC04, - 0x105, 0x205, 0x305, 0x405, 0x505, 0x605, 0x705, 0x805, 0x905, 0xA05, 0xB05, 0xC05, - 0x106, 0x206, 0x306, 0x406, 0x506, 0x606, 0x706, 0x806, 0x906, 0xA06, 0xB06, 0xC06, - 0x107, 0x207, 0x307, 0x407, 0x507, 0x607, 0x707, 0x807, 0x907, 0xA07, 0xB07, 0xC07, - 0x108, 0x208, 0x308, 0x408, 0x508, 0x608, 0x708, 0x808, 0x908, 0xA08, 0xB08, 0xC08, - 0x109, 0x209, 0x309, 0x409, 0x509, 0x609, 0x709, 0x809, 0x909, 0xA09, 0xB09, 0xC09, - 0x10A, 0x20A, 0x30A, 0x40A, 0x50A, 0x60A, 0x70A, 0x80A, 0x90A, 0xA0A, 0xB0A, 0xC0A, - 0x10B, 0x20B, 0x30B, 0x40B, 0x50B, 0x60B, 0x70B, 0x80B, 0x90B, 0xA0B, 0xB0B, 0xC0B, - 0x10C, 0x20C, 0x30C, 0x40C, 0x50C, 0x60C, 0x70C, 0x80C, 0x90C, 0xA0C, 0xB0C, 0xC0C, - 0x10D, 0x20D, 0x30D, 0x40D, 0x50D, 0x60D, 0x70D, 0x80D, 0x90D, 0xA0D, 0xB0D, 0xC0D, - 0x10E, 0x20E, 0x30E, 0x40E, 0x50E, 0x60E, 0x70E, 0x80E, 0x90E, 0xA0E, 0xB0E, 0xC0E, - 0x10F, 0x20F, 0x30F, 0x40F, 0x50F, 0x60F, 0x70F, 0x80F, 0x90F, 0xA0F, 0xB0F, 0xC0F, - 0x110, 0x210, 0x310, 0x410, 0x510, 0x610, 0x710, 0x810, 0x910, 0xA10, 0xB10, 0xC10, - 0x111, 0x211, 0x311, 0x411, 0x511, 0x611, 0x711, 0x811, 0x911, 0xA11, 0xB11, 0xC11, - 0x112, 0x212, 0x312, 0x412, 0x512, 0x612, 0x712, 0x812, 0x912, 0xA12, 0xB12, 0xC12, - 0x113, 0x213, 0x313, 0x413, 0x513, 0x613, 0x713, 0x813, 0x913, 0xA13, 0xB13, 0xC13, - 0x114, 0x214, 0x314, 0x414, 0x514, 0x614, 0x714, 0x814, 0x914, 0xA14, 0xB14, 0xC14, + 0x100, 0x200, 0x300, 0x400, 0x500, 0x600, 0x700, 0x800, 0x900, 0xA00, 0xB00, + 0xC00, + 0x101, 0x201, 0x301, 0x401, 0x501, 0x601, 0x701, 0x801, 0x901, 0xA01, 0xB01, + 0xC01, + 0x102, 0x202, 0x302, 0x402, 0x502, 0x602, 0x702, 0x802, 0x902, 0xA02, 0xB02, + 0xC02, + 0x103, 0x203, 0x303, 0x403, 0x503, 0x603, 0x703, 0x803, 0x903, 0xA03, 0xB03, + 0xC03, + 0x104, 0x204, 0x304, 0x404, 0x504, 0x604, 0x704, 0x804, 0x904, 0xA04, 0xB04, + 0xC04, + 0x105, 0x205, 0x305, 0x405, 0x505, 0x605, 0x705, 0x805, 0x905, 0xA05, 0xB05, + 0xC05, + 0x106, 0x206, 0x306, 0x406, 0x506, 0x606, 0x706, 0x806, 0x906, 0xA06, 0xB06, + 0xC06, + 0x107, 0x207, 0x307, 0x407, 0x507, 0x607, 0x707, 0x807, 0x907, 0xA07, 0xB07, + 0xC07, + 0x108, 0x208, 0x308, 0x408, 0x508, 0x608, 0x708, 0x808, 0x908, 0xA08, 0xB08, + 0xC08, + 0x109, 0x209, 0x309, 0x409, 0x509, 0x609, 0x709, 0x809, 0x909, 0xA09, 0xB09, + 0xC09, + 0x10A, 0x20A, 0x30A, 0x40A, 0x50A, 0x60A, 0x70A, 0x80A, 0x90A, 0xA0A, 0xB0A, + 0xC0A, + 0x10B, 0x20B, 0x30B, 0x40B, 0x50B, 0x60B, 0x70B, 0x80B, 0x90B, 0xA0B, 0xB0B, + 0xC0B, + 0x10C, 0x20C, 0x30C, 0x40C, 0x50C, 0x60C, 0x70C, 0x80C, 0x90C, 0xA0C, 0xB0C, + 0xC0C, + 0x10D, 0x20D, 0x30D, 0x40D, 0x50D, 0x60D, 0x70D, 0x80D, 0x90D, 0xA0D, 0xB0D, + 0xC0D, + 0x10E, 0x20E, 0x30E, 0x40E, 0x50E, 0x60E, 0x70E, 0x80E, 0x90E, 0xA0E, 0xB0E, + 0xC0E, + 0x10F, 0x20F, 0x30F, 0x40F, 0x50F, 0x60F, 0x70F, 0x80F, 0x90F, 0xA0F, 0xB0F, + 0xC0F, + 0x110, 0x210, 0x310, 0x410, 0x510, 0x610, 0x710, 0x810, 0x910, 0xA10, 0xB10, + 0xC10, + 0x111, 0x211, 0x311, 0x411, 0x511, 0x611, 0x711, 0x811, 0x911, 0xA11, 0xB11, + 0xC11, + 0x112, 0x212, 0x312, 0x412, 0x512, 0x612, 0x712, 0x812, 0x912, 0xA12, 0xB12, + 0xC12, + 0x113, 0x213, 0x313, 0x413, 0x513, 0x613, 0x713, 0x813, 0x913, 0xA13, 0xB13, + 0xC13, + 0x114, 0x214, 0x314, 0x414, 0x514, 0x614, 0x714, 0x814, 0x914, 0xA14, 0xB14, + 0xC14, 0x115, 0x215, 0x315 }; -const unsigned short CxadflashPlayer::flash_notes[12] = -{ - 0x157, 0x16B, 0x181, 0x198, 0x1B0, 0x1CA, 0x1E5, 0x202, 0x220, 0x241, 0x263, 0x287 +const unsigned short + CxadflashPlayer::flash_notes[12] = { + 0x157, 0x16B, 0x181, 0x198, 0x1B0, 0x1CA, 0x1E5, 0x202, 0x220, 0x241, 0x263, + 0x287 }; -const unsigned char CxadflashPlayer::flash_default_instrument[8] = -{ +const unsigned char + CxadflashPlayer::flash_default_instrument[8] = { 0x00, 0x00, 0x3F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF }; -CPlayer *CxadflashPlayer::factory(Copl *newopl) +CPlayer * +CxadflashPlayer::factory (Copl * newopl) { - return new CxadflashPlayer(newopl); + return new CxadflashPlayer (newopl); } -void CxadflashPlayer::xadplayer_rewind(int subsong) +void +CxadflashPlayer::xadplayer_rewind (int subsong) { int i; @@ -95,74 +119,77 @@ flash.order_pos = 0; flash.pattern_pos = 0; - opl_write(0x08, 0x00); - opl_write(0xBD, 0x00); + opl_write (0x08, 0x00); + opl_write (0xBD, 0x00); // assign default instrument - for(i=0; i<9; i++) + for (i = 0; i < 9; i++) { - opl_write(0xA0+i, 0x00); - opl_write(0xB0+i, 0x00); + opl_write (0xA0 + i, 0x00); + opl_write (0xB0 + i, 0x00); } // assign instruments - for(i=0; i<9; i++) - for(int j=0; j<11; j++) - opl_write(flash_adlib_registers[i*11+j], tune[i*12+j]); + for (i = 0; i < 9; i++) + for (int j = 0; j < 11; j++) + opl_write (flash_adlib_registers[i * 11 + j], tune[i * 12 + j]); } -void CxadflashPlayer::xadplayer_update() +void +CxadflashPlayer::xadplayer_update () { - unsigned short event_pos = (tune[0x600+flash.order_pos]*1152) + \ - (flash.pattern_pos*18) + \ - 0x633; + unsigned short event_pos = (tune[0x600 + flash.order_pos] * 1152) + + (flash.pattern_pos * 18) + 0x633; - for (int i=0; i<9; i++) + for (int i = 0; i < 9; i++) { - unsigned short flash_channel_freq = (adlib[0xB0+i] << 8) + adlib[0xA0+i]; + unsigned short flash_channel_freq = + (adlib[0xB0 + i] << 8) + adlib[0xA0 + i]; unsigned char event_b0 = tune[event_pos++]; unsigned char event_b1 = tune[event_pos++]; #ifdef DEBUG - AdPlug_LogWrite("channel %02X, event %02X %02X:\n",i+1,event_b0,event_b1); + AdPlug_LogWrite ("channel %02X, event %02X %02X:\n", i + 1, event_b0, + event_b1); #endif - if (event_b0 == 0x80) // 0.0x80: Set Instrument + if (event_b0 == 0x80) // 0.0x80: Set Instrument { - for(int j=0; j<11; j++) - opl_write(flash_adlib_registers[i*11+j], tune[event_b1*12+j]); + for (int j = 0; j < 11; j++) + opl_write (flash_adlib_registers[i * 11 + j], + tune[event_b1 * 12 + j]); } else { if (event_b1 == 0x01) - flash.pattern_pos = 0x3F; // 1.0x01: Pattern Break + flash.pattern_pos = 0x3F; // 1.0x01: Pattern Break unsigned char fx = (event_b1 >> 4); unsigned char fx_p = (event_b1 & 0x0F); - switch(fx) + switch (fx) { - case 0x0A: // 1.0xAy: Set Carrier volume - opl_write(flash_adlib_registers[11*i+2], fx_p << 2); - break; - case 0x0B: // 1.0xBy: Set Modulator volume - opl_write(flash_adlib_registers[11*i+3], fx_p << 2); - break; - case 0x0C: // 1.0xCy: Set both operators volume - opl_write(flash_adlib_registers[11*i+2], fx_p << 2); - opl_write(flash_adlib_registers[11*i+3], fx_p << 2); - break; + case 0x0A: // 1.0xAy: Set Carrier volume + opl_write (flash_adlib_registers[11 * i + 2], fx_p << 2); + break; + case 0x0B: // 1.0xBy: Set Modulator volume + opl_write (flash_adlib_registers[11 * i + 3], fx_p << 2); + break; + case 0x0C: // 1.0xCy: Set both operators volume + opl_write (flash_adlib_registers[11 * i + 2], fx_p << 2); + opl_write (flash_adlib_registers[11 * i + 3], fx_p << 2); + break; // case 0x0E: // 1.0xEy: ? (increase some value) - case 0x0F: // 1.0xFy: Set Speed - plr.speed = (fx_p + 1); - break; + case 0x0F: // 1.0xFy: Set Speed + plr.speed = (fx_p + 1); + break; } if (event_b0) { // mute channel - opl_write(0xA0+i, adlib[0xA0+i]); - opl_write(0xB0+i, adlib[0xB0+i] & 0xDF); + opl_write (0xA0 + i, adlib[0xA0 + i]); + opl_write (0xB0 + i, adlib[0xB0 + i] & 0xDF); // is note ? if (event_b0 != 0x7F) @@ -172,24 +199,24 @@ flash_channel_freq = freq | ((note_encoded & 0xFF) << 10) | 0x2000; - opl_write(0xA0+i, flash_channel_freq & 0xFF); - opl_write(0xB0+i, flash_channel_freq >> 8); + opl_write (0xA0 + i, flash_channel_freq & 0xFF); + opl_write (0xB0 + i, flash_channel_freq >> 8); } } - if (fx == 0x01) // 1.0x1y: Fine Frequency Slide Up + if (fx == 0x01) // 1.0x1y: Fine Frequency Slide Up { flash_channel_freq += (fx_p << 1); - opl_write(0xA0+i, flash_channel_freq & 0xFF); - opl_write(0xB0+i, flash_channel_freq >> 8); + opl_write (0xA0 + i, flash_channel_freq & 0xFF); + opl_write (0xB0 + i, flash_channel_freq >> 8); } - else if (fx == 0x02) // 1.0x2y: Fine Frequency Slide Down + else if (fx == 0x02) // 1.0x2y: Fine Frequency Slide Down { flash_channel_freq -= (fx_p << 1); - opl_write(0xA0+i, flash_channel_freq & 0xFF); - opl_write(0xB0+i, flash_channel_freq >> 8); + opl_write (0xA0 + i, flash_channel_freq & 0xFF); + opl_write (0xB0 + i, flash_channel_freq >> 8); } } } @@ -205,7 +232,7 @@ flash.order_pos++; // end of module ? - if (tune[0x600+flash.order_pos] == 0xFF) + if (tune[0x600 + flash.order_pos] == 0xFF) { flash.order_pos = 0; @@ -214,17 +241,19 @@ } } -float CxadflashPlayer::xadplayer_getrefresh() +float +CxadflashPlayer::xadplayer_getrefresh () { return 17.5f; } -std::string CxadflashPlayer::xadplayer_gettype() +std::string CxadflashPlayer::xadplayer_gettype () { - return std::string("xad: flash player"); + return std::string ("xad: flash player"); } -unsigned int CxadflashPlayer::xadplayer_getinstruments() +unsigned int +CxadflashPlayer::xadplayer_getinstruments () { return 32; } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/fmc.cxx --- a/src/adplug/core/fmc.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/fmc.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -23,201 +23,217 @@ /* -------- Public Methods -------------------------------- */ -CPlayer *CfmcLoader::factory(Copl *newopl) +CPlayer * +CfmcLoader::factory (Copl * newopl) { - return new CfmcLoader(newopl); + return new CfmcLoader (newopl); } -bool CfmcLoader::load(VFSFile *fd, const CFileProvider &fp) +bool +CfmcLoader::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); if(!f) return false; - const unsigned char conv_fx[16] = {0,1,2,3,4,8,255,255,255,255,26,11,12,13,14,15}; - - int i,j,k,t=0; + binistream *f = fp.open (fd); + if (!f) + return false; + const unsigned char conv_fx[16] = + { 0, 1, 2, 3, 4, 8, 255, 255, 255, 255, 26, 11, 12, 13, 14, 15 }; - // read header - f->readString(header.id, 4); - f->readString(header.title, 21); - header.numchan = f->readInt(1); + int i, j, k, t = 0; - // 'FMC!' - signed ? - if (strncmp(header.id,"FMC!",4)) { fp.close(f); return false; } + // read header + f->readString (header.id, 4); + f->readString (header.title, 21); + header.numchan = f->readInt (1); - // init CmodPlayer - realloc_instruments(32); - realloc_order(256); - realloc_patterns(64,64,header.numchan); - init_trackord(); + // 'FMC!' - signed ? + if (strncmp (header.id, "FMC!", 4)) + { + fp.close (f); + return false; + } - // load order - for(i = 0; i < 256; i++) order[i] = f->readInt(1); - - f->ignore(2); + // init CmodPlayer + realloc_instruments (32); + realloc_order (256); + realloc_patterns (64, 64, header.numchan); + init_trackord (); - // load instruments - for(i = 0; i < 32; i++) { - instruments[i].synthesis = f->readInt(1); - instruments[i].feedback = f->readInt(1); + // load order + for (i = 0; i < 256; i++) + order[i] = f->readInt (1); + + f->ignore (2); - instruments[i].mod_attack = f->readInt(1); - instruments[i].mod_decay = f->readInt(1); - instruments[i].mod_sustain = f->readInt(1); - instruments[i].mod_release = f->readInt(1); - instruments[i].mod_volume = f->readInt(1); - instruments[i].mod_ksl = f->readInt(1); - instruments[i].mod_freq_multi = f->readInt(1); - instruments[i].mod_waveform = f->readInt(1); - instruments[i].mod_sustain_sound = f->readInt(1); - instruments[i].mod_ksr = f->readInt(1); - instruments[i].mod_vibrato = f->readInt(1); - instruments[i].mod_tremolo = f->readInt(1); + // load instruments + for (i = 0; i < 32; i++) + { + instruments[i].synthesis = f->readInt (1); + instruments[i].feedback = f->readInt (1); - instruments[i].car_attack = f->readInt(1); - instruments[i].car_decay = f->readInt(1); - instruments[i].car_sustain = f->readInt(1); - instruments[i].car_release = f->readInt(1); - instruments[i].car_volume = f->readInt(1); - instruments[i].car_ksl = f->readInt(1); - instruments[i].car_freq_multi = f->readInt(1); - instruments[i].car_waveform = f->readInt(1); - instruments[i].car_sustain_sound = f->readInt(1); - instruments[i].car_ksr = f->readInt(1); - instruments[i].car_vibrato = f->readInt(1); - instruments[i].car_tremolo = f->readInt(1); + instruments[i].mod_attack = f->readInt (1); + instruments[i].mod_decay = f->readInt (1); + instruments[i].mod_sustain = f->readInt (1); + instruments[i].mod_release = f->readInt (1); + instruments[i].mod_volume = f->readInt (1); + instruments[i].mod_ksl = f->readInt (1); + instruments[i].mod_freq_multi = f->readInt (1); + instruments[i].mod_waveform = f->readInt (1); + instruments[i].mod_sustain_sound = f->readInt (1); + instruments[i].mod_ksr = f->readInt (1); + instruments[i].mod_vibrato = f->readInt (1); + instruments[i].mod_tremolo = f->readInt (1); - instruments[i].pitch_shift = f->readInt(1); + instruments[i].car_attack = f->readInt (1); + instruments[i].car_decay = f->readInt (1); + instruments[i].car_sustain = f->readInt (1); + instruments[i].car_release = f->readInt (1); + instruments[i].car_volume = f->readInt (1); + instruments[i].car_ksl = f->readInt (1); + instruments[i].car_freq_multi = f->readInt (1); + instruments[i].car_waveform = f->readInt (1); + instruments[i].car_sustain_sound = f->readInt (1); + instruments[i].car_ksr = f->readInt (1); + instruments[i].car_vibrato = f->readInt (1); + instruments[i].car_tremolo = f->readInt (1); - f->readString(instruments[i].name, 21); - } + instruments[i].pitch_shift = f->readInt (1); + + f->readString (instruments[i].name, 21); + } - // load tracks - for (i=0;i<64;i++) - { - if(f->ateof()) break; + // load tracks + for (i = 0; i < 64; i++) + { + if (f->ateof ()) + break; - for (j=0;jreadInt(1); - event.byte1 = f->readInt(1); - event.byte2 = f->readInt(1); + // read event + event.byte0 = f->readInt (1); + event.byte1 = f->readInt (1); + event.byte2 = f->readInt (1); - // convert event - tracks[t][k].note = event.byte0 & 0x7F; - tracks[t][k].inst = ((event.byte0 & 0x80) >> 3) + (event.byte1 >> 4) + 1; - tracks[t][k].command = conv_fx[event.byte1 & 0x0F]; - tracks[t][k].param1 = event.byte2 >> 4; - tracks[t][k].param2 = event.byte2 & 0x0F; + // convert event + tracks[t][k].note = event.byte0 & 0x7F; + tracks[t][k].inst = + ((event.byte0 & 0x80) >> 3) + (event.byte1 >> 4) + 1; + tracks[t][k].command = conv_fx[event.byte1 & 0x0F]; + tracks[t][k].param1 = event.byte2 >> 4; + tracks[t][k].param2 = event.byte2 & 0x0F; - // fix effects - if (tracks[t][k].command == 0x0E) // 0x0E (14): Retrig - tracks[t][k].param1 = 3; - if (tracks[t][k].command == 0x1A) // 0x1A (26): Volume Slide - if (tracks[t][k].param1 > tracks[t][k].param2) - { - tracks[t][k].param1 -= tracks[t][k].param2; - tracks[t][k].param2 = 0; - } - else - { - tracks[t][k].param2 -= tracks[t][k].param1; - tracks[t][k].param1 = 0; - } - } + // fix effects + if (tracks[t][k].command == 0x0E) // 0x0E (14): Retrig + tracks[t][k].param1 = 3; + if (tracks[t][k].command == 0x1A) // 0x1A (26): Volume Slide + if (tracks[t][k].param1 > tracks[t][k].param2) + { + tracks[t][k].param1 -= tracks[t][k].param2; + tracks[t][k].param2 = 0; + } + else + { + tracks[t][k].param2 -= tracks[t][k].param1; + tracks[t][k].param1 = 0; + } + } - t++; - } - } - fp.close(f); + t++; + } + } + fp.close (f); - // convert instruments - for (i=0;i<31;i++) - buildinst(i); + // convert instruments + for (i = 0; i < 31; i++) + buildinst (i); - // order length - for (i=0;i<256;i++) - { - if (order[i] >= 0xFE) - { - length = i; - break; - } - } + // order length + for (i = 0; i < 256; i++) + { + if (order[i] >= 0xFE) + { + length = i; + break; + } + } - // data for Protracker - activechan = (0xffffffff >> (32 - header.numchan)) << (32 - header.numchan); - nop = t / header.numchan; - restartpos = 0; + // data for Protracker + activechan = (0xffffffff >> (32 - header.numchan)) << (32 - header.numchan); + nop = t / header.numchan; + restartpos = 0; - // flags - flags = Faust; + // flags + flags = Faust; - rewind(0); + rewind (0); - return true; + return true; } -float CfmcLoader::getrefresh() +float +CfmcLoader::getrefresh () { - return 50.0f; + return 50.0f; } -std::string CfmcLoader::gettype() +std::string CfmcLoader::gettype () { - return std::string("Faust Music Creator"); + return std::string ("Faust Music Creator"); } -std::string CfmcLoader::gettitle() +std::string CfmcLoader::gettitle () { - return std::string(header.title); + return std::string (header.title); } -std::string CfmcLoader::getinstrument(unsigned int n) +std::string CfmcLoader::getinstrument (unsigned int n) { - return std::string(instruments[n].name); + return std::string (instruments[n].name); } -unsigned int CfmcLoader::getinstruments() +unsigned int +CfmcLoader::getinstruments () { - return 32; + return 32; } /* -------- Private Methods ------------------------------- */ -void CfmcLoader::buildinst(unsigned char i) +void +CfmcLoader::buildinst (unsigned char i) { - inst[i].data[0] = ((instruments[i].synthesis & 1) ^ 1); - inst[i].data[0] |= ((instruments[i].feedback & 7) << 1); + inst[i].data[0] = ((instruments[i].synthesis & 1) ^ 1); + inst[i].data[0] |= ((instruments[i].feedback & 7) << 1); - inst[i].data[3] = ((instruments[i].mod_attack & 15) << 4); - inst[i].data[3] |= (instruments[i].mod_decay & 15); - inst[i].data[5] = ((15 - (instruments[i].mod_sustain & 15)) << 4); - inst[i].data[5] |= (instruments[i].mod_release & 15); - inst[i].data[9] = (63 - (instruments[i].mod_volume & 63)); - inst[i].data[9] |= ((instruments[i].mod_ksl & 3) << 6); - inst[i].data[1] = (instruments[i].mod_freq_multi & 15); - inst[i].data[7] = (instruments[i].mod_waveform & 3); - inst[i].data[1] |= ((instruments[i].mod_sustain_sound & 1) << 5); - inst[i].data[1] |= ((instruments[i].mod_ksr & 1) << 4); - inst[i].data[1] |= ((instruments[i].mod_vibrato & 1) << 6); - inst[i].data[1] |= ((instruments[i].mod_tremolo & 1) << 7); + inst[i].data[3] = ((instruments[i].mod_attack & 15) << 4); + inst[i].data[3] |= (instruments[i].mod_decay & 15); + inst[i].data[5] = ((15 - (instruments[i].mod_sustain & 15)) << 4); + inst[i].data[5] |= (instruments[i].mod_release & 15); + inst[i].data[9] = (63 - (instruments[i].mod_volume & 63)); + inst[i].data[9] |= ((instruments[i].mod_ksl & 3) << 6); + inst[i].data[1] = (instruments[i].mod_freq_multi & 15); + inst[i].data[7] = (instruments[i].mod_waveform & 3); + inst[i].data[1] |= ((instruments[i].mod_sustain_sound & 1) << 5); + inst[i].data[1] |= ((instruments[i].mod_ksr & 1) << 4); + inst[i].data[1] |= ((instruments[i].mod_vibrato & 1) << 6); + inst[i].data[1] |= ((instruments[i].mod_tremolo & 1) << 7); - inst[i].data[4] = ((instruments[i].car_attack & 15) << 4); - inst[i].data[4] |= (instruments[i].car_decay & 15); - inst[i].data[6] = ((15 - (instruments[i].car_sustain & 15)) << 4); - inst[i].data[6] |= (instruments[i].car_release & 15); - inst[i].data[10] = (63 - (instruments[i].car_volume & 63)); - inst[i].data[10] |= ((instruments[i].car_ksl & 3) << 6); - inst[i].data[2] = (instruments[i].car_freq_multi & 15); - inst[i].data[8] = (instruments[i].car_waveform & 3); - inst[i].data[2] |= ((instruments[i].car_sustain_sound & 1) << 5); - inst[i].data[2] |= ((instruments[i].car_ksr & 1) << 4); - inst[i].data[2] |= ((instruments[i].car_vibrato & 1) << 6); - inst[i].data[2] |= ((instruments[i].car_tremolo & 1) << 7); + inst[i].data[4] = ((instruments[i].car_attack & 15) << 4); + inst[i].data[4] |= (instruments[i].car_decay & 15); + inst[i].data[6] = ((15 - (instruments[i].car_sustain & 15)) << 4); + inst[i].data[6] |= (instruments[i].car_release & 15); + inst[i].data[10] = (63 - (instruments[i].car_volume & 63)); + inst[i].data[10] |= ((instruments[i].car_ksl & 3) << 6); + inst[i].data[2] = (instruments[i].car_freq_multi & 15); + inst[i].data[8] = (instruments[i].car_waveform & 3); + inst[i].data[2] |= ((instruments[i].car_sustain_sound & 1) << 5); + inst[i].data[2] |= ((instruments[i].car_ksr & 1) << 4); + inst[i].data[2] |= ((instruments[i].car_vibrato & 1) << 6); + inst[i].data[2] |= ((instruments[i].car_tremolo & 1) << 7); - inst[i].slide = instruments[i].pitch_shift; + inst[i].slide = instruments[i].pitch_shift; } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/fprovide.cxx --- a/src/adplug/core/fprovide.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/fprovide.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -27,49 +27,60 @@ /***** CFileProvider *****/ -bool CFileProvider::extension(const std::string &filename, - const std::string &extension) +bool +CFileProvider::extension (const std::string & filename, + const std::string & extension) { - const char *fname = filename.c_str(), *ext = extension.c_str(); + const char *fname = filename.c_str (), *ext = extension.c_str (); - if(strlen(fname) < strlen(ext) || - stricmp(fname + strlen(fname) - strlen(ext), ext)) + if (strlen (fname) < strlen (ext) || + stricmp (fname + strlen (fname) - strlen (ext), ext)) return false; else return true; } -unsigned long CFileProvider::filesize(binistream *f) +unsigned long +CFileProvider::filesize (binistream * f) { - unsigned long oldpos = f->pos(), size; + unsigned long oldpos = f->pos (), size; - f->seek(0, binio::End); - size = f->pos(); - f->seek(oldpos, binio::Set); + f->seek (0, binio::End); + size = f->pos (); + f->seek (oldpos, binio::Set); return size; } /***** CProvider_Filesystem *****/ -binistream *CProvider_Filesystem::open(VFSFile *fd) const +binistream * +CProvider_Filesystem::open (VFSFile * fd) const const { - vfsistream *f = new vfsistream(fd); + vfsistream *f = new vfsistream (fd); - if(!f) return 0; - if(f->error()) { delete f; return 0; } + if (!f) + return 0; + if (f->error ()) + { + delete f; + return 0; + } // Open all files as little endian with IEEE floats by default - f->setFlag(binio::BigEndian, false); f->setFlag(binio::FloatIEEE); + f->setFlag (binio::BigEndian, false); + f->setFlag (binio::FloatIEEE); return f; } -void CProvider_Filesystem::close(binistream *f) const +void +CProvider_Filesystem::close (binistream * f) const const { - vfsistream *ff = (vfsistream *)f; + vfsistream *ff = (vfsistream *) f; - if(f) { + if (f) + { delete ff; } } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/hsc.cxx --- a/src/adplug/core/hsc.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/hsc.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -26,84 +26,95 @@ /*** public methods **************************************/ -CPlayer *ChscPlayer::factory(Copl *newopl) +CPlayer * +ChscPlayer::factory (Copl * newopl) { - return new ChscPlayer(newopl); + return new ChscPlayer (newopl); } -bool ChscPlayer::load(VFSFile *fd, const CFileProvider &fp) +bool +ChscPlayer::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); - int i; + binistream *f = fp.open (fd); + int i; // file validation section - if(!f || !fp.extension(fd->uri, ".hsc") || fp.filesize(f) > 59187) { - AdPlug_LogWrite("ChscPlayer::load(\"%s\"): Not a HSC file!\n", fd->uri); - fp.close(f); + if (!f || !fp.extension (fd->uri, ".hsc") || fp.filesize (f) > 59187) + { + AdPlug_LogWrite ("ChscPlayer::load(\"%s\"): Not a HSC file!\n", fd->uri); + fp.close (f); return false; } // load section - for(i=0;i<128*12;i++) // load instruments - *((unsigned char *)instr + i) = f->readInt(1); - for (i=0;i<128;i++) { // correct instruments + for (i = 0; i < 128 * 12; i++) // load instruments + *((unsigned char *) instr + i) = f->readInt (1); + for (i = 0; i < 128; i++) + { // correct instruments instr[i][2] ^= (instr[i][2] & 0x40) << 1; instr[i][3] ^= (instr[i][3] & 0x40) << 1; - instr[i][11] >>= 4; // slide + instr[i][11] >>= 4; // slide } - for(i=0;i<51;i++) song[i] = f->readInt(1); // load tracklist - for(i=0;i<50*64*9;i++) // load patterns - *((char *)patterns + i) = f->readInt(1); + for (i = 0; i < 51; i++) + song[i] = f->readInt (1); // load tracklist + for (i = 0; i < 50 * 64 * 9; i++) // load patterns + *((char *) patterns + i) = f->readInt (1); - fp.close(f); - rewind(0); // rewind module + fp.close (f); + rewind (0); // rewind module return true; } -bool ChscPlayer::update() +bool +ChscPlayer::update () { // general vars - unsigned char chan,pattnr,note,effect,eff_op,inst,vol,Okt,db; - unsigned short Fnr; - unsigned long pattoff; + unsigned char chan, pattnr, note, effect, eff_op, inst, vol, Okt, db; + unsigned short Fnr; + unsigned long pattoff; - del--; // player speed handling - if(del) - return !songend; // nothing done + del--; // player speed handling + if (del) + return !songend; // nothing done - if(fadein) // fade-in handling + if (fadein) // fade-in handling fadein--; pattnr = song[songpos]; - if(pattnr == 0xff) { // arrangement handling - songend = 1; // set end-flag + if (pattnr == 0xff) + { // arrangement handling + songend = 1; // set end-flag songpos = 0; pattnr = song[songpos]; - } else - if ((pattnr & 128) && (pattnr <= 0xb1)) { // goto pattern "nr" - songpos = song[songpos] & 127; - pattpos = 0; - pattnr = song[songpos]; - songend = 1; - } + } + else if ((pattnr & 128) && (pattnr <= 0xb1)) + { // goto pattern "nr" + songpos = song[songpos] & 127; + pattpos = 0; + pattnr = song[songpos]; + songend = 1; + } - pattoff = pattpos*9; - for (chan=0;chan<9;chan++) { // handle all channels + pattoff = pattpos * 9; + for (chan = 0; chan < 9; chan++) + { // handle all channels note = patterns[pattnr][pattoff].note; effect = patterns[pattnr][pattoff].effect; pattoff++; - if(note & 128) { // set instrument - setinstr(chan,effect); + if (note & 128) + { // set instrument + setinstr (chan, effect); continue; } eff_op = effect & 0x0f; inst = channel[chan].inst; - if(note) + if (note) channel[chan].slide = 0; - switch (effect & 0xf0) { // effect handling - case 0: // global effect + switch (effect & 0xf0) + { // effect handling + case 0: // global effect /* The following fx are unimplemented on purpose: * 02 - Slide Mainvolume up * 03 - Slide Mainvolume down (here: fade in) @@ -112,161 +123,212 @@ * This is because i've never seen any HSC modules using the fx this way. * All modules use the fx the way, i've implemented it. */ - switch(eff_op) { - case 1: pattbreak++; break; // jump to next pattern - case 3: fadein = 31; break; // fade in (divided by 2) - case 5: mode6 = 1; break; // 6 voice mode on - case 6: mode6 = 0; break; // 6 voice mode off + switch (eff_op) + { + case 1: + pattbreak++; + break; // jump to next pattern + case 3: + fadein = 31; + break; // fade in (divided by 2) + case 5: + mode6 = 1; + break; // 6 voice mode on + case 6: + mode6 = 0; + break; // 6 voice mode off } break; case 0x20: - case 0x10: // manual slides - if (effect & 0x10) { - channel[chan].freq += eff_op; - channel[chan].slide += eff_op; - } else { - channel[chan].freq -= eff_op; - channel[chan].slide -= eff_op; + case 0x10: // manual slides + if (effect & 0x10) + { + channel[chan].freq += eff_op; + channel[chan].slide += eff_op; } - if(!note) - setfreq(chan,channel[chan].freq); + else + { + channel[chan].freq -= eff_op; + channel[chan].slide -= eff_op; + } + if (!note) + setfreq (chan, channel[chan].freq); break; - case 0x50: // set percussion instrument (unimplemented) + case 0x50: // set percussion instrument (unimplemented) break; - case 0x60: // set feedback - opl->write(0xc0 + chan, (instr[channel[chan].inst][8] & 1) + (eff_op << 1)); + case 0x60: // set feedback + opl->write (0xc0 + chan, + (instr[channel[chan].inst][8] & 1) + (eff_op << 1)); break; - case 0xa0: // set carrier volume + case 0xa0: // set carrier volume vol = eff_op << 2; - opl->write(0x43 + op_table[chan], vol | (instr[channel[chan].inst][2] & ~63)); + opl->write (0x43 + op_table[chan], + vol | (instr[channel[chan].inst][2] & ~63)); break; - case 0xb0: // set modulator volume + case 0xb0: // set modulator volume vol = eff_op << 2; if (instr[inst][8] & 1) - opl->write(0x40 + op_table[chan], vol | (instr[channel[chan].inst][3] & ~63)); + opl->write (0x40 + op_table[chan], + vol | (instr[channel[chan].inst][3] & ~63)); else - opl->write(0x40 + op_table[chan],vol | (instr[inst][3] & ~63)); + opl->write (0x40 + op_table[chan], vol | (instr[inst][3] & ~63)); break; - case 0xc0: // set instrument volume + case 0xc0: // set instrument volume db = eff_op << 2; - opl->write(0x43 + op_table[chan], db | (instr[channel[chan].inst][2] & ~63)); + opl->write (0x43 + op_table[chan], + db | (instr[channel[chan].inst][2] & ~63)); if (instr[inst][8] & 1) - opl->write(0x40 + op_table[chan], db | (instr[channel[chan].inst][3] & ~63)); + opl->write (0x40 + op_table[chan], + db | (instr[channel[chan].inst][3] & ~63)); break; - case 0xd0: pattbreak++; songpos = eff_op; songend = 1; break; // position jump - case 0xf0: // set speed + case 0xd0: + pattbreak++; + songpos = eff_op; + songend = 1; + break; // position jump + case 0xf0: // set speed speed = eff_op; del = ++speed; break; } - if(fadein) // fade-in volume setting - setvolume(chan,fadein*2,fadein*2); + if (fadein) // fade-in volume setting + setvolume (chan, fadein * 2, fadein * 2); - if(!note) // note handling + if (!note) // note handling continue; note--; - if ((note == 0x7f-1) || ((note/12) & ~7)) { // pause (7fh) + if ((note == 0x7f - 1) || ((note / 12) & ~7)) + { // pause (7fh) adl_freq[chan] &= ~32; - opl->write(0xb0 + chan,adl_freq[chan]); + opl->write (0xb0 + chan, adl_freq[chan]); continue; } // play the note - if(mtkmode) // imitate MPU-401 Trakker bug + if (mtkmode) // imitate MPU-401 Trakker bug note--; - Okt = ((note/12) & 7) << 2; + Okt = ((note / 12) & 7) << 2; Fnr = note_table[(note % 12)] + instr[inst][11] + channel[chan].slide; channel[chan].freq = Fnr; - if(!mode6 || chan < 6) + if (!mode6 || chan < 6) adl_freq[chan] = Okt | 32; else - adl_freq[chan] = Okt; // never set key for drums - opl->write(0xb0 + chan, 0); - setfreq(chan,Fnr); - if(mode6) { - switch(chan) { // play drums - case 6: opl->write(0xbd,bd & ~16); bd |= 48; break; // bass drum - case 7: opl->write(0xbd,bd & ~1); bd |= 33; break; // hihat - case 8: opl->write(0xbd,bd & ~2); bd |= 34; break; // cymbal + adl_freq[chan] = Okt; // never set key for drums + opl->write (0xb0 + chan, 0); + setfreq (chan, Fnr); + if (mode6) + { + switch (chan) + { // play drums + case 6: + opl->write (0xbd, bd & ~16); + bd |= 48; + break; // bass drum + case 7: + opl->write (0xbd, bd & ~1); + bd |= 33; + break; // hihat + case 8: + opl->write (0xbd, bd & ~2); + bd |= 34; + break; // cymbal } - opl->write(0xbd,bd); + opl->write (0xbd, bd); } } - del = speed; // player speed-timing - if(pattbreak) { // do post-effect handling - pattpos=0; // pattern break! - pattbreak=0; + del = speed; // player speed-timing + if (pattbreak) + { // do post-effect handling + pattpos = 0; // pattern break! + pattbreak = 0; songpos++; songpos %= 50; - if(!songpos) + if (!songpos) songend = 1; - } else { + } + else + { pattpos++; - pattpos &= 63; // advance in pattern data - if (!pattpos) { + pattpos &= 63; // advance in pattern data + if (!pattpos) + { songpos++; songpos %= 50; - if(!songpos) - songend = 1; + if (!songpos) + songend = 1; } } - return !songend; // still playing + return !songend; // still playing } -void ChscPlayer::rewind(int subsong) +void +ChscPlayer::rewind (int subsong) { - int i; // counter + int i; // counter // rewind HSC player - pattpos = 0; songpos = 0; pattbreak = 0; speed = 2; - del = 1; songend = 0; mode6 = 0; bd = 0; fadein = 0; + pattpos = 0; + songpos = 0; + pattbreak = 0; + speed = 2; + del = 1; + songend = 0; + mode6 = 0; + bd = 0; + fadein = 0; - opl->init(); // reset OPL chip - opl->write(1,32); opl->write(8,128); opl->write(0xbd,0); + opl->init (); // reset OPL chip + opl->write (1, 32); + opl->write (8, 128); + opl->write (0xbd, 0); - for(i=0;i<9;i++) - setinstr((char) i,(char) i); // init channels + for (i = 0; i < 9; i++) + setinstr ((char) i, (char) i); // init channels } -unsigned int ChscPlayer::getpatterns() +unsigned int +ChscPlayer::getpatterns () { - unsigned char poscnt,pattcnt=0; + unsigned char poscnt, pattcnt = 0; // count patterns - for(poscnt=0;poscnt<51 && song[poscnt] != 0xff;poscnt++) - if(song[poscnt] > pattcnt) + for (poscnt = 0; poscnt < 51 && song[poscnt] != 0xff; poscnt++) + if (song[poscnt] > pattcnt) pattcnt = song[poscnt]; - return (pattcnt+1); + return (pattcnt + 1); } -unsigned int ChscPlayer::getorders() +unsigned int +ChscPlayer::getorders () { unsigned char poscnt; // count positions - for(poscnt=0;poscnt<51;poscnt++) - if(song[poscnt] == 0xff) + for (poscnt = 0; poscnt < 51; poscnt++) + if (song[poscnt] == 0xff) break; return poscnt; } -unsigned int ChscPlayer::getinstruments() +unsigned int +ChscPlayer::getinstruments () { - unsigned char instcnt,instnum=0,i; - bool isinst; + unsigned char instcnt, instnum = 0, i; + bool isinst; // count instruments - for(instcnt=0;instcnt<128;instcnt++) { + for (instcnt = 0; instcnt < 128; instcnt++) + { isinst = false; - for(i=0;i<12;i++) - if(instr[instcnt][i]) - isinst = true; - if(isinst) + for (i = 0; i < 12; i++) + if (instr[instcnt][i]) + isinst = true; + if (isinst) instnum++; } @@ -275,43 +337,46 @@ /*** private methods *************************************/ -void ChscPlayer::setfreq(unsigned char chan, unsigned short freq) +void +ChscPlayer::setfreq (unsigned char chan, unsigned short freq) { adl_freq[chan] = (adl_freq[chan] & ~3) | (freq >> 8); - opl->write(0xa0 + chan, freq & 0xff); - opl->write(0xb0 + chan, adl_freq[chan]); + opl->write (0xa0 + chan, freq & 0xff); + opl->write (0xb0 + chan, adl_freq[chan]); } -void ChscPlayer::setvolume(unsigned char chan, int volc, int volm) +void +ChscPlayer::setvolume (unsigned char chan, int volc, int volm) { - unsigned char *ins = instr[channel[chan].inst]; - char op = op_table[chan]; + unsigned char *ins = instr[channel[chan].inst]; + char op = op_table[chan]; - opl->write(0x43 + op,volc | (ins[2] & ~63)); - if (ins[8] & 1) // carrier - opl->write(0x40 + op,volm | (ins[3] & ~63)); + opl->write (0x43 + op, volc | (ins[2] & ~63)); + if (ins[8] & 1) // carrier + opl->write (0x40 + op, volm | (ins[3] & ~63)); else - opl->write(0x40 + op, ins[3]); // modulator + opl->write (0x40 + op, ins[3]); // modulator } -void ChscPlayer::setinstr(unsigned char chan, unsigned char insnr) +void +ChscPlayer::setinstr (unsigned char chan, unsigned char insnr) { - unsigned char *ins = instr[insnr]; - char op = op_table[chan]; + unsigned char *ins = instr[insnr]; + char op = op_table[chan]; - channel[chan].inst = insnr; // set internal instrument - opl->write(0xb0 + chan,0); // stop old note + channel[chan].inst = insnr; // set internal instrument + opl->write (0xb0 + chan, 0); // stop old note // set instrument - opl->write(0xc0 + chan, ins[8]); - opl->write(0x23 + op, ins[0]); // carrier - opl->write(0x20 + op, ins[1]); // modulator - opl->write(0x63 + op, ins[4]); // bits 0..3 = decay; 4..7 = attack - opl->write(0x60 + op, ins[5]); - opl->write(0x83 + op, ins[6]); // 0..3 = release; 4..7 = sustain - opl->write(0x80 + op, ins[7]); - opl->write(0xe3 + op, ins[9]); // bits 0..1 = Wellenform - opl->write(0xe0 + op, ins[10]); - setvolume(chan, ins[2] & 63, ins[3] & 63); + opl->write (0xc0 + chan, ins[8]); + opl->write (0x23 + op, ins[0]); // carrier + opl->write (0x20 + op, ins[1]); // modulator + opl->write (0x63 + op, ins[4]); // bits 0..3 = decay; 4..7 = attack + opl->write (0x60 + op, ins[5]); + opl->write (0x83 + op, ins[6]); // 0..3 = release; 4..7 = sustain + opl->write (0x80 + op, ins[7]); + opl->write (0xe3 + op, ins[9]); // bits 0..1 = Wellenform + opl->write (0xe0 + op, ins[10]); + setvolume (chan, ins[2] & 63, ins[3] & 63); } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/hsp.cxx --- a/src/adplug/core/hsp.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/hsp.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -23,47 +23,64 @@ #include "hsp.h" -CPlayer *ChspLoader::factory(Copl *newopl) +CPlayer * +ChspLoader::factory (Copl * newopl) { - return new ChspLoader(newopl); + return new ChspLoader (newopl); } -bool ChspLoader::load(VFSFile *fd, const CFileProvider &fp) +bool +ChspLoader::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); if(!f) return false; - unsigned long i, j, orgsize, filesize; - unsigned char *cmp, *org; - std::string filename(fd->uri); + binistream *f = fp.open (fd); + if (!f) + return false; + unsigned long i, j, orgsize, filesize; + unsigned char *cmp, *org; + std::string filename (fd->uri); // file validation section - if(!fp.extension(filename, ".hsp")) { fp.close(f); return false; } + if (!fp.extension (filename, ".hsp")) + { + fp.close (f); + return false; + } - filesize = fp.filesize(f); - orgsize = f->readInt(2); - if(orgsize > 59187) { fp.close(f); return false; } + filesize = fp.filesize (f); + orgsize = f->readInt (2); + if (orgsize > 59187) + { + fp.close (f); + return false; + } // load section cmp = new unsigned char[filesize]; - for(i = 0; i < filesize; i++) cmp[i] = f->readInt(1); - fp.close(f); + for (i = 0; i < filesize; i++) + cmp[i] = f->readInt (1); + fp.close (f); org = new unsigned char[orgsize]; - for(i = 0, j = 0; i < filesize; j += cmp[i], i += 2) { // RLE decompress - if(j >= orgsize) break; // memory boundary check - memset(org + j, cmp[i + 1], j + cmp[i] < orgsize ? cmp[i] : orgsize - j - 1); + for (i = 0, j = 0; i < filesize; j += cmp[i], i += 2) + { // RLE decompress + if (j >= orgsize) + break; // memory boundary check + memset (org + j, cmp[i + 1], + j + cmp[i] < orgsize ? cmp[i] : orgsize - j - 1); } - delete [] cmp; + delete[]cmp; - memcpy(instr, org, 128 * 12); // instruments - for(i = 0; i < 128; i++) { // correct instruments + memcpy (instr, org, 128 * 12); // instruments + for (i = 0; i < 128; i++) + { // correct instruments instr[i][2] ^= (instr[i][2] & 0x40) << 1; instr[i][3] ^= (instr[i][3] & 0x40) << 1; - instr[i][11] >>= 4; // slide + instr[i][11] >>= 4; // slide } - memcpy(song, org + 128 * 12, 51); // tracklist - memcpy(patterns, org + 128 * 12 + 51, orgsize - 128 * 12 - 51); // patterns - delete [] org; + memcpy (song, org + 128 * 12, 51); // tracklist + memcpy (patterns, org + 128 * 12 + 51, orgsize - 128 * 12 - 51); // patterns + delete[]org; - rewind(0); + rewind (0); return true; } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/hybrid.cxx --- a/src/adplug/core/hybrid.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/hybrid.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -31,8 +31,8 @@ #include "hybrid.h" #include "debug.h" -const unsigned char CxadhybridPlayer::hyb_adlib_registers[99] = -{ +const unsigned char + CxadhybridPlayer::hyb_adlib_registers[99] = { 0xE0, 0x60, 0x80, 0x20, 0x40, 0xE3, 0x63, 0x83, 0x23, 0x43, 0xC0, 0xE1, 0x61, 0x81, 0x21, 0x41, 0xE4, 0x64, 0x84, 0x24, 0x44, 0xC1, 0xE2, 0x62, 0x82, 0x22, 0x42, 0xE5, 0x65, 0x85, 0x25, 0x45, 0xC2, @@ -44,36 +44,46 @@ 0xF2, 0x72, 0x92, 0x32, 0x52, 0xF5, 0x75, 0x95, 0x35, 0x55, 0xC8 }; -const unsigned short CxadhybridPlayer::hyb_notes[98] = -{ +const unsigned short + CxadhybridPlayer::hyb_notes[98] = { 0x0000, 0x0000, - 0x016B, 0x0181, 0x0198, 0x01B0, 0x01CA, 0x01E5, 0x0202, 0x0220, 0x0241, 0x0263, 0x0287, 0x02AE, - 0x056B, 0x0581, 0x0598, 0x05B0, 0x05CA, 0x05E5, 0x0602, 0x0620, 0x0641, 0x0663, 0x0687, 0x06AE, - 0x096B, 0x0981, 0x0998, 0x09B0, 0x09CA, 0x09E5, 0x0A02, 0x0A20, 0x0A41, 0x0A63, 0x0A87, 0x0AAE, - 0x0D6B, 0x0D81, 0x0D98, 0x0DB0, 0x0DCA, 0x0DE5, 0x0E02, 0x0E20, 0x0E41, 0x0E63, 0x0E87, 0x0EAE, - 0x116B, 0x1181, 0x1198, 0x11B0, 0x11CA, 0x11E5, 0x1202, 0x1220, 0x1241, 0x1263, 0x1287, 0x12AE, - 0x156B, 0x1581, 0x1598, 0x15B0, 0x15CA, 0x15E5, 0x1602, 0x1620, 0x1641, 0x1663, 0x1687, 0x16AE, - 0x196B, 0x1981, 0x1998, 0x19B0, 0x19CA, 0x19E5, 0x1A02, 0x1A20, 0x1A41, 0x1A63, 0x1A87, 0x1AAE, - 0x1D6B, 0x1D81, 0x1D98, 0x1DB0, 0x1DCA, 0x1DE5, 0x1E02, 0x1E20, 0x1E41, 0x1E63, 0x1E87, 0x1EAE + 0x016B, 0x0181, 0x0198, 0x01B0, 0x01CA, 0x01E5, 0x0202, 0x0220, 0x0241, + 0x0263, 0x0287, 0x02AE, + 0x056B, 0x0581, 0x0598, 0x05B0, 0x05CA, 0x05E5, 0x0602, 0x0620, 0x0641, + 0x0663, 0x0687, 0x06AE, + 0x096B, 0x0981, 0x0998, 0x09B0, 0x09CA, 0x09E5, 0x0A02, 0x0A20, 0x0A41, + 0x0A63, 0x0A87, 0x0AAE, + 0x0D6B, 0x0D81, 0x0D98, 0x0DB0, 0x0DCA, 0x0DE5, 0x0E02, 0x0E20, 0x0E41, + 0x0E63, 0x0E87, 0x0EAE, + 0x116B, 0x1181, 0x1198, 0x11B0, 0x11CA, 0x11E5, 0x1202, 0x1220, 0x1241, + 0x1263, 0x1287, 0x12AE, + 0x156B, 0x1581, 0x1598, 0x15B0, 0x15CA, 0x15E5, 0x1602, 0x1620, 0x1641, + 0x1663, 0x1687, 0x16AE, + 0x196B, 0x1981, 0x1998, 0x19B0, 0x19CA, 0x19E5, 0x1A02, 0x1A20, 0x1A41, + 0x1A63, 0x1A87, 0x1AAE, + 0x1D6B, 0x1D81, 0x1D98, 0x1DB0, 0x1DCA, 0x1DE5, 0x1E02, 0x1E20, 0x1E41, + 0x1E63, 0x1E87, 0x1EAE }; -const unsigned char CxadhybridPlayer::hyb_default_instrument[11] = -{ +const unsigned char + CxadhybridPlayer::hyb_default_instrument[11] = { 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00 }; -CPlayer *CxadhybridPlayer::factory(Copl *newopl) +CPlayer * +CxadhybridPlayer::factory (Copl * newopl) { - return new CxadhybridPlayer(newopl); + return new CxadhybridPlayer (newopl); } -bool CxadhybridPlayer::xadplayer_load() +bool +CxadhybridPlayer::xadplayer_load () { - if(xad.fmt != HYBRID) + if (xad.fmt != HYBRID) return false; // load instruments - hyb.inst = (hyb_instrument *)&tune[0]; + hyb.inst = (hyb_instrument *) & tune[0]; // load order hyb.order = &tune[0x1D4]; @@ -81,7 +91,8 @@ return true; } -void CxadhybridPlayer::xadplayer_rewind(int subsong) +void +CxadhybridPlayer::xadplayer_rewind (int subsong) { int i; @@ -94,32 +105,34 @@ plr.speed = 1; // init channel data - for(i=0;i<9;i++) + for (i = 0; i < 9; i++) { - hyb.channel[i].freq = 0x2000; + hyb.channel[i].freq = 0x2000; hyb.channel[i].freq_slide = 0x0000; } // basic OPL init - opl_write(0x01, 0x20); - opl_write(0xBD, 0x40); - opl_write(0x08, 0x00); + opl_write (0x01, 0x20); + opl_write (0xBD, 0x40); + opl_write (0x08, 0x00); // init OPL channels - for(i=0;i<9;i++) + for (i = 0; i < 9; i++) { - for(int j=0;j<11;j++) - opl_write(hyb_adlib_registers[i*11+j], 0x00 /* hyb_default_instrument[j] */ ); + for (int j = 0; j < 11; j++) + opl_write (hyb_adlib_registers[i * 11 + j], + 0x00 /* hyb_default_instrument[j] */ ); - opl_write(0xA0+i, 0x00); - opl_write(0xB0+i, 0x20); + opl_write (0xA0 + i, 0x00); + opl_write (0xB0 + i, 0x20); } } -void CxadhybridPlayer::xadplayer_update() +void +CxadhybridPlayer::xadplayer_update () { - int i,j; - unsigned char patpos,ordpos; + int i, j; + unsigned char patpos, ordpos; if (--hyb.speed_counter) goto update_slides; @@ -130,75 +143,78 @@ ordpos = hyb.order_pos; // process channels - for(i=0;i<9;i++) + for (i = 0; i < 9; i++) { - unsigned char *pos = &tune[0xADE + (hyb.order[hyb.order_pos*9 + i] * 64 * 2) + (patpos * 2)]; + unsigned char *pos = + &tune[0xADE + (hyb.order[hyb.order_pos * 9 + i] * 64 * 2) + + (patpos * 2)]; // read event unsigned short event = (pos[1] << 8) + pos[0]; #ifdef DEBUG - AdPlug_LogWrite("track %02X, channel %02X, event %04X:\n", hyb.order[hyb.order_pos*9 + i], i, event ); + AdPlug_LogWrite ("track %02X, channel %02X, event %04X:\n", + hyb.order[hyb.order_pos * 9 + i], i, event); #endif // calculate variables - unsigned char note = event >> 9; - unsigned char ins = ((event & 0x01F0) >> 4); - unsigned char slide = event & 0x000F; + unsigned char note = event >> 9; + unsigned char ins = ((event & 0x01F0) >> 4); + unsigned char slide = event & 0x000F; // play event - switch(note) + switch (note) { - case 0x7D: // 0x7D: Set Speed - hyb.speed = event & 0xFF; - break; - case 0x7E: // 0x7E: Jump Position - hyb.order_pos = event & 0xFF; - hyb.pattern_pos = 0x3F; + case 0x7D: // 0x7D: Set Speed + hyb.speed = event & 0xFF; + break; + case 0x7E: // 0x7E: Jump Position + hyb.order_pos = event & 0xFF; + hyb.pattern_pos = 0x3F; - // jumpback ? - if (hyb.order_pos <= ordpos) - plr.looping = 1; + // jumpback ? + if (hyb.order_pos <= ordpos) + plr.looping = 1; - break; - case 0x7F: // 0x7F: Pattern Break - hyb.pattern_pos = 0x3F; - break; - default: + break; + case 0x7F: // 0x7F: Pattern Break + hyb.pattern_pos = 0x3F; + break; + default: - // is instrument ? - if (ins) - for(j=0;j<11;j++) - opl_write(hyb_adlib_registers[i*11+j], *((unsigned char *)&hyb.inst[ins-1] + 7 + j)); // +7 = skip name... + // is instrument ? + if (ins) + for (j = 0; j < 11; j++) + opl_write (hyb_adlib_registers[i * 11 + j], *((unsigned char *) &hyb.inst[ins - 1] + 7 + j)); // +7 = skip name... - // is note ? - if (note) - { - hyb.channel[i].freq = hyb_notes[note]; - hyb.channel[i].freq_slide = 0; - } + // is note ? + if (note) + { + hyb.channel[i].freq = hyb_notes[note]; + hyb.channel[i].freq_slide = 0; + } + + // is slide ? + if (slide) + { + hyb.channel[i].freq_slide = (((slide >> 3) * -1) * (slide & 7)) << 1; - // is slide ? - if (slide) - { - hyb.channel[i].freq_slide = (((slide >> 3) * -1) * (slide & 7)) << 1; - - if (slide & 0x80) - slide = -(slide & 7); - } + if (slide & 0x80) + slide = -(slide & 7); + } - // set frequency - if (!(hyb.channel[i].freq & 0x2000)) - { - opl_write(0xA0+i, hyb.channel[i].freq & 0xFF); - opl_write(0xB0+i, hyb.channel[i].freq >> 8); + // set frequency + if (!(hyb.channel[i].freq & 0x2000)) + { + opl_write (0xA0 + i, hyb.channel[i].freq & 0xFF); + opl_write (0xB0 + i, hyb.channel[i].freq >> 8); - hyb.channel[i].freq |= 0x2000; + hyb.channel[i].freq |= 0x2000; - opl_write(0xA0+i, hyb.channel[i].freq & 0xFF); - opl_write(0xB0+i, hyb.channel[i].freq >> 8); - } + opl_write (0xA0 + i, hyb.channel[i].freq & 0xFF); + opl_write (0xB0 + i, hyb.channel[i].freq >> 8); + } - break; + break; } } @@ -214,35 +230,39 @@ update_slides: #ifdef DEBUG - AdPlug_LogWrite("slides:\n"); + AdPlug_LogWrite ("slides:\n"); #endif // update fine frequency slides - for(i=0;i<9;i++) + for (i = 0; i < 9; i++) if (hyb.channel[i].freq_slide) { - hyb.channel[i].freq = (((hyb.channel[i].freq & 0x1FFF) + hyb.channel[i].freq_slide) & 0x1FFF) | 0x2000; + hyb.channel[i].freq = + (((hyb.channel[i].freq & 0x1FFF) + + hyb.channel[i].freq_slide) & 0x1FFF) | 0x2000; - opl_write(0xA0+i, hyb.channel[i].freq & 0xFF); - opl_write(0xB0+i, hyb.channel[i].freq >> 8); + opl_write (0xA0 + i, hyb.channel[i].freq & 0xFF); + opl_write (0xB0 + i, hyb.channel[i].freq >> 8); } } -float CxadhybridPlayer::xadplayer_getrefresh() +float +CxadhybridPlayer::xadplayer_getrefresh () { return 50.0f; } -std::string CxadhybridPlayer::xadplayer_gettype() +std::string CxadhybridPlayer::xadplayer_gettype () { - return (std::string("xad: hybrid player")); + return (std::string ("xad: hybrid player")); } -std::string CxadhybridPlayer::xadplayer_getinstrument(unsigned int i) +std::string CxadhybridPlayer::xadplayer_getinstrument (unsigned int i) { - return (std::string(hyb.inst[i].name,7)); + return (std::string (hyb.inst[i].name, 7)); } -unsigned int CxadhybridPlayer::xadplayer_getinstruments() +unsigned int +CxadhybridPlayer::xadplayer_getinstruments () { return 26; } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/hyp.cxx --- a/src/adplug/core/hyp.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/hyp.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -31,8 +31,8 @@ #include "hyp.h" #include "debug.h" -const unsigned char CxadhypPlayer::hyp_adlib_registers[99] = -{ +const unsigned char + CxadhypPlayer::hyp_adlib_registers[99] = { 0x20, 0x23, 0x40, 0x43, 0x60, 0x63, 0x80, 0x83, 0xA0, 0xB0, 0xC0, 0x21, 0x24, 0x41, 0x44, 0x61, 0x64, 0x81, 0x84, 0xA1, 0xB1, 0xC1, 0x22, 0x25, 0x42, 0x45, 0x62, 0x65, 0x82, 0x85, 0xA2, 0xB2, 0xC2, @@ -44,9 +44,9 @@ 0x32, 0x35, 0x52, 0x55, 0x72, 0x75, 0x92, 0x95, 0xA8, 0xB8, 0xC8 }; -const unsigned short CxadhypPlayer::hyp_notes[73] = -{ - 0x0000, // by riven +const unsigned short + CxadhypPlayer::hyp_notes[73] = { + 0x0000, // by riven 0x0956, 0x096B, 0x0980, 0x0998, 0x09B1, 0x09C9, 0x09E5, 0x0A03, 0x0A21, 0x0A41, 0x0A63, 0x0A86, 0x0D56, 0x0D6B, 0x0D80, 0x0D98, 0x0DB1, 0x0DC9, 0x0DE5, 0x0E03, 0x0E21, 0x0E41, 0x0E63, 0x0E86, 0x1156, 0x116B, 0x1180, @@ -57,32 +57,35 @@ 0x1D98, 0x1DB1, 0x1DC9, 0x1DE5, 0x1E03, 0x1E21, 0x1E41, 0x1E63, 0x1E86 }; -CPlayer *CxadhypPlayer::factory(Copl *newopl) +CPlayer * +CxadhypPlayer::factory (Copl * newopl) { - return new CxadhypPlayer(newopl); + return new CxadhypPlayer (newopl); } -void CxadhypPlayer::xadplayer_rewind(int subsong) +void +CxadhypPlayer::xadplayer_rewind (int subsong) { int i; plr.speed = tune[5]; - opl_write(0xBD,0xC0); + opl_write (0xBD, 0xC0); - for(i=0; i<9; i++) - adlib[0xB0+i] = 0; + for (i = 0; i < 9; i++) + adlib[0xB0 + i] = 0; // define instruments - for(i=0; i<99; i++) - opl_write(hyp_adlib_registers[i], tune[6+i]); + for (i = 0; i < 99; i++) + opl_write (hyp_adlib_registers[i], tune[6 + i]); hyp.pointer = 0x69; } -void CxadhypPlayer::xadplayer_update() +void +CxadhypPlayer::xadplayer_update () { - for(int i=0; i<9; i++) + for (int i = 0; i < 9; i++) { unsigned char event = tune[hyp.pointer++]; @@ -93,15 +96,15 @@ unsigned char lofreq = (freq & 0xFF); unsigned char hifreq = (freq >> 8); - opl_write(0xB0+i, adlib[0xB0+i]); + opl_write (0xB0 + i, adlib[0xB0 + i]); if (!(event & 0x40)) { - opl_write(0xA0+i, lofreq); - opl_write(0xB0+i, hifreq | 0x20); + opl_write (0xA0 + i, lofreq); + opl_write (0xB0 + i, hifreq | 0x20); } - adlib[0xB0+i] &= 0xDF; + adlib[0xB0 + i] &= 0xDF; } } @@ -114,12 +117,13 @@ } } -float CxadhypPlayer::xadplayer_getrefresh() +float +CxadhypPlayer::xadplayer_getrefresh () { return 60.0f; } -std::string CxadhypPlayer::xadplayer_gettype() +std::string CxadhypPlayer::xadplayer_gettype () { - return std::string("xad: hypnosis player"); + return std::string ("xad: hypnosis player"); } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/imf.cxx --- a/src/adplug/core/imf.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/imf.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -48,114 +48,139 @@ /*** public methods *************************************/ -CPlayer *CimfPlayer::factory(Copl *newopl) +CPlayer * +CimfPlayer::factory (Copl * newopl) { - return new CimfPlayer(newopl); + return new CimfPlayer (newopl); } -bool CimfPlayer::load(VFSFile *fd, const CFileProvider &fp) +bool +CimfPlayer::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); if(!f) return false; + binistream *f = fp.open (fd); + if (!f) + return false; unsigned long fsize, flsize, mfsize = 0; unsigned int i; // file validation section { - char header[5]; - int version; + char header[5]; + int version; - f->readString(header, 5); - version = f->readInt(1); + f->readString (header, 5); + version = f->readInt (1); - if(strncmp(header, "ADLIB", 5) || version != 1) { - if(!fp.extension(fd->uri, ".imf") && !fp.extension(fd->uri, ".wlf")) { - // It's no IMF file at all - fp.close(f); - return false; - } else - f->seek(0); // It's a normal IMF file - } else { + if (strncmp (header, "ADLIB", 5) || version != 1) + { + if (!fp.extension (fd->uri, ".imf") && !fp.extension (fd->uri, ".wlf")) + { + // It's no IMF file at all + fp.close (f); + return false; + } + else + f->seek (0); // It's a normal IMF file + } + else + { // It's a IMF file with header - track_name = f->readString('\0'); - game_name = f->readString('\0'); - f->ignore(1); - mfsize = f->pos() + 2; + track_name = f->readString ('\0'); + game_name = f->readString ('\0'); + f->ignore (1); + mfsize = f->pos () + 2; } } // load section - if(mfsize) - fsize = f->readInt(4); + if (mfsize) + fsize = f->readInt (4); else - fsize = f->readInt(2); - flsize = fp.filesize(f); - if(!fsize) { // footerless file (raw music data) - if(mfsize) - f->seek(-4, binio::Add); + fsize = f->readInt (2); + flsize = fp.filesize (f); + if (!fsize) + { // footerless file (raw music data) + if (mfsize) + f->seek (-4, binio::Add); else - f->seek(-2, binio::Add); + f->seek (-2, binio::Add); size = (flsize - mfsize) / 4; - } else // file has got a footer + } + else // file has got a footer size = fsize / 4; data = new Sdata[size]; - for(i = 0; i < size; i++) { - data[i].reg = f->readInt(1); data[i].val = f->readInt(1); - data[i].time = f->readInt(2); + for (i = 0; i < size; i++) + { + data[i].reg = f->readInt (1); + data[i].val = f->readInt (1); + data[i].time = f->readInt (2); } // read footer, if any - if(fsize && (fsize < flsize - 2 - mfsize)) - if(f->readInt(1) == 0x1a) { + if (fsize && (fsize < flsize - 2 - mfsize)) + if (f->readInt (1) == 0x1a) + { // Adam Nielsen's footer format - track_name = f->readString(); - author_name = f->readString(); - remarks = f->readString(); - } else { + track_name = f->readString (); + author_name = f->readString (); + remarks = f->readString (); + } + else + { // Generic footer unsigned long footerlen = flsize - fsize - 2 - mfsize; footer = new char[footerlen + 1]; - f->readString(footer, footerlen); - footer[footerlen] = '\0'; // Make ASCIIZ string + f->readString (footer, footerlen); + footer[footerlen] = '\0'; // Make ASCIIZ string } - rate = getrate(fd->uri, fp, f); - fp.close(f); - rewind(0); + rate = getrate (fd->uri, fp, f); + fp.close (f); + rewind (0); return true; } -bool CimfPlayer::update() +bool +CimfPlayer::update () { - do { - opl->write(data[pos].reg,data[pos].val); - del = data[pos].time; - pos++; - } while(!del && pos < size); + do + { + opl->write (data[pos].reg, data[pos].val); + del = data[pos].time; + pos++; + } while (!del && pos < size); - if(pos >= size) { - pos = 0; - songend = true; - } - else timer = rate / (float)del; + if (pos >= size) + { + pos = 0; + songend = true; + } + else + timer = rate / (float) del; - return !songend; + return !songend; } -void CimfPlayer::rewind(int subsong) +void +CimfPlayer::rewind (int subsong) { - pos = 0; del = 0; timer = rate; songend = false; - opl->init(); opl->write(1,32); // go to OPL2 mode + pos = 0; + del = 0; + timer = rate; + songend = false; + opl->init (); + opl->write (1, 32); // go to OPL2 mode } -std::string CimfPlayer::gettitle() +std::string CimfPlayer::gettitle () { - std::string title; + std::string title; title = track_name; - if(!track_name.empty() && !game_name.empty()) + if (!track_name.empty () && !game_name.empty ()) title += " - "; title += game_name; @@ -163,14 +188,14 @@ return title; } -std::string CimfPlayer::getdesc() +std::string CimfPlayer::getdesc () { - std::string desc; + std::string desc; - if(footer) - desc = std::string(footer); + if (footer) + desc = std::string (footer); - if(!remarks.empty() && footer) + if (!remarks.empty () && footer) desc += "\n\n"; desc += remarks; @@ -180,17 +205,23 @@ /*** private methods *************************************/ -float CimfPlayer::getrate(const std::string &filename, const CFileProvider &fp, binistream *f) +float +CimfPlayer::getrate (const std::string & filename, const CFileProvider & fp, + binistream * f) { - if(db) { // Database available - f->seek(0, binio::Set); - CClockRecord *record = (CClockRecord *)db->search(CAdPlugDatabase::CKey(*f)); + if (db) + { // Database available + f->seek (0, binio::Set); + CClockRecord *record = + (CClockRecord *) db->search (CAdPlugDatabase::CKey (*f)); if (record && record->type == CAdPlugDatabase::CRecord::ClockSpeed) return record->clock; } // Otherwise the database is either unavailable, or there's no entry for this file - if (fp.extension(filename, ".imf")) return 560.0f; - if (fp.extension(filename, ".wlf")) return 700.0f; - return 700.0f; // default speed for unknown files that aren't .IMF or .WLF + if (fp.extension (filename, ".imf")) + return 560.0f; + if (fp.extension (filename, ".wlf")) + return 700.0f; + return 700.0f; // default speed for unknown files that aren't .IMF or .WLF } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/ksm.cxx --- a/src/adplug/core/ksm.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/ksm.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -24,316 +24,396 @@ #include "ksm.h" #include "debug.h" -const unsigned int CksmPlayer::adlibfreq[63] = { - 0, - 2390,2411,2434,2456,2480,2506,2533,2562,2592,2625,2659,2695, - 3414,3435,3458,3480,3504,3530,3557,3586,3616,3649,3683,3719, - 4438,4459,4482,4504,4528,4554,4581,4610,4640,4673,4707,4743, - 5462,5483,5506,5528,5552,5578,5605,5634,5664,5697,5731,5767, - 6486,6507,6530,6552,6576,6602,6629,6658,6688,6721,6755,6791, - 7510}; +const unsigned int + CksmPlayer::adlibfreq[63] = { + 0, + 2390, 2411, 2434, 2456, 2480, 2506, 2533, 2562, 2592, 2625, 2659, 2695, + 3414, 3435, 3458, 3480, 3504, 3530, 3557, 3586, 3616, 3649, 3683, 3719, + 4438, 4459, 4482, 4504, 4528, 4554, 4581, 4610, 4640, 4673, 4707, 4743, + 5462, 5483, 5506, 5528, 5552, 5578, 5605, 5634, 5664, 5697, 5731, 5767, + 6486, 6507, 6530, 6552, 6576, 6602, 6629, 6658, 6688, 6721, 6755, 6791, + 7510 +}; /*** public methods **************************************/ -CPlayer *CksmPlayer::factory(Copl *newopl) +CPlayer * +CksmPlayer::factory (Copl * newopl) { - return new CksmPlayer(newopl); + return new CksmPlayer (newopl); } -bool CksmPlayer::load(VFSFile *fd, const CFileProvider &fp) +bool +CksmPlayer::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f; - int i; - std::string filename(fd->uri); - char *fn = new char[filename.length() + 9]; + binistream *f; + int i; + std::string filename (fd->uri); + char *fn = new char[filename.length () + 9]; // file validation section - if(!fp.extension(filename, ".ksm")) { - AdPlug_LogWrite("CksmPlayer::load(,\"%s\"): File doesn't have '.ksm' " - "extension! Rejected!\n", filename.c_str()); + if (!fp.extension (filename, ".ksm")) + { + AdPlug_LogWrite ("CksmPlayer::load(,\"%s\"): File doesn't have '.ksm' " + "extension! Rejected!\n", filename.c_str ()); return false; } - AdPlug_LogWrite("*** CksmPlayer::load(,\"%s\") ***\n", filename.c_str()); + AdPlug_LogWrite ("*** CksmPlayer::load(,\"%s\") ***\n", filename.c_str ()); // Load instruments from 'insts.dat' - strcpy(fn, filename.c_str()); - for(i = strlen(fn) - 1; i >= 0; i--) - if(fn[i] == '/' || fn[i] == '\\') + strcpy (fn, filename.c_str ()); + for (i = strlen (fn) - 1; i >= 0; i--) + if (fn[i] == '/' || fn[i] == '\\') break; - strcpy(fn + i + 1, "insts.dat"); - AdPlug_LogWrite("Instruments file: \"%s\"\n", fn); - VFSFile *instfd = vfs_fopen(fn, "rb"); - f = fp.open(instfd); - delete [] fn; - if(!f) { - AdPlug_LogWrite("Couldn't open instruments file! Aborting!\n"); - AdPlug_LogWrite("--- CksmPlayer::load ---\n"); + strcpy (fn + i + 1, "insts.dat"); + AdPlug_LogWrite ("Instruments file: \"%s\"\n", fn); + VFSFile *instfd = vfs_fopen (fn, "rb"); + f = fp.open (instfd); + delete[]fn; + if (!f) + { + AdPlug_LogWrite ("Couldn't open instruments file! Aborting!\n"); + AdPlug_LogWrite ("--- CksmPlayer::load ---\n"); return false; } - loadinsts(f); - fp.close(f); - vfs_fclose(instfd); + loadinsts (f); + fp.close (f); + vfs_fclose (instfd); - f = fp.open(fd); if(!f) return false; - for(i = 0; i < 16; i++) trinst[i] = f->readInt(1); - for(i = 0; i < 16; i++) trquant[i] = f->readInt(1); - for(i = 0; i < 16; i++) trchan[i] = f->readInt(1); - f->ignore(16); - for(i = 0; i < 16; i++) trvol[i] = f->readInt(1); - numnotes = f->readInt(2); - note = new unsigned long [numnotes]; - for(i = 0; i < numnotes; i++) note[i] = f->readInt(4); - fp.close(f); + f = fp.open (fd); + if (!f) + return false; + for (i = 0; i < 16; i++) + trinst[i] = f->readInt (1); + for (i = 0; i < 16; i++) + trquant[i] = f->readInt (1); + for (i = 0; i < 16; i++) + trchan[i] = f->readInt (1); + f->ignore (16); + for (i = 0; i < 16; i++) + trvol[i] = f->readInt (1); + numnotes = f->readInt (2); + note = new unsigned long[numnotes]; + for (i = 0; i < numnotes; i++) + note[i] = f->readInt (4); + fp.close (f); - if(!trchan[11]) { + if (!trchan[11]) + { drumstat = 0; numchans = 9; - } else { + } + else + { drumstat = 32; numchans = 6; } - rewind(0); - AdPlug_LogWrite("--- CksmPlayer::load ---\n"); + rewind (0); + AdPlug_LogWrite ("--- CksmPlayer::load ---\n"); return true; } -bool CksmPlayer::update() +bool +CksmPlayer::update () { - int quanter,chan,drumnum,freq,track,volevel,volval; - unsigned int i,j,bufnum; - unsigned long temp,templong; + int quanter, chan, drumnum, freq, track, volevel, volval; + unsigned int i, j, bufnum; + unsigned long temp, templong; - count++; - if (count >= countstop) - { - bufnum = 0; - while (count >= countstop) - { - templong = note[nownote]; - track = (int)((templong>>8)&15); - if ((templong&192) == 0) - { - i = 0; + count++; + if (count >= countstop) + { + bufnum = 0; + while (count >= countstop) + { + templong = note[nownote]; + track = (int) ((templong >> 8) & 15); + if ((templong & 192) == 0) + { + i = 0; - while ((i < numchans) && - ((chanfreq[i] != (templong&63)) || - (chantrack[i] != ((templong>>8)&15)))) - i++; - if (i < numchans) - { - databuf[bufnum] = (char)0; bufnum++; - databuf[bufnum] = (unsigned char)(0xb0+i); bufnum++; - databuf[bufnum] = (unsigned char)((adlibfreq[templong&63]>>8)&223); bufnum++; - chanfreq[i] = 0; - chanage[i] = 0; - } - } - else - { - volevel = trvol[track]; - if ((templong&192) == 128) - { - volevel -= 4; - if (volevel < 0) - volevel = 0; - } - if ((templong&192) == 192) - { - volevel += 4; - if (volevel > 63) - volevel = 63; - } - if (track < 11) - { - temp = 0; - i = numchans; - for(j=0;j= temp) && (chantrack[j] == track)) - { - temp = countstop - chanage[j]; - i = j; - } - if (i < numchans) - { - databuf[bufnum] = (char)0, bufnum++; - databuf[bufnum] = (unsigned char)(0xb0+i); bufnum++; - databuf[bufnum] = (unsigned char)0; bufnum++; - volval = (inst[trinst[track]][1]&192)+(volevel^63); - databuf[bufnum] = (char)0, bufnum++; - databuf[bufnum] = (unsigned char)(0x40+op_table[i]+3); bufnum++; - databuf[bufnum] = (unsigned char)volval; bufnum++; - databuf[bufnum] = (char)0, bufnum++; - databuf[bufnum] = (unsigned char)(0xa0+i); bufnum++; - databuf[bufnum] = (unsigned char)(adlibfreq[templong&63]&255); bufnum++; - databuf[bufnum] = (char)0, bufnum++; - databuf[bufnum] = (unsigned char)(0xb0+i); bufnum++; - databuf[bufnum] = (unsigned char)((adlibfreq[templong&63]>>8)|32); bufnum++; - chanfreq[i] = templong&63; - chanage[i] = countstop; - } - } - else if ((drumstat&32) > 0) - { - freq = adlibfreq[templong&63]; - switch(track) - { - case 11: drumnum = 16; chan = 6; freq -= 2048; break; - case 12: drumnum = 8; chan = 7; freq -= 2048; break; - case 13: drumnum = 4; chan = 8; break; - case 14: drumnum = 2; chan = 8; break; - case 15: drumnum = 1; chan = 7; freq -= 2048; break; - } - databuf[bufnum] = (char)0, bufnum++; - databuf[bufnum] = (unsigned char)(0xa0+chan); bufnum++; - databuf[bufnum] = (unsigned char)(freq&255); bufnum++; - databuf[bufnum] = (char)0, bufnum++; - databuf[bufnum] = (unsigned char)(0xb0+chan); bufnum++; - databuf[bufnum] = (unsigned char)((freq>>8)&223); bufnum++; - databuf[bufnum] = (char)0, bufnum++; - databuf[bufnum] = (unsigned char)(0xbd); bufnum++; - databuf[bufnum] = (unsigned char)(drumstat&(255-drumnum)); bufnum++; - drumstat |= drumnum; - if ((track == 11) || (track == 12) || (track == 14)) - { - volval = (inst[trinst[track]][1]&192)+(volevel^63); - databuf[bufnum] = (char)0, bufnum++; - databuf[bufnum] = (unsigned char)(0x40+op_table[chan]+3); bufnum++; - databuf[bufnum] = (unsigned char)(volval); bufnum++; - } - else - { - volval = (inst[trinst[track]][6]&192)+(volevel^63); - databuf[bufnum] = (char)0, bufnum++; - databuf[bufnum] = (unsigned char)(0x40+op_table[chan]); bufnum++; - databuf[bufnum] = (unsigned char)(volval); bufnum++; - } - databuf[bufnum] = (char)0, bufnum++; - databuf[bufnum] = (unsigned char)(0xbd); bufnum++; - databuf[bufnum] = (unsigned char)(drumstat); bufnum++; - } - } - nownote++; - if (nownote >= numnotes) { - nownote = 0; - songend = true; - } - templong = note[nownote]; - if (nownote == 0) - count = (templong>>12)-1; - quanter = (240/trquant[(templong>>8)&15]); - countstop = (((templong>>12)+(quanter>>1)) / quanter) * quanter; - } - for(i=0;iwrite(databuf[i+1],databuf[i+2]); - } - return !songend; + while ((i < numchans) && + ((chanfreq[i] != (templong & 63)) || + (chantrack[i] != ((templong >> 8) & 15)))) + i++; + if (i < numchans) + { + databuf[bufnum] = (char) 0; + bufnum++; + databuf[bufnum] = (unsigned char) (0xb0 + i); + bufnum++; + databuf[bufnum] = + (unsigned char) ((adlibfreq[templong & 63] >> 8) & 223); + bufnum++; + chanfreq[i] = 0; + chanage[i] = 0; + } + } + else + { + volevel = trvol[track]; + if ((templong & 192) == 128) + { + volevel -= 4; + if (volevel < 0) + volevel = 0; + } + if ((templong & 192) == 192) + { + volevel += 4; + if (volevel > 63) + volevel = 63; + } + if (track < 11) + { + temp = 0; + i = numchans; + for (j = 0; j < numchans; j++) + if ((countstop - chanage[j] >= temp) && (chantrack[j] == track)) + { + temp = countstop - chanage[j]; + i = j; + } + if (i < numchans) + { + databuf[bufnum] = (char) 0, bufnum++; + databuf[bufnum] = (unsigned char) (0xb0 + i); + bufnum++; + databuf[bufnum] = (unsigned char) 0; + bufnum++; + volval = (inst[trinst[track]][1] & 192) + (volevel ^ 63); + databuf[bufnum] = (char) 0, bufnum++; + databuf[bufnum] = (unsigned char) (0x40 + op_table[i] + 3); + bufnum++; + databuf[bufnum] = (unsigned char) volval; + bufnum++; + databuf[bufnum] = (char) 0, bufnum++; + databuf[bufnum] = (unsigned char) (0xa0 + i); + bufnum++; + databuf[bufnum] = + (unsigned char) (adlibfreq[templong & 63] & 255); + bufnum++; + databuf[bufnum] = (char) 0, bufnum++; + databuf[bufnum] = (unsigned char) (0xb0 + i); + bufnum++; + databuf[bufnum] = + (unsigned char) ((adlibfreq[templong & 63] >> 8) | 32); + bufnum++; + chanfreq[i] = templong & 63; + chanage[i] = countstop; + } + } + else if ((drumstat & 32) > 0) + { + freq = adlibfreq[templong & 63]; + switch (track) + { + case 11: + drumnum = 16; + chan = 6; + freq -= 2048; + break; + case 12: + drumnum = 8; + chan = 7; + freq -= 2048; + break; + case 13: + drumnum = 4; + chan = 8; + break; + case 14: + drumnum = 2; + chan = 8; + break; + case 15: + drumnum = 1; + chan = 7; + freq -= 2048; + break; + } + databuf[bufnum] = (char) 0, bufnum++; + databuf[bufnum] = (unsigned char) (0xa0 + chan); + bufnum++; + databuf[bufnum] = (unsigned char) (freq & 255); + bufnum++; + databuf[bufnum] = (char) 0, bufnum++; + databuf[bufnum] = (unsigned char) (0xb0 + chan); + bufnum++; + databuf[bufnum] = (unsigned char) ((freq >> 8) & 223); + bufnum++; + databuf[bufnum] = (char) 0, bufnum++; + databuf[bufnum] = (unsigned char) (0xbd); + bufnum++; + databuf[bufnum] = (unsigned char) (drumstat & (255 - drumnum)); + bufnum++; + drumstat |= drumnum; + if ((track == 11) || (track == 12) || (track == 14)) + { + volval = (inst[trinst[track]][1] & 192) + (volevel ^ 63); + databuf[bufnum] = (char) 0, bufnum++; + databuf[bufnum] = (unsigned char) (0x40 + op_table[chan] + 3); + bufnum++; + databuf[bufnum] = (unsigned char) (volval); + bufnum++; + } + else + { + volval = (inst[trinst[track]][6] & 192) + (volevel ^ 63); + databuf[bufnum] = (char) 0, bufnum++; + databuf[bufnum] = (unsigned char) (0x40 + op_table[chan]); + bufnum++; + databuf[bufnum] = (unsigned char) (volval); + bufnum++; + } + databuf[bufnum] = (char) 0, bufnum++; + databuf[bufnum] = (unsigned char) (0xbd); + bufnum++; + databuf[bufnum] = (unsigned char) (drumstat); + bufnum++; + } + } + nownote++; + if (nownote >= numnotes) + { + nownote = 0; + songend = true; + } + templong = note[nownote]; + if (nownote == 0) + count = (templong >> 12) - 1; + quanter = (240 / trquant[(templong >> 8) & 15]); + countstop = (((templong >> 12) + (quanter >> 1)) / quanter) * quanter; + } + for (i = 0; i < bufnum; i += 3) + opl->write (databuf[i + 1], databuf[i + 2]); + } + return !songend; } -void CksmPlayer::rewind(int subsong) +void +CksmPlayer::rewind (int subsong) { - unsigned int i,j,k; - unsigned char instbuf[11]; - unsigned long templong; - - songend = false; - opl->init(); opl->write(1,32); opl->write(4,0); opl->write(8,0); opl->write(0xbd,drumstat); + unsigned int i, j, k; + unsigned char instbuf[11]; + unsigned long templong; - if (trchan[11] == 1) { - for(i=0;i<11;i++) - instbuf[i] = inst[trinst[11]][i]; - instbuf[1] = ((instbuf[1]&192)|(trvol[11])^63); - setinst(6,instbuf[0],instbuf[1],instbuf[2],instbuf[3],instbuf[4],instbuf[5],instbuf[6],instbuf[7],instbuf[8],instbuf[9],instbuf[10]); - for(i=0;i<5;i++) - instbuf[i] = inst[trinst[12]][i]; - for(i=5;i<11;i++) - instbuf[i] = inst[trinst[15]][i]; - instbuf[1] = ((instbuf[1]&192)|(trvol[12])^63); - instbuf[6] = ((instbuf[6]&192)|(trvol[15])^63); - setinst(7,instbuf[0],instbuf[1],instbuf[2],instbuf[3],instbuf[4],instbuf[5],instbuf[6],instbuf[7],instbuf[8],instbuf[9],instbuf[10]); - for(i=0;i<5;i++) - instbuf[i] = inst[trinst[14]][i]; - for(i=5;i<11;i++) - instbuf[i] = inst[trinst[13]][i]; - instbuf[1] = ((instbuf[1]&192)|(trvol[14])^63); - instbuf[6] = ((instbuf[6]&192)|(trvol[13])^63); - setinst(8,instbuf[0],instbuf[1],instbuf[2],instbuf[3],instbuf[4],instbuf[5],instbuf[6],instbuf[7],instbuf[8],instbuf[9],instbuf[10]); - } + songend = false; + opl->init (); + opl->write (1, 32); + opl->write (4, 0); + opl->write (8, 0); + opl->write (0xbd, drumstat); - for(i=0;i 0) && (j < numchans)) - { - k = trchan[i]; - while ((j < numchans) && (k > 0)) - { - chantrack[j] = i; - k--; - j++; - } - } - for(i=0;i>12)-1; - countstop = (templong>>12)-1; - nownote = 0; + if (trchan[11] == 1) + { + for (i = 0; i < 11; i++) + instbuf[i] = inst[trinst[11]][i]; + instbuf[1] = ((instbuf[1] & 192) | (trvol[11]) ^ 63); + setinst (6, instbuf[0], instbuf[1], instbuf[2], instbuf[3], instbuf[4], + instbuf[5], instbuf[6], instbuf[7], instbuf[8], instbuf[9], + instbuf[10]); + for (i = 0; i < 5; i++) + instbuf[i] = inst[trinst[12]][i]; + for (i = 5; i < 11; i++) + instbuf[i] = inst[trinst[15]][i]; + instbuf[1] = ((instbuf[1] & 192) | (trvol[12]) ^ 63); + instbuf[6] = ((instbuf[6] & 192) | (trvol[15]) ^ 63); + setinst (7, instbuf[0], instbuf[1], instbuf[2], instbuf[3], instbuf[4], + instbuf[5], instbuf[6], instbuf[7], instbuf[8], instbuf[9], + instbuf[10]); + for (i = 0; i < 5; i++) + instbuf[i] = inst[trinst[14]][i]; + for (i = 5; i < 11; i++) + instbuf[i] = inst[trinst[13]][i]; + instbuf[1] = ((instbuf[1] & 192) | (trvol[14]) ^ 63); + instbuf[6] = ((instbuf[6] & 192) | (trvol[13]) ^ 63); + setinst (8, instbuf[0], instbuf[1], instbuf[2], instbuf[3], instbuf[4], + instbuf[5], instbuf[6], instbuf[7], instbuf[8], instbuf[9], + instbuf[10]); + } + + for (i = 0; i < numchans; i++) + { + chantrack[i] = 0; + chanage[i] = 0; + } + j = 0; + for (i = 0; i < 16; i++) + if ((trchan[i] > 0) && (j < numchans)) + { + k = trchan[i]; + while ((j < numchans) && (k > 0)) + { + chantrack[j] = i; + k--; + j++; + } + } + for (i = 0; i < numchans; i++) + { + for (j = 0; j < 11; j++) + instbuf[j] = inst[trinst[chantrack[i]]][j]; + instbuf[1] = ((instbuf[1] & 192) | (63 - trvol[chantrack[i]])); + setinst (i, instbuf[0], instbuf[1], instbuf[2], instbuf[3], instbuf[4], + instbuf[5], instbuf[6], instbuf[7], instbuf[8], instbuf[9], + instbuf[10]); + chanfreq[i] = 0; + } + k = 0; + templong = *note; + count = (templong >> 12) - 1; + countstop = (templong >> 12) - 1; + nownote = 0; } -std::string CksmPlayer::getinstrument(unsigned int n) +std::string CksmPlayer::getinstrument (unsigned int n) { - if(trchan[n]) - return std::string(instname[trinst[n]]); - else - return std::string(); + if (trchan[n]) + return std::string (instname[trinst[n]]); + else + return std::string (); } /*** private methods *************************************/ -void CksmPlayer::loadinsts(binistream *f) +void +CksmPlayer::loadinsts (binistream * f) { int i, j; - for(i = 0; i < 256; i++) { - f->readString(instname[i], 20); - for(j = 0; j < 11; j++) inst[i][j] = f->readInt(1); - f->ignore(2); + for (i = 0; i < 256; i++) + { + f->readString (instname[i], 20); + for (j = 0; j < 11; j++) + inst[i][j] = f->readInt (1); + f->ignore (2); } } -void CksmPlayer::setinst(int chan, - unsigned char v0,unsigned char v1,unsigned char v2, - unsigned char v3,unsigned char v4,unsigned char v5, - unsigned char v6,unsigned char v7,unsigned char v8, - unsigned char v9,unsigned char v10) +void +CksmPlayer::setinst (int chan, + unsigned char v0, unsigned char v1, unsigned char v2, + unsigned char v3, unsigned char v4, unsigned char v5, + unsigned char v6, unsigned char v7, unsigned char v8, + unsigned char v9, unsigned char v10) { - int offs; + int offs; - opl->write(0xa0+chan,0); - opl->write(0xb0+chan,0); - opl->write(0xc0+chan,v10); - offs = op_table[chan]; - opl->write(0x20+offs,v5); - opl->write(0x40+offs,v6); - opl->write(0x60+offs,v7); - opl->write(0x80+offs,v8); - opl->write(0xe0+offs,v9); - offs+=3; - opl->write(0x20+offs,v0); - opl->write(0x40+offs,v1); - opl->write(0x60+offs,v2); - opl->write(0x80+offs,v3); - opl->write(0xe0+offs,v4); + opl->write (0xa0 + chan, 0); + opl->write (0xb0 + chan, 0); + opl->write (0xc0 + chan, v10); + offs = op_table[chan]; + opl->write (0x20 + offs, v5); + opl->write (0x40 + offs, v6); + opl->write (0x60 + offs, v7); + opl->write (0x80 + offs, v8); + opl->write (0xe0 + offs, v9); + offs += 3; + opl->write (0x20 + offs, v0); + opl->write (0x40 + offs, v1); + opl->write (0x60 + offs, v2); + opl->write (0x80 + offs, v3); + opl->write (0xe0 + offs, v4); } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/lds.cxx --- a/src/adplug/core/lds.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/lds.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -25,7 +25,8 @@ #include "debug.h" // Note frequency table (16 notes / octave) -const unsigned short CldsPlayer::frequency[] = { +const unsigned short + CldsPlayer::frequency[] = { 343, 344, 345, 347, 348, 349, 350, 352, 353, 354, 356, 357, 358, 359, 361, 362, 363, 365, 366, 367, 369, 370, 371, 373, 374, 375, 377, 378, 379, 381, 382, 384, 385, 386, 388, 389, 391, 392, 393, @@ -44,7 +45,8 @@ }; // Vibrato (sine) table -const unsigned char CldsPlayer::vibtab[] = { +const unsigned char + CldsPlayer::vibtab[] = { 0, 13, 25, 37, 50, 62, 74, 86, 98, 109, 120, 131, 142, 152, 162, 171, 180, 189, 197, 205, 212, 219, 225, 231, 236, 240, 244, 247, 250, 252, 254, 255, 255, 255, 254, 252, 250, 247, 244, 240, 236, @@ -53,7 +55,8 @@ }; // Tremolo (sine * sine) table -const unsigned char CldsPlayer::tremtab[] = { +const unsigned char + CldsPlayer::tremtab[] = { 0, 0, 1, 1, 2, 4, 5, 7, 10, 12, 15, 18, 21, 25, 29, 33, 37, 42, 47, 52, 57, 62, 67, 73, 79, 85, 90, 97, 103, 109, 115, 121, 128, 134, 140, 146, 152, 158, 165, 170, 176, 182, 188, 193, 198, 203, 208, @@ -67,509 +70,618 @@ // 'maxsound' is maximum number of patches (instruments) // 'maxpos' is maximum number of entries in position list (orderlist) -const unsigned short CldsPlayer::maxsound = 0x3f, CldsPlayer::maxpos = 0xff; +const unsigned short + CldsPlayer::maxsound = 0x3f, CldsPlayer::maxpos = 0xff; /*** public methods *************************************/ -CldsPlayer::CldsPlayer(Copl *newopl) - : CPlayer(newopl), soundbank(0), positions(0), patterns(0) +CldsPlayer::CldsPlayer (Copl * newopl):CPlayer (newopl), soundbank (0), positions (0), +patterns (0) { } -CldsPlayer::~CldsPlayer() +CldsPlayer::~CldsPlayer () { - if(soundbank) delete [] soundbank; - if(positions) delete [] positions; - if(patterns) delete [] patterns; + if (soundbank) + delete[]soundbank; + if (positions) + delete[]positions; + if (patterns) + delete[]patterns; } -bool CldsPlayer::load(VFSFile *fd, const CFileProvider &fp) +bool +CldsPlayer::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f; - unsigned int i, j; - SoundBank *sb; - std::string filename(fd->uri); + binistream *f; + unsigned int i, j; + SoundBank *sb; + std::string filename (fd->uri); // file validation section (actually just an extension check) - f = fp.open(fd); if(!f) return false; - if(!fp.extension(filename, ".lds")) return false; + f = fp.open (fd); + if (!f) + return false; + if (!fp.extension (filename, ".lds")) + return false; // file load section (header) - mode = f->readInt(1); - if(mode > 2) { fp.close(f); return false; } - speed = f->readInt(2); - tempo = f->readInt(1); - pattlen = f->readInt(1); - for(i = 0; i < 9; i++) chandelay[i] = f->readInt(1); - regbd = f->readInt(1); + mode = f->readInt (1); + if (mode > 2) + { + fp.close (f); + return false; + } + speed = f->readInt (2); + tempo = f->readInt (1); + pattlen = f->readInt (1); + for (i = 0; i < 9; i++) + chandelay[i] = f->readInt (1); + regbd = f->readInt (1); // load patches - numpatch = f->readInt(2); + numpatch = f->readInt (2); soundbank = new SoundBank[numpatch]; - for(i = 0; i < numpatch; i++) { + for (i = 0; i < numpatch; i++) + { sb = &soundbank[i]; - sb->mod_misc = f->readInt(1); sb->mod_vol = f->readInt(1); - sb->mod_ad = f->readInt(1); sb->mod_sr = f->readInt(1); - sb->mod_wave = f->readInt(1); sb->car_misc = f->readInt(1); - sb->car_vol = f->readInt(1); sb->car_ad = f->readInt(1); - sb->car_sr = f->readInt(1); sb->car_wave = f->readInt(1); - sb->feedback = f->readInt(1); sb->keyoff = f->readInt(1); - sb->portamento = f->readInt(1); sb->glide = f->readInt(1); - sb->finetune = f->readInt(1); sb->vibrato = f->readInt(1); - sb->vibdelay = f->readInt(1); sb->mod_trem = f->readInt(1); - sb->car_trem = f->readInt(1); sb->tremwait = f->readInt(1); - sb->arpeggio = f->readInt(1); - for(j = 0; j < 12; j++) sb->arp_tab[j] = f->readInt(1); - sb->start = f->readInt(2); sb->size = f->readInt(2); - sb->fms = f->readInt(1); sb->transp = f->readInt(2); - sb->midinst = f->readInt(1); sb->midvelo = f->readInt(1); - sb->midkey = f->readInt(1); sb->midtrans = f->readInt(1); - sb->middum1 = f->readInt(1); sb->middum2 = f->readInt(1); + sb->mod_misc = f->readInt (1); + sb->mod_vol = f->readInt (1); + sb->mod_ad = f->readInt (1); + sb->mod_sr = f->readInt (1); + sb->mod_wave = f->readInt (1); + sb->car_misc = f->readInt (1); + sb->car_vol = f->readInt (1); + sb->car_ad = f->readInt (1); + sb->car_sr = f->readInt (1); + sb->car_wave = f->readInt (1); + sb->feedback = f->readInt (1); + sb->keyoff = f->readInt (1); + sb->portamento = f->readInt (1); + sb->glide = f->readInt (1); + sb->finetune = f->readInt (1); + sb->vibrato = f->readInt (1); + sb->vibdelay = f->readInt (1); + sb->mod_trem = f->readInt (1); + sb->car_trem = f->readInt (1); + sb->tremwait = f->readInt (1); + sb->arpeggio = f->readInt (1); + for (j = 0; j < 12; j++) + sb->arp_tab[j] = f->readInt (1); + sb->start = f->readInt (2); + sb->size = f->readInt (2); + sb->fms = f->readInt (1); + sb->transp = f->readInt (2); + sb->midinst = f->readInt (1); + sb->midvelo = f->readInt (1); + sb->midkey = f->readInt (1); + sb->midtrans = f->readInt (1); + sb->middum1 = f->readInt (1); + sb->middum2 = f->readInt (1); } // load positions - numposi = f->readInt(2); + numposi = f->readInt (2); positions = new Position[9 * numposi]; - for(i = 0; i < numposi; i++) - for(j = 0; j < 9; j++) { + for (i = 0; i < numposi; i++) + for (j = 0; j < 9; j++) + { /* * patnum is a pointer inside the pattern space, but patterns are 16bit * word fields anyway, so it ought to be an even number (hopefully) and * we can just divide it by 2 to get our array index of 16bit words. */ - positions[i * 9 + j].patnum = f->readInt(2) / 2; - positions[i * 9 + j].transpose = f->readInt(1); + positions[i * 9 + j].patnum = f->readInt (2) / 2; + positions[i * 9 + j].transpose = f->readInt (1); } - AdPlug_LogWrite("CldsPlayer::load(\"%s\",fp): loading LOUDNESS file: mode = " - "%d, pattlen = %d, numpatch = %d, numposi = %d\n", - filename.c_str(), mode, pattlen, numpatch, numposi); + AdPlug_LogWrite + ("CldsPlayer::load(\"%s\",fp): loading LOUDNESS file: mode = " + "%d, pattlen = %d, numpatch = %d, numposi = %d\n", filename.c_str (), + mode, pattlen, numpatch, numposi); // load patterns - f->ignore(2); // ignore # of digital sounds (not played by this player) - patterns = new unsigned short[(fp.filesize(f) - f->pos()) / 2 + 1]; - for(i = 0; !f->eof(); i++) - patterns[i] = f->readInt(2); + f->ignore (2); // ignore # of digital sounds (not played by this player) + patterns = new unsigned short[(fp.filesize (f) - f->pos ()) / 2 + 1]; + for (i = 0; !f->eof (); i++) + patterns[i] = f->readInt (2); - fp.close(f); - rewind(0); + fp.close (f); + rewind (0); return true; } -bool CldsPlayer::update() +bool +CldsPlayer::update () { - unsigned short comword, freq, octave, chan, tune, wibc, tremc, arpreg; - bool vbreak; - unsigned char level, regnum, comhi, comlo; - int i; - Channel *c; + unsigned short comword, freq, octave, chan, tune, wibc, tremc, arpreg; + bool vbreak; + unsigned char level, regnum, comhi, comlo; + int i; + Channel *c; - if(!playing) return false; + if (!playing) + return false; // handle fading - if(fadeonoff) - if(fadeonoff <= 128) { - if(allvolume > fadeonoff || allvolume == 0) - allvolume -= fadeonoff; - else { - allvolume = 1; - fadeonoff = 0; - if(hardfade != 0) { - playing = false; - hardfade = 0; - for(i = 0; i < 9; i++) - channel[i].keycount = 1; - } + if (fadeonoff) + if (fadeonoff <= 128) + { + if (allvolume > fadeonoff || allvolume == 0) + allvolume -= fadeonoff; + else + { + allvolume = 1; + fadeonoff = 0; + if (hardfade != 0) + { + playing = false; + hardfade = 0; + for (i = 0; i < 9; i++) + channel[i].keycount = 1; + } } - } else - if((unsigned int)((allvolume + (0x100 - fadeonoff)) & 0xff) <= mainvolume) - allvolume += 0x100 - fadeonoff; - else { - allvolume = mainvolume; - fadeonoff = 0; - } + } + else + if ((unsigned int) ((allvolume + (0x100 - fadeonoff)) & 0xff) <= + mainvolume) + allvolume += 0x100 - fadeonoff; + else + { + allvolume = mainvolume; + fadeonoff = 0; + } // handle channel delay - for(chan = 0; chan < 9; chan++) { + for (chan = 0; chan < 9; chan++) + { c = &channel[chan]; - if(c->chancheat.chandelay) - if(!(--c->chancheat.chandelay)) - playsound(c->chancheat.sound, chan, c->chancheat.high); + if (c->chancheat.chandelay) + if (!(--c->chancheat.chandelay)) + playsound (c->chancheat.sound, chan, c->chancheat.high); } // handle notes - if(!tempo_now) { + if (!tempo_now) + { vbreak = false; - for(chan = 0; chan < 9; chan++) { + for (chan = 0; chan < 9; chan++) + { c = &channel[chan]; - if(!c->packwait) { - unsigned short patnum = positions[posplay * 9 + chan].patnum; - unsigned char transpose = positions[posplay * 9 + chan].transpose; + if (!c->packwait) + { + unsigned short patnum = positions[posplay * 9 + chan].patnum; + unsigned char transpose = positions[posplay * 9 + chan].transpose; - comword = patterns[patnum + c->packpos]; - comhi = comword >> 8; comlo = comword & 0xff; - if(comword) - if(comhi == 0x80) - c->packwait = comlo; - else - if(comhi >= 0x80) { - switch(comhi) { - case 0xff: - c->volcar = (((c->volcar & 0x3f) * comlo) >> 6) & 0x3f; - if(fmchip[0xc0 + chan] & 1) - c->volmod = (((c->volmod & 0x3f) * comlo) >> 6) & 0x3f; - break; - case 0xfe: - tempo = comword & 0x3f; - break; - case 0xfd: - c->nextvol = comlo; - break; - case 0xfc: - playing = false; - // in real player there's also full keyoff here, but we don't need it - break; - case 0xfb: - c->keycount = 1; - break; - case 0xfa: - vbreak = true; - jumppos = (posplay + 1) & maxpos; - break; - case 0xf9: - vbreak = true; - jumppos = comlo & maxpos; - jumping = 1; - if(jumppos < posplay) songlooped = true; - break; - case 0xf8: - c->lasttune = 0; - break; - case 0xf7: - c->vibwait = 0; - // PASCAL: c->vibspeed = ((comlo >> 4) & 15) + 2; - c->vibspeed = (comlo >> 4) + 2; - c->vibrate = (comlo & 15) + 1; - break; - case 0xf6: - c->glideto = comlo; - break; - case 0xf5: - c->finetune = comlo; - break; - case 0xf4: - if(!hardfade) { - allvolume = mainvolume = comlo; - fadeonoff = 0; - } - break; - case 0xf3: - if(!hardfade) fadeonoff = comlo; - break; - case 0xf2: - c->trmstay = comlo; - break; - case 0xf1: // panorama - case 0xf0: // progch - // MIDI commands (unhandled) - AdPlug_LogWrite("CldsPlayer(): not handling MIDI command 0x%x, " - "value = 0x%x\n", comhi); - break; - default: - if(comhi < 0xa0) - c->glideto = comhi & 0x1f; - else - AdPlug_LogWrite("CldsPlayer(): unknown command 0x%x encountered!" - " value = 0x%x\n", comhi, comlo); - break; - } - } else { - unsigned char sound; - unsigned short high; - signed char transp = transpose & 127; + comword = patterns[patnum + c->packpos]; + comhi = comword >> 8; + comlo = comword & 0xff; + if (comword) + if (comhi == 0x80) + c->packwait = comlo; + else if (comhi >= 0x80) + { + switch (comhi) + { + case 0xff: + c->volcar = (((c->volcar & 0x3f) * comlo) >> 6) & 0x3f; + if (fmchip[0xc0 + chan] & 1) + c->volmod = (((c->volmod & 0x3f) * comlo) >> 6) & 0x3f; + break; + case 0xfe: + tempo = comword & 0x3f; + break; + case 0xfd: + c->nextvol = comlo; + break; + case 0xfc: + playing = false; + // in real player there's also full keyoff here, but we don't need it + break; + case 0xfb: + c->keycount = 1; + break; + case 0xfa: + vbreak = true; + jumppos = (posplay + 1) & maxpos; + break; + case 0xf9: + vbreak = true; + jumppos = comlo & maxpos; + jumping = 1; + if (jumppos < posplay) + songlooped = true; + break; + case 0xf8: + c->lasttune = 0; + break; + case 0xf7: + c->vibwait = 0; + // PASCAL: c->vibspeed = ((comlo >> 4) & 15) + 2; + c->vibspeed = (comlo >> 4) + 2; + c->vibrate = (comlo & 15) + 1; + break; + case 0xf6: + c->glideto = comlo; + break; + case 0xf5: + c->finetune = comlo; + break; + case 0xf4: + if (!hardfade) + { + allvolume = mainvolume = comlo; + fadeonoff = 0; + } + break; + case 0xf3: + if (!hardfade) + fadeonoff = comlo; + break; + case 0xf2: + c->trmstay = comlo; + break; + case 0xf1: // panorama + case 0xf0: // progch + // MIDI commands (unhandled) + AdPlug_LogWrite + ("CldsPlayer(): not handling MIDI command 0x%x, " + "value = 0x%x\n", comhi); + break; + default: + if (comhi < 0xa0) + c->glideto = comhi & 0x1f; + else + AdPlug_LogWrite + ("CldsPlayer(): unknown command 0x%x encountered!" + " value = 0x%x\n", comhi, comlo); + break; + } + } + else + { + unsigned char sound; + unsigned short high; + signed char transp = transpose & 127; - /* - * Originally, in assembler code, the player first shifted - * logically left the transpose byte by 1 and then shifted - * arithmetically right the same byte to achieve the final, - * signed transpose value. Since we can't do arithmetic shifts - * in C, we just duplicate the 7th bit into the 8th one and - * discard the 8th one completely. - */ + /* + * Originally, in assembler code, the player first shifted + * logically left the transpose byte by 1 and then shifted + * arithmetically right the same byte to achieve the final, + * signed transpose value. Since we can't do arithmetic shifts + * in C, we just duplicate the 7th bit into the 8th one and + * discard the 8th one completely. + */ - if(transpose & 64) transp |= 128; - - if(transpose & 128) { - sound = (comlo + transp) & maxsound; - high = comhi << 4; - } else { - sound = comlo & maxsound; - high = (comhi + transp) << 4; - } + if (transpose & 64) + transp |= 128; - /* - PASCAL: - sound = comlo & maxsound; - high = (comhi + (((transpose + 0x24) & 0xff) - 0x24)) << 4; - */ + if (transpose & 128) + { + sound = (comlo + transp) & maxsound; + high = comhi << 4; + } + else + { + sound = comlo & maxsound; + high = (comhi + transp) << 4; + } - if(!chandelay[chan]) - playsound(sound, chan, high); - else { - c->chancheat.chandelay = chandelay[chan]; - c->chancheat.sound = sound; - c->chancheat.high = high; - } - } + /* + PASCAL: + sound = comlo & maxsound; + high = (comhi + (((transpose + 0x24) & 0xff) - 0x24)) << 4; + */ - c->packpos++; - } else - c->packwait--; + if (!chandelay[chan]) + playsound (sound, chan, high); + else + { + c->chancheat.chandelay = chandelay[chan]; + c->chancheat.sound = sound; + c->chancheat.high = high; + } + } + + c->packpos++; + } + else + c->packwait--; } tempo_now = tempo; /* - The continue table is updated here, but this is only used in the - original player, which can be paused in the middle of a song and then - unpaused. Since AdPlug does all this for us automatically, we don't - have a continue table here. The continue table update code is noted - here for reference only. + The continue table is updated here, but this is only used in the + original player, which can be paused in the middle of a song and then + unpaused. Since AdPlug does all this for us automatically, we don't + have a continue table here. The continue table update code is noted + here for reference only. - if(!pattplay) { - conttab[speed & maxcont].position = posplay & 0xff; - conttab[speed & maxcont].tempo = tempo; - } - */ + if(!pattplay) { + conttab[speed & maxcont].position = posplay & 0xff; + conttab[speed & maxcont].tempo = tempo; + } + */ pattplay++; - if(vbreak) { + if (vbreak) + { pattplay = 0; - for(i = 0; i < 9; i++) channel[i].packpos = channel[i].packwait = 0; + for (i = 0; i < 9; i++) + channel[i].packpos = channel[i].packwait = 0; posplay = jumppos; - } else - if(pattplay >= pattlen) { - pattplay = 0; - for(i = 0; i < 9; i++) channel[i].packpos = channel[i].packwait = 0; - posplay = (posplay + 1) & maxpos; - } - } else + } + else if (pattplay >= pattlen) + { + pattplay = 0; + for (i = 0; i < 9; i++) + channel[i].packpos = channel[i].packwait = 0; + posplay = (posplay + 1) & maxpos; + } + } + else tempo_now--; // make effects - for(chan = 0; chan < 9; chan++) { + for (chan = 0; chan < 9; chan++) + { c = &channel[chan]; regnum = op_table[chan]; - if(c->keycount > 0) { - if(c->keycount == 1) - setregs_adv(0xb0 + chan, 0xdf, 0); + if (c->keycount > 0) + { + if (c->keycount == 1) + setregs_adv (0xb0 + chan, 0xdf, 0); c->keycount--; } // arpeggio - if(c->arp_size == 0) + if (c->arp_size == 0) arpreg = 0; - else { + else + { arpreg = c->arp_tab[c->arp_pos] << 4; - if(arpreg == 0x800) { - if(c->arp_pos > 0) c->arp_tab[0] = c->arp_tab[c->arp_pos - 1]; - c->arp_size = 1; c->arp_pos = 0; - arpreg = c->arp_tab[0] << 4; + if (arpreg == 0x800) + { + if (c->arp_pos > 0) + c->arp_tab[0] = c->arp_tab[c->arp_pos - 1]; + c->arp_size = 1; + c->arp_pos = 0; + arpreg = c->arp_tab[0] << 4; } - if(c->arp_count == c->arp_speed) { - c->arp_pos++; - if(c->arp_pos >= c->arp_size) c->arp_pos = 0; - c->arp_count = 0; - } else - c->arp_count++; + if (c->arp_count == c->arp_speed) + { + c->arp_pos++; + if (c->arp_pos >= c->arp_size) + c->arp_pos = 0; + c->arp_count = 0; + } + else + c->arp_count++; } // glide & portamento - if(c->lasttune && (c->lasttune != c->gototune)) { - if(c->lasttune > c->gototune) { - if(c->lasttune - c->gototune < c->portspeed) - c->lasttune = c->gototune; - else - c->lasttune -= c->portspeed; - } else { - if(c->gototune - c->lasttune < c->portspeed) - c->lasttune = c->gototune; - else - c->lasttune += c->portspeed; + if (c->lasttune && (c->lasttune != c->gototune)) + { + if (c->lasttune > c->gototune) + { + if (c->lasttune - c->gototune < c->portspeed) + c->lasttune = c->gototune; + else + c->lasttune -= c->portspeed; + } + else + { + if (c->gototune - c->lasttune < c->portspeed) + c->lasttune = c->gototune; + else + c->lasttune += c->portspeed; } - if(arpreg >= 0x800) - arpreg = c->lasttune - (arpreg ^ 0xff0) - 16; + if (arpreg >= 0x800) + arpreg = c->lasttune - (arpreg ^ 0xff0) - 16; else - arpreg += c->lasttune; + arpreg += c->lasttune; freq = frequency[arpreg % (12 * 16)]; octave = arpreg / (12 * 16) - 1; - setregs(0xa0 + chan, freq & 0xff); - setregs_adv(0xb0 + chan, 0x20, ((octave << 2) + (freq >> 8)) & 0xdf); - } else { + setregs (0xa0 + chan, freq & 0xff); + setregs_adv (0xb0 + chan, 0x20, ((octave << 2) + (freq >> 8)) & 0xdf); + } + else + { // vibrato - if(!c->vibwait) { - if(c->vibrate) { - wibc = vibtab[c->vibcount & 0x3f] * c->vibrate; + if (!c->vibwait) + { + if (c->vibrate) + { + wibc = vibtab[c->vibcount & 0x3f] * c->vibrate; - if((c->vibcount & 0x40) == 0) - tune = c->lasttune + (wibc >> 8); - else - tune = c->lasttune - (wibc >> 8); + if ((c->vibcount & 0x40) == 0) + tune = c->lasttune + (wibc >> 8); + else + tune = c->lasttune - (wibc >> 8); - if(arpreg >= 0x800) - tune = tune - (arpreg ^ 0xff0) - 16; - else - tune += arpreg; + if (arpreg >= 0x800) + tune = tune - (arpreg ^ 0xff0) - 16; + else + tune += arpreg; - freq = frequency[tune % (12 * 16)]; - octave = tune / (12 * 16) - 1; - setregs(0xa0 + chan, freq & 0xff); - setregs_adv(0xb0 + chan, 0x20, ((octave << 2) + (freq >> 8)) & 0xdf); - c->vibcount += c->vibspeed; - } else - if(c->arp_size != 0) { // no vibrato, just arpeggio - if(arpreg >= 0x800) - tune = c->lasttune - (arpreg ^ 0xff0) - 16; - else - tune = c->lasttune + arpreg; + freq = frequency[tune % (12 * 16)]; + octave = tune / (12 * 16) - 1; + setregs (0xa0 + chan, freq & 0xff); + setregs_adv (0xb0 + chan, 0x20, + ((octave << 2) + (freq >> 8)) & 0xdf); + c->vibcount += c->vibspeed; + } + else if (c->arp_size != 0) + { // no vibrato, just arpeggio + if (arpreg >= 0x800) + tune = c->lasttune - (arpreg ^ 0xff0) - 16; + else + tune = c->lasttune + arpreg; - freq = frequency[tune % (12 * 16)]; - octave = tune / (12 * 16) - 1; - setregs(0xa0 + chan, freq & 0xff); - setregs_adv(0xb0 + chan, 0x20, ((octave << 2) + (freq >> 8)) & 0xdf); - } - } else { // no vibrato, just arpeggio - c->vibwait--; + freq = frequency[tune % (12 * 16)]; + octave = tune / (12 * 16) - 1; + setregs (0xa0 + chan, freq & 0xff); + setregs_adv (0xb0 + chan, 0x20, + ((octave << 2) + (freq >> 8)) & 0xdf); + } + } + else + { // no vibrato, just arpeggio + c->vibwait--; - if(c->arp_size != 0) { - if(arpreg >= 0x800) - tune = c->lasttune - (arpreg ^ 0xff0) - 16; - else - tune = c->lasttune + arpreg; + if (c->arp_size != 0) + { + if (arpreg >= 0x800) + tune = c->lasttune - (arpreg ^ 0xff0) - 16; + else + tune = c->lasttune + arpreg; - freq = frequency[tune % (12 * 16)]; - octave = tune / (12 * 16) - 1; - setregs(0xa0 + chan, freq & 0xff); - setregs_adv(0xb0 + chan, 0x20, ((octave << 2) + (freq >> 8)) & 0xdf); - } + freq = frequency[tune % (12 * 16)]; + octave = tune / (12 * 16) - 1; + setregs (0xa0 + chan, freq & 0xff); + setregs_adv (0xb0 + chan, 0x20, + ((octave << 2) + (freq >> 8)) & 0xdf); + } } } // tremolo (modulator) - if(!c->trmwait) { - if(c->trmrate) { - tremc = tremtab[c->trmcount & 0x7f] * c->trmrate; - if((tremc >> 8) <= (c->volmod & 0x3f)) - level = (c->volmod & 0x3f) - (tremc >> 8); - else - level = 0; + if (!c->trmwait) + { + if (c->trmrate) + { + tremc = tremtab[c->trmcount & 0x7f] * c->trmrate; + if ((tremc >> 8) <= (c->volmod & 0x3f)) + level = (c->volmod & 0x3f) - (tremc >> 8); + else + level = 0; - if(allvolume != 0 && (fmchip[0xc0 + chan] & 1)) - setregs_adv(0x40 + regnum, 0xc0, ((level * allvolume) >> 8) ^ 0x3f); - else - setregs_adv(0x40 + regnum, 0xc0, level ^ 0x3f); + if (allvolume != 0 && (fmchip[0xc0 + chan] & 1)) + setregs_adv (0x40 + regnum, 0xc0, + ((level * allvolume) >> 8) ^ 0x3f); + else + setregs_adv (0x40 + regnum, 0xc0, level ^ 0x3f); - c->trmcount += c->trmspeed; - } else - if(allvolume != 0 && (fmchip[0xc0 + chan] & 1)) - setregs_adv(0x40 + regnum, 0xc0, ((((c->volmod & 0x3f) * allvolume) >> 8) ^ 0x3f) & 0x3f); - else - setregs_adv(0x40 + regnum, 0xc0, (c->volmod ^ 0x3f) & 0x3f); - } else { + c->trmcount += c->trmspeed; + } + else if (allvolume != 0 && (fmchip[0xc0 + chan] & 1)) + setregs_adv (0x40 + regnum, 0xc0, + ((((c->volmod & 0x3f) * allvolume) >> 8) ^ 0x3f) & 0x3f); + else + setregs_adv (0x40 + regnum, 0xc0, (c->volmod ^ 0x3f) & 0x3f); + } + else + { c->trmwait--; - if(allvolume != 0 && (fmchip[0xc0 + chan] & 1)) - setregs_adv(0x40 + regnum, 0xc0, ((((c->volmod & 0x3f) * allvolume) >> 8) ^ 0x3f) & 0x3f); + if (allvolume != 0 && (fmchip[0xc0 + chan] & 1)) + setregs_adv (0x40 + regnum, 0xc0, + ((((c->volmod & 0x3f) * allvolume) >> 8) ^ 0x3f) & 0x3f); } // tremolo (carrier) - if(!c->trcwait) { - if(c->trcrate) { - tremc = tremtab[c->trccount & 0x7f] * c->trcrate; - if((tremc >> 8) <= (c->volcar & 0x3f)) - level = (c->volcar & 0x3f) - (tremc >> 8); - else - level = 0; + if (!c->trcwait) + { + if (c->trcrate) + { + tremc = tremtab[c->trccount & 0x7f] * c->trcrate; + if ((tremc >> 8) <= (c->volcar & 0x3f)) + level = (c->volcar & 0x3f) - (tremc >> 8); + else + level = 0; - if(allvolume != 0) - setregs_adv(0x43 + regnum, 0xc0, ((level * allvolume) >> 8) ^ 0x3f); - else - setregs_adv(0x43 + regnum, 0xc0, level ^ 0x3f); - c->trccount += c->trcspeed; - } else - if(allvolume != 0) - setregs_adv(0x43 + regnum, 0xc0, ((((c->volcar & 0x3f) * allvolume) >> 8) ^ 0x3f) & 0x3f); - else - setregs_adv(0x43 + regnum, 0xc0, (c->volcar ^ 0x3f) & 0x3f); - } else { + if (allvolume != 0) + setregs_adv (0x43 + regnum, 0xc0, + ((level * allvolume) >> 8) ^ 0x3f); + else + setregs_adv (0x43 + regnum, 0xc0, level ^ 0x3f); + c->trccount += c->trcspeed; + } + else if (allvolume != 0) + setregs_adv (0x43 + regnum, 0xc0, + ((((c->volcar & 0x3f) * allvolume) >> 8) ^ 0x3f) & 0x3f); + else + setregs_adv (0x43 + regnum, 0xc0, (c->volcar ^ 0x3f) & 0x3f); + } + else + { c->trcwait--; - if(allvolume != 0) - setregs_adv(0x43 + regnum, 0xc0, ((((c->volcar & 0x3f) * allvolume) >> 8) ^ 0x3f) & 0x3f); + if (allvolume != 0) + setregs_adv (0x43 + regnum, 0xc0, + ((((c->volcar & 0x3f) * allvolume) >> 8) ^ 0x3f) & 0x3f); } } return (!playing || songlooped) ? false : true; } -void CldsPlayer::rewind(int subsong) +void +CldsPlayer::rewind (int subsong) { int i; // init all with 0 - tempo_now = 3; playing = true; songlooped = false; + tempo_now = 3; + playing = true; + songlooped = false; jumping = fadeonoff = allvolume = hardfade = pattplay = posplay = jumppos = mainvolume = 0; - memset(channel, 0, sizeof(channel)); - memset(fmchip, 0, sizeof(fmchip)); + memset (channel, 0, sizeof (channel)); + memset (fmchip, 0, sizeof (fmchip)); // OPL2 init - opl->init(); // Reset OPL chip - opl->write(1, 0x20); - opl->write(8, 0); - opl->write(0xbd, regbd); + opl->init (); // Reset OPL chip + opl->write (1, 0x20); + opl->write (8, 0); + opl->write (0xbd, regbd); - for(i = 0; i < 9; i++) { - opl->write(0x20 + op_table[i], 0); - opl->write(0x23 + op_table[i], 0); - opl->write(0x40 + op_table[i], 0x3f); - opl->write(0x43 + op_table[i], 0x3f); - opl->write(0x60 + op_table[i], 0xff); - opl->write(0x63 + op_table[i], 0xff); - opl->write(0x80 + op_table[i], 0xff); - opl->write(0x83 + op_table[i], 0xff); - opl->write(0xe0 + op_table[i], 0); - opl->write(0xe3 + op_table[i], 0); - opl->write(0xa0 + i, 0); - opl->write(0xb0 + i, 0); - opl->write(0xc0 + i, 0); + for (i = 0; i < 9; i++) + { + opl->write (0x20 + op_table[i], 0); + opl->write (0x23 + op_table[i], 0); + opl->write (0x40 + op_table[i], 0x3f); + opl->write (0x43 + op_table[i], 0x3f); + opl->write (0x60 + op_table[i], 0xff); + opl->write (0x63 + op_table[i], 0xff); + opl->write (0x80 + op_table[i], 0xff); + opl->write (0x83 + op_table[i], 0xff); + opl->write (0xe0 + op_table[i], 0); + opl->write (0xe3 + op_table[i], 0); + opl->write (0xa0 + i, 0); + opl->write (0xb0 + i, 0); + opl->write (0xc0 + i, 0); } } /*** private methods *************************************/ -void CldsPlayer::playsound(int inst_number, int channel_number, int tunehigh) +void +CldsPlayer::playsound (int inst_number, int channel_number, int tunehigh) { - Channel *c = &channel[channel_number]; // current channel - SoundBank *i = &soundbank[inst_number]; // current instrument - unsigned int regnum = op_table[channel_number]; // channel's OPL2 register - unsigned char volcalc, octave; - unsigned short freq; + Channel *c = &channel[channel_number]; // current channel + SoundBank *i = &soundbank[inst_number]; // current instrument + unsigned int regnum = op_table[channel_number]; // channel's OPL2 register + unsigned char volcalc, octave; + unsigned short freq; // set fine tune tunehigh += ((i->finetune + c->finetune + 0x80) & 0xff) - 0x80; // arpeggio handling - if(!i->arpeggio) { - unsigned short arpcalc = i->arp_tab[0] << 4; + if (!i->arpeggio) + { + unsigned short arpcalc = i->arp_tab[0] << 4; - if(arpcalc > 0x800) + if (arpcalc > 0x800) tunehigh = tunehigh - (arpcalc ^ 0xff0) - 16; else tunehigh += arpcalc; } // glide handling - if(c->glideto != 0) { + if (c->glideto != 0) + { c->gototune = tunehigh; c->portspeed = c->glideto; c->glideto = c->finetune = 0; @@ -577,69 +689,83 @@ } // set modulator registers - setregs(0x20 + regnum, i->mod_misc); + setregs (0x20 + regnum, i->mod_misc); volcalc = i->mod_vol; - if(!c->nextvol || !(i->feedback & 1)) + if (!c->nextvol || !(i->feedback & 1)) c->volmod = volcalc; else c->volmod = (volcalc & 0xc0) | ((((volcalc & 0x3f) * c->nextvol) >> 6)); - if((i->feedback & 1) == 1 && allvolume != 0) - setregs(0x40 + regnum, ((c->volmod & 0xc0) | (((c->volmod & 0x3f) * allvolume) >> 8)) ^ 0x3f); + if ((i->feedback & 1) == 1 && allvolume != 0) + setregs (0x40 + regnum, + ((c-> + volmod & 0xc0) | (((c->volmod & 0x3f) * + allvolume) >> 8)) ^ 0x3f); else - setregs(0x40 + regnum, c->volmod ^ 0x3f); - setregs(0x60 + regnum, i->mod_ad); - setregs(0x80 + regnum, i->mod_sr); - setregs(0xe0 + regnum, i->mod_wave); + setregs (0x40 + regnum, c->volmod ^ 0x3f); + setregs (0x60 + regnum, i->mod_ad); + setregs (0x80 + regnum, i->mod_sr); + setregs (0xe0 + regnum, i->mod_wave); // Set carrier registers - setregs(0x23 + regnum, i->car_misc); + setregs (0x23 + regnum, i->car_misc); volcalc = i->car_vol; - if(!c->nextvol) + if (!c->nextvol) c->volcar = volcalc; else c->volcar = (volcalc & 0xc0) | ((((volcalc & 0x3f) * c->nextvol) >> 6)); - if(allvolume) - setregs(0x43 + regnum, ((c->volcar & 0xc0) | (((c->volcar & 0x3f) * allvolume) >> 8)) ^ 0x3f); + if (allvolume) + setregs (0x43 + regnum, + ((c-> + volcar & 0xc0) | (((c->volcar & 0x3f) * + allvolume) >> 8)) ^ 0x3f); else - setregs(0x43 + regnum, c->volcar ^ 0x3f); - setregs(0x63 + regnum, i->car_ad); - setregs(0x83 + regnum, i->car_sr); - setregs(0xe3 + regnum, i->car_wave); - setregs(0xc0 + channel_number, i->feedback); - setregs_adv(0xb0 + channel_number, 0xdf, 0); // key off + setregs (0x43 + regnum, c->volcar ^ 0x3f); + setregs (0x63 + regnum, i->car_ad); + setregs (0x83 + regnum, i->car_sr); + setregs (0xe3 + regnum, i->car_wave); + setregs (0xc0 + channel_number, i->feedback); + setregs_adv (0xb0 + channel_number, 0xdf, 0); // key off freq = frequency[tunehigh % (12 * 16)]; octave = tunehigh / (12 * 16) - 1; - if(!i->glide) { - if(!i->portamento || !c->lasttune) { - setregs(0xa0 + channel_number, freq & 0xff); - setregs(0xb0 + channel_number, (octave << 2) + 0x20 + (freq >> 8)); + if (!i->glide) + { + if (!i->portamento || !c->lasttune) + { + setregs (0xa0 + channel_number, freq & 0xff); + setregs (0xb0 + channel_number, (octave << 2) + 0x20 + (freq >> 8)); c->lasttune = c->gototune = tunehigh; - } else { + } + else + { c->gototune = tunehigh; c->portspeed = i->portamento; - setregs_adv(0xb0 + channel_number, 0xdf, 0x20); // key on + setregs_adv (0xb0 + channel_number, 0xdf, 0x20); // key on } - } else { - setregs(0xa0 + channel_number, freq & 0xff); - setregs(0xb0 + channel_number, (octave << 2) + 0x20 + (freq >> 8)); + } + else + { + setregs (0xa0 + channel_number, freq & 0xff); + setregs (0xb0 + channel_number, (octave << 2) + 0x20 + (freq >> 8)); c->lasttune = tunehigh; - c->gototune = tunehigh + ((i->glide + 0x80) & 0xff) - 0x80; // set destination + c->gototune = tunehigh + ((i->glide + 0x80) & 0xff) - 0x80; // set destination c->portspeed = i->portamento; } - if(!i->vibrato) + if (!i->vibrato) c->vibwait = c->vibspeed = c->vibrate = 0; - else { + else + { c->vibwait = i->vibdelay; // PASCAL: c->vibspeed = ((i->vibrato >> 4) & 15) + 1; c->vibspeed = (i->vibrato >> 4) + 2; c->vibrate = (i->vibrato & 15) + 1; } - if(!(c->trmstay & 0xf0)) { + if (!(c->trmstay & 0xf0)) + { c->trmwait = (i->tremwait & 0xf0) >> 3; // PASCAL: c->trmspeed = (i->mod_trem >> 4) & 15; c->trmspeed = i->mod_trem >> 4; @@ -647,7 +773,8 @@ c->trmcount = 0; } - if(!(c->trmstay & 0x0f)) { + if (!(c->trmstay & 0x0f)) + { c->trcwait = (i->tremwait & 15) << 1; // PASCAL: c->trcspeed = (i->car_trem >> 4) & 15; c->trcspeed = i->car_trem >> 4; @@ -657,21 +784,25 @@ c->arp_size = i->arpeggio & 15; c->arp_speed = i->arpeggio >> 4; - memcpy(c->arp_tab, i->arp_tab, 12); + memcpy (c->arp_tab, i->arp_tab, 12); c->keycount = i->keyoff; - c->nextvol = c->glideto = c->finetune = c->vibcount = c->arp_pos = c->arp_count = 0; + c->nextvol = c->glideto = c->finetune = c->vibcount = c->arp_pos = + c->arp_count = 0; } -inline void CldsPlayer::setregs(unsigned char reg, unsigned char val) +inline void +CldsPlayer::setregs (unsigned char reg, unsigned char val) { - if(fmchip[reg] == val) return; + if (fmchip[reg] == val) + return; fmchip[reg] = val; - opl->write(reg, val); + opl->write (reg, val); } -inline void CldsPlayer::setregs_adv(unsigned char reg, unsigned char mask, - unsigned char val) +inline void +CldsPlayer::setregs_adv (unsigned char reg, unsigned char mask, + unsigned char val) { - setregs(reg, (fmchip[reg] & mask) | val); + setregs (reg, (fmchip[reg] & mask) | val); } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/mad.cxx --- a/src/adplug/core/mad.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/mad.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -23,104 +23,122 @@ /* -------- Public Methods -------------------------------- */ -CPlayer *CmadLoader::factory(Copl *newopl) +CPlayer * +CmadLoader::factory (Copl * newopl) { - return new CmadLoader(newopl); + return new CmadLoader (newopl); } -bool CmadLoader::load(VFSFile *fd, const CFileProvider &fp) +bool +CmadLoader::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); if(!f) return false; - const unsigned char conv_inst[10] = { 2,1,10,9,4,3,6,5,8,7 }; + binistream *f = fp.open (fd); + if (!f) + return false; + const unsigned char conv_inst[10] = { 2, 1, 10, 9, 4, 3, 6, 5, 8, 7 }; unsigned int i, j, k, t = 0; // 'MAD+' - signed ? - char id[4]; f->readString(id, 4); - if (strncmp(id,"MAD+",4)) { fp.close(f); return false; } + char id[4]; + f->readString (id, 4); + if (strncmp (id, "MAD+", 4)) + { + fp.close (f); + return false; + } // load instruments - for(i = 0; i < 9; i++) { - f->readString(instruments[i].name, 8); - for(j = 0; j < 12; j++) instruments[i].data[j] = f->readInt(1); + for (i = 0; i < 9; i++) + { + f->readString (instruments[i].name, 8); + for (j = 0; j < 12; j++) + instruments[i].data[j] = f->readInt (1); } - f->ignore(1); + f->ignore (1); // data for Protracker - length = f->readInt(1); nop = f->readInt(1); timer = f->readInt(1); + length = f->readInt (1); + nop = f->readInt (1); + timer = f->readInt (1); // init CmodPlayer - realloc_instruments(9); - realloc_order(length); - realloc_patterns(nop,32,9); - init_trackord(); + realloc_instruments (9); + realloc_order (length); + realloc_patterns (nop, 32, 9); + init_trackord (); // load tracks - for(i = 0; i < nop; i++) - for(k = 0; k < 32; k++) - for(j = 0; j < 9; j++) { - t = i * 9 + j; - - // read event - unsigned char event = f->readInt(1); + for (i = 0; i < nop; i++) + for (k = 0; k < 32; k++) + for (j = 0; j < 9; j++) + { + t = i * 9 + j; - // convert event - if (event < 0x61) - tracks[t][k].note = event; - if (event == 0xFF) // 0xFF: Release note - tracks[t][k].command = 8; - if (event == 0xFE) // 0xFE: Pattern Break - tracks[t][k].command = 13; + // read event + unsigned char event = f->readInt (1); + + // convert event + if (event < 0x61) + tracks[t][k].note = event; + if (event == 0xFF) // 0xFF: Release note + tracks[t][k].command = 8; + if (event == 0xFE) // 0xFE: Pattern Break + tracks[t][k].command = 13; } // load order - for(i = 0; i < length; i++) order[i] = f->readInt(1) - 1; + for (i = 0; i < length; i++) + order[i] = f->readInt (1) - 1; - fp.close(f); + fp.close (f); // convert instruments - for(i = 0; i < 9; i++) - for(j = 0; j < 10; j++) + for (i = 0; i < 9; i++) + for (j = 0; j < 10; j++) inst[i].data[conv_inst[j]] = instruments[i].data[j]; // data for Protracker restartpos = 0; initspeed = 1; - rewind(0); + rewind (0); return true; } -void CmadLoader::rewind(int subsong) +void +CmadLoader::rewind (int subsong) { - CmodPlayer::rewind(subsong); + CmodPlayer::rewind (subsong); - // default instruments - for (int i=0;i<9;i++) - { - channel[i].inst = i; + // default instruments + for (int i = 0; i < 9; i++) + { + channel[i].inst = i; - channel[i].vol1 = 63 - (inst[i].data[10] & 63); - channel[i].vol2 = 63 - (inst[i].data[9] & 63); - } + channel[i].vol1 = 63 - (inst[i].data[10] & 63); + channel[i].vol2 = 63 - (inst[i].data[9] & 63); + } } -float CmadLoader::getrefresh() +float +CmadLoader::getrefresh () { - return (float)timer; + return (float) timer; } -std::string CmadLoader::gettype() +std::string CmadLoader::gettype () { - return std::string("Mlat Adlib Tracker"); + return std::string ("Mlat Adlib Tracker"); } -std::string CmadLoader::getinstrument(unsigned int n) +std::string CmadLoader::getinstrument (unsigned int n) { - return std::string(instruments[n].name,8); + return std::string (instruments[n].name, 8); } -unsigned int CmadLoader::getinstruments() +unsigned int +CmadLoader::getinstruments () { - return 9; + return 9; } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/mid.cxx --- a/src/adplug/core/mid.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/mid.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -82,9 +82,10 @@ #ifdef TESTING #define midiprintf printf #else -void CmidPlayer::midiprintf(char *format, ...) - { - } +void +CmidPlayer::midiprintf (char *format, ...) +{ +} #endif #define LUCAS_STYLE 1 @@ -105,987 +106,1082 @@ #define FILE_OLDLUCAS 6 // AdLib standard operator table -const unsigned char CmidPlayer::adlib_opadd[] = {0x00 ,0x01 ,0x02 ,0x08 ,0x09 ,0x0A ,0x10 ,0x11 ,0x12}; +const unsigned char +CmidPlayer::adlib_opadd[] = + { 0x00, 0x01, 0x02, 0x08, 0x09, 0x0A, 0x10, 0x11, 0x12 }; // dunno -const int CmidPlayer::ops[] = {0x20,0x20,0x40,0x40,0x60,0x60,0x80,0x80,0xe0,0xe0,0xc0}; +const int +CmidPlayer::ops[] = + { 0x20, 0x20, 0x40, 0x40, 0x60, 0x60, 0x80, 0x80, 0xe0, 0xe0, 0xc0 }; // map CMF drum channels 12 - 15 to corresponding AdLib drum operators // bass drum (channel 11) not mapped, cause it's handled like a normal instrument -const int CmidPlayer::map_chan[] = { 0x14, 0x12, 0x15, 0x11 }; +const int +CmidPlayer::map_chan[] = { 0x14, 0x12, 0x15, 0x11 }; // Standard AdLib frequency table -const int CmidPlayer::fnums[] = { 0x16b,0x181,0x198,0x1b0,0x1ca,0x1e5,0x202,0x220,0x241,0x263,0x287,0x2ae }; +const int +CmidPlayer::fnums[] = + { 0x16b, 0x181, 0x198, 0x1b0, 0x1ca, 0x1e5, 0x202, 0x220, 0x241, 0x263, +0x287, 0x2ae }; // Map CMF drum channels 11 - 15 to corresponding AdLib drum channels -const int CmidPlayer::percussion_map[] = { 6, 7, 8, 8, 7 }; +const int +CmidPlayer::percussion_map[] = { 6, 7, 8, 8, 7 }; -CPlayer *CmidPlayer::factory(Copl *newopl) +CPlayer * +CmidPlayer::factory (Copl * newopl) { - return new CmidPlayer(newopl); + return new CmidPlayer (newopl); } -CmidPlayer::CmidPlayer(Copl *newopl) - : CPlayer(newopl), author(&emptystr), title(&emptystr), remarks(&emptystr), - emptystr('\0'), flen(0), data(0) +CmidPlayer::CmidPlayer (Copl * newopl):CPlayer (newopl), author (&emptystr), title (&emptystr), remarks (&emptystr), +emptystr ('\0'), flen (0), data (0) { } -unsigned char CmidPlayer::datalook(long pos) +unsigned char +CmidPlayer::datalook (long pos) { - if (pos<0 || pos >= flen) return(0); - return(data[pos]); + if (pos < 0 || pos >= flen) + return (0); + return (data[pos]); } -unsigned long CmidPlayer::getnexti(unsigned long num) +unsigned long +CmidPlayer::getnexti (unsigned long num) { - unsigned long v=0; - unsigned long i; + unsigned long v = 0; + unsigned long i; - for (i=0; i= 0; i--) + if (pfilename[i] == '/' || pfilename[i] == '\\') + { + j = i + 1; + break; + } + sprintf (pfilename + j + 3, "patch.003"); + + VFSFile *instfd = vfs_fopen (pfilename, "rb"); + f = fp.open (instfd); + free (pfilename); + if (!f) + { + vfs_fclose (instfd); + return false; + } + + f->ignore (2); + stins = 0; + for (i = 0; i < 2; i++) + { + for (k = 0; k < 48; k++) + { + l = i * 48 + k; + midiprintf ("\n%2d: ", l); + for (j = 0; j < 28; j++) + ins[j] = f->readInt (1); - pfilename = (char *)malloc(fname.length()+9); - strcpy(pfilename,fname.c_str()); - j=0; - for(i=strlen(pfilename)-1; i >= 0; i--) - if(pfilename[i] == '/' || pfilename[i] == '\\') { - j = i+1; - break; - } - sprintf(pfilename+j+3,"patch.003"); + myinsbank[l][0] = (ins[9] * 0x80) + (ins[10] * 0x40) + (ins[5] * 0x20) + (ins[11] * 0x10) + ins[1]; //1=ins5 + myinsbank[l][1] = (ins[22] * 0x80) + (ins[23] * 0x40) + (ins[18] * 0x20) + (ins[24] * 0x10) + ins[14]; //1=ins18 + + myinsbank[l][2] = (ins[0] << 6) + ins[8]; + myinsbank[l][3] = (ins[13] << 6) + ins[21]; + + myinsbank[l][4] = (ins[3] << 4) + ins[6]; + myinsbank[l][5] = (ins[16] << 4) + ins[19]; + myinsbank[l][6] = (ins[4] << 4) + ins[7]; + myinsbank[l][7] = (ins[17] << 4) + ins[20]; + + myinsbank[l][8] = ins[26]; + myinsbank[l][9] = ins[27]; + + myinsbank[l][10] = ((ins[2] << 1)) + (1 - (ins[12] & 1)); + //(ins[12] ? 0:1)+((ins[2]<<1)); - VFSFile *instfd = vfs_fopen(pfilename, "rb"); - f = fp.open(instfd); - free(pfilename); - if(!f) { vfs_fclose(instfd); return false; } + for (j = 0; j < 11; j++) + midiprintf ("%02X ", myinsbank[l][j]); + stins++; + } + f->ignore (2); + } - f->ignore(2); - stins = 0; - for (i=0; i<2; i++) - { - for (k=0; k<48; k++) - { - l=i*48+k; - midiprintf ("\n%2d: ",l); - for (j=0; j<28; j++) - ins[j] = f->readInt(1); + fp.close (f); + vfs_fclose (instfd); + memcpy (smyinsbank, myinsbank, 128 * 16); + return true; +} + +void +CmidPlayer::sierra_next_section () +{ + int i, j; + + for (i = 0; i < 16; i++) + track[i].on = 0; + + midiprintf ("\n\nnext adv sierra section:\n"); - myinsbank[l][0]= - (ins[9]*0x80) + (ins[10]*0x40) + - (ins[5]*0x20) + (ins[11]*0x10) + - ins[1]; //1=ins5 - myinsbank[l][1]= - (ins[22]*0x80) + (ins[23]*0x40) + - (ins[18]*0x20) + (ins[24]*0x10) + - ins[14]; //1=ins18 + pos = sierra_pos; + i = 0; + j = 0; + while (i != 0xff) + { + getnext (1); + curtrack = j; + j++; + track[curtrack].on = 1; + track[curtrack].spos = getnext (1); + track[curtrack].spos += (getnext (1) << 8) + 4; //4 best usually +3? not 0,1,2 or 5 +// track[curtrack].spos=getnext(1)+(getnext(1)<<8)+4; // dynamite!: doesn't optimize correctly!! + track[curtrack].tend = flen; //0xFC will kill it + track[curtrack].iwait = 0; + track[curtrack].pv = 0; + midiprintf ("track %d starts at %lx\n", curtrack, track[curtrack].spos); - myinsbank[l][2]=(ins[0]<<6)+ins[8]; - myinsbank[l][3]=(ins[13]<<6)+ins[21]; + getnext (2); + i = getnext (1); + } + getnext (2); + deltas = 0x20; + sierra_pos = pos; + //getch(); - myinsbank[l][4]=(ins[3]<<4)+ins[6]; - myinsbank[l][5]=(ins[16]<<4)+ins[19]; - myinsbank[l][6]=(ins[4]<<4)+ins[7]; - myinsbank[l][7]=(ins[17]<<4)+ins[20]; + fwait = 0; + doing = 1; +} + +bool +CmidPlayer::load (VFSFile * fd, const CFileProvider & fp) +{ + binistream *f = fp.open (fd); + if (!f) + return false; + int good; + unsigned char s[6]; + std::string filename (fd->uri); - myinsbank[l][8]=ins[26]; - myinsbank[l][9]=ins[27]; - - myinsbank[l][10]=((ins[2]<<1))+(1-(ins[12]&1)); - //(ins[12] ? 0:1)+((ins[2]<<1)); + f->readString ((char *) s, 6); + good = 0; + subsongs = 0; + switch (s[0]) + { + case 'A': + if (s[1] == 'D' && s[2] == 'L') + good = FILE_LUCAS; + break; + case 'C': + if (s[1] == 'T' && s[2] == 'M' && s[3] == 'F') + good = FILE_CMF; + break; + case 0x84: + if (s[1] == 0x00 && load_sierra_ins (filename, fp)) + if (s[2] == 0xf0) + good = FILE_ADVSIERRA; + else + good = FILE_SIERRA; + break; + default: + if (s[4] == 'A' && s[5] == 'D') + good = FILE_OLDLUCAS; + break; + } - for (j=0; j<11; j++) - midiprintf ("%02X ",myinsbank[l][j]); - stins++; - } - f->ignore(2); - } + if (good != 0) + subsongs = 1; + else + { + fp.close (f); + return false; + } - fp.close(f); - vfs_fclose(instfd); - memcpy(smyinsbank, myinsbank, 128 * 16); - return true; + type = good; + f->seek (0); + flen = fp.filesize (f); + data = new unsigned char[flen]; + f->readString ((char *) data, flen); + + fp.close (f); + rewind (0); + return true; +} + +void +CmidPlayer::midi_write_adlib (unsigned int r, unsigned char v) +{ + opl->write (r, v); + adlib_data[r] = v; } -void CmidPlayer::sierra_next_section() +void +CmidPlayer::midi_fm_instrument (int voice, unsigned char *inst) { - int i,j; + if ((adlib_style & SIERRA_STYLE) != 0) + midi_write_adlib (0xbd, 0); //just gotta make sure this happens.. + //'cause who knows when it'll be + //reset otherwise. + + + midi_write_adlib (0x20 + adlib_opadd[voice], inst[0]); + midi_write_adlib (0x23 + adlib_opadd[voice], inst[1]); - for (i=0; i<16; i++) - track[i].on=0; + if ((adlib_style & LUCAS_STYLE) != 0) + { + midi_write_adlib (0x43 + adlib_opadd[voice], 0x3f); + if ((inst[10] & 1) == 0) + midi_write_adlib (0x40 + adlib_opadd[voice], inst[2]); + else + midi_write_adlib (0x40 + adlib_opadd[voice], 0x3f); + } + else + { + if ((adlib_style & SIERRA_STYLE) != 0) + { + midi_write_adlib (0x40 + adlib_opadd[voice], inst[2]); + midi_write_adlib (0x43 + adlib_opadd[voice], inst[3]); + } + else + { + midi_write_adlib (0x40 + adlib_opadd[voice], inst[2]); + if ((inst[10] & 1) == 0) + midi_write_adlib (0x43 + adlib_opadd[voice], inst[3]); + else + midi_write_adlib (0x43 + adlib_opadd[voice], 0); + } + } - midiprintf("\n\nnext adv sierra section:\n"); + midi_write_adlib (0x60 + adlib_opadd[voice], inst[4]); + midi_write_adlib (0x63 + adlib_opadd[voice], inst[5]); + midi_write_adlib (0x80 + adlib_opadd[voice], inst[6]); + midi_write_adlib (0x83 + adlib_opadd[voice], inst[7]); + midi_write_adlib (0xe0 + adlib_opadd[voice], inst[8]); + midi_write_adlib (0xe3 + adlib_opadd[voice], inst[9]); + + midi_write_adlib (0xc0 + voice, inst[10]); +} + +void +CmidPlayer::midi_fm_percussion (int ch, unsigned char *inst) +{ + int opadd = map_chan[ch - 12]; + + midi_write_adlib (0x20 + opadd, inst[0]); + midi_write_adlib (0x40 + opadd, inst[2]); + midi_write_adlib (0x60 + opadd, inst[4]); + midi_write_adlib (0x80 + opadd, inst[6]); + midi_write_adlib (0xe0 + opadd, inst[8]); + midi_write_adlib (0xc0 + opadd, inst[10]); +} + +void +CmidPlayer::midi_fm_volume (int voice, int volume) +{ + int vol; + + if ((adlib_style & SIERRA_STYLE) == 0) //sierra likes it loud! + { + vol = volume >> 2; - pos=sierra_pos; - i=0;j=0; - while (i!=0xff) - { - getnext(1); - curtrack=j; j++; - track[curtrack].on=1; - track[curtrack].spos = getnext(1); - track[curtrack].spos += (getnext(1) << 8) + 4; //4 best usually +3? not 0,1,2 or 5 -// track[curtrack].spos=getnext(1)+(getnext(1)<<8)+4; // dynamite!: doesn't optimize correctly!! - track[curtrack].tend=flen; //0xFC will kill it - track[curtrack].iwait=0; - track[curtrack].pv=0; - midiprintf ("track %d starts at %lx\n",curtrack,track[curtrack].spos); + if ((adlib_style & LUCAS_STYLE) != 0) + { + if ((adlib_data[0xc0 + voice] & 1) == 1) + midi_write_adlib (0x40 + adlib_opadd[voice], + (unsigned char) ((63 - vol) | + (adlib_data + [0x40 + + adlib_opadd[voice]] & 0xc0))); + midi_write_adlib (0x43 + adlib_opadd[voice], + (unsigned char) ((63 - vol) | + (adlib_data + [0x43 + + adlib_opadd[voice]] & 0xc0))); + } + else + { + if ((adlib_data[0xc0 + voice] & 1) == 1) + midi_write_adlib (0x40 + adlib_opadd[voice], + (unsigned char) ((63 - vol) | + (adlib_data + [0x40 + + adlib_opadd[voice]] & 0xc0))); + midi_write_adlib (0x43 + adlib_opadd[voice], + (unsigned char) ((63 - vol) | + (adlib_data + [0x43 + + adlib_opadd[voice]] & 0xc0))); + } + } +} - getnext(2); - i=getnext(1); - } - getnext(2); - deltas=0x20; - sierra_pos=pos; - //getch(); +void +CmidPlayer::midi_fm_playnote (int voice, int note, int volume) +{ + int freq = fnums[note % 12]; + int oct = note / 12; + int c; + + midi_fm_volume (voice, volume); + midi_write_adlib (0xa0 + voice, (unsigned char) (freq & 0xff)); + + c = ((freq & 0x300) >> 8) + (oct << 2) + (adlib_mode == ADLIB_MELODIC + || voice < 6 ? (1 << 5) : 0); + midi_write_adlib (0xb0 + voice, (unsigned char) c); +} - fwait=0; - doing=1; +void +CmidPlayer::midi_fm_endnote (int voice) +{ + //midi_fm_volume(voice,0); + //midi_write_adlib(0xb0+voice,0); + + midi_write_adlib (0xb0 + voice, + (unsigned char) (adlib_data[0xb0 + voice] & (255 - 32))); +} + +void +CmidPlayer::midi_fm_reset () +{ + int i; + + opl->init (); + + for (i = 0; i < 256; i++) + midi_write_adlib (i, 0); + + midi_write_adlib (0x01, 0x20); + midi_write_adlib (0xBD, 0xc0); } -bool CmidPlayer::load(VFSFile *fd, const CFileProvider &fp) +bool +CmidPlayer::update () { - binistream *f = fp.open(fd); if(!f) return false; - int good; - unsigned char s[6]; - std::string filename(fd->uri); + long w, v, note, vel, ctrl, nv, x, l, lnum; + int i = 0, j, c; + int on, onl, numchan; + int ret; - f->readString((char *)s, 6); - good=0; - subsongs=0; - switch(s[0]) + if (doing == 1) + { + // just get the first wait and ignore it :> + for (curtrack = 0; curtrack < 16; curtrack++) + if (track[curtrack].on) + { + pos = track[curtrack].pos; + if (type != FILE_SIERRA && type != FILE_ADVSIERRA) + track[curtrack].iwait += getval (); + else + track[curtrack].iwait += getnext (1); + track[curtrack].pos = pos; + } + doing = 0; + } + + iwait = 0; + ret = 1; + + while (iwait == 0 && ret == 1) + { + for (curtrack = 0; curtrack < 16; curtrack++) + if (track[curtrack].on && track[curtrack].iwait == 0 && + track[curtrack].pos < track[curtrack].tend) + { + pos = track[curtrack].pos; + + v = getnext (1); + + // This is to do implied MIDI events. + if (v < 0x80) { - case 'A': - if (s[1]=='D' && s[2]=='L') good=FILE_LUCAS; - break; - case 'C': - if (s[1]=='T' && s[2]=='M' && s[3]=='F') good=FILE_CMF; - break; - case 0x84: - if (s[1]==0x00 && load_sierra_ins(filename, fp)) - if (s[2]==0xf0) - good=FILE_ADVSIERRA; - else - good=FILE_SIERRA; - break; - default: - if (s[4]=='A' && s[5]=='D') good=FILE_OLDLUCAS; - break; + v = track[curtrack].pv; + pos--; } + track[curtrack].pv = (unsigned char) v; - if (good!=0) - subsongs=1; - else { - fp.close(f); - return false; - } + c = v & 0x0f; + midiprintf ("[%2X]", v); + switch (v & 0xf0) + { + case 0x80: /*note off */ + note = getnext (1); + vel = getnext (1); + for (i = 0; i < 9; i++) + if (chp[i][0] == c && chp[i][1] == note) + { + midi_fm_endnote (i); + chp[i][0] = -1; + } + break; + case 0x90: /*note on */ + // doing=0; + note = getnext (1); + vel = getnext (1); + + if (adlib_mode == ADLIB_RYTHM) + numchan = 6; + else + numchan = 9; - type=good; - f->seek(0); - flen = fp.filesize(f); - data = new unsigned char [flen]; - f->readString((char *)data, flen); + if (ch[c].on != 0) + { + for (i = 0; i < 18; i++) + chp[i][2]++; - fp.close(f); - rewind(0); - return true; -} + if (c < 11 || adlib_mode == ADLIB_MELODIC) + { + j = 0; + on = -1; + onl = 0; + for (i = 0; i < numchan; i++) + if (chp[i][0] == -1 && chp[i][2] > onl) + { + onl = chp[i][2]; + on = i; + j = 1; + } -void CmidPlayer::midi_write_adlib(unsigned int r, unsigned char v) -{ - opl->write(r,v); - adlib_data[r]=v; -} + if (on == -1) + { + onl = 0; + for (i = 0; i < numchan; i++) + if (chp[i][2] > onl) + { + onl = chp[i][2]; + on = i; + } + } + + if (j == 0) + midi_fm_endnote (on); + } + else + on = percussion_map[c - 11]; -void CmidPlayer::midi_fm_instrument(int voice, unsigned char *inst) -{ - if ((adlib_style&SIERRA_STYLE)!=0) - midi_write_adlib(0xbd,0); //just gotta make sure this happens.. - //'cause who knows when it'll be - //reset otherwise. - - - midi_write_adlib(0x20+adlib_opadd[voice],inst[0]); - midi_write_adlib(0x23+adlib_opadd[voice],inst[1]); + if (vel != 0 && ch[c].inum >= 0 && ch[c].inum < 128) + { + if (adlib_mode == ADLIB_MELODIC || c < 12) + midi_fm_instrument (on, ch[c].ins); + else + midi_fm_percussion (c, ch[c].ins); - if ((adlib_style&LUCAS_STYLE)!=0) - { - midi_write_adlib(0x43+adlib_opadd[voice],0x3f); - if ((inst[10] & 1)==0) - midi_write_adlib(0x40+adlib_opadd[voice],inst[2]); - else - midi_write_adlib(0x40+adlib_opadd[voice],0x3f); - } - else - { - if ((adlib_style&SIERRA_STYLE)!=0) - { - midi_write_adlib(0x40+adlib_opadd[voice],inst[2]); - midi_write_adlib(0x43+adlib_opadd[voice],inst[3]); + if ((adlib_style & MIDI_STYLE) != 0) + { + nv = ((ch[c].vol * vel) / 128); + if ((adlib_style & LUCAS_STYLE) != 0) + nv *= 2; + if (nv > 127) + nv = 127; + nv = my_midi_fm_vol_table[nv]; + if ((adlib_style & LUCAS_STYLE) != 0) + nv = (int) ((float) sqrt ((float) nv) * 11); + } + else + { + nv = vel; + } + + midi_fm_playnote (on, note + ch[c].nshift, nv * 2); + chp[on][0] = c; + chp[on][1] = note; + chp[on][2] = 0; + + if (adlib_mode == ADLIB_RYTHM && c >= 11) + { + midi_write_adlib (0xbd, + adlib_data[0xbd] & ~(0x10 >> (c - 11))); + midi_write_adlib (0xbd, + adlib_data[0xbd] | (0x10 >> (c - 11))); + } + } else { - midi_write_adlib(0x40+adlib_opadd[voice],inst[2]); - if ((inst[10] & 1)==0) - midi_write_adlib(0x43+adlib_opadd[voice],inst[3]); - else - midi_write_adlib(0x43+adlib_opadd[voice],0); + if (vel == 0) //same code as end note + { + for (i = 0; i < 9; i++) + if (chp[i][0] == c && chp[i][1] == note) + { + // midi_fm_volume(i,0); // really end the note + midi_fm_endnote (i); + chp[i][0] = -1; + } + } + else + { // i forget what this is for. + chp[on][0] = -1; + chp[on][2] = 0; + } } - } + midiprintf (" [%d:%d:%d:%d]\n", c, ch[c].inum, note, vel); + } + else + midiprintf ("off"); + break; + case 0xa0: /*key after touch */ + note = getnext (1); + vel = getnext (1); + /* //this might all be good + for (i=0; i<9; i++) + if (chp[i][0]==c & chp[i][1]==note) - midi_write_adlib(0x60+adlib_opadd[voice],inst[4]); - midi_write_adlib(0x63+adlib_opadd[voice],inst[5]); - midi_write_adlib(0x80+adlib_opadd[voice],inst[6]); - midi_write_adlib(0x83+adlib_opadd[voice],inst[7]); - midi_write_adlib(0xe0+adlib_opadd[voice],inst[8]); - midi_write_adlib(0xe3+adlib_opadd[voice],inst[9]); - - midi_write_adlib(0xc0+voice,inst[10]); -} + midi_fm_playnote(i,note+cnote[c],my_midi_fm_vol_table[(cvols[c]*vel)/128]*2); + */ + break; + case 0xb0: /*control change .. pitch bend? */ + ctrl = getnext (1); + vel = getnext (1); -void CmidPlayer::midi_fm_percussion(int ch, unsigned char *inst) -{ - int opadd = map_chan[ch - 12]; + switch (ctrl) + { + case 0x07: + midiprintf ("(pb:%d: %d %d)", c, ctrl, vel); + ch[c].vol = vel; + midiprintf ("vol"); + break; + case 0x67: + midiprintf ("\n\nhere:%d\n\n", vel); + if ((adlib_style & CMF_STYLE) != 0) + { + adlib_mode = vel; + if (adlib_mode == ADLIB_RYTHM) + midi_write_adlib (0xbd, adlib_data[0xbd] | (1 << 5)); + else + midi_write_adlib (0xbd, adlib_data[0xbd] & ~(1 << 5)); + } + break; + } + break; + case 0xc0: /*patch change */ + x = getnext (1); + ch[c].inum = x; + for (j = 0; j < 11; j++) + ch[c].ins[j] = myinsbank[ch[c].inum][j]; + break; + case 0xd0: /*chanel touch */ + x = getnext (1); + break; + case 0xe0: /*pitch wheel */ + x = getnext (1); + x = getnext (1); + break; + case 0xf0: + switch (v) + { + case 0xf0: + case 0xf7: /*sysex */ + l = getval (); + if (datalook (pos + l) == 0xf7) + i = 1; + midiprintf ("{%d}", l); + midiprintf ("\n"); - midi_write_adlib(0x20 + opadd, inst[0]); - midi_write_adlib(0x40 + opadd, inst[2]); - midi_write_adlib(0x60 + opadd, inst[4]); - midi_write_adlib(0x80 + opadd, inst[6]); - midi_write_adlib(0xe0 + opadd, inst[8]); - midi_write_adlib(0xc0 + opadd, inst[10]); -} - -void CmidPlayer::midi_fm_volume(int voice, int volume) -{ - int vol; - - if ((adlib_style&SIERRA_STYLE)==0) //sierra likes it loud! - { - vol=volume>>2; + if (datalook (pos) == 0x7d && + datalook (pos + 1) == 0x10 && datalook (pos + 2) < 16) + { + adlib_style = LUCAS_STYLE | MIDI_STYLE; + for (i = 0; i < l; i++) + { + midiprintf ("%x ", datalook (pos + i)); + if ((i - 3) % 10 == 0) + midiprintf ("\n"); + } + midiprintf ("\n"); + getnext (1); + getnext (1); + c = getnext (1); + getnext (1); - if ((adlib_style&LUCAS_STYLE)!=0) - { - if ((adlib_data[0xc0+voice]&1)==1) - midi_write_adlib(0x40+adlib_opadd[voice], (unsigned char)((63-vol) | - (adlib_data[0x40+adlib_opadd[voice]]&0xc0))); - midi_write_adlib(0x43+adlib_opadd[voice], (unsigned char)((63-vol) | - (adlib_data[0x43+adlib_opadd[voice]]&0xc0))); - } - else - { - if ((adlib_data[0xc0+voice]&1)==1) - midi_write_adlib(0x40+adlib_opadd[voice], (unsigned char)((63-vol) | - (adlib_data[0x40+adlib_opadd[voice]]&0xc0))); - midi_write_adlib(0x43+adlib_opadd[voice], (unsigned char)((63-vol) | - (adlib_data[0x43+adlib_opadd[voice]]&0xc0))); - } - } -} + // getnext(22); //temp + ch[c].ins[0] = + (unsigned char) ((getnext (1) << 4) + getnext (1)); + ch[c].ins[2] = + (unsigned char) (0xff - + (((getnext (1) << 4) + getnext (1)) & 0x3f)); + ch[c].ins[4] = + (unsigned char) (0xff - ((getnext (1) << 4) + getnext (1))); + ch[c].ins[6] = + (unsigned char) (0xff - ((getnext (1) << 4) + getnext (1))); + ch[c].ins[8] = + (unsigned char) ((getnext (1) << 4) + getnext (1)); -void CmidPlayer::midi_fm_playnote(int voice, int note, int volume) -{ - int freq=fnums[note%12]; - int oct=note/12; - int c; - - midi_fm_volume(voice,volume); - midi_write_adlib(0xa0+voice,(unsigned char)(freq&0xff)); + ch[c].ins[1] = + (unsigned char) ((getnext (1) << 4) + getnext (1)); + ch[c].ins[3] = + (unsigned char) (0xff - + (((getnext (1) << 4) + getnext (1)) & 0x3f)); + ch[c].ins[5] = + (unsigned char) (0xff - ((getnext (1) << 4) + getnext (1))); + ch[c].ins[7] = + (unsigned char) (0xff - ((getnext (1) << 4) + getnext (1))); + ch[c].ins[9] = + (unsigned char) ((getnext (1) << 4) + getnext (1)); - c=((freq&0x300) >> 8)+(oct<<2) + (adlib_mode == ADLIB_MELODIC || voice < 6 ? (1<<5) : 0); - midi_write_adlib(0xb0+voice,(unsigned char)c); -} + i = (getnext (1) << 4) + getnext (1); + ch[c].ins[10] = i; + + //if ((i&1)==1) ch[c].ins[10]=1; -void CmidPlayer::midi_fm_endnote(int voice) -{ - //midi_fm_volume(voice,0); - //midi_write_adlib(0xb0+voice,0); + midiprintf ("\n%d: ", c); + for (i = 0; i < 11; i++) + midiprintf ("%2X ", ch[c].ins[i]); + getnext (l - 26); + } + else + { + midiprintf ("\n"); + for (j = 0; j < l; j++) + midiprintf ("%2X ", getnext (1)); + } - midi_write_adlib(0xb0+voice,(unsigned char)(adlib_data[0xb0+voice]&(255-32))); -} - -void CmidPlayer::midi_fm_reset() -{ - int i; - - opl->init(); - - for (i=0; i<256; i++) - midi_write_adlib(i,0); - - midi_write_adlib(0x01, 0x20); - midi_write_adlib(0xBD,0xc0); -} - -bool CmidPlayer::update() -{ - long w,v,note,vel,ctrl,nv,x,l,lnum; - int i=0,j,c; - int on,onl,numchan; - int ret; - - if (doing == 1) - { - // just get the first wait and ignore it :> - for (curtrack=0; curtrack<16; curtrack++) - if (track[curtrack].on) - { - pos=track[curtrack].pos; - if (type != FILE_SIERRA && type !=FILE_ADVSIERRA) - track[curtrack].iwait+=getval(); - else - track[curtrack].iwait+=getnext(1); - track[curtrack].pos=pos; - } - doing=0; + midiprintf ("\n"); + if (i == 1) + getnext (1); + break; + case 0xf1: + break; + case 0xf2: + getnext (2); + break; + case 0xf3: + getnext (1); + break; + case 0xf4: + break; + case 0xf5: + break; + case 0xf6: /*something */ + case 0xf8: + case 0xfa: + case 0xfb: + case 0xfc: + //this ends the track for sierra. + if (type == FILE_SIERRA || type == FILE_ADVSIERRA) + { + track[curtrack].tend = pos; + midiprintf ("endmark: %ld -- %lx\n", pos, pos); + } + break; + case 0xfe: + break; + case 0xfd: + break; + case 0xff: + v = getnext (1); + l = getval (); + midiprintf ("\n"); + midiprintf ("{%X_%X}", v, l); + if (v == 0x51) + { + lnum = getnext (l); + msqtr = lnum; /*set tempo */ + midiprintf ("(qtr=%ld)", msqtr); + } + else + { + for (i = 0; i < l; i++) + midiprintf ("%2X ", getnext (1)); + } + break; + } + break; + default: + midiprintf ("!", v); /* if we get down here, a error occurred */ + break; } - iwait=0; - ret=1; - - while (iwait==0 && ret==1) - { - for (curtrack=0; curtrack<16; curtrack++) - if (track[curtrack].on && track[curtrack].iwait==0 && - track[curtrack].pos < track[curtrack].tend) + if (pos < track[curtrack].tend) { - pos=track[curtrack].pos; - - v=getnext(1); - - // This is to do implied MIDI events. - if (v<0x80) {v=track[curtrack].pv; pos--;} - track[curtrack].pv=(unsigned char)v; - - c=v&0x0f; - midiprintf ("[%2X]",v); - switch(v&0xf0) - { - case 0x80: /*note off*/ - note=getnext(1); vel=getnext(1); - for (i=0; i<9; i++) - if (chp[i][0]==c && chp[i][1]==note) - { - midi_fm_endnote(i); - chp[i][0]=-1; - } - break; - case 0x90: /*note on*/ - // doing=0; - note=getnext(1); vel=getnext(1); - - if(adlib_mode == ADLIB_RYTHM) - numchan = 6; - else - numchan = 9; - - if (ch[c].on!=0) - { - for (i=0; i<18; i++) - chp[i][2]++; - - if(c < 11 || adlib_mode == ADLIB_MELODIC) { - j=0; - on=-1;onl=0; - for (i=0; ionl) - { onl=chp[i][2]; on=i; j=1; } - - if (on==-1) - { - onl=0; - for (i=0; ionl) - { onl=chp[i][2]; on=i; } - } - - if (j==0) - midi_fm_endnote(on); - } else - on = percussion_map[c - 11]; + if (type != FILE_SIERRA && type != FILE_ADVSIERRA) + w = getval (); + else + w = getnext (1); + track[curtrack].iwait = w; + /* + if (w!=0) + { + midiprintf("\n<%d>",w); + f = + ((float)w/(float)deltas)*((float)msqtr/(float)1000000); + if (doing==1) f=0; //not playing yet. don't wait yet + } + */ + } + else + track[curtrack].iwait = 0; - if (vel!=0 && ch[c].inum>=0 && ch[c].inum<128) - { - if (adlib_mode == ADLIB_MELODIC || c < 12) - midi_fm_instrument(on,ch[c].ins); - else - midi_fm_percussion(c, ch[c].ins); - - if ((adlib_style&MIDI_STYLE)!=0) - { - nv=((ch[c].vol*vel)/128); - if ((adlib_style&LUCAS_STYLE)!=0) - nv*=2; - if (nv>127) nv=127; - nv=my_midi_fm_vol_table[nv]; - if ((adlib_style&LUCAS_STYLE)!=0) - nv=(int)((float)sqrt((float)nv)*11); - } - else - { - nv=vel; - } - - midi_fm_playnote(on,note+ch[c].nshift,nv*2); - chp[on][0]=c; - chp[on][1]=note; - chp[on][2]=0; - - if(adlib_mode == ADLIB_RYTHM && c >= 11) { - midi_write_adlib(0xbd, adlib_data[0xbd] & ~(0x10 >> (c - 11))); - midi_write_adlib(0xbd, adlib_data[0xbd] | (0x10 >> (c - 11))); - } + track[curtrack].pos = pos; + } - } - else - { - if (vel==0) //same code as end note - { - for (i=0; i<9; i++) - if (chp[i][0]==c && chp[i][1]==note) - { - // midi_fm_volume(i,0); // really end the note - midi_fm_endnote(i); - chp[i][0]=-1; - } - } - else - { // i forget what this is for. - chp[on][0]=-1; - chp[on][2]=0; - } - } - midiprintf(" [%d:%d:%d:%d]\n",c,ch[c].inum,note,vel); - } - else - midiprintf ("off"); - break; - case 0xa0: /*key after touch */ - note=getnext(1); vel=getnext(1); - /* //this might all be good - for (i=0; i<9; i++) - if (chp[i][0]==c & chp[i][1]==note) - -midi_fm_playnote(i,note+cnote[c],my_midi_fm_vol_table[(cvols[c]*vel)/128]*2); - */ - break; - case 0xb0: /*control change .. pitch bend? */ - ctrl=getnext(1); vel=getnext(1); - switch(ctrl) - { - case 0x07: - midiprintf ("(pb:%d: %d %d)",c,ctrl,vel); - ch[c].vol=vel; - midiprintf("vol"); - break; - case 0x67: - midiprintf ("\n\nhere:%d\n\n",vel); - if ((adlib_style&CMF_STYLE)!=0) { - adlib_mode=vel; - if(adlib_mode == ADLIB_RYTHM) - midi_write_adlib(0xbd, adlib_data[0xbd] | (1 << 5)); - else - midi_write_adlib(0xbd, adlib_data[0xbd] & ~(1 << 5)); - } - break; - } - break; - case 0xc0: /*patch change*/ - x=getnext(1); - ch[c].inum=x; - for (j=0; j<11; j++) - ch[c].ins[j]=myinsbank[ch[c].inum][j]; - break; - case 0xd0: /*chanel touch*/ - x=getnext(1); - break; - case 0xe0: /*pitch wheel*/ - x=getnext(1); - x=getnext(1); - break; - case 0xf0: - switch(v) - { - case 0xf0: - case 0xf7: /*sysex*/ - l=getval(); - if (datalook(pos+l)==0xf7) - i=1; - midiprintf("{%d}",l); - midiprintf("\n"); - - if (datalook(pos)==0x7d && - datalook(pos+1)==0x10 && - datalook(pos+2)<16) - { - adlib_style=LUCAS_STYLE|MIDI_STYLE; - for (i=0; i",w); - f = -((float)w/(float)deltas)*((float)msqtr/(float)1000000); - if (doing==1) f=0; //not playing yet. don't wait yet - } - */ - } - else - track[curtrack].iwait=0; - - track[curtrack].pos=pos; - } + if (iwait != 0 && ret == 1) + { + for (curtrack = 0; curtrack < 16; curtrack++) + if (track[curtrack].on) + track[curtrack].iwait -= iwait; - ret=0; //end of song. - iwait=0; - for (curtrack=0; curtrack<16; curtrack++) - if (track[curtrack].on == 1 && - track[curtrack].pos < track[curtrack].tend) - ret=1; //not yet.. + fwait = + 1.0f / (((float) iwait / (float) deltas) * + ((float) msqtr / (float) 1000000)); + } + else + fwait = 50; // 1/50th of a second - if (ret==1) - { - iwait=0xffffff; // bigger than any wait can be! - for (curtrack=0; curtrack<16; curtrack++) - if (track[curtrack].on == 1 && - track[curtrack].pos < track[curtrack].tend && - track[curtrack].iwait < iwait) - iwait=track[curtrack].iwait; - } - } - - - if (iwait !=0 && ret==1) - { - for (curtrack=0; curtrack<16; curtrack++) - if (track[curtrack].on) - track[curtrack].iwait-=iwait; + midiprintf ("\n"); + for (i = 0; i < 16; i++) + if (track[i].on) + if (track[i].pos < track[i].tend) + midiprintf ("<%d>", track[i].iwait); + else + midiprintf ("stop"); - -fwait=1.0f/(((float)iwait/(float)deltas)*((float)msqtr/(float)1000000)); - } - else - fwait=50; // 1/50th of a second - - midiprintf ("\n"); - for (i=0; i<16; i++) - if (track[i].on) - if (track[i].pos < track[i].tend) - midiprintf ("<%d>",track[i].iwait); - else - midiprintf("stop"); + /* + if (ret==0 && type==FILE_ADVSIERRA) + if (datalook(sierra_pos-2)!=0xff) + { + midiprintf ("next sectoin!"); + sierra_next_section(p); + fwait=50; + ret=1; + } + */ - /* - if (ret==0 && type==FILE_ADVSIERRA) - if (datalook(sierra_pos-2)!=0xff) - { - midiprintf ("next sectoin!"); - sierra_next_section(p); - fwait=50; - ret=1; - } - */ - - if(ret) - return true; - else - return false; + if (ret) + return true; + else + return false; } -float CmidPlayer::getrefresh() +float +CmidPlayer::getrefresh () { - return (fwait > 0.01f ? fwait : 0.01f); + return (fwait > 0.01f ? fwait : 0.01f); } -void CmidPlayer::rewind(int subsong) +void +CmidPlayer::rewind (int subsong) { - long i,j,n,m,l; - long o_sierra_pos; - unsigned char ins[16]; + long i, j, n, m, l; + long o_sierra_pos; + unsigned char ins[16]; - pos=0; tins=0; - adlib_style=MIDI_STYLE|CMF_STYLE; - adlib_mode=ADLIB_MELODIC; - for (i=0; i<128; i++) - for (j=0; j<16; j++) - myinsbank[i][j]=midi_fm_instruments[i][j]; - for (i=0; i<16; i++) - { - ch[i].inum=0; - for (j=0; j<11; j++) - ch[i].ins[j]=myinsbank[ch[i].inum][j]; - ch[i].vol=127; - ch[i].nshift=-25; - ch[i].on=1; - } + pos = 0; + tins = 0; + adlib_style = MIDI_STYLE | CMF_STYLE; + adlib_mode = ADLIB_MELODIC; + for (i = 0; i < 128; i++) + for (j = 0; j < 16; j++) + myinsbank[i][j] = midi_fm_instruments[i][j]; + for (i = 0; i < 16; i++) + { + ch[i].inum = 0; + for (j = 0; j < 11; j++) + ch[i].ins[j] = myinsbank[ch[i].inum][j]; + ch[i].vol = 127; + ch[i].nshift = -25; + ch[i].on = 1; + } - /* General init */ - for (i=0; i<9; i++) - { - chp[i][0]=-1; - chp[i][2]=0; - } + /* General init */ + for (i = 0; i < 9; i++) + { + chp[i][0] = -1; + chp[i][2] = 0; + } - deltas=250; // just a number, not a standard - msqtr=500000; - fwait=123; // gotta be a small thing.. sorta like nothing - iwait=0; + deltas = 250; // just a number, not a standard + msqtr = 500000; + fwait = 123; // gotta be a small thing.. sorta like nothing + iwait = 0; - subsongs=1; + subsongs = 1; - for (i=0; i<16; i++) - { - track[i].tend=0; - track[i].spos=0; - track[i].pos=0; - track[i].iwait=0; - track[i].on=0; - track[i].pv=0; - } - curtrack=0; - - /* specific to file-type init */ + for (i = 0; i < 16; i++) + { + track[i].tend = 0; + track[i].spos = 0; + track[i].pos = 0; + track[i].iwait = 0; + track[i].on = 0; + track[i].pv = 0; + } + curtrack = 0; - pos=0; - i=getnext(1); - switch(type) - { - case FILE_LUCAS: - getnext(24); //skip junk and get to the midi. - adlib_style=LUCAS_STYLE|MIDI_STYLE; - //note: no break, we go right into midi headers... - case FILE_MIDI: - if (type != FILE_LUCAS) - tins=128; - getnext(11); /*skip header*/ - deltas=getnext(2); - midiprintf ("deltas:%ld\n",deltas); - getnext(4); + /* specific to file-type init */ + + pos = 0; + i = getnext (1); + switch (type) + { + case FILE_LUCAS: + getnext (24); //skip junk and get to the midi. + adlib_style = LUCAS_STYLE | MIDI_STYLE; + //note: no break, we go right into midi headers... + case FILE_MIDI: + if (type != FILE_LUCAS) + tins = 128; + getnext (11); /*skip header */ + deltas = getnext (2); + midiprintf ("deltas:%ld\n", deltas); + getnext (4); - curtrack=0; - track[curtrack].on=1; - track[curtrack].tend=getnext(4); - track[curtrack].spos=pos; - midiprintf ("tracklen:%ld\n",track[curtrack].tend); - break; - case FILE_CMF: - getnext(3); // ctmf - getnexti(2); //version - n=getnexti(2); // instrument offset - m=getnexti(2); // music offset - deltas=getnexti(2); //ticks/qtr note - msqtr=1000000/getnexti(2)*deltas; - //the stuff in the cmf is click ticks per second.. + curtrack = 0; + track[curtrack].on = 1; + track[curtrack].tend = getnext (4); + track[curtrack].spos = pos; + midiprintf ("tracklen:%ld\n", track[curtrack].tend); + break; + case FILE_CMF: + getnext (3); // ctmf + getnexti (2); //version + n = getnexti (2); // instrument offset + m = getnexti (2); // music offset + deltas = getnexti (2); //ticks/qtr note + msqtr = 1000000 / getnexti (2) * deltas; + //the stuff in the cmf is click ticks per second.. - i=getnexti(2); - if(i) title = (char *)data+i; - i=getnexti(2); - if(i) author = (char *)data+i; - i=getnexti(2); - if(i) remarks = (char *)data+i; - - getnext(16); // channel in use table .. - i=getnexti(2); // num instr - if (i>128) i=128; // to ward of bad numbers... - getnexti(2); //basic tempo + i = getnexti (2); + if (i) + title = (char *) data + i; + i = getnexti (2); + if (i) + author = (char *) data + i; + i = getnexti (2); + if (i) + remarks = (char *) data + i; - midiprintf("\nioff:%d\nmoff%d\ndeltas:%ld\nmsqtr:%ld\nnumi:%d\n", - n,m,deltas,msqtr,i); - pos=n; // jump to instruments - tins=i; - for (j=0; j 128) + i = 128; // to ward of bad numbers... + getnexti (2); //basic tempo - for (i=0; i<16; i++) - ch[i].nshift=-13; - - adlib_style=CMF_STYLE; + midiprintf ("\nioff:%d\nmoff%d\ndeltas:%ld\nmsqtr:%ld\nnumi:%d\n", + n, m, deltas, msqtr, i); + pos = n; // jump to instruments + tins = i; + for (j = 0; j < i; j++) + { + midiprintf ("\n%d: ", j); + for (l = 0; l < 16; l++) + { + myinsbank[j][l] = (unsigned char) getnext (1); + midiprintf ("%2X ", myinsbank[j][l]); + } + } - curtrack=0; - track[curtrack].on=1; - track[curtrack].tend=flen; // music until the end of the file - track[curtrack].spos=m; //jump to midi music - break; - case FILE_OLDLUCAS: - msqtr=250000; - pos=9; - deltas=getnext(1); + for (i = 0; i < 16; i++) + ch[i].nshift = -13; - i=8; - pos=0x19; // jump to instruments - tins=i; - for (j=0; j= subsongs) subsong=0; + o_sierra_pos = sierra_pos = pos; + sierra_next_section (); + while (datalook (sierra_pos - 2) != 0xff) + { + sierra_next_section (); + subsongs++; + } + + if (subsong < 0 || subsong >= subsongs) + subsong = 0; - sierra_pos=o_sierra_pos; - sierra_next_section(); - i=0; - while (i != subsong) - { - sierra_next_section(); - i++; - } + sierra_pos = o_sierra_pos; + sierra_next_section (); + i = 0; + while (i != subsong) + { + sierra_next_section (); + i++; + } - adlib_style=SIERRA_STYLE|MIDI_STYLE; //advanced sierra tunes use volume - break; - case FILE_SIERRA: - memcpy(myinsbank, smyinsbank, 128 * 16); - tins = stins; - getnext(2); - deltas=0x20; + adlib_style = SIERRA_STYLE | MIDI_STYLE; //advanced sierra tunes use volume + break; + case FILE_SIERRA: + memcpy (myinsbank, smyinsbank, 128 * 16); + tins = stins; + getnext (2); + deltas = 0x20; - curtrack=0; - track[curtrack].on=1; - track[curtrack].tend=flen; // music until the end of the file + curtrack = 0; + track[curtrack].on = 1; + track[curtrack].tend = flen; // music until the end of the file - for (i=0; i<16; i++) - { - ch[i].nshift=-13; - ch[i].on=getnext(1); - ch[i].inum=getnext(1); - for (j=0; j<11; j++) - ch[i].ins[j]=myinsbank[ch[i].inum][j]; - } + for (i = 0; i < 16; i++) + { + ch[i].nshift = -13; + ch[i].on = getnext (1); + ch[i].inum = getnext (1); + for (j = 0; j < 11; j++) + ch[i].ins[j] = myinsbank[ch[i].inum][j]; + } - track[curtrack].spos=pos; - adlib_style=SIERRA_STYLE|MIDI_STYLE; - break; - } + track[curtrack].spos = pos; + adlib_style = SIERRA_STYLE | MIDI_STYLE; + break; + } /* sprintf(info,"%s\r\nTicks/Quarter Note: %ld\r\n",info,deltas); sprintf(info,"%sms/Quarter Note: %ld",info,msqtr); */ - for (i=0; i<16; i++) - if (track[i].on) - { - track[i].pos=track[i].spos; - track[i].pv=0; - track[i].iwait=0; - } + for (i = 0; i < 16; i++) + if (track[i].on) + { + track[i].pos = track[i].spos; + track[i].pv = 0; + track[i].iwait = 0; + } - doing=1; - midi_fm_reset(); + doing = 1; + midi_fm_reset (); } -std::string CmidPlayer::gettype() +std::string CmidPlayer::gettype () { - switch(type) { - case FILE_LUCAS: - return std::string("LucasArts AdLib MIDI"); - case FILE_MIDI: - return std::string("General MIDI"); - case FILE_CMF: - return std::string("Creative Music Format (CMF MIDI)"); - case FILE_OLDLUCAS: - return std::string("Lucasfilm Adlib MIDI"); - case FILE_ADVSIERRA: - return std::string("Sierra On-Line VGA MIDI"); - case FILE_SIERRA: - return std::string("Sierra On-Line EGA MIDI"); - default: - return std::string("MIDI unknown"); - } + switch (type) + { + case FILE_LUCAS: + return std::string ("LucasArts AdLib MIDI"); + case FILE_MIDI: + return std::string ("General MIDI"); + case FILE_CMF: + return std::string ("Creative Music Format (CMF MIDI)"); + case FILE_OLDLUCAS: + return std::string ("Lucasfilm Adlib MIDI"); + case FILE_ADVSIERRA: + return std::string ("Sierra On-Line VGA MIDI"); + case FILE_SIERRA: + return std::string ("Sierra On-Line EGA MIDI"); + default: + return std::string ("MIDI unknown"); + } } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/mkj.cxx --- a/src/adplug/core/mkj.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/mkj.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -24,129 +24,189 @@ #include "mkj.h" #include "debug.h" -CPlayer *CmkjPlayer::factory(Copl *newopl) +CPlayer * +CmkjPlayer::factory (Copl * newopl) { - return new CmkjPlayer(newopl); + return new CmkjPlayer (newopl); } -bool CmkjPlayer::load(VFSFile *fd, const CFileProvider &fp) +bool +CmkjPlayer::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); if(!f) return false; - char id[6]; - float ver; - int i, j; - short inst[8]; + binistream *f = fp.open (fd); + if (!f) + return false; + char id[6]; + float ver; + int i, j; + short inst[8]; // file validation - f->readString(id, 6); - if(strncmp(id,"MKJamz",6)) { fp.close(f); return false; } - ver = f->readFloat(binio::Single); - if(ver > 1.12) { fp.close(f); return false; } + f->readString (id, 6); + if (strncmp (id, "MKJamz", 6)) + { + fp.close (f); + return false; + } + ver = f->readFloat (binio::Single); + if (ver > 1.12) + { + fp.close (f); + return false; + } // load - maxchannel = f->readInt(2); - opl->init(); opl->write(1, 32); - for(i = 0; i < maxchannel; i++) { - for(j = 0; j < 8; j++) inst[j] = f->readInt(2); - opl->write(0x20+op_table[i],inst[4]); - opl->write(0x23+op_table[i],inst[0]); - opl->write(0x40+op_table[i],inst[5]); - opl->write(0x43+op_table[i],inst[1]); - opl->write(0x60+op_table[i],inst[6]); - opl->write(0x63+op_table[i],inst[2]); - opl->write(0x80+op_table[i],inst[7]); - opl->write(0x83+op_table[i],inst[3]); + maxchannel = f->readInt (2); + opl->init (); + opl->write (1, 32); + for (i = 0; i < maxchannel; i++) + { + for (j = 0; j < 8; j++) + inst[j] = f->readInt (2); + opl->write (0x20 + op_table[i], inst[4]); + opl->write (0x23 + op_table[i], inst[0]); + opl->write (0x40 + op_table[i], inst[5]); + opl->write (0x43 + op_table[i], inst[1]); + opl->write (0x60 + op_table[i], inst[6]); + opl->write (0x63 + op_table[i], inst[2]); + opl->write (0x80 + op_table[i], inst[7]); + opl->write (0x83 + op_table[i], inst[3]); } - maxnotes = f->readInt(2); - songbuf = new short [(maxchannel+1)*maxnotes]; - for(i = 0; i < maxchannel; i++) channel[i].defined = f->readInt(2); - for(i = 0; i < (maxchannel + 1) * maxnotes; i++) - songbuf[i] = f->readInt(2); + maxnotes = f->readInt (2); + songbuf = new short[(maxchannel + 1) * maxnotes]; + for (i = 0; i < maxchannel; i++) + channel[i].defined = f->readInt (2); + for (i = 0; i < (maxchannel + 1) * maxnotes; i++) + songbuf[i] = f->readInt (2); - AdPlug_LogWrite("CmkjPlayer::load(\"%s\"): loaded file ver %.2f, %d channels," - " %d notes/channel.\n", fd->uri, ver, maxchannel, - maxnotes); - fp.close(f); - rewind(0); + AdPlug_LogWrite + ("CmkjPlayer::load(\"%s\"): loaded file ver %.2f, %d channels," + " %d notes/channel.\n", fd->uri, ver, maxchannel, maxnotes); + fp.close (f); + rewind (0); return true; } -bool CmkjPlayer::update() +bool +CmkjPlayer::update () { int c, i; short note; - for(c = 0; c < maxchannel; c++) { - if(!channel[c].defined) // skip if channel is disabled + for (c = 0; c < maxchannel; c++) + { + if (!channel[c].defined) // skip if channel is disabled continue; - if(channel[c].pstat) { + if (channel[c].pstat) + { channel[c].pstat--; continue; } - opl->write(0xb0 + c, 0); // key off - do { - assert(channel[c].songptr < (maxchannel + 1) * maxnotes); + opl->write (0xb0 + c, 0); // key off + do + { + assert (channel[c].songptr < (maxchannel + 1) * maxnotes); note = songbuf[channel[c].songptr]; - if(channel[c].songptr - c > maxchannel) - if(note && note < 250) - channel[c].pstat = channel[c].speed; - switch(note) { - // normal notes - case 68: opl->write(0xa0 + c,0x81); opl->write(0xb0 + c,0x21 + 4 * channel[c].octave); break; - case 69: opl->write(0xa0 + c,0xb0); opl->write(0xb0 + c,0x21 + 4 * channel[c].octave); break; - case 70: opl->write(0xa0 + c,0xca); opl->write(0xb0 + c,0x21 + 4 * channel[c].octave); break; - case 71: opl->write(0xa0 + c,0x2); opl->write(0xb0 + c,0x22 + 4 * channel[c].octave); break; - case 65: opl->write(0xa0 + c,0x41); opl->write(0xb0 + c,0x22 + 4 * channel[c].octave); break; - case 66: opl->write(0xa0 + c,0x87); opl->write(0xb0 + c,0x22 + 4 * channel[c].octave); break; - case 67: opl->write(0xa0 + c,0xae); opl->write(0xb0 + c,0x22 + 4 * channel[c].octave); break; - case 17: opl->write(0xa0 + c,0x6b); opl->write(0xb0 + c,0x21 + 4 * channel[c].octave); break; - case 18: opl->write(0xa0 + c,0x98); opl->write(0xb0 + c,0x21 + 4 * channel[c].octave); break; - case 20: opl->write(0xa0 + c,0xe5); opl->write(0xb0 + c,0x21 + 4 * channel[c].octave); break; - case 21: opl->write(0xa0 + c,0x20); opl->write(0xb0 + c,0x22 + 4 * channel[c].octave); break; - case 15: opl->write(0xa0 + c,0x63); opl->write(0xb0 + c,0x22 + 4 * channel[c].octave); break; - case 255: // delay - channel[c].songptr += maxchannel; - channel[c].pstat = songbuf[channel[c].songptr]; - break; - case 254: // set octave - channel[c].songptr += maxchannel; - channel[c].octave = songbuf[channel[c].songptr]; - break; - case 253: // set speed - channel[c].songptr += maxchannel; - channel[c].speed = songbuf[channel[c].songptr]; - break; - case 252: // set waveform - channel[c].songptr += maxchannel; - channel[c].waveform = songbuf[channel[c].songptr] - 300; - if(c > 2) - opl->write(0xe0 + c + (c+6),channel[c].waveform); - else - opl->write(0xe0 + c,channel[c].waveform); - break; - case 251: // song end - for(i = 0; i < maxchannel; i++) channel[i].songptr = i; - songend = true; - return false; + if (channel[c].songptr - c > maxchannel) + if (note && note < 250) + channel[c].pstat = channel[c].speed; + switch (note) + { + // normal notes + case 68: + opl->write (0xa0 + c, 0x81); + opl->write (0xb0 + c, 0x21 + 4 * channel[c].octave); + break; + case 69: + opl->write (0xa0 + c, 0xb0); + opl->write (0xb0 + c, 0x21 + 4 * channel[c].octave); + break; + case 70: + opl->write (0xa0 + c, 0xca); + opl->write (0xb0 + c, 0x21 + 4 * channel[c].octave); + break; + case 71: + opl->write (0xa0 + c, 0x2); + opl->write (0xb0 + c, 0x22 + 4 * channel[c].octave); + break; + case 65: + opl->write (0xa0 + c, 0x41); + opl->write (0xb0 + c, 0x22 + 4 * channel[c].octave); + break; + case 66: + opl->write (0xa0 + c, 0x87); + opl->write (0xb0 + c, 0x22 + 4 * channel[c].octave); + break; + case 67: + opl->write (0xa0 + c, 0xae); + opl->write (0xb0 + c, 0x22 + 4 * channel[c].octave); + break; + case 17: + opl->write (0xa0 + c, 0x6b); + opl->write (0xb0 + c, 0x21 + 4 * channel[c].octave); + break; + case 18: + opl->write (0xa0 + c, 0x98); + opl->write (0xb0 + c, 0x21 + 4 * channel[c].octave); + break; + case 20: + opl->write (0xa0 + c, 0xe5); + opl->write (0xb0 + c, 0x21 + 4 * channel[c].octave); + break; + case 21: + opl->write (0xa0 + c, 0x20); + opl->write (0xb0 + c, 0x22 + 4 * channel[c].octave); + break; + case 15: + opl->write (0xa0 + c, 0x63); + opl->write (0xb0 + c, 0x22 + 4 * channel[c].octave); + break; + case 255: // delay + channel[c].songptr += maxchannel; + channel[c].pstat = songbuf[channel[c].songptr]; + break; + case 254: // set octave + channel[c].songptr += maxchannel; + channel[c].octave = songbuf[channel[c].songptr]; + break; + case 253: // set speed + channel[c].songptr += maxchannel; + channel[c].speed = songbuf[channel[c].songptr]; + break; + case 252: // set waveform + channel[c].songptr += maxchannel; + channel[c].waveform = songbuf[channel[c].songptr] - 300; + if (c > 2) + opl->write (0xe0 + c + (c + 6), channel[c].waveform); + else + opl->write (0xe0 + c, channel[c].waveform); + break; + case 251: // song end + for (i = 0; i < maxchannel; i++) + channel[i].songptr = i; + songend = true; + return false; } - if(channel[c].songptr - c < maxnotes) - channel[c].songptr += maxchannel; + if (channel[c].songptr - c < maxnotes) + channel[c].songptr += maxchannel; else - channel[c].songptr = c; - } while(!channel[c].pstat); + channel[c].songptr = c; + } while (!channel[c].pstat); } return !songend; } -void CmkjPlayer::rewind(int subsong) +void +CmkjPlayer::rewind (int subsong) { int i; - for(i = 0; i < maxchannel; i++) { + for (i = 0; i < maxchannel; i++) + { channel[i].pstat = 0; channel[i].speed = 0; channel[i].waveform = 0; @@ -157,7 +217,8 @@ songend = false; } -float CmkjPlayer::getrefresh() +float +CmkjPlayer::getrefresh () { return 100.0f; } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/msc.cxx --- a/src/adplug/core/msc.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/msc.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -24,289 +24,314 @@ #include "msc.h" #include "debug.h" -const unsigned char CmscPlayer::msc_signature [MSC_SIGN_LEN] = { - 'C', 'e', 'r', 'e', 's', ' ', '\x13', ' ', - 'M', 'S', 'C', 'p', 'l', 'a', 'y', ' ' }; +const unsigned char + CmscPlayer::msc_signature[MSC_SIGN_LEN] = { + 'C', 'e', 'r', 'e', 's', ' ', '\x13', ' ', + 'M', 'S', 'C', 'p', 'l', 'a', 'y', ' ' +}; /*** public methods *************************************/ -CPlayer *CmscPlayer::factory (Copl * newopl) +CPlayer * +CmscPlayer::factory (Copl * newopl) { - return new CmscPlayer (newopl); + return new CmscPlayer (newopl); } -CmscPlayer::CmscPlayer(Copl * newopl) : CPlayer (newopl) +CmscPlayer::CmscPlayer (Copl * newopl):CPlayer (newopl) { - desc = NULL; - msc_data = NULL; - raw_data = NULL; - nr_blocks = 0; + desc = NULL; + msc_data = NULL; + raw_data = NULL; + nr_blocks = 0; } -CmscPlayer::~CmscPlayer() +CmscPlayer::~CmscPlayer () { - if (raw_data != NULL) - delete [] raw_data; - - if (msc_data != NULL) { - // free compressed blocks - for (int blk_num = 0; blk_num < nr_blocks; blk_num++) { - if (msc_data [blk_num].mb_data != NULL) - delete [] msc_data [blk_num].mb_data; - } - - delete [] msc_data; - } - - if (desc != NULL) - delete [] desc; + if (raw_data != NULL) + delete[]raw_data; + + if (msc_data != NULL) + { + // free compressed blocks + for (int blk_num = 0; blk_num < nr_blocks; blk_num++) + { + if (msc_data[blk_num].mb_data != NULL) + delete[]msc_data[blk_num].mb_data; + } + + delete[]msc_data; + } + + if (desc != NULL) + delete[]desc; } -bool CmscPlayer::load(VFSFile * fd, const CFileProvider & fp) +bool +CmscPlayer::load (VFSFile * fd, const CFileProvider & fp) { - binistream * bf; - msc_header hdr; + binistream *bf; + msc_header hdr; + + // open and validate the file + bf = fp.open (fd); + if (!bf) + return false; + + if (!load_header (bf, &hdr)) + { + fp.close (bf); + return false; + } + + // get stuff from the header + version = hdr.mh_ver; + timer_div = hdr.mh_timer; + nr_blocks = hdr.mh_nr_blocks; + block_len = hdr.mh_block_len; - // open and validate the file - bf = fp.open (fd); - if (! bf) - return false; - - if (! load_header (bf, & hdr)) { - fp.close (bf); - return false; - } - - // get stuff from the header - version = hdr.mh_ver; - timer_div = hdr.mh_timer; - nr_blocks = hdr.mh_nr_blocks; - block_len = hdr.mh_block_len; - - if (! nr_blocks) { - fp.close (bf); - return false; - } - - // load compressed data blocks - msc_data = new msc_block [nr_blocks]; - raw_data = new u8 [block_len]; + if (!nr_blocks) + { + fp.close (bf); + return false; + } + + // load compressed data blocks + msc_data = new msc_block[nr_blocks]; + raw_data = new u8[block_len]; + + for (int blk_num = 0; blk_num < nr_blocks; blk_num++) + { + msc_block blk; - for (int blk_num = 0; blk_num < nr_blocks; blk_num++) { - msc_block blk; - - blk.mb_length = bf->readInt (2); - blk.mb_data = new u8 [blk.mb_length]; - for (int oct_num = 0; oct_num < blk.mb_length; oct_num++) { - blk.mb_data [oct_num] = bf->readInt (1); - } - - msc_data [blk_num] = blk; - } - - // clean up & initialize - fp.close (bf); - rewind (0); - - return true; + blk.mb_length = bf->readInt (2); + blk.mb_data = new u8[blk.mb_length]; + for (int oct_num = 0; oct_num < blk.mb_length; oct_num++) + { + blk.mb_data[oct_num] = bf->readInt (1); + } + + msc_data[blk_num] = blk; + } + + // clean up & initialize + fp.close (bf); + rewind (0); + + return true; } -bool CmscPlayer::update() +bool +CmscPlayer::update () { - // output data - while (! delay) { - u8 cmnd; - u8 data; + // output data + while (!delay) + { + u8 cmnd; + u8 data; + + // decode data + if (!decode_octet (&cmnd)) + return false; + + if (!decode_octet (&data)) + return false; + + // check for special commands + switch (cmnd) + { - // decode data - if (! decode_octet (& cmnd)) - return false; - - if (! decode_octet (& data)) - return false; - - // check for special commands - switch (cmnd) { - - // delay - case 0xff: - delay = 1 + (u8) (data - 1); - break; - - // play command & data - default: - opl->write (cmnd, data); - - } // command switch - } // play pass - - - // count delays - if (delay) - delay--; - - // advance player position - play_pos++; - return true; + // delay + case 0xff: + delay = 1 + (u8) (data - 1); + break; + + // play command & data + default: + opl->write (cmnd, data); + + } // command switch + } // play pass + + + // count delays + if (delay) + delay--; + + // advance player position + play_pos++; + return true; } -void CmscPlayer::rewind(int subsong) +void +CmscPlayer::rewind (int subsong) { - // reset state - dec_prefix = 0; - block_num = 0; - block_pos = 0; - play_pos = 0; - raw_pos = 0; - delay = 0; - - // init the OPL chip and go to OPL2 mode - opl->init(); - opl->write(1, 32); + // reset state + dec_prefix = 0; + block_num = 0; + block_pos = 0; + play_pos = 0; + raw_pos = 0; + delay = 0; + + // init the OPL chip and go to OPL2 mode + opl->init (); + opl->write (1, 32); } -float CmscPlayer::getrefresh() +float +CmscPlayer::getrefresh () { - // PC timer oscillator frequency / wait register - return 1193180 / (float) (timer_div ? timer_div : 0xffff); + // PC timer oscillator frequency / wait register + return 1193180 / (float) (timer_div ? timer_div : 0xffff); } -std::string CmscPlayer::gettype() +std::string CmscPlayer::gettype () { - char vstr [40]; - - sprintf(vstr, "AdLib MSCplay (version %d)", version); - return std::string (vstr); + char + vstr[40]; + + sprintf (vstr, "AdLib MSCplay (version %d)", version); + return std::string (vstr); } /*** private methods *************************************/ -bool CmscPlayer::load_header(binistream * bf, msc_header * hdr) +bool +CmscPlayer::load_header (binistream * bf, msc_header * hdr) { - // check signature - bf->readString ((char *) hdr->mh_sign, sizeof (hdr->mh_sign)); - if (memcmp (msc_signature, hdr->mh_sign, MSC_SIGN_LEN) != 0) - return false; + // check signature + bf->readString ((char *) hdr->mh_sign, sizeof (hdr->mh_sign)); + if (memcmp (msc_signature, hdr->mh_sign, MSC_SIGN_LEN) != 0) + return false; - // check version - hdr->mh_ver = bf->readInt (2); - if (hdr->mh_ver != 0) - return false; + // check version + hdr->mh_ver = bf->readInt (2); + if (hdr->mh_ver != 0) + return false; - bf->readString ((char *) hdr->mh_desc, sizeof (hdr->mh_desc)); - hdr->mh_timer = bf->readInt (2); - hdr->mh_nr_blocks = bf->readInt (2); - hdr->mh_block_len = bf->readInt (2); - return true; + bf->readString ((char *) hdr->mh_desc, sizeof (hdr->mh_desc)); + hdr->mh_timer = bf->readInt (2); + hdr->mh_nr_blocks = bf->readInt (2); + hdr->mh_block_len = bf->readInt (2); + return true; } -bool CmscPlayer::decode_octet(u8 * output) +bool +CmscPlayer::decode_octet (u8 * output) { - msc_block blk; // compressed data block - - if (block_num >= nr_blocks) - return false; - - blk = msc_data [block_num]; - while (1) { - u8 octet; // decoded octet - u8 len_corr; // length correction - - // advance to next block if necessary - if (block_pos >= blk.mb_length && dec_len == 0) { - block_num++; - if (block_num >= nr_blocks) - return false; - - blk = msc_data [block_num]; - block_pos = 0; - raw_pos = 0; - } - - // decode the compressed music data - switch (dec_prefix) { - - // decode prefix - case 155: - case 175: - octet = blk.mb_data [block_pos++]; - if (octet == 0) { - // invalid prefix, output original - octet = dec_prefix; - dec_prefix = 0; - break; - } - - // isolate length and distance - dec_len = (octet & 0x0F); - len_corr = 2; + msc_block blk; // compressed data block + + if (block_num >= nr_blocks) + return false; + + blk = msc_data[block_num]; + while (1) + { + u8 octet; // decoded octet + u8 len_corr; // length correction + + // advance to next block if necessary + if (block_pos >= blk.mb_length && dec_len == 0) + { + block_num++; + if (block_num >= nr_blocks) + return false; + + blk = msc_data[block_num]; + block_pos = 0; + raw_pos = 0; + } - dec_dist = (octet & 0xF0) >> 4; - if (dec_prefix == 155) - dec_dist++; - - // next decode step for respective prefix type - dec_prefix++; - continue; - + // decode the compressed music data + switch (dec_prefix) + { - // check for extended length - case 156: - if (dec_len == 15) - dec_len += blk.mb_data [block_pos++]; + // decode prefix + case 155: + case 175: + octet = blk.mb_data[block_pos++]; + if (octet == 0) + { + // invalid prefix, output original + octet = dec_prefix; + dec_prefix = 0; + break; + } + + // isolate length and distance + dec_len = (octet & 0x0F); + len_corr = 2; + + dec_dist = (octet & 0xF0) >> 4; + if (dec_prefix == 155) + dec_dist++; + + // next decode step for respective prefix type + dec_prefix++; + continue; + - // add length correction and go for copy mode - dec_len += len_corr; - dec_prefix = 255; - continue; - - - // get extended distance - case 176: - dec_dist += 17 + 16 * blk.mb_data [block_pos++]; - len_corr = 3; - - // check for extended length - dec_prefix = 156; - continue; - - - // prefix copy mode - case 255: - if((int)raw_pos >= dec_dist) - octet = raw_data [raw_pos - dec_dist]; - else { - AdPlug_LogWrite("error! read before raw_data buffer.\n"); - octet = 0; + // check for extended length + case 156: + if (dec_len == 15) + dec_len += blk.mb_data[block_pos++]; + + // add length correction and go for copy mode + dec_len += len_corr; + dec_prefix = 255; + continue; + + + // get extended distance + case 176: + dec_dist += 17 + 16 * blk.mb_data[block_pos++]; + len_corr = 3; + + // check for extended length + dec_prefix = 156; + continue; + + + // prefix copy mode + case 255: + if ((int) raw_pos >= dec_dist) + octet = raw_data[raw_pos - dec_dist]; + else + { + AdPlug_LogWrite ("error! read before raw_data buffer.\n"); + octet = 0; } - - dec_len--; - if (dec_len == 0) { - // back to normal mode - dec_prefix = 0; - } - - break; + + dec_len--; + if (dec_len == 0) + { + // back to normal mode + dec_prefix = 0; + } + + break; + - - // normal mode - default: - octet = blk.mb_data [block_pos++]; - if (octet == 155 || octet == 175) { - // it's a prefix, restart - dec_prefix = octet; - continue; - } - } // prefix switch + // normal mode + default: + octet = blk.mb_data[block_pos++]; + if (octet == 155 || octet == 175) + { + // it's a prefix, restart + dec_prefix = octet; + continue; + } + } // prefix switch - - // output the octet - if (output != NULL) - *output = octet; - - raw_data [raw_pos++] = octet; - break; - }; // decode pass + + // output the octet + if (output != NULL) + *output = octet; - return true; -} + raw_data[raw_pos++] = octet; + break; + }; // decode pass + + return true; +} diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/mtk.cxx --- a/src/adplug/core/mtk.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/mtk.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -23,118 +23,144 @@ /*** public methods **************************************/ -CPlayer *CmtkLoader::factory(Copl *newopl) +CPlayer * +CmtkLoader::factory (Copl * newopl) { - return new CmtkLoader(newopl); + return new CmtkLoader (newopl); } -bool CmtkLoader::load(VFSFile *fd, const CFileProvider &fp) +bool +CmtkLoader::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); if(!f) return false; - struct { - char id[18]; - unsigned short crc,size; - } header; - struct mtkdata { - char songname[34],composername[34],instname[0x80][34]; - unsigned char insts[0x80][12],order[0x80],dummy,patterns[0x32][0x40][9]; - } *data; - unsigned char *cmp,*org; - unsigned int i; - unsigned long cmpsize,cmpptr=0,orgptr=0; - unsigned short ctrlbits=0,ctrlmask=0,cmd,cnt,offs; + binistream *f = fp.open (fd); + if (!f) + return false; + struct + { + char id[18]; + unsigned short crc, size; + } header; + struct mtkdata + { + char songname[34], composername[34], instname[0x80][34]; + unsigned char insts[0x80][12], order[0x80], dummy, + patterns[0x32][0x40][9]; + } *data; + unsigned char *cmp, *org; + unsigned int i; + unsigned long cmpsize, cmpptr = 0, orgptr = 0; + unsigned short ctrlbits = 0, ctrlmask = 0, cmd, cnt, offs; - // read header - f->readString(header.id, 18); - header.crc = f->readInt(2); - header.size = f->readInt(2); + // read header + f->readString (header.id, 18); + header.crc = f->readInt (2); + header.size = f->readInt (2); - // file validation section - if(strncmp(header.id,"mpu401tr\x92kk\xeer@data",18)) - { fp.close(f); return false; } + // file validation section + if (strncmp (header.id, "mpu401tr\x92kk\xeer@data", 18)) + { + fp.close (f); + return false; + } - // load section - cmpsize = fp.filesize(f) - 22; - cmp = new unsigned char[cmpsize]; - org = new unsigned char[header.size]; - for(i = 0; i < cmpsize; i++) cmp[i] = f->readInt(1); - fp.close(f); + // load section + cmpsize = fp.filesize (f) - 22; + cmp = new unsigned char[cmpsize]; + org = new unsigned char[header.size]; + for (i = 0; i < cmpsize; i++) + cmp[i] = f->readInt (1); + fp.close (f); - while(cmpptr < cmpsize) { // decompress - ctrlmask >>= 1; - if(!ctrlmask) { - ctrlbits = cmp[cmpptr] + (cmp[cmpptr + 1] << 8); - cmpptr += 2; - ctrlmask = 0x8000; - } - if(!(ctrlbits & ctrlmask)) { // uncompressed data - if(orgptr >= header.size) - goto err; + while (cmpptr < cmpsize) + { // decompress + ctrlmask >>= 1; + if (!ctrlmask) + { + ctrlbits = cmp[cmpptr] + (cmp[cmpptr + 1] << 8); + cmpptr += 2; + ctrlmask = 0x8000; + } + if (!(ctrlbits & ctrlmask)) + { // uncompressed data + if (orgptr >= header.size) + goto err; - org[orgptr] = cmp[cmpptr]; - orgptr++; cmpptr++; - continue; - } + org[orgptr] = cmp[cmpptr]; + orgptr++; + cmpptr++; + continue; + } - // compressed data - cmd = (cmp[cmpptr] >> 4) & 0x0f; - cnt = cmp[cmpptr] & 0x0f; - cmpptr++; - switch(cmd) { + // compressed data + cmd = (cmp[cmpptr] >> 4) & 0x0f; + cnt = cmp[cmpptr] & 0x0f; + cmpptr++; + switch (cmd) + { case 0: - if(orgptr + cnt > header.size) goto err; + if (orgptr + cnt > header.size) + goto err; cnt += 3; - memset(&org[orgptr],cmp[cmpptr],cnt); - cmpptr++; orgptr += cnt; + memset (&org[orgptr], cmp[cmpptr], cnt); + cmpptr++; + orgptr += cnt; break; case 1: - if(orgptr + cnt > header.size) goto err; + if (orgptr + cnt > header.size) + goto err; cnt += (cmp[cmpptr] << 4) + 19; - memset(&org[orgptr],cmp[++cmpptr],cnt); - cmpptr++; orgptr += cnt; + memset (&org[orgptr], cmp[++cmpptr], cnt); + cmpptr++; + orgptr += cnt; break; case 2: - if(orgptr + cnt > header.size) goto err; - offs = (cnt+3) + (cmp[cmpptr] << 4); - cnt = cmp[++cmpptr] + 16; cmpptr++; - memcpy(&org[orgptr],&org[orgptr - offs],cnt); + if (orgptr + cnt > header.size) + goto err; + offs = (cnt + 3) + (cmp[cmpptr] << 4); + cnt = cmp[++cmpptr] + 16; + cmpptr++; + memcpy (&org[orgptr], &org[orgptr - offs], cnt); orgptr += cnt; break; default: - if(orgptr + cmd > header.size) goto err; - offs = (cnt+3) + (cmp[cmpptr++] << 4); - memcpy(&org[orgptr],&org[orgptr-offs],cmd); + if (orgptr + cmd > header.size) + goto err; + offs = (cnt + 3) + (cmp[cmpptr++] << 4); + memcpy (&org[orgptr], &org[orgptr - offs], cmd); orgptr += cmd; break; - } - } - delete [] cmp; - data = (struct mtkdata *) org; + } + } + delete[]cmp; + data = (struct mtkdata *) org; - // convert to HSC replay data - memset(title,0,34); strncpy(title,data->songname+1,33); - memset(composer,0,34); strncpy(composer,data->composername+1,33); - memset(instname,0,0x80*34); - for(i=0;i<0x80;i++) - strncpy(instname[i],data->instname[i]+1,33); - memcpy(instr,data->insts,0x80 * 12); - memcpy(song,data->order,0x80); - memcpy(patterns,data->patterns,header.size-6084); - for (i=0;i<128;i++) { // correct instruments - instr[i][2] ^= (instr[i][2] & 0x40) << 1; - instr[i][3] ^= (instr[i][3] & 0x40) << 1; - instr[i][11] >>= 4; // make unsigned - } + // convert to HSC replay data + memset (title, 0, 34); + strncpy (title, data->songname + 1, 33); + memset (composer, 0, 34); + strncpy (composer, data->composername + 1, 33); + memset (instname, 0, 0x80 * 34); + for (i = 0; i < 0x80; i++) + strncpy (instname[i], data->instname[i] + 1, 33); + memcpy (instr, data->insts, 0x80 * 12); + memcpy (song, data->order, 0x80); + memcpy (patterns, data->patterns, header.size - 6084); + for (i = 0; i < 128; i++) + { // correct instruments + instr[i][2] ^= (instr[i][2] & 0x40) << 1; + instr[i][3] ^= (instr[i][3] & 0x40) << 1; + instr[i][11] >>= 4; // make unsigned + } - delete [] org; - rewind(0); - return true; + delete[]org; + rewind (0); + return true; - err: - delete [] cmp; - delete [] org; +err: + delete[]cmp; + delete[]org; return false; } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/player.cxx --- a/src/adplug/core/player.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/player.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -25,46 +25,49 @@ /***** CPlayer *****/ -const unsigned short CPlayer::note_table[12] = - {363, 385, 408, 432, 458, 485, 514, 544, 577, 611, 647, 686}; +const unsigned short +CPlayer::note_table[12] = + { 363, 385, 408, 432, 458, 485, 514, 544, 577, 611, 647, 686 }; -const unsigned char CPlayer::op_table[9] = - {0x00, 0x01, 0x02, 0x08, 0x09, 0x0a, 0x10, 0x11, 0x12}; +const unsigned char +CPlayer::op_table[9] = + { 0x00, 0x01, 0x02, 0x08, 0x09, 0x0a, 0x10, 0x11, 0x12 }; -CPlayer::CPlayer(Copl *newopl) - : opl(newopl), db(CAdPlug::database) +CPlayer::CPlayer (Copl * newopl):opl (newopl), db (CAdPlug::database) { } -CPlayer::~CPlayer() +CPlayer::~CPlayer () { } -unsigned long CPlayer::songlength(int subsong) +unsigned long +CPlayer::songlength (int subsong) { - CSilentopl tempopl; - Copl *saveopl = opl; - float slength = 0.0f; + CSilentopl tempopl; + Copl *saveopl = opl; + float slength = 0.0f; // save original OPL from being overwritten opl = &tempopl; // get song length - rewind(subsong); - while(update() && slength < 600000) // song length limit: 10 minutes - slength += 1000.0f / getrefresh(); - rewind(subsong); + rewind (subsong); + while (update () && slength < 600000) // song length limit: 10 minutes + slength += 1000.0f / getrefresh (); + rewind (subsong); // restore original OPL and return opl = saveopl; - return (unsigned long)slength; + return (unsigned long) slength; } -void CPlayer::seek(unsigned long ms) +void +CPlayer::seek (unsigned long ms) { float pos = 0.0f; - rewind(); - while(pos < ms && update()) // seek to new position - pos += 1000/getrefresh(); + rewind (); + while (pos < ms && update ()) // seek to new position + pos += 1000 / getrefresh (); } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/players.cxx --- a/src/adplug/core/players.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/players.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -26,80 +26,92 @@ /***** CPlayerDesc *****/ -CPlayerDesc::CPlayerDesc() - : factory(0), extensions(0), extlength(0) +CPlayerDesc::CPlayerDesc ():factory (0), extensions (0), extlength (0) { } -CPlayerDesc::CPlayerDesc(const CPlayerDesc &pd) - : factory(pd.factory), filetype(pd.filetype), extlength(pd.extlength) +CPlayerDesc::CPlayerDesc (const CPlayerDesc & pd): +factory (pd.factory), +filetype (pd.filetype), +extlength (pd.extlength) { - if(pd.extensions) { - extensions = (char *)malloc(extlength); - memcpy(extensions, pd.extensions, extlength); - } else + if (pd.extensions) + { + extensions = (char *) malloc (extlength); + memcpy (extensions, pd.extensions, extlength); + } + else extensions = 0; } -CPlayerDesc::CPlayerDesc(Factory f, const std::string &type, const char *ext) - : factory(f), filetype(type), extensions(0) +CPlayerDesc::CPlayerDesc (Factory f, const std::string & type, + const char *ext): +factory (f), +filetype (type), +extensions (0) { const char *i = ext; // Determine length of passed extensions list - while(*i) i += strlen(i) + 1; - extlength = i - ext + 1; // length = difference between last and first char + 1 + while (*i) + i += strlen (i) + 1; + extlength = i - ext + 1; // length = difference between last and first char + 1 - extensions = (char *)malloc(extlength); - memcpy(extensions, ext, extlength); + extensions = (char *) malloc (extlength); + memcpy (extensions, ext, extlength); } -CPlayerDesc::~CPlayerDesc() +CPlayerDesc::~CPlayerDesc () { - if(extensions) free(extensions); + if (extensions) + free (extensions); } -void CPlayerDesc::add_extension(const char *ext) +void +CPlayerDesc::add_extension (const char *ext) { - unsigned long newlength = extlength + strlen(ext) + 1; + unsigned long newlength = extlength + strlen (ext) + 1; - extensions = (char *)realloc(extensions, newlength); - strcpy(extensions + extlength - 1, ext); + extensions = (char *) realloc (extensions, newlength); + strcpy (extensions + extlength - 1, ext); extensions[newlength - 1] = '\0'; extlength = newlength; } -const char *CPlayerDesc::get_extension(unsigned int n) const +const char * +CPlayerDesc::get_extension (unsigned int n) const const { - const char *i = extensions; - unsigned int j; + const char *i = extensions; + unsigned int j; - for(j = 0; j < n && (*i); j++, i += strlen(i) + 1) ; + for (j = 0; j < n && (*i); j++, i += strlen (i) + 1); return (*i != '\0' ? i : 0); } /***** CPlayers *****/ -const CPlayerDesc *CPlayers::lookup_filetype(const std::string &ftype) const +const CPlayerDesc * +CPlayers::lookup_filetype (const std::string & ftype) const const { - const_iterator i; + const_iterator i; - for(i = begin(); i != end(); i++) - if((*i)->filetype == ftype) + for (i = begin (); i != end (); i++) + if ((*i)->filetype == ftype) return *i; return 0; } -const CPlayerDesc *CPlayers::lookup_extension(const std::string &extension) const +const CPlayerDesc * +CPlayers::lookup_extension (const std::string & extension) const const { - const_iterator i; - unsigned int j; + const_iterator i; + unsigned int j; - for(i = begin(); i != end(); i++) - for(j = 0; (*i)->get_extension(j); j++) - if(!stricmp(extension.c_str(), (*i)->get_extension(j))) - return *i; + for (i = begin (); i != end (); i++) + for (j = 0; (*i)->get_extension (j); j++) + if (!stricmp (extension.c_str (), (*i)->get_extension (j))) + return *i; return 0; } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/protrack.cxx --- a/src/adplug/core/protrack.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/protrack.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -28,426 +28,508 @@ #include "protrack.h" #include "debug.h" -#define SPECIALARPLEN 256 // Standard length of special arpeggio lists -#define JUMPMARKER 0x80 // Orderlist jump marker +#define SPECIALARPLEN 256 // Standard length of special arpeggio lists +#define JUMPMARKER 0x80 // Orderlist jump marker // SA2 compatible adlib note table -const unsigned short CmodPlayer::sa2_notetable[12] = - {340,363,385,408,432,458,485,514,544,577,611,647}; +const unsigned short +CmodPlayer::sa2_notetable[12] = + { 340, 363, 385, 408, 432, 458, 485, 514, 544, 577, 611, 647 }; // SA2 compatible vibrato rate table -const unsigned char CmodPlayer::vibratotab[32] = - {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1}; +const unsigned char +CmodPlayer::vibratotab[32] = + { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 15, 14, 13, +12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; /*** public methods *************************************/ -CmodPlayer::CmodPlayer(Copl *newopl) - : CPlayer(newopl), inst(0), order(0), arplist(0), arpcmd(0), initspeed(6), - nop(0), activechan(0xffffffff), flags(Standard), curchip(opl->getchip()), - nrows(0), npats(0), nchans(0) +CmodPlayer::CmodPlayer (Copl * newopl):CPlayer (newopl), inst (0), order (0), arplist (0), arpcmd (0), initspeed (6), +nop (0), activechan (0xffffffff), flags (Standard), curchip (opl->getchip ()), +nrows (0), npats (0), nchans (0) { - realloc_order(128); - realloc_patterns(64, 64, 9); - realloc_instruments(250); - init_notetable(sa2_notetable); + realloc_order (128); + realloc_patterns (64, 64, 9); + realloc_instruments (250); + init_notetable (sa2_notetable); } -CmodPlayer::~CmodPlayer() +CmodPlayer::~CmodPlayer () { - dealloc(); + dealloc (); } -bool CmodPlayer::update() +bool +CmodPlayer::update () { - unsigned char pattbreak=0, donote, pattnr, chan, oplchan, info1, + unsigned char pattbreak = 0, donote, pattnr, chan, oplchan, info1, info2, info, pattern_delay; - unsigned short track; - unsigned long row; + unsigned short track; + unsigned long row; - if(!speed) // song full stop - return !songend; + if (!speed) // song full stop + return !songend; - // effect handling (timer dependant) - for(chan = 0; chan < nchans; chan++) { - oplchan = set_opl_chip(chan); + // effect handling (timer dependant) + for (chan = 0; chan < nchans; chan++) + { + oplchan = set_opl_chip (chan); - if(arplist && arpcmd && inst[channel[chan].inst].arpstart) // special arpeggio - if(channel[chan].arpspdcnt) - channel[chan].arpspdcnt--; - else - if(arpcmd[channel[chan].arppos] != 255) { - switch(arpcmd[channel[chan].arppos]) { - case 252: channel[chan].vol1 = arplist[channel[chan].arppos]; // set volume - if(channel[chan].vol1 > 63) // ????? - channel[chan].vol1 = 63; - channel[chan].vol2 = channel[chan].vol1; - setvolume(chan); - break; - case 253: channel[chan].key = 0; setfreq(chan); break; // release sustaining note - case 254: channel[chan].arppos = arplist[channel[chan].arppos]; break; // arpeggio loop - default: if(arpcmd[channel[chan].arppos]) { - if(arpcmd[channel[chan].arppos] / 10) - opl->write(0xe3 + op_table[oplchan], arpcmd[channel[chan].arppos] / 10 - 1); - if(arpcmd[channel[chan].arppos] % 10) - opl->write(0xe0 + op_table[oplchan], (arpcmd[channel[chan].arppos] % 10) - 1); - if(arpcmd[channel[chan].arppos] < 10) // ????? - opl->write(0xe0 + op_table[oplchan], arpcmd[channel[chan].arppos] - 1); - } - } - if(arpcmd[channel[chan].arppos] != 252) { - if(arplist[channel[chan].arppos] <= 96) - setnote(chan,channel[chan].note + arplist[channel[chan].arppos]); - if(arplist[channel[chan].arppos] >= 100) - setnote(chan,arplist[channel[chan].arppos] - 100); - } else - setnote(chan,channel[chan].note); - setfreq(chan); - if(arpcmd[channel[chan].arppos] != 255) - channel[chan].arppos++; - channel[chan].arpspdcnt = inst[channel[chan].inst].arpspeed - 1; - } + if (arplist && arpcmd && inst[channel[chan].inst].arpstart) // special arpeggio + if (channel[chan].arpspdcnt) + channel[chan].arpspdcnt--; + else if (arpcmd[channel[chan].arppos] != 255) + { + switch (arpcmd[channel[chan].arppos]) + { + case 252: + channel[chan].vol1 = arplist[channel[chan].arppos]; // set volume + if (channel[chan].vol1 > 63) // ????? + channel[chan].vol1 = 63; + channel[chan].vol2 = channel[chan].vol1; + setvolume (chan); + break; + case 253: + channel[chan].key = 0; + setfreq (chan); + break; // release sustaining note + case 254: + channel[chan].arppos = arplist[channel[chan].arppos]; + break; // arpeggio loop + default: + if (arpcmd[channel[chan].arppos]) + { + if (arpcmd[channel[chan].arppos] / 10) + opl->write (0xe3 + op_table[oplchan], + arpcmd[channel[chan].arppos] / 10 - 1); + if (arpcmd[channel[chan].arppos] % 10) + opl->write (0xe0 + op_table[oplchan], + (arpcmd[channel[chan].arppos] % 10) - 1); + if (arpcmd[channel[chan].arppos] < 10) // ????? + opl->write (0xe0 + op_table[oplchan], + arpcmd[channel[chan].arppos] - 1); + } + } + if (arpcmd[channel[chan].arppos] != 252) + { + if (arplist[channel[chan].arppos] <= 96) + setnote (chan, + channel[chan].note + arplist[channel[chan].arppos]); + if (arplist[channel[chan].arppos] >= 100) + setnote (chan, arplist[channel[chan].arppos] - 100); + } + else + setnote (chan, channel[chan].note); + setfreq (chan); + if (arpcmd[channel[chan].arppos] != 255) + channel[chan].arppos++; + channel[chan].arpspdcnt = inst[channel[chan].inst].arpspeed - 1; + } - info1 = channel[chan].info1; - info2 = channel[chan].info2; - if(flags & Decimal) - info = channel[chan].info1 * 10 + channel[chan].info2; - else - info = (channel[chan].info1 << 4) + channel[chan].info2; - switch(channel[chan].fx) { - case 0: if(info) { // arpeggio - if(channel[chan].trigger < 2) - channel[chan].trigger++; - else - channel[chan].trigger = 0; - switch(channel[chan].trigger) { - case 0: setnote(chan,channel[chan].note); break; - case 1: setnote(chan,channel[chan].note + info1); break; - case 2: setnote(chan,channel[chan].note + info2); - } - setfreq(chan); - } - break; - case 1: slide_up(chan,info); setfreq(chan); break; // slide up - case 2: slide_down(chan,info); setfreq(chan); break; // slide down - case 3: tone_portamento(chan,channel[chan].portainfo); break; // tone portamento - case 4: vibrato(chan,channel[chan].vibinfo1,channel[chan].vibinfo2); break; // vibrato - case 5: // tone portamento & volume slide - case 6: if(channel[chan].fx == 5) // vibrato & volume slide - tone_portamento(chan,channel[chan].portainfo); - else - vibrato(chan,channel[chan].vibinfo1,channel[chan].vibinfo2); - case 10: if(del % 4) // SA2 volume slide - break; - if(info1) - vol_up(chan,info1); - else - vol_down(chan,info2); - setvolume(chan); - break; - case 14: if(info1 == 3) // retrig note - if(!(del % (info2+1))) - playnote(chan); - break; - case 16: if(del % 4) // AMD volume slide - break; - if(info1) - vol_up_alt(chan,info1); - else - vol_down_alt(chan,info2); - setvolume(chan); - break; - case 20: // RAD volume slide - if(info < 50) - vol_down_alt(chan,info); - else - vol_up_alt(chan,info - 50); - setvolume(chan); - break; - case 26: // volume slide - if(info1) - vol_up(chan,info1); - else - vol_down(chan,info2); - setvolume(chan); - break; - case 28: - if (info1) { - slide_up(chan,1); channel[chan].info1--; - } - if (info2) { - slide_down(chan,1); channel[chan].info2--; - } - setfreq(chan); - break; - } - } + info1 = channel[chan].info1; + info2 = channel[chan].info2; + if (flags & Decimal) + info = channel[chan].info1 * 10 + channel[chan].info2; + else + info = (channel[chan].info1 << 4) + channel[chan].info2; + switch (channel[chan].fx) + { + case 0: + if (info) + { // arpeggio + if (channel[chan].trigger < 2) + channel[chan].trigger++; + else + channel[chan].trigger = 0; + switch (channel[chan].trigger) + { + case 0: + setnote (chan, channel[chan].note); + break; + case 1: + setnote (chan, channel[chan].note + info1); + break; + case 2: + setnote (chan, channel[chan].note + info2); + } + setfreq (chan); + } + break; + case 1: + slide_up (chan, info); + setfreq (chan); + break; // slide up + case 2: + slide_down (chan, info); + setfreq (chan); + break; // slide down + case 3: + tone_portamento (chan, channel[chan].portainfo); + break; // tone portamento + case 4: + vibrato (chan, channel[chan].vibinfo1, channel[chan].vibinfo2); + break; // vibrato + case 5: // tone portamento & volume slide + case 6: + if (channel[chan].fx == 5) // vibrato & volume slide + tone_portamento (chan, channel[chan].portainfo); + else + vibrato (chan, channel[chan].vibinfo1, channel[chan].vibinfo2); + case 10: + if (del % 4) // SA2 volume slide + break; + if (info1) + vol_up (chan, info1); + else + vol_down (chan, info2); + setvolume (chan); + break; + case 14: + if (info1 == 3) // retrig note + if (!(del % (info2 + 1))) + playnote (chan); + break; + case 16: + if (del % 4) // AMD volume slide + break; + if (info1) + vol_up_alt (chan, info1); + else + vol_down_alt (chan, info2); + setvolume (chan); + break; + case 20: // RAD volume slide + if (info < 50) + vol_down_alt (chan, info); + else + vol_up_alt (chan, info - 50); + setvolume (chan); + break; + case 26: // volume slide + if (info1) + vol_up (chan, info1); + else + vol_down (chan, info2); + setvolume (chan); + break; + case 28: + if (info1) + { + slide_up (chan, 1); + channel[chan].info1--; + } + if (info2) + { + slide_down (chan, 1); + channel[chan].info2--; + } + setfreq (chan); + break; + } + } - if(del) { // speed compensation - del--; - return !songend; - } + if (del) + { // speed compensation + del--; + return !songend; + } - // arrangement handling - if(!resolve_order()) return !songend; - pattnr = order[ord]; + // arrangement handling + if (!resolve_order ()) + return !songend; + pattnr = order[ord]; - if(!rw) AdPlug_LogWrite("\nCmodPlayer::update(): Pattern: %d, Order: %d\n", pattnr, ord); - AdPlug_LogWrite("CmodPlayer::update():%3d|", rw); + if (!rw) + AdPlug_LogWrite ("\nCmodPlayer::update(): Pattern: %d, Order: %d\n", + pattnr, ord); + AdPlug_LogWrite ("CmodPlayer::update():%3d|", rw); - // play row + // play row pattern_delay = 0; - row = rw; - for(chan = 0; chan < nchans; chan++) { - oplchan = set_opl_chip(chan); - - if(!(activechan >> (31 - chan)) & 1) { // channel active? - AdPlug_LogWrite("N/A|"); - continue; - } - if(!(track = trackord[pattnr][chan])) { // resolve track - AdPlug_LogWrite("------------|"); - continue; - } else - track--; + row = rw; + for (chan = 0; chan < nchans; chan++) + { + oplchan = set_opl_chip (chan); - AdPlug_LogWrite("%3d%3d%2X%2X%2X|", tracks[track][row].note, - tracks[track][row].inst, tracks[track][row].command, - tracks[track][row].param1, tracks[track][row].param2); - - donote = 0; - if(tracks[track][row].inst) { - channel[chan].inst = tracks[track][row].inst - 1; - if (!(flags & Faust)) { - channel[chan].vol1 = 63 - (inst[channel[chan].inst].data[10] & 63); - channel[chan].vol2 = 63 - (inst[channel[chan].inst].data[9] & 63); - setvolume(chan); - } - } + if (!(activechan >> (31 - chan)) & 1) + { // channel active? + AdPlug_LogWrite ("N/A|"); + continue; + } + if (!(track = trackord[pattnr][chan])) + { // resolve track + AdPlug_LogWrite ("------------|"); + continue; + } + else + track--; - if(tracks[track][row].note && tracks[track][row].command != 3) { // no tone portamento - channel[chan].note = tracks[track][row].note; - setnote(chan,tracks[track][row].note); - channel[chan].nextfreq = channel[chan].freq; - channel[chan].nextoct = channel[chan].oct; - channel[chan].arppos = inst[channel[chan].inst].arpstart; - channel[chan].arpspdcnt = 0; - if(tracks[track][row].note != 127) // handle key off - donote = 1; - } - channel[chan].fx = tracks[track][row].command; - channel[chan].info1 = tracks[track][row].param1; - channel[chan].info2 = tracks[track][row].param2; + AdPlug_LogWrite ("%3d%3d%2X%2X%2X|", tracks[track][row].note, + tracks[track][row].inst, tracks[track][row].command, + tracks[track][row].param1, tracks[track][row].param2); - if(donote) - playnote(chan); + donote = 0; + if (tracks[track][row].inst) + { + channel[chan].inst = tracks[track][row].inst - 1; + if (!(flags & Faust)) + { + channel[chan].vol1 = 63 - (inst[channel[chan].inst].data[10] & 63); + channel[chan].vol2 = 63 - (inst[channel[chan].inst].data[9] & 63); + setvolume (chan); + } + } - // command handling (row dependant) - info1 = channel[chan].info1; - info2 = channel[chan].info2; - if(flags & Decimal) - info = channel[chan].info1 * 10 + channel[chan].info2; - else - info = (channel[chan].info1 << 4) + channel[chan].info2; - switch(channel[chan].fx) { - case 3: // tone portamento - if(tracks[track][row].note) { - if(tracks[track][row].note < 13) - channel[chan].nextfreq = notetable[tracks[track][row].note - 1]; - else - if(tracks[track][row].note % 12 > 0) - channel[chan].nextfreq = notetable[(tracks[track][row].note % 12) - 1]; - else - channel[chan].nextfreq = notetable[11]; - channel[chan].nextoct = (tracks[track][row].note - 1) / 12; - if(tracks[track][row].note == 127) { // handle key off - channel[chan].nextfreq = channel[chan].freq; - channel[chan].nextoct = channel[chan].oct; - } - } - if(info) // remember vars - channel[chan].portainfo = info; - break; + if (tracks[track][row].note && tracks[track][row].command != 3) + { // no tone portamento + channel[chan].note = tracks[track][row].note; + setnote (chan, tracks[track][row].note); + channel[chan].nextfreq = channel[chan].freq; + channel[chan].nextoct = channel[chan].oct; + channel[chan].arppos = inst[channel[chan].inst].arpstart; + channel[chan].arpspdcnt = 0; + if (tracks[track][row].note != 127) // handle key off + donote = 1; + } + channel[chan].fx = tracks[track][row].command; + channel[chan].info1 = tracks[track][row].param1; + channel[chan].info2 = tracks[track][row].param2; + + if (donote) + playnote (chan); - case 4: // vibrato (remember vars) - if(info) { - channel[chan].vibinfo1 = info1; - channel[chan].vibinfo2 = info2; + // command handling (row dependant) + info1 = channel[chan].info1; + info2 = channel[chan].info2; + if (flags & Decimal) + info = channel[chan].info1 * 10 + channel[chan].info2; + else + info = (channel[chan].info1 << 4) + channel[chan].info2; + switch (channel[chan].fx) + { + case 3: // tone portamento + if (tracks[track][row].note) + { + if (tracks[track][row].note < 13) + channel[chan].nextfreq = notetable[tracks[track][row].note - 1]; + else if (tracks[track][row].note % 12 > 0) + channel[chan].nextfreq = + notetable[(tracks[track][row].note % 12) - 1]; + else + channel[chan].nextfreq = notetable[11]; + channel[chan].nextoct = (tracks[track][row].note - 1) / 12; + if (tracks[track][row].note == 127) + { // handle key off + channel[chan].nextfreq = channel[chan].freq; + channel[chan].nextoct = channel[chan].oct; + } } - break; - - case 7: tempo = info; break; // set tempo - - case 8: channel[chan].key = 0; setfreq(chan); break; // release sustaining note + if (info) // remember vars + channel[chan].portainfo = info; + break; - case 9: // set carrier/modulator volume - if(info1) - channel[chan].vol1 = info1 * 7; - else - channel[chan].vol2 = info2 * 7; - setvolume(chan); - break; + case 4: // vibrato (remember vars) + if (info) + { + channel[chan].vibinfo1 = info1; + channel[chan].vibinfo2 = info2; + } + break; - case 11: // position jump - pattbreak = 1; rw = 0; if(info < ord) songend = 1; ord = info; break; + case 7: + tempo = info; + break; // set tempo - case 12: // set volume - channel[chan].vol1 = info; - channel[chan].vol2 = info; - if(channel[chan].vol1 > 63) - channel[chan].vol1 = 63; - if(channel[chan].vol2 > 63) - channel[chan].vol2 = 63; - setvolume(chan); - break; + case 8: + channel[chan].key = 0; + setfreq (chan); + break; // release sustaining note - case 13: // pattern break - if(!pattbreak) { pattbreak = 1; rw = info; ord++; } break; + case 9: // set carrier/modulator volume + if (info1) + channel[chan].vol1 = info1 * 7; + else + channel[chan].vol2 = info2 * 7; + setvolume (chan); + break; - case 14: // extended command - switch(info1) { - case 0: // define cell-tremolo - if(info2) - regbd |= 128; - else - regbd &= 127; - opl->write(0xbd,regbd); - break; + case 11: // position jump + pattbreak = 1; + rw = 0; + if (info < ord) + songend = 1; + ord = info; + break; + + case 12: // set volume + channel[chan].vol1 = info; + channel[chan].vol2 = info; + if (channel[chan].vol1 > 63) + channel[chan].vol1 = 63; + if (channel[chan].vol2 > 63) + channel[chan].vol2 = 63; + setvolume (chan); + break; - case 1: // define cell-vibrato - if(info2) - regbd |= 64; - else - regbd &= 191; - opl->write(0xbd,regbd); - break; + case 13: // pattern break + if (!pattbreak) + { + pattbreak = 1; + rw = info; + ord++; + } + break; - case 4: // increase volume fine - vol_up_alt(chan,info2); - setvolume(chan); - break; - - case 5: // decrease volume fine - vol_down_alt(chan,info2); - setvolume(chan); - break; + case 14: // extended command + switch (info1) + { + case 0: // define cell-tremolo + if (info2) + regbd |= 128; + else + regbd &= 127; + opl->write (0xbd, regbd); + break; - case 6: // manual slide up - slide_up(chan,info2); - setfreq(chan); - break; + case 1: // define cell-vibrato + if (info2) + regbd |= 64; + else + regbd &= 191; + opl->write (0xbd, regbd); + break; + + case 4: // increase volume fine + vol_up_alt (chan, info2); + setvolume (chan); + break; - case 7: // manual slide down - slide_down(chan,info2); - setfreq(chan); - break; + case 5: // decrease volume fine + vol_down_alt (chan, info2); + setvolume (chan); + break; - case 8: // pattern delay (rows) - pattern_delay = info2 * speed; - break; - } - break; + case 6: // manual slide up + slide_up (chan, info2); + setfreq (chan); + break; + + case 7: // manual slide down + slide_down (chan, info2); + setfreq (chan); + break; - case 15: // SA2 set speed - if(info <= 0x1f) - speed = info; - if(info >= 0x32) - tempo = info; - if(!info) - songend = 1; - break; + case 8: // pattern delay (rows) + pattern_delay = info2 * speed; + break; + } + break; - case 17: // alternate set volume - channel[chan].vol1 = info; - if(channel[chan].vol1 > 63) - channel[chan].vol1 = 63; - if(inst[channel[chan].inst].data[0] & 1) { - channel[chan].vol2 = info; - if(channel[chan].vol2 > 63) - channel[chan].vol2 = 63; - } + case 15: // SA2 set speed + if (info <= 0x1f) + speed = info; + if (info >= 0x32) + tempo = info; + if (!info) + songend = 1; + break; - setvolume(chan); - break; + case 17: // alternate set volume + channel[chan].vol1 = info; + if (channel[chan].vol1 > 63) + channel[chan].vol1 = 63; + if (inst[channel[chan].inst].data[0] & 1) + { + channel[chan].vol2 = info; + if (channel[chan].vol2 > 63) + channel[chan].vol2 = 63; + } - case 18: // AMD set speed - if(info <= 31 && info > 0) - speed = info; - if(info > 31 || !info) - tempo = info; - break; + setvolume (chan); + break; - case 19: // RAD/A2M set speed - speed = (info ? info : info + 1); - break; + case 18: // AMD set speed + if (info <= 31 && info > 0) + speed = info; + if (info > 31 || !info) + tempo = info; + break; - case 21: // set modulator volume - if(info <= 63) - channel[chan].vol2 = info; - else - channel[chan].vol2 = 63; - setvolume(chan); - break; + case 19: // RAD/A2M set speed + speed = (info ? info : info + 1); + break; - case 22: // set carrier volume - if(info <= 63) - channel[chan].vol1 = info; - else - channel[chan].vol1 = 63; - setvolume(chan); - break; + case 21: // set modulator volume + if (info <= 63) + channel[chan].vol2 = info; + else + channel[chan].vol2 = 63; + setvolume (chan); + break; - case 23: // fine frequency slide up - slide_up(chan,info); - setfreq(chan); - break; + case 22: // set carrier volume + if (info <= 63) + channel[chan].vol1 = info; + else + channel[chan].vol1 = 63; + setvolume (chan); + break; - case 24: // fine frequency slide down - slide_down(chan,info); - setfreq(chan); - break; + case 23: // fine frequency slide up + slide_up (chan, info); + setfreq (chan); + break; - case 25: // set carrier/modulator waveform - if(info1 != 0x0f) - opl->write(0xe3 + op_table[oplchan],info1); - if(info2 != 0x0f) - opl->write(0xe0 + op_table[oplchan],info2); - break; + case 24: // fine frequency slide down + slide_down (chan, info); + setfreq (chan); + break; - case 27: // set chip tremolo/vibrato - if(info1) - regbd |= 128; - else - regbd &= 127; - if(info2) - regbd |= 64; - else - regbd &= 191; - opl->write(0xbd,regbd); - break; + case 25: // set carrier/modulator waveform + if (info1 != 0x0f) + opl->write (0xe3 + op_table[oplchan], info1); + if (info2 != 0x0f) + opl->write (0xe0 + op_table[oplchan], info2); + break; - case 29: // pattern delay (frames) + case 27: // set chip tremolo/vibrato + if (info1) + regbd |= 128; + else + regbd &= 127; + if (info2) + regbd |= 64; + else + regbd &= 191; + opl->write (0xbd, regbd); + break; + + case 29: // pattern delay (frames) pattern_delay = info; break; - } - } + } + } // speed compensation del = speed - 1 + pattern_delay; - if(!pattbreak) { // next row (only if no manual advance) - rw++; - if(rw >= nrows) { - rw = 0; - ord++; - } - } + if (!pattbreak) + { // next row (only if no manual advance) + rw++; + if (rw >= nrows) + { + rw = 0; + ord++; + } + } - resolve_order(); // so we can report songend right away - AdPlug_LogWrite("\n"); + resolve_order (); // so we can report songend right away + AdPlug_LogWrite ("\n"); return !songend; } -unsigned char CmodPlayer::set_opl_chip(unsigned char chan) +unsigned char +CmodPlayer::set_opl_chip (unsigned char chan) /* * Sets OPL chip according to channel number. Channels 0-8 are on first chip, * channels 9-17 are on second chip. Returns corresponding OPL channel @@ -456,15 +538,17 @@ { int newchip = chan < 9 ? 0 : 1; - if(newchip != curchip) { - opl->setchip(newchip); + if (newchip != curchip) + { + opl->setchip (newchip); curchip = newchip; } return chan % 9; } -bool CmodPlayer::resolve_order() +bool +CmodPlayer::resolve_order () /* * Resolves current orderlist entry, checking for jumps and loops. * @@ -472,69 +556,84 @@ * has been detected. */ { - if(ord < length) { - while(order[ord] >= JUMPMARKER) { // jump to order + if (ord < length) + { + while (order[ord] >= JUMPMARKER) + { // jump to order unsigned long neword = order[ord] - JUMPMARKER; - if(neword <= ord) songend = 1; - if(neword == ord) return false; + if (neword <= ord) + songend = 1; + if (neword == ord) + return false; ord = neword; - } - } else { - songend = 1; + } + } + else + { + songend = 1; ord = restartpos; } return true; } -void CmodPlayer::rewind(int subsong) +void +CmodPlayer::rewind (int subsong) { unsigned long i; // Reset playing variables songend = del = ord = rw = regbd = 0; - tempo = bpm; speed = initspeed; + tempo = bpm; + speed = initspeed; // Reset channel data - memset(channel,0,sizeof(Channel)*nchans); + memset (channel, 0, sizeof (Channel) * nchans); // Compute number of patterns, if needed - if(!nop) - for(i=0;i nop ? order[i] : nop); - opl->init(); // Reset OPL chip - opl->write(1, 32); // Go to ym3812 mode + opl->init (); // Reset OPL chip + opl->write (1, 32); // Go to ym3812 mode // Enable OPL3 extensions if flagged - if(flags & Opl3) { - opl->setchip(1); - opl->write(1, 32); - opl->write(5, 1); - opl->setchip(0); + if (flags & Opl3) + { + opl->setchip (1); + opl->write (1, 32); + opl->write (5, 1); + opl->setchip (0); } // Enable tremolo/vibrato depth if flagged - if(flags & Tremolo) regbd |= 128; - if(flags & Vibrato) regbd |= 64; - if(regbd) opl->write(0xbd, regbd); + if (flags & Tremolo) + regbd |= 128; + if (flags & Vibrato) + regbd |= 64; + if (regbd) + opl->write (0xbd, regbd); } -float CmodPlayer::getrefresh() +float +CmodPlayer::getrefresh () { - return (float) (tempo / 2.5); + return (float) (tempo / 2.5); } -void CmodPlayer::init_trackord() +void +CmodPlayer::init_trackord () { unsigned long i; - for(i=0;iwrite(0x40 + op_table[oplchan], 63-channel[chan].vol2 + (inst[channel[chan].inst].data[9] & 192)); - opl->write(0x43 + op_table[oplchan], 63-channel[chan].vol1 + (inst[channel[chan].inst].data[10] & 192)); - } + if (flags & Faust) + setvolume_alt (chan); + else + { + opl->write (0x40 + op_table[oplchan], + 63 - channel[chan].vol2 + + (inst[channel[chan].inst].data[9] & 192)); + opl->write (0x43 + op_table[oplchan], + 63 - channel[chan].vol1 + + (inst[channel[chan].inst].data[10] & 192)); + } } -void CmodPlayer::setvolume_alt(unsigned char chan) +void +CmodPlayer::setvolume_alt (unsigned char chan) { - unsigned char oplchan = set_opl_chip(chan); - unsigned char ivol2 = inst[channel[chan].inst].data[9] & 63; - unsigned char ivol1 = inst[channel[chan].inst].data[10] & 63; + unsigned char oplchan = set_opl_chip (chan); + unsigned char ivol2 = inst[channel[chan].inst].data[9] & 63; + unsigned char ivol1 = inst[channel[chan].inst].data[10] & 63; - opl->write(0x40 + op_table[oplchan], (((63 - channel[chan].vol2 & 63) + ivol2) >> 1) + (inst[channel[chan].inst].data[9] & 192)); - opl->write(0x43 + op_table[oplchan], (((63 - channel[chan].vol1 & 63) + ivol1) >> 1) + (inst[channel[chan].inst].data[10] & 192)); + opl->write (0x40 + op_table[oplchan], + (((63 - channel[chan].vol2 & 63) + ivol2) >> 1) + + (inst[channel[chan].inst].data[9] & 192)); + opl->write (0x43 + op_table[oplchan], + (((63 - channel[chan].vol1 & 63) + ivol1) >> 1) + + (inst[channel[chan].inst].data[10] & 192)); } -void CmodPlayer::setfreq(unsigned char chan) +void +CmodPlayer::setfreq (unsigned char chan) { - unsigned char oplchan = set_opl_chip(chan); + unsigned char oplchan = set_opl_chip (chan); - opl->write(0xa0 + oplchan, channel[chan].freq & 255); - if(channel[chan].key) - opl->write(0xb0 + oplchan, ((channel[chan].freq & 768) >> 8) + (channel[chan].oct << 2) | 32); - else - opl->write(0xb0 + oplchan, ((channel[chan].freq & 768) >> 8) + (channel[chan].oct << 2)); + opl->write (0xa0 + oplchan, channel[chan].freq & 255); + if (channel[chan].key) + opl->write (0xb0 + oplchan, + ((channel[chan].freq & 768) >> 8) + + (channel[chan].oct << 2) | 32); + else + opl->write (0xb0 + oplchan, + ((channel[chan].freq & 768) >> 8) + (channel[chan].oct << 2)); } -void CmodPlayer::playnote(unsigned char chan) +void +CmodPlayer::playnote (unsigned char chan) { - unsigned char oplchan = set_opl_chip(chan); + unsigned char oplchan = set_opl_chip (chan); unsigned char op = op_table[oplchan], insnr = channel[chan].inst; - if(!(flags & NoKeyOn)) - opl->write(0xb0 + oplchan, 0); // stop old note + if (!(flags & NoKeyOn)) + opl->write (0xb0 + oplchan, 0); // stop old note - // set instrument data - opl->write(0x20 + op, inst[insnr].data[1]); - opl->write(0x23 + op, inst[insnr].data[2]); - opl->write(0x60 + op, inst[insnr].data[3]); - opl->write(0x63 + op, inst[insnr].data[4]); - opl->write(0x80 + op, inst[insnr].data[5]); - opl->write(0x83 + op, inst[insnr].data[6]); - opl->write(0xe0 + op, inst[insnr].data[7]); - opl->write(0xe3 + op, inst[insnr].data[8]); - opl->write(0xc0 + oplchan, inst[insnr].data[0]); - opl->write(0xbd, inst[insnr].misc); // set misc. register + // set instrument data + opl->write (0x20 + op, inst[insnr].data[1]); + opl->write (0x23 + op, inst[insnr].data[2]); + opl->write (0x60 + op, inst[insnr].data[3]); + opl->write (0x63 + op, inst[insnr].data[4]); + opl->write (0x80 + op, inst[insnr].data[5]); + opl->write (0x83 + op, inst[insnr].data[6]); + opl->write (0xe0 + op, inst[insnr].data[7]); + opl->write (0xe3 + op, inst[insnr].data[8]); + opl->write (0xc0 + oplchan, inst[insnr].data[0]); + opl->write (0xbd, inst[insnr].misc); // set misc. register - // set frequency, volume & play - channel[chan].key = 1; - setfreq(chan); + // set frequency, volume & play + channel[chan].key = 1; + setfreq (chan); - if (flags & Faust) { - channel[chan].vol2 = 63; - channel[chan].vol1 = 63; - } - setvolume(chan); + if (flags & Faust) + { + channel[chan].vol2 = 63; + channel[chan].vol1 = 63; + } + setvolume (chan); } -void CmodPlayer::setnote(unsigned char chan, int note) +void +CmodPlayer::setnote (unsigned char chan, int note) { - if(note > 96) - if(note == 127) { // key off - channel[chan].key = 0; - setfreq(chan); - return; - } else - note = 96; + if (note > 96) + if (note == 127) + { // key off + channel[chan].key = 0; + setfreq (chan); + return; + } + else + note = 96; - if(note < 13) - channel[chan].freq = notetable[note - 1]; - else - if(note % 12 > 0) - channel[chan].freq = notetable[(note % 12) - 1]; - else - channel[chan].freq = notetable[11]; - channel[chan].oct = (note - 1) / 12; - channel[chan].freq += inst[channel[chan].inst].slide; // apply pre-slide + if (note < 13) + channel[chan].freq = notetable[note - 1]; + else if (note % 12 > 0) + channel[chan].freq = notetable[(note % 12) - 1]; + else + channel[chan].freq = notetable[11]; + channel[chan].oct = (note - 1) / 12; + channel[chan].freq += inst[channel[chan].inst].slide; // apply pre-slide } -void CmodPlayer::slide_down(unsigned char chan, int amount) +void +CmodPlayer::slide_down (unsigned char chan, int amount) { - channel[chan].freq -= amount; - if(channel[chan].freq <= 342) - if(channel[chan].oct) { - channel[chan].oct--; - channel[chan].freq <<= 1; - } else - channel[chan].freq = 342; + channel[chan].freq -= amount; + if (channel[chan].freq <= 342) + if (channel[chan].oct) + { + channel[chan].oct--; + channel[chan].freq <<= 1; + } + else + channel[chan].freq = 342; } -void CmodPlayer::slide_up(unsigned char chan, int amount) +void +CmodPlayer::slide_up (unsigned char chan, int amount) { - channel[chan].freq += amount; - if(channel[chan].freq >= 686) - if(channel[chan].oct < 7) { - channel[chan].oct++; - channel[chan].freq >>= 1; - } else - channel[chan].freq = 686; + channel[chan].freq += amount; + if (channel[chan].freq >= 686) + if (channel[chan].oct < 7) + { + channel[chan].oct++; + channel[chan].freq >>= 1; + } + else + channel[chan].freq = 686; } -void CmodPlayer::tone_portamento(unsigned char chan, unsigned char info) +void +CmodPlayer::tone_portamento (unsigned char chan, unsigned char info) { - if(channel[chan].freq + (channel[chan].oct << 10) < channel[chan].nextfreq + - (channel[chan].nextoct << 10)) { - slide_up(chan,info); - if(channel[chan].freq + (channel[chan].oct << 10) > channel[chan].nextfreq + - (channel[chan].nextoct << 10)) { - channel[chan].freq = channel[chan].nextfreq; - channel[chan].oct = channel[chan].nextoct; - } - } - if(channel[chan].freq + (channel[chan].oct << 10) > channel[chan].nextfreq + - (channel[chan].nextoct << 10)) { - slide_down(chan,info); - if(channel[chan].freq + (channel[chan].oct << 10) < channel[chan].nextfreq + - (channel[chan].nextoct << 10)) { - channel[chan].freq = channel[chan].nextfreq; - channel[chan].oct = channel[chan].nextoct; - } - } - setfreq(chan); + if (channel[chan].freq + (channel[chan].oct << 10) < + channel[chan].nextfreq + (channel[chan].nextoct << 10)) + { + slide_up (chan, info); + if (channel[chan].freq + (channel[chan].oct << 10) > + channel[chan].nextfreq + (channel[chan].nextoct << 10)) + { + channel[chan].freq = channel[chan].nextfreq; + channel[chan].oct = channel[chan].nextoct; + } + } + if (channel[chan].freq + (channel[chan].oct << 10) > + channel[chan].nextfreq + (channel[chan].nextoct << 10)) + { + slide_down (chan, info); + if (channel[chan].freq + (channel[chan].oct << 10) < + channel[chan].nextfreq + (channel[chan].nextoct << 10)) + { + channel[chan].freq = channel[chan].nextfreq; + channel[chan].oct = channel[chan].nextoct; + } + } + setfreq (chan); } -void CmodPlayer::vibrato(unsigned char chan, unsigned char speed, unsigned char depth) +void +CmodPlayer::vibrato (unsigned char chan, unsigned char speed, + unsigned char depth) { - int i; + int i; - if(!speed || !depth) - return; + if (!speed || !depth) + return; - if(depth > 14) - depth = 14; + if (depth > 14) + depth = 14; - for(i=0;i= 64) - channel[chan].trigger -= 64; - if(channel[chan].trigger >= 16 && channel[chan].trigger < 48) - slide_down(chan,vibratotab[channel[chan].trigger - 16] / (16-depth)); - if(channel[chan].trigger < 16) - slide_up(chan,vibratotab[channel[chan].trigger + 16] / (16-depth)); - if(channel[chan].trigger >= 48) - slide_up(chan,vibratotab[channel[chan].trigger - 48] / (16-depth)); - } - setfreq(chan); + for (i = 0; i < speed; i++) + { + channel[chan].trigger++; + while (channel[chan].trigger >= 64) + channel[chan].trigger -= 64; + if (channel[chan].trigger >= 16 && channel[chan].trigger < 48) + slide_down (chan, + vibratotab[channel[chan].trigger - 16] / (16 - depth)); + if (channel[chan].trigger < 16) + slide_up (chan, vibratotab[channel[chan].trigger + 16] / (16 - depth)); + if (channel[chan].trigger >= 48) + slide_up (chan, vibratotab[channel[chan].trigger - 48] / (16 - depth)); + } + setfreq (chan); } -void CmodPlayer::vol_up(unsigned char chan, int amount) +void +CmodPlayer::vol_up (unsigned char chan, int amount) { - if(channel[chan].vol1 + amount < 63) - channel[chan].vol1 += amount; - else - channel[chan].vol1 = 63; + if (channel[chan].vol1 + amount < 63) + channel[chan].vol1 += amount; + else + channel[chan].vol1 = 63; - if(channel[chan].vol2 + amount < 63) - channel[chan].vol2 += amount; - else - channel[chan].vol2 = 63; + if (channel[chan].vol2 + amount < 63) + channel[chan].vol2 += amount; + else + channel[chan].vol2 = 63; } -void CmodPlayer::vol_down(unsigned char chan, int amount) +void +CmodPlayer::vol_down (unsigned char chan, int amount) { - if(channel[chan].vol1 - amount > 0) - channel[chan].vol1 -= amount; - else - channel[chan].vol1 = 0; + if (channel[chan].vol1 - amount > 0) + channel[chan].vol1 -= amount; + else + channel[chan].vol1 = 0; - if(channel[chan].vol2 - amount > 0) - channel[chan].vol2 -= amount; - else - channel[chan].vol2 = 0; + if (channel[chan].vol2 - amount > 0) + channel[chan].vol2 -= amount; + else + channel[chan].vol2 = 0; } -void CmodPlayer::vol_up_alt(unsigned char chan, int amount) +void +CmodPlayer::vol_up_alt (unsigned char chan, int amount) { - if(channel[chan].vol1 + amount < 63) - channel[chan].vol1 += amount; - else - channel[chan].vol1 = 63; - if(inst[channel[chan].inst].data[0] & 1) - if(channel[chan].vol2 + amount < 63) - channel[chan].vol2 += amount; - else - channel[chan].vol2 = 63; + if (channel[chan].vol1 + amount < 63) + channel[chan].vol1 += amount; + else + channel[chan].vol1 = 63; + if (inst[channel[chan].inst].data[0] & 1) + if (channel[chan].vol2 + amount < 63) + channel[chan].vol2 += amount; + else + channel[chan].vol2 = 63; } -void CmodPlayer::vol_down_alt(unsigned char chan, int amount) +void +CmodPlayer::vol_down_alt (unsigned char chan, int amount) { - if(channel[chan].vol1 - amount > 0) - channel[chan].vol1 -= amount; - else - channel[chan].vol1 = 0; - if(inst[channel[chan].inst].data[0] & 1) - if(channel[chan].vol2 - amount > 0) - channel[chan].vol2 -= amount; - else - channel[chan].vol2 = 0; + if (channel[chan].vol1 - amount > 0) + channel[chan].vol1 -= amount; + else + channel[chan].vol1 = 0; + if (inst[channel[chan].inst].data[0] & 1) + if (channel[chan].vol2 - amount > 0) + channel[chan].vol2 -= amount; + else + channel[chan].vol2 = 0; } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/psi.cxx --- a/src/adplug/core/psi.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/psi.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -38,8 +38,8 @@ #include "psi.h" #include "debug.h" -const unsigned char CxadpsiPlayer::psi_adlib_registers[99] = -{ +const unsigned char + CxadpsiPlayer::psi_adlib_registers[99] = { 0x20, 0x23, 0x40, 0x43, 0x60, 0x63, 0x80, 0x83, 0xE0, 0xE3, 0xC0, 0x21, 0x24, 0x41, 0x44, 0x61, 0x64, 0x81, 0x84, 0xE1, 0xE4, 0xC1, 0x22, 0x25, 0x42, 0x45, 0x62, 0x65, 0x82, 0x85, 0xE2, 0xE5, 0xC2, @@ -51,23 +51,25 @@ 0x32, 0x35, 0x52, 0x55, 0x72, 0x75, 0x92, 0x95, 0xF2, 0xF5, 0xC8 }; -const unsigned short CxadpsiPlayer::psi_notes[16] = -{ +const unsigned short + CxadpsiPlayer::psi_notes[16] = { 0x216B, 0x2181, 0x2198, 0x21B0, 0x21CA, 0x21E5, 0x2202, 0x2220, 0x2241, 0x2263, 0x2287, 0x2364, - 0x0000, 0x0000, 0x0000, 0x0000 // by riven + 0x0000, 0x0000, 0x0000, 0x0000 // by riven }; -CPlayer *CxadpsiPlayer::factory(Copl *newopl) +CPlayer * +CxadpsiPlayer::factory (Copl * newopl) { - return new CxadpsiPlayer(newopl); + return new CxadpsiPlayer (newopl); } -void CxadpsiPlayer::xadplayer_rewind(int subsong) +void +CxadpsiPlayer::xadplayer_rewind (int subsong) { - opl_write(0x01, 0x20); - opl_write(0x08, 0x00); - opl_write(0xBD, 0x00); + opl_write (0x01, 0x20); + opl_write (0x08, 0x00); + opl_write (0xBD, 0x00); // get header header.instr_ptr = (tune[1] << 8) + tune[0]; @@ -76,16 +78,18 @@ // define instruments psi.instr_table = &tune[header.instr_ptr]; - for(int i=0; i<8; i++) + for (int i = 0; i < 8; i++) { - for(int j=0; j<11; j++) { - unsigned short inspos = (psi.instr_table[i * 2 + 1] << 8) + psi.instr_table[i * 2]; + for (int j = 0; j < 11; j++) + { + unsigned short inspos = + (psi.instr_table[i * 2 + 1] << 8) + psi.instr_table[i * 2]; - opl_write(psi_adlib_registers[i*11 + j],tune[inspos + j]); + opl_write (psi_adlib_registers[i * 11 + j], tune[inspos + j]); } - opl_write(0xA0+i, 0x00); - opl_write(0xB0+i, 0x00); + opl_write (0xA0 + i, 0x00); + opl_write (0xB0 + i, 0x00); psi.note_delay[i] = 1; psi.note_curdelay[i] = 1; @@ -96,34 +100,38 @@ psi.seq_table = &tune[header.seq_ptr]; } -void CxadpsiPlayer::xadplayer_update() +void +CxadpsiPlayer::xadplayer_update () { unsigned short ptr; - for(int i=0; i<8; i++) + for (int i = 0; i < 8; i++) { - ptr = (psi.seq_table[(i<<1) * 2 + 1] << 8) + psi.seq_table[(i<<1) * 2]; + ptr = + (psi.seq_table[(i << 1) * 2 + 1] << 8) + psi.seq_table[(i << 1) * 2]; psi.note_curdelay[i]--; if (!psi.note_curdelay[i]) { - opl_write(0xA0+i, 0x00); - opl_write(0xB0+i, 0x00); + opl_write (0xA0 + i, 0x00); + opl_write (0xB0 + i, 0x00); unsigned char event = tune[ptr++]; #ifdef DEBUG - AdPlug_LogWrite("channel %02X, event %02X:\n",i+1,event); + AdPlug_LogWrite ("channel %02X, event %02X:\n", i + 1, event); #endif // end of sequence ? if (!event) { - ptr = (psi.seq_table[(i<<1) * 2 + 3] << 8) + psi.seq_table[(i<<1) * 2 + 2]; + ptr = + (psi.seq_table[(i << 1) * 2 + 3] << 8) + + psi.seq_table[(i << 1) * 2 + 2]; event = tune[ptr++]; #ifdef DEBUG - AdPlug_LogWrite(" channel %02X, event %02X:\n",i+1,event); + AdPlug_LogWrite (" channel %02X, event %02X:\n", i + 1, event); #endif // set sequence loop flag @@ -131,7 +139,7 @@ // module loop ? plr.looping = 1; - for(int j=0; j<8; j++) + for (int j = 0; j < 8; j++) plr.looping &= psi.looping[j]; } @@ -142,7 +150,7 @@ event = tune[ptr++]; #ifdef DEBUG - AdPlug_LogWrite(" channel %02X, event %02X:\n",i+1,event); + AdPlug_LogWrite (" channel %02X, event %02X:\n", i + 1, event); #endif } @@ -151,27 +159,29 @@ // play note unsigned short note = psi_notes[event & 0x0F]; - opl_write(0xA0+i, note & 0xFF); - opl_write(0xB0+i, (note >> 8) + ((event >> 2) & 0xFC)); + opl_write (0xA0 + i, note & 0xFF); + opl_write (0xB0 + i, (note >> 8) + ((event >> 2) & 0xFC)); // save position - psi.seq_table[(i<<1) * 2] = ptr & 0xff; - psi.seq_table[(i<<1) * 2 + 1] = ptr >> 8; + psi.seq_table[(i << 1) * 2] = ptr & 0xff; + psi.seq_table[(i << 1) * 2 + 1] = ptr >> 8; } } } -float CxadpsiPlayer::xadplayer_getrefresh() +float +CxadpsiPlayer::xadplayer_getrefresh () { return 70.0f; } -std::string CxadpsiPlayer::xadplayer_gettype() +std::string CxadpsiPlayer::xadplayer_gettype () { - return std::string("xad: psi player"); + return std::string ("xad: psi player"); } -unsigned int CxadpsiPlayer::xadplayer_getinstruments() +unsigned int +CxadpsiPlayer::xadplayer_getinstruments () { return 8; } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/rad.cxx --- a/src/adplug/core/rad.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/rad.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -24,101 +24,130 @@ #include "rad.h" -CPlayer *CradLoader::factory(Copl *newopl) +CPlayer * +CradLoader::factory (Copl * newopl) { - return new CradLoader(newopl); + return new CradLoader (newopl); } -bool CradLoader::load(VFSFile *fd, const CFileProvider &fp) +bool +CradLoader::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); if(!f) return false; - char id[16]; - unsigned char buf,ch,c,b,inp; - char bufstr[2] = "\0"; - unsigned int i,j; - unsigned short patofs[32]; - const unsigned char convfx[16] = {255,1,2,3,255,5,255,255,255,255,20,255,17,0xd,255,19}; + binistream *f = fp.open (fd); + if (!f) + return false; + char id[16]; + unsigned char buf, ch, c, b, inp; + char bufstr[2] = "\0"; + unsigned int i, j; + unsigned short patofs[32]; + const unsigned char convfx[16] = + { 255, 1, 2, 3, 255, 5, 255, 255, 255, 255, 20, 255, 17, 0xd, 255, 19 }; - // file validation section - f->readString(id, 16); version = f->readInt(1); - if(strncmp(id,"RAD by REALiTY!!",16) || version != 0x10) - { fp.close(f); return false; } + // file validation section + f->readString (id, 16); + version = f->readInt (1); + if (strncmp (id, "RAD by REALiTY!!", 16) || version != 0x10) + { + fp.close (f); + return false; + } - // load section - radflags = f->readInt(1); - if(radflags & 128) { // description - memset(desc,0,80*22); - while((buf = f->readInt(1))) - if(buf == 1) - strcat(desc,"\n"); - else - if(buf >= 2 && buf <= 0x1f) - for(i=0;ireadInt(1))) { // instruments - buf--; - inst[buf].data[2] = f->readInt(1); inst[buf].data[1] = f->readInt(1); - inst[buf].data[10] = f->readInt(1); inst[buf].data[9] = f->readInt(1); - inst[buf].data[4] = f->readInt(1); inst[buf].data[3] = f->readInt(1); - inst[buf].data[6] = f->readInt(1); inst[buf].data[5] = f->readInt(1); - inst[buf].data[0] = f->readInt(1); - inst[buf].data[8] = f->readInt(1); inst[buf].data[7] = f->readInt(1); - } - length = f->readInt(1); - for(i = 0; i < length; i++) order[i] = f->readInt(1); // orderlist - for(i = 0; i < 32; i++) patofs[i] = f->readInt(2); // pattern offset table - init_trackord(); // patterns - for(i=0;i<32;i++) - if(patofs[i]) { - f->seek(patofs[i]); - do { - buf = f->readInt(1); b = buf & 127; - do { - ch = f->readInt(1); c = ch & 127; - inp = f->readInt(1); - tracks[i*9+c][b].note = inp & 127; - tracks[i*9+c][b].inst = (inp & 128) >> 3; - inp = f->readInt(1); - tracks[i*9+c][b].inst += inp >> 4; - tracks[i*9+c][b].command = inp & 15; - if(inp & 15) { - inp = f->readInt(1); - tracks[i*9+c][b].param1 = inp / 10; - tracks[i*9+c][b].param2 = inp % 10; - } - } while(!(ch & 128)); - } while(!(buf & 128)); - } else - memset(trackord[i],0,9*2); - fp.close(f); + // load section + radflags = f->readInt (1); + if (radflags & 128) + { // description + memset (desc, 0, 80 * 22); + while ((buf = f->readInt (1))) + if (buf == 1) + strcat (desc, "\n"); + else if (buf >= 2 && buf <= 0x1f) + for (i = 0; i < buf; i++) + strcat (desc, " "); + else + { + *bufstr = buf; + strcat (desc, bufstr); + } + } + while ((buf = f->readInt (1))) + { // instruments + buf--; + inst[buf].data[2] = f->readInt (1); + inst[buf].data[1] = f->readInt (1); + inst[buf].data[10] = f->readInt (1); + inst[buf].data[9] = f->readInt (1); + inst[buf].data[4] = f->readInt (1); + inst[buf].data[3] = f->readInt (1); + inst[buf].data[6] = f->readInt (1); + inst[buf].data[5] = f->readInt (1); + inst[buf].data[0] = f->readInt (1); + inst[buf].data[8] = f->readInt (1); + inst[buf].data[7] = f->readInt (1); + } + length = f->readInt (1); + for (i = 0; i < length; i++) + order[i] = f->readInt (1); // orderlist + for (i = 0; i < 32; i++) + patofs[i] = f->readInt (2); // pattern offset table + init_trackord (); // patterns + for (i = 0; i < 32; i++) + if (patofs[i]) + { + f->seek (patofs[i]); + do + { + buf = f->readInt (1); + b = buf & 127; + do + { + ch = f->readInt (1); + c = ch & 127; + inp = f->readInt (1); + tracks[i * 9 + c][b].note = inp & 127; + tracks[i * 9 + c][b].inst = (inp & 128) >> 3; + inp = f->readInt (1); + tracks[i * 9 + c][b].inst += inp >> 4; + tracks[i * 9 + c][b].command = inp & 15; + if (inp & 15) + { + inp = f->readInt (1); + tracks[i * 9 + c][b].param1 = inp / 10; + tracks[i * 9 + c][b].param2 = inp % 10; + } + } while (!(ch & 128)); + } while (!(buf & 128)); + } + else + memset (trackord[i], 0, 9 * 2); + fp.close (f); - // convert replay data - for(i=0;i<32*9;i++) // convert patterns - for(j=0;j<64;j++) { - if(tracks[i][j].note == 15) - tracks[i][j].note = 127; - if(tracks[i][j].note > 16 && tracks[i][j].note < 127) - tracks[i][j].note -= 4 * (tracks[i][j].note >> 4); - if(tracks[i][j].note && tracks[i][j].note < 126) - tracks[i][j].note++; - tracks[i][j].command = convfx[tracks[i][j].command]; - } - restartpos = 0; initspeed = radflags & 31; - bpm = radflags & 64 ? 0 : 50; flags = Decimal; + // convert replay data + for (i = 0; i < 32 * 9; i++) // convert patterns + for (j = 0; j < 64; j++) + { + if (tracks[i][j].note == 15) + tracks[i][j].note = 127; + if (tracks[i][j].note > 16 && tracks[i][j].note < 127) + tracks[i][j].note -= 4 * (tracks[i][j].note >> 4); + if (tracks[i][j].note && tracks[i][j].note < 126) + tracks[i][j].note++; + tracks[i][j].command = convfx[tracks[i][j].command]; + } + restartpos = 0; + initspeed = radflags & 31; + bpm = radflags & 64 ? 0 : 50; + flags = Decimal; - rewind(0); - return true; + rewind (0); + return true; } -float CradLoader::getrefresh() +float +CradLoader::getrefresh () { - if(tempo) - return (float) (tempo); - else - return 18.2f; + if (tempo) + return (float) (tempo); + else + return 18.2f; } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/rat.cxx --- a/src/adplug/core/rat.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/rat.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -32,33 +32,36 @@ #include "rat.h" #include "debug.h" -const unsigned char CxadratPlayer::rat_adlib_bases[18] = -{ +const unsigned char + CxadratPlayer::rat_adlib_bases[18] = { 0x00, 0x01, 0x02, 0x08, 0x09, 0x0A, 0x10, 0x11, 0x12, 0x03, 0x04, 0x05, 0x0B, 0x0C, 0x0D, 0x13, 0x14, 0x15 }; -const unsigned short CxadratPlayer::rat_notes[16] = -{ - 0x157, 0x16B, 0x181, 0x198, 0x1B0, 0x1CA, 0x1E5, 0x202, 0x220, 0x241, 0x263, 0x287, - 0x000, 0x000, 0x000, 0x000 // by riven +const unsigned short + CxadratPlayer::rat_notes[16] = { + 0x157, 0x16B, 0x181, 0x198, 0x1B0, 0x1CA, 0x1E5, 0x202, 0x220, 0x241, 0x263, + 0x287, + 0x000, 0x000, 0x000, 0x000 // by riven }; -CPlayer *CxadratPlayer::factory(Copl *newopl) +CPlayer * +CxadratPlayer::factory (Copl * newopl) { - return new CxadratPlayer(newopl); + return new CxadratPlayer (newopl); } -bool CxadratPlayer::xadplayer_load() +bool +CxadratPlayer::xadplayer_load () { - if(xad.fmt != RAT) + if (xad.fmt != RAT) return false; // load header - memcpy(&rat.hdr, &tune[0], sizeof(rat_header)); + memcpy (&rat.hdr, &tune[0], sizeof (rat_header)); // is 'RAT'-signed ? - if (strncmp(rat.hdr.id,"RAT",3)) + if (strncmp (rat.hdr.id, "RAT", 3)) return false; // is version 1.0 ? @@ -69,25 +72,26 @@ rat.order = &tune[0x40]; // load instruments - rat.inst = (rat_instrument *)&tune[0x140]; + rat.inst = (rat_instrument *) & tune[0x140]; // load pattern data unsigned short patseg = (rat.hdr.patseg[1] << 8) + rat.hdr.patseg[0]; unsigned char *event_ptr = &tune[patseg << 4]; - for(int i=0;i> 8) | ((event.note & 0xF0) >> 2) | 0x20); + opl_write (0xA0 + i, freq & 0xFF); + opl_write (0xB0 + i, (freq >> 8) | ((event.note & 0xF0) >> 2) | 0x20); } } @@ -202,30 +214,30 @@ rat.pattern_pos++; // process effects - for(i=0;i>= 6; - vol *= gvol; - vol >>= 6; - vol ^= 0x3F; + vol = ivol; + vol &= 0x3F; + vol ^= 0x3F; + vol *= cvol; + vol >>= 6; + vol *= gvol; + vol >>= 6; + vol ^= 0x3F; - vol |= ivol & 0xC0; + vol |= ivol & 0xC0; return vol; } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/raw.cxx --- a/src/adplug/core/raw.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/raw.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -23,81 +23,105 @@ /*** public methods *************************************/ -CPlayer *CrawPlayer::factory(Copl *newopl) +CPlayer * +CrawPlayer::factory (Copl * newopl) { - return new CrawPlayer(newopl); + return new CrawPlayer (newopl); } -bool CrawPlayer::load(VFSFile *fd, const CFileProvider &fp) +bool +CrawPlayer::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); if(!f) return false; + binistream *f = fp.open (fd); + if (!f) + return false; char id[8]; unsigned long i; // file validation section - f->readString(id, 8); - if(strncmp(id,"RAWADATA",8)) { fp.close (f); return false; } + f->readString (id, 8); + if (strncmp (id, "RAWADATA", 8)) + { + fp.close (f); + return false; + } // load section - clock = f->readInt(2); // clock speed - length = (fp.filesize(f) - 10) / 2; - data = new Tdata [length]; - for(i = 0; i < length; i++) { - data[i].param = f->readInt(1); - data[i].command = f->readInt(1); + clock = f->readInt (2); // clock speed + length = (fp.filesize (f) - 10) / 2; + data = new Tdata[length]; + for (i = 0; i < length; i++) + { + data[i].param = f->readInt (1); + data[i].command = f->readInt (1); } - fp.close(f); - rewind(0); + fp.close (f); + rewind (0); return true; } -bool CrawPlayer::update() +bool +CrawPlayer::update () { - bool setspeed; + bool setspeed; - if(pos >= length) return false; + if (pos >= length) + return false; - if(del) { + if (del) + { del--; return !songend; } - do { + do + { setspeed = false; - switch(data[pos].command) { - case 0: del = data[pos].param - 1; break; + switch (data[pos].command) + { + case 0: + del = data[pos].param - 1; + break; case 2: - if(!data[pos].param) { - pos++; - speed = data[pos].param + (data[pos].command << 8); - setspeed = true; - } else - opl->setchip(data[pos].param - 1); + if (!data[pos].param) + { + pos++; + speed = data[pos].param + (data[pos].command << 8); + setspeed = true; + } + else + opl->setchip (data[pos].param - 1); break; case 0xff: - if(data[pos].param == 0xff) { - rewind(0); // auto-rewind song - songend = true; - return !songend; + if (data[pos].param == 0xff) + { + rewind (0); // auto-rewind song + songend = true; + return !songend; } break; default: - opl->write(data[pos].command,data[pos].param); + opl->write (data[pos].command, data[pos].param); break; } - } while(data[pos++].command || setspeed); + } while (data[pos++].command || setspeed); return !songend; } -void CrawPlayer::rewind(int subsong) +void +CrawPlayer::rewind (int subsong) { - pos = del = 0; speed = clock; songend = false; - opl->init(); opl->write(1, 32); // go to 9 channel mode + pos = del = 0; + speed = clock; + songend = false; + opl->init (); + opl->write (1, 32); // go to 9 channel mode } -float CrawPlayer::getrefresh() +float +CrawPlayer::getrefresh () { - return 1193180.0 / (speed ? speed : 0xffff); // timer oscillator speed / wait register = clock frequency + return 1193180.0 / (speed ? speed : 0xffff); // timer oscillator speed / wait register = clock frequency } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/rix.cxx --- a/src/adplug/core/rix.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/rix.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -23,81 +23,108 @@ #include "rix.h" #include "debug.h" -const unsigned char CrixPlayer::adflag[] = {0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1}; -const unsigned char CrixPlayer::reg_data[] = {0,1,2,3,4,5,8,9,10,11,12,13,16,17,18,19,20,21}; -const unsigned char CrixPlayer::ad_C0_offs[] = {0,1,2,0,1,2,3,4,5,3,4,5,6,7,8,6,7,8}; -const unsigned char CrixPlayer::modify[] = {0,3,1,4,2,5,6,9,7,10,8,11,12,15,13,16,14,17,12,\ - 15,16,0,14,0,17,0,13,0}; -const unsigned char CrixPlayer::bd_reg_data[] = { - 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x04,0x02,0x01, - 0x00,0x01,0x01,0x03,0x0F,0x05,0x00,0x01,0x03,0x0F,0x00, - 0x00,0x00,0x01,0x00,0x00,0x01,0x01,0x0F,0x07,0x00,0x02, - 0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x0A, - 0x04,0x00,0x08,0x0C,0x0B,0x00,0x00,0x00,0x01,0x00,0x00, - 0x00,0x00,0x0D,0x04,0x00,0x06,0x0F,0x00,0x00,0x00,0x00, - 0x01,0x00,0x00,0x0C,0x00,0x0F,0x0B,0x00,0x08,0x05,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0F,0x0B,0x00, - 0x07,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00, - 0x0F,0x0B,0x00,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x01,0x00,0x0F,0x0B,0x00,0x07,0x05,0x00,0x00,0x00, - 0x00,0x00,0x00}; -unsigned char CrixPlayer::for40reg[] = {0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F, - 0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F}; -unsigned short CrixPlayer::mus_time = 0x4268; +const unsigned char +CrixPlayer::adflag[] = + { 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1 }; +const unsigned char +CrixPlayer::reg_data[] = + { 0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21 }; +const unsigned char +CrixPlayer::ad_C0_offs[] = + { 0, 1, 2, 0, 1, 2, 3, 4, 5, 3, 4, 5, 6, 7, 8, 6, 7, 8 }; +const unsigned char + CrixPlayer::modify[] = + { 0, 3, 1, 4, 2, 5, 6, 9, 7, 10, 8, 11, 12, 15, 13, 16, 14, 17, 12, + 15, 16, 0, 14, 0, 17, 0, 13, 0 +}; +const unsigned char + CrixPlayer::bd_reg_data[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x04, 0x02, 0x01, + 0x00, 0x01, 0x01, 0x03, 0x0F, 0x05, 0x00, 0x01, 0x03, 0x0F, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x0F, 0x07, 0x00, 0x02, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, + 0x04, 0x00, 0x08, 0x0C, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x0D, 0x04, 0x00, 0x06, 0x0F, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x0C, 0x00, 0x0F, 0x0B, 0x00, 0x08, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x0B, 0x00, + 0x07, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x0F, 0x0B, 0x00, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x0F, 0x0B, 0x00, 0x07, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00 +}; +unsigned char + CrixPlayer::for40reg[] = + { 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F +}; +unsigned short + CrixPlayer::mus_time = 0x4268; /*** public methods *************************************/ -CPlayer *CrixPlayer::factory(Copl *newopl) +CPlayer * +CrixPlayer::factory (Copl * newopl) { - return new CrixPlayer(newopl); + return new CrixPlayer (newopl); } -CrixPlayer::CrixPlayer(Copl *newopl) - : CPlayer(newopl), flag_mkf(0), file_buffer(0), buf_addr(0) +CrixPlayer::CrixPlayer (Copl * newopl):CPlayer (newopl), flag_mkf (0), file_buffer (0), +buf_addr (0) { } -CrixPlayer::~CrixPlayer() +CrixPlayer::~CrixPlayer () { - if(file_buffer) - delete [] file_buffer; + if (file_buffer) + delete[]file_buffer; } -bool CrixPlayer::load(VFSFile *fd, const CFileProvider &fp) +bool +CrixPlayer::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); if(!f) return false; - unsigned long i=0; - std::string filename(fd->uri); + binistream *f = fp.open (fd); + if (!f) + return false; + unsigned long i = 0; + std::string filename (fd->uri); - if(stricmp(filename.substr(filename.length()-4,4).c_str(),".mkf")==0) + if (stricmp (filename.substr (filename.length () - 4, 4).c_str (), ".mkf") + == 0) { - flag_mkf=1; - f->seek(0); - int offset=f->readInt(4); - f->seek(offset); + flag_mkf = 1; + f->seek (0); + int offset = f->readInt (4); + f->seek (offset); + } + if (f->readInt (2) != 0x55aa) + { + fp.close (f); + return false; } - if(f->readInt(2)!=0x55aa){ fp.close(f);return false; } - file_buffer = new unsigned char [fp.filesize(f) + 1]; - f->seek(0); - while(!f->eof()) - file_buffer[i++]=f->readInt(1); - length=i; - fp.close(f); - if(!flag_mkf) - buf_addr=file_buffer; - rewind(0); + file_buffer = new unsigned char[fp.filesize (f) + 1]; + f->seek (0); + while (!f->eof ()) + file_buffer[i++] = f->readInt (1); + length = i; + fp.close (f); + if (!flag_mkf) + buf_addr = file_buffer; + rewind (0); return true; } -bool CrixPlayer::update() +bool +CrixPlayer::update () { - int_08h_entry(); - return !play_end; + int_08h_entry (); + return !play_end; } -void CrixPlayer::rewind(int subsong) +void +CrixPlayer::rewind (int subsong) { - I = 0; T = 0; + I = 0; + T = 0; mus_block = 0; ins_block = 0; rhythm = 0; @@ -109,387 +136,472 @@ bd_modify = 0; sustain = 0; play_end = 0; - pos = index = 0; + pos = index = 0; - memset(f_buffer, 0, sizeof(unsigned short) * 300); - memset(a0b0_data2, 0, sizeof(unsigned short) * 11); - memset(a0b0_data3, 0, 18); - memset(a0b0_data4, 0, 18); - memset(a0b0_data5, 0, 96); - memset(addrs_head, 0, 96); - memset(insbuf, 0, 28 * sizeof(unsigned short)); - memset(displace, 0, 11 * sizeof(unsigned short)); - memset(reg_bufs, 0, 18 * sizeof(ADDT)); + memset (f_buffer, 0, sizeof (unsigned short) * 300); + memset (a0b0_data2, 0, sizeof (unsigned short) * 11); + memset (a0b0_data3, 0, 18); + memset (a0b0_data4, 0, 18); + memset (a0b0_data5, 0, 96); + memset (addrs_head, 0, 96); + memset (insbuf, 0, 28 * sizeof (unsigned short)); + memset (displace, 0, 11 * sizeof (unsigned short)); + memset (reg_bufs, 0, 18 * sizeof (ADDT)); - if(flag_mkf) + if (flag_mkf) { - unsigned int *buf_index=(unsigned int *)file_buffer; - int offset1=buf_index[subsong],offset2; - while((offset2=buf_index[++subsong])==offset1); - length=offset2-offset1+1; - buf_addr=file_buffer+offset1; + unsigned int *buf_index = (unsigned int *) file_buffer; + int offset1 = buf_index[subsong], offset2; + while ((offset2 = buf_index[++subsong]) == offset1); + length = offset2 - offset1 + 1; + buf_addr = file_buffer + offset1; } - opl->init(); - opl->write(1,32); // go to OPL2 mode - set_new_int(); - data_initial(); + opl->init (); + opl->write (1, 32); // go to OPL2 mode + set_new_int (); + data_initial (); } -unsigned int CrixPlayer::getsubsongs() +unsigned int +CrixPlayer::getsubsongs () { - if(flag_mkf) - { - unsigned int *buf_index=(unsigned int *)file_buffer; - int songs=buf_index[0]/4,i=0; - for(i=0;i>3; - for(int t=1;t<12;t++) - f_buffer[i*12+t]=(unsigned int)((double)f_buffer[i*12+t-1]*1.06); + f_buffer[i * 12] = + (unsigned int) ((i * 24 + 10000) * 0.27461678223 + 4) >> 3; + for (int t = 1; t < 12; t++) + f_buffer[i * 12 + t] = + (unsigned int) ((double) f_buffer[i * 12 + t - 1] * 1.06); } - for(i=0;i<8;i++) - for(j=0;j<12;j++) - { - a0b0_data5[k] = i; - addrs_head[k] = j; - k++; - } + for (i = 0; i < 8; i++) + for (j = 0; j < 12; j++) + { + a0b0_data5[k] = i; + addrs_head[k] = j; + k++; + } //ad_bd_reg(); //ad_08_reg(); //for(i=0;i<9;i++) ad_a0b0_reg(i); e0_reg_flag = 0x20; //for(i=0;i<18;i++) ad_bop(0xE0+reg_data[i],0); //ad_bop(1,e0_reg_flag); - return 1;//ad_test(); + return 1; //ad_test(); } + /*----------------------------------------------------------*/ -inline void CrixPlayer::ad_bop(unsigned short reg,unsigned short value) +inline void +CrixPlayer::ad_bop (unsigned short reg, unsigned short value) { - if(reg == 2 || reg == 3) - AdPlug_LogWrite("switch OPL2/3 mode!\n"); - opl->write(reg & 0xff, value & 0xff); + if (reg == 2 || reg == 3) + AdPlug_LogWrite ("switch OPL2/3 mode!\n"); + opl->write (reg & 0xff, value & 0xff); } + /*--------------------------------------------------------------*/ -inline void CrixPlayer::int_08h_entry() - { +inline void +CrixPlayer::int_08h_entry () +{ unsigned short band_sus = 1; - while(band_sus) + while (band_sus) + { + if (sustain <= 0) { - if(sustain <= 0) - { - band_sus = rix_proc(); - if(band_sus) sustain += band_sus; - else - { - play_end=1; - break; - } - } + band_sus = rix_proc (); + if (band_sus) + sustain += band_sus; else - { - if(band_sus) sustain -= 14; /* aging */ - break; - } + { + play_end = 1; + break; + } } - } + else + { + if (band_sus) + sustain -= 14; /* aging */ + break; + } + } +} + /*--------------------------------------------------------------*/ -inline unsigned short CrixPlayer::rix_proc() +inline unsigned short +CrixPlayer::rix_proc () { unsigned char ctrl = 0; - if(music_on == 0||pause_flag == 1) return 0; + if (music_on == 0 || pause_flag == 1) + return 0; band = 0; - while(buf_addr[I] != 0x80 && I 6) + { + ins_to_reg (modify[ctrl_l * 2 + 6], insbuf, insbuf[26]); + return; + } + else + { + ins_to_reg (12, insbuf, insbuf[26]); + ins_to_reg (15, insbuf + 13, insbuf[27]); + return; + } +} + +/*--------------------------------------------------------------*/ +inline void +CrixPlayer::rix_A0_pro (unsigned short ctrl_l, unsigned short index) { - if(rhythm == 0 || ctrl_l < 6) + if (rhythm == 0 || ctrl_l <= 6) + { + prepare_a0b0 (ctrl_l, index > 0x3FFF ? 0x3FFF : index); + ad_a0b0l_reg (ctrl_l, a0b0_data3[ctrl_l], a0b0_data4[ctrl_l]); + } + else + return; +} + +/*--------------------------------------------------------------*/ +inline void +CrixPlayer::prepare_a0b0 (unsigned short index, unsigned short v) /* important ! */ +{ + short high = 0, low = 0; + unsigned int res; + int res1 = (v - 0x2000) * 0x19; + if (res1 == (int) 0xff) + return; + low = res1 / 0x2000; + if (low < 0) + { + low = 0x18 - low; + high = (signed short) low < 0 ? 0xFFFF : 0; + res = high; + res <<= 16; + res += low; + low = ((signed short) res) / (signed short) 0xFFE7; + a0b0_data2[index] = low; + low = res; + res = low - 0x18; + high = (signed short) res % 0x19; + low = (signed short) res / 0x19; + if (high != 0) { - ins_to_reg(modify[ctrl_l*2],insbuf,insbuf[26]); - ins_to_reg(modify[ctrl_l*2+1],insbuf+13,insbuf[27]); - return; - } - else if(ctrl_l > 6) - { - ins_to_reg(modify[ctrl_l*2+6],insbuf,insbuf[26]); - return; - } - else - { - ins_to_reg(12,insbuf,insbuf[26]); - ins_to_reg(15,insbuf+13,insbuf[27]); - return; - } -} -/*--------------------------------------------------------------*/ -inline void CrixPlayer::rix_A0_pro(unsigned short ctrl_l,unsigned short index) -{ - if(rhythm == 0 || ctrl_l <= 6) - { - prepare_a0b0(ctrl_l,index>0x3FFF?0x3FFF:index); - ad_a0b0l_reg(ctrl_l,a0b0_data3[ctrl_l],a0b0_data4[ctrl_l]); + low = 0x19; + low = low - high; } - else return; -} -/*--------------------------------------------------------------*/ -inline void CrixPlayer::prepare_a0b0(unsigned short index,unsigned short v) /* important !*/ -{ - short high = 0,low = 0; unsigned int res; - int res1 = (v-0x2000)*0x19; - if(res1 == (int)0xff) return; - low = res1/0x2000; - if(low < 0) - { - low = 0x18-low; high = (signed short)low<0?0xFFFF:0; - res = high; res<<=16; res+=low; - low = ((signed short)res)/(signed short)0xFFE7; - a0b0_data2[index] = low; - low = res; - res = low - 0x18; - high = (signed short)res%0x19; - low = (signed short)res/0x19; - if(high != 0) {low = 0x19; low = low-high;} - } + } else - { - res = high = low; - low = (signed short)res/(signed short)0x19; - a0b0_data2[index] = low; - res = high; - low = (signed short)res%(signed short)0x19; - } - low = (signed short)low*(signed short)0x18; + { + res = high = low; + low = (signed short) res / (signed short) 0x19; + a0b0_data2[index] = low; + res = high; + low = (signed short) res % (signed short) 0x19; + } + low = (signed short) low *(signed short) 0x18; displace[index] = low; } + /*--------------------------------------------------------------*/ -inline void CrixPlayer::ad_a0b0l_reg(unsigned short index,unsigned short p2,unsigned short p3) +inline void +CrixPlayer::ad_a0b0l_reg (unsigned short index, unsigned short p2, + unsigned short p3) { - unsigned short data; unsigned short i = p2+a0b0_data2[index]; + unsigned short data; + unsigned short i = p2 + a0b0_data2[index]; a0b0_data4[index] = p3; a0b0_data3[index] = p2; - i = ((signed short)i<=0x5F?i:0x5F); - i = ((signed short)i>=0?i:0); - data = f_buffer[addrs_head[i]+displace[index]/2]; - ad_bop(0xA0+index,data); - data = a0b0_data5[i]*4+(p3<1?0:0x20)+((data>>8)&3); - ad_bop(0xB0+index,data); + i = ((signed short) i <= 0x5F ? i : 0x5F); + i = ((signed short) i >= 0 ? i : 0); + data = f_buffer[addrs_head[i] + displace[index] / 2]; + ad_bop (0xA0 + index, data); + data = a0b0_data5[i] * 4 + (p3 < 1 ? 0 : 0x20) + ((data >> 8) & 3); + ad_bop (0xB0 + index, data); } + /*--------------------------------------------------------------*/ -inline void CrixPlayer::rix_B0_pro(unsigned short ctrl_l,unsigned short index) +inline void +CrixPlayer::rix_B0_pro (unsigned short ctrl_l, unsigned short index) { register int temp = 0; - if(rhythm == 0 || ctrl_l < 6) temp = modify[ctrl_l*2+1]; + if (rhythm == 0 || ctrl_l < 6) + temp = modify[ctrl_l * 2 + 1]; else - { - temp = ctrl_l > 6?ctrl_l*2:ctrl_l*2+1; - temp = modify[temp+6]; - } - for40reg[temp] = index>0x7F?0x7F:index; - ad_40_reg(temp); + { + temp = ctrl_l > 6 ? ctrl_l * 2 : ctrl_l * 2 + 1; + temp = modify[temp + 6]; + } + for40reg[temp] = index > 0x7F ? 0x7F : index; + ad_40_reg (temp); } + /*--------------------------------------------------------------*/ -inline void CrixPlayer::rix_C0_pro(unsigned short ctrl_l,unsigned short index) +inline void +CrixPlayer::rix_C0_pro (unsigned short ctrl_l, unsigned short index) { - register unsigned short i = index>=12?index-12:0; - if(ctrl_l < 6 || rhythm == 0) + register unsigned short i = index >= 12 ? index - 12 : 0; + if (ctrl_l < 6 || rhythm == 0) + { + ad_a0b0l_reg (ctrl_l, i, 1); + return; + } + else + { + if (ctrl_l != 6) { - ad_a0b0l_reg(ctrl_l,i,1); - return; + if (ctrl_l == 8) + { + ad_a0b0l_reg (ctrl_l, i, 0); + ad_a0b0l_reg (7, i + 7, 0); + } } - else - { - if(ctrl_l != 6) - { - if(ctrl_l == 8) - { - ad_a0b0l_reg(ctrl_l,i,0); - ad_a0b0l_reg(7,i+7,0); - } - } - else ad_a0b0l_reg(ctrl_l,i,0); - bd_modify |= bd_reg_data[ctrl_l]; - ad_bd_reg(); - return; - } + else + ad_a0b0l_reg (ctrl_l, i, 0); + bd_modify |= bd_reg_data[ctrl_l]; + ad_bd_reg (); + return; + } } + /*--------------------------------------------------------------*/ -inline void CrixPlayer::switch_ad_bd(unsigned short index) +inline void +CrixPlayer::switch_ad_bd (unsigned short index) { - if(rhythm == 0 || index < 6) ad_a0b0l_reg(index,a0b0_data3[index],0); + if (rhythm == 0 || index < 6) + ad_a0b0l_reg (index, a0b0_data3[index], 0); else - { - bd_modify &= (~bd_reg_data[index]), - ad_bd_reg(); - } + { + bd_modify &= (~bd_reg_data[index]), ad_bd_reg (); + } } + /*--------------------------------------------------------------*/ -inline void CrixPlayer::ins_to_reg(unsigned short index,unsigned short* insb,unsigned short value) +inline void +CrixPlayer::ins_to_reg (unsigned short index, unsigned short *insb, + unsigned short value) { register unsigned short i; - for(i=0;i<13;i++) reg_bufs[index].v[i] = insb[i]; - reg_bufs[index].v[13] = value&3; - ad_bd_reg(),ad_08_reg(), - ad_40_reg(index),ad_C0_reg(index),ad_60_reg(index), - ad_80_reg(index),ad_20_reg(index),ad_E0_reg(index); + for (i = 0; i < 13; i++) + reg_bufs[index].v[i] = insb[i]; + reg_bufs[index].v[13] = value & 3; + ad_bd_reg (), ad_08_reg (), + ad_40_reg (index), ad_C0_reg (index), ad_60_reg (index), + ad_80_reg (index), ad_20_reg (index), ad_E0_reg (index); } + /*--------------------------------------------------------------*/ -inline void CrixPlayer::ad_E0_reg(unsigned short index) +inline void +CrixPlayer::ad_E0_reg (unsigned short index) { - unsigned short data = e0_reg_flag == 0?0:(reg_bufs[index].v[13]&3); - ad_bop(0xE0+reg_data[index],data); + unsigned short data = e0_reg_flag == 0 ? 0 : (reg_bufs[index].v[13] & 3); + ad_bop (0xE0 + reg_data[index], data); } + /*--------------------------------------------------------------*/ -inline void CrixPlayer::ad_20_reg(unsigned short index) +inline void +CrixPlayer::ad_20_reg (unsigned short index) { - unsigned short data = (reg_bufs[index].v[9] < 1?0:0x80); - data += (reg_bufs[index].v[10] < 1?0:0x40); - data += (reg_bufs[index].v[5] < 1?0:0x20); - data += (reg_bufs[index].v[11] < 1?0:0x10); - data += (reg_bufs[index].v[1]&0x0F); - ad_bop(0x20+reg_data[index],data); + unsigned short data = (reg_bufs[index].v[9] < 1 ? 0 : 0x80); + data += (reg_bufs[index].v[10] < 1 ? 0 : 0x40); + data += (reg_bufs[index].v[5] < 1 ? 0 : 0x20); + data += (reg_bufs[index].v[11] < 1 ? 0 : 0x10); + data += (reg_bufs[index].v[1] & 0x0F); + ad_bop (0x20 + reg_data[index], data); } + /*--------------------------------------------------------------*/ -inline void CrixPlayer::ad_80_reg(unsigned short index) +inline void +CrixPlayer::ad_80_reg (unsigned short index) { - unsigned short data = (reg_bufs[index].v[7]&0x0F),temp = reg_bufs[index].v[4]; + unsigned short data = (reg_bufs[index].v[7] & 0x0F), temp = + reg_bufs[index].v[4]; data |= (temp << 4); - ad_bop(0x80+reg_data[index],data); + ad_bop (0x80 + reg_data[index], data); } + /*--------------------------------------------------------------*/ -inline void CrixPlayer::ad_60_reg(unsigned short index) +inline void +CrixPlayer::ad_60_reg (unsigned short index) { - unsigned short data = reg_bufs[index].v[6]&0x0F,temp = reg_bufs[index].v[3]; + unsigned short data = reg_bufs[index].v[6] & 0x0F, temp = + reg_bufs[index].v[3]; data |= (temp << 4); - ad_bop(0x60+reg_data[index],data); + ad_bop (0x60 + reg_data[index], data); } + /*--------------------------------------------------------------*/ -inline void CrixPlayer::ad_C0_reg(unsigned short index) +inline void +CrixPlayer::ad_C0_reg (unsigned short index) { unsigned short data = reg_bufs[index].v[2]; - if(adflag[index] == 1) return; - data *= 2, - data |= (reg_bufs[index].v[12] < 1?1:0); - ad_bop(0xC0+ad_C0_offs[index],data); + if (adflag[index] == 1) + return; + data *= 2, data |= (reg_bufs[index].v[12] < 1 ? 1 : 0); + ad_bop (0xC0 + ad_C0_offs[index], data); } + /*--------------------------------------------------------------*/ -inline void CrixPlayer::ad_40_reg(unsigned short index) +inline void +CrixPlayer::ad_40_reg (unsigned short index) { unsigned int res = 0; - unsigned short data = 0,temp = reg_bufs[index].v[0]; + unsigned short data = 0, temp = reg_bufs[index].v[0]; data = 0x3F - (0x3F & reg_bufs[index].v[8]), - data *= for40reg[index], - data *= 2, - data += 0x7F, - res = data; - data = res/0xFE, - data -= 0x3F, - data = -data, - data |= temp<<6; - ad_bop(0x40+reg_data[index],data); + data *= for40reg[index], data *= 2, data += 0x7F, res = data; + data = res / 0xFE, data -= 0x3F, data = -data, data |= temp << 6; + ad_bop (0x40 + reg_data[index], data); } + /*--------------------------------------------------------------*/ -inline void CrixPlayer::ad_bd_reg() +inline void +CrixPlayer::ad_bd_reg () { - unsigned short data = rhythm < 1? 0:0x20; + unsigned short data = rhythm < 1 ? 0 : 0x20; data |= bd_modify; - ad_bop(0xBD,data); + ad_bop (0xBD, data); } + /*--------------------------------------------------------------*/ -inline void CrixPlayer::ad_a0b0_reg(unsigned short index) +inline void +CrixPlayer::ad_a0b0_reg (unsigned short index) { - ad_bop(0xA0+index,0); - ad_bop(0xB0+index,0); + ad_bop (0xA0 + index, 0); + ad_bop (0xB0 + index, 0); } + /*--------------------------------------------------------------*/ -inline void CrixPlayer::music_ctrl() +inline void +CrixPlayer::music_ctrl () { register int i; - for(i=0;i<11;i++) - switch_ad_bd(i); + for (i = 0; i < 11; i++) + switch_ad_bd (i); } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/rol.cxx --- a/src/adplug/core/rol.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/rol.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -25,702 +25,786 @@ #include "rol.h" #include "debug.h" -int const CrolPlayer::kSizeofDataRecord = 30; -int const CrolPlayer::kMaxTickBeat = 60; -int const CrolPlayer::kSilenceNote = -12; -int const CrolPlayer::kNumMelodicVoices = 9; -int const CrolPlayer::kNumPercussiveVoices = 11; -int const CrolPlayer::kBassDrumChannel = 6; -int const CrolPlayer::kSnareDrumChannel = 7; -int const CrolPlayer::kTomtomChannel = 8; -int const CrolPlayer::kTomtomFreq = 2;//4; -int const CrolPlayer::kSnareDrumFreq = 2;//kTomtomFreq + 7; -float const CrolPlayer::kDefaultUpdateTme = 18.2f; -float const CrolPlayer::kPitchFactor = 400.0f; - -static const unsigned char drum_table[4] = {0x14, 0x12, 0x15, 0x11}; +int const + CrolPlayer::kSizeofDataRecord = 30; +int const + CrolPlayer::kMaxTickBeat = 60; +int const + CrolPlayer::kSilenceNote = -12; +int const + CrolPlayer::kNumMelodicVoices = 9; +int const + CrolPlayer::kNumPercussiveVoices = 11; +int const + CrolPlayer::kBassDrumChannel = 6; +int const + CrolPlayer::kSnareDrumChannel = 7; +int const + CrolPlayer::kTomtomChannel = 8; +int const + CrolPlayer::kTomtomFreq = 2; //4; +int const + CrolPlayer::kSnareDrumFreq = 2; //kTomtomFreq + 7; +float const + CrolPlayer::kDefaultUpdateTme = 18.2f; +float const + CrolPlayer::kPitchFactor = 400.0f; -CrolPlayer::uint16 const CrolPlayer::kNoteTable[12] = -{ - 340, // C - 363, // C# - 385, // D - 408, // D# - 432, // E - 458, // F - 485, // F# - 514, // G - 544, // G# - 577, // A - 611, // A# - 647 // B +static const unsigned char +drum_table[4] = { 0x14, 0x12, 0x15, 0x11 }; + +CrolPlayer::uint16 const + CrolPlayer::kNoteTable[12] = { + 340, // C + 363, // C# + 385, // D + 408, // D# + 432, // E + 458, // F + 485, // F# + 514, // G + 544, // G# + 577, // A + 611, // A# + 647 // B }; /*** public methods **************************************/ -CPlayer *CrolPlayer::factory(Copl *newopl) +CPlayer * +CrolPlayer::factory (Copl * newopl) { - return new CrolPlayer(newopl); + return new CrolPlayer (newopl); } + //--------------------------------------------------------- -CrolPlayer::CrolPlayer(Copl *newopl) -: CPlayer ( newopl ) - ,rol_header ( NULL ) - ,mNextTempoEvent ( 0 ) - ,mCurrTick ( 0 ) - ,mTimeOfLastNote ( 0 ) - ,mRefresh ( kDefaultUpdateTme ) - ,bdRegister ( 0 ) +CrolPlayer::CrolPlayer (Copl * newopl):CPlayer (newopl), rol_header (NULL), mNextTempoEvent (0), mCurrTick (0), +mTimeOfLastNote (0), mRefresh (kDefaultUpdateTme), +bdRegister (0) { - int n; + int + n; - memset(bxRegister, 0, sizeof(bxRegister) ); - memset(volumeCache, 0, sizeof(volumeCache) ); - memset(freqCache, 0, sizeof(freqCache) ); + memset (bxRegister, 0, sizeof (bxRegister)); + memset (volumeCache, 0, sizeof (volumeCache)); + memset (freqCache, 0, sizeof (freqCache)); + + for (n = 0; n < 11; n++) + pitchCache[n] = 1.0f; +} - for(n=0; n<11; n++) - pitchCache[n]=1.0f; +//--------------------------------------------------------- +CrolPlayer::~CrolPlayer () +{ + if (rol_header) + { + delete rol_header; + rol_header = 0; + } } + //--------------------------------------------------------- -CrolPlayer::~CrolPlayer() +bool +CrolPlayer::load (VFSFile * fd, const CFileProvider & fp) { - if(rol_header) - { - delete rol_header; - rol_header = 0; - } -} -//--------------------------------------------------------- -bool CrolPlayer::load(VFSFile *fd, const CFileProvider &fp) -{ - binistream *f = fp.open(fd); if(!f) return false; - std::string filename(fd->uri); + binistream *f = fp.open (fd); + if (!f) + return false; + std::string filename (fd->uri); + + char *fn = new char[filename.length () + 12]; + int i; + std::string bnk_filename; - char *fn = new char[filename.length()+12]; - int i; - std::string bnk_filename; + AdPlug_LogWrite ("*** CrolPlayer::load(f, \"%s\") ***\n", + filename.c_str ()); + strcpy (fn, filename.data ()); + for (i = strlen (fn) - 1; i >= 0; i--) + if (fn[i] == '/' || fn[i] == '\\') + break; + strcpy (fn + i + 1, "standard.bnk"); + bnk_filename = fn; + delete[]fn; + fn = 0; + AdPlug_LogWrite ("bnk_filename = \"%s\"\n", bnk_filename.c_str ()); + + rol_header = new SRolHeader; + memset (rol_header, 0, sizeof (SRolHeader)); + + rol_header->version_major = f->readInt (2); + rol_header->version_minor = f->readInt (2); + + // Version check + if (rol_header->version_major != 0 || rol_header->version_minor != 4) + { + AdPlug_LogWrite ("Unsupported file version %d.%d or not a ROL file!\n", + rol_header->version_major, rol_header->version_minor); + AdPlug_LogWrite ("--- CrolPlayer::load ---\n"); + fp.close (f); + return false; + } + + f->seek (40, binio::Add); - AdPlug_LogWrite("*** CrolPlayer::load(f, \"%s\") ***\n", filename.c_str()); - strcpy(fn,filename.data()); - for (i=strlen(fn)-1; i>=0; i--) - if (fn[i] == '/' || fn[i] == '\\') - break; - strcpy(fn+i+1,"standard.bnk"); - bnk_filename = fn; - delete [] fn; fn = 0; - AdPlug_LogWrite("bnk_filename = \"%s\"\n",bnk_filename.c_str()); + rol_header->ticks_per_beat = f->readInt (2); + rol_header->beats_per_measure = f->readInt (2); + rol_header->edit_scale_y = f->readInt (2); + rol_header->edit_scale_x = f->readInt (2); + + f->seek (1, binio::Add); + + rol_header->mode = f->readInt (1); + + f->seek (90 + 38 + 15, binio::Add); + + rol_header->basic_tempo = f->readFloat (binio::Single); + + load_tempo_events (f); + + mTimeOfLastNote = 0; + + if (load_voice_data (f, bnk_filename, fp) != true) + { + AdPlug_LogWrite ("CrolPlayer::load_voice_data(f) failed!\n"); + AdPlug_LogWrite ("--- CrolPlayer::load ---\n"); - rol_header = new SRolHeader; - memset( rol_header, 0, sizeof(SRolHeader) ); + fp.close (f); + return false; + } + + fp.close (f); + + rewind (0); + AdPlug_LogWrite ("--- CrolPlayer::load ---\n"); + return true; +} - rol_header->version_major = f->readInt( 2 ); - rol_header->version_minor = f->readInt( 2 ); +//--------------------------------------------------------- +bool +CrolPlayer::update () +{ + if (mNextTempoEvent < mTempoEvents.size () && + mTempoEvents[mNextTempoEvent].time == mCurrTick) + { + SetRefresh (mTempoEvents[mNextTempoEvent].multiplier); + ++mNextTempoEvent; + } + + TVoiceData::iterator curr = voice_data.begin (); + TVoiceData::iterator end = voice_data.end (); + int voice = 0; - // Version check - if(rol_header->version_major != 0 || rol_header->version_minor != 4) { - AdPlug_LogWrite("Unsupported file version %d.%d or not a ROL file!\n", - rol_header->version_major, rol_header->version_minor); - AdPlug_LogWrite("--- CrolPlayer::load ---\n"); - fp.close(f); - return false; - } + while (curr != end) + { + UpdateVoice (voice, *curr); + ++curr; + ++voice; + } + + ++mCurrTick; + + if (mCurrTick > mTimeOfLastNote) + { + return false; + } - f->seek( 40, binio::Add ); + return true; + //return ( mCurrTick > mTimeOfLastNote ) ? false : true; +} - rol_header->ticks_per_beat = f->readInt( 2 ); - rol_header->beats_per_measure = f->readInt( 2 ); - rol_header->edit_scale_y = f->readInt( 2 ); - rol_header->edit_scale_x = f->readInt( 2 ); +//--------------------------------------------------------- +void +CrolPlayer::rewind (int subsong) +{ + TVoiceData::iterator curr = voice_data.begin (); + TVoiceData::iterator end = voice_data.end (); + + while (curr != end) + { + CVoiceData & voice = *curr; - f->seek( 1, binio::Add ); + voice.Reset (); + ++curr; + } - rol_header->mode = f->readInt(1); + memset (bxRegister, 0, sizeof (bxRegister)); + memset (volumeCache, 0, sizeof (volumeCache)); - f->seek( 90+38+15, binio::Add ); + bdRegister = 0; + + opl->init (); // initialize to melodic by default + opl->write (1, 0x20); // Enable waveform select (bit 5) - rol_header->basic_tempo = f->readFloat( binio::Single ); + if (rol_header->mode == 0) + { + opl->write (0xbd, 0x20); // select rhythm mode (bit 5) + bdRegister = 0x20; - load_tempo_events( f ); + SetFreq (kTomtomChannel, 24); + SetFreq (kSnareDrumChannel, 31); + } - mTimeOfLastNote = 0; + mNextTempoEvent = 0; + mCurrTick = 0; - if( load_voice_data( f, bnk_filename, fp ) != true ) - { - AdPlug_LogWrite("CrolPlayer::load_voice_data(f) failed!\n"); - AdPlug_LogWrite("--- CrolPlayer::load ---\n"); + SetRefresh (1.0f); +} + +//--------------------------------------------------------- +inline float +fmin (int const a, int const b) +{ + return static_cast < float >(a < b ? a : b); +} - fp.close( f ); - return false; - } +//--------------------------------------------------------- +void +CrolPlayer::SetRefresh (float const multiplier) +{ + float const tickBeat = fmin (kMaxTickBeat, rol_header->ticks_per_beat); - fp.close( f ); + mRefresh = (tickBeat * rol_header->basic_tempo * multiplier) / 60.0f; +} + +//--------------------------------------------------------- +float +CrolPlayer::getrefresh () +{ + return mRefresh; +} - rewind( 0 ); - AdPlug_LogWrite("--- CrolPlayer::load ---\n"); - return true; -} //--------------------------------------------------------- -bool CrolPlayer::update() +void +CrolPlayer::UpdateVoice (int const voice, CVoiceData & voiceData) { - if( mNextTempoEvent < mTempoEvents.size() && - mTempoEvents[mNextTempoEvent].time == mCurrTick ) + TNoteEvents const &nEvents = voiceData.note_events; + + if (nEvents.empty () || voiceData.mEventStatus & CVoiceData::kES_NoteEnd) + { + return; // no note data to process, don't bother doing anything. + } + + TInstrumentEvents & iEvents = voiceData.instrument_events; + TVolumeEvents & vEvents = voiceData.volume_events; + TPitchEvents & pEvents = voiceData.pitch_events; + + if (!(voiceData.mEventStatus & CVoiceData::kES_InstrEnd) && + iEvents[voiceData.next_instrument_event].time == mCurrTick) + { + if (voiceData.next_instrument_event < iEvents.size ()) { - SetRefresh( mTempoEvents[mNextTempoEvent].multiplier ); - ++mNextTempoEvent; + send_ins_data_to_chip (voice, + iEvents[voiceData.next_instrument_event]. + ins_index); + ++voiceData.next_instrument_event; } + else + { + voiceData.mEventStatus |= CVoiceData::kES_InstrEnd; + } + } - TVoiceData::iterator curr = voice_data.begin(); - TVoiceData::iterator end = voice_data.end(); - int voice = 0; + if (!(voiceData.mEventStatus & CVoiceData::kES_VolumeEnd) && + vEvents[voiceData.next_volume_event].time == mCurrTick) + { + SVolumeEvent const &volumeEvent = vEvents[voiceData.next_volume_event]; - while( curr != end ) + if (voiceData.next_volume_event < vEvents.size ()) { - UpdateVoice( voice, *curr ); - ++curr; - ++voice; - } + int const volume = (int) (63.0f * (1.0f - volumeEvent.multiplier)); + + SetVolume (voice, volume); - ++mCurrTick; + ++voiceData.next_volume_event; // move to next volume event + } + else + { + voiceData.mEventStatus |= CVoiceData::kES_VolumeEnd; + } + } - if( mCurrTick > mTimeOfLastNote ) + if (voiceData.mForceNote + || voiceData.current_note_duration > voiceData.mNoteDuration - 1) + { + if (mCurrTick != 0) { - return false; + ++voiceData.current_note; } - return true; - //return ( mCurrTick > mTimeOfLastNote ) ? false : true; -} -//--------------------------------------------------------- -void CrolPlayer::rewind( int subsong ) -{ - TVoiceData::iterator curr = voice_data.begin(); - TVoiceData::iterator end = voice_data.end(); - - while( curr != end ) + if (voiceData.current_note < nEvents.size ()) { - CVoiceData &voice = *curr; - - voice.Reset(); - ++curr; - } - - memset(bxRegister, 0, sizeof(bxRegister) ); - memset(volumeCache, 0, sizeof(volumeCache) ); - - bdRegister = 0; - - opl->init(); // initialize to melodic by default - opl->write(1,0x20); // Enable waveform select (bit 5) - - if( rol_header->mode == 0 ) - { - opl->write( 0xbd, 0x20 ); // select rhythm mode (bit 5) - bdRegister = 0x20; - - SetFreq( kTomtomChannel, 24 ); - SetFreq( kSnareDrumChannel, 31 ); - } + SNoteEvent const ¬eEvent = nEvents[voiceData.current_note]; - mNextTempoEvent = 0; - mCurrTick = 0; - - SetRefresh(1.0f); -} -//--------------------------------------------------------- -inline float fmin( int const a, int const b ) -{ - return static_cast( a < b ? a : b ); -} -//--------------------------------------------------------- -void CrolPlayer::SetRefresh( float const multiplier ) -{ - float const tickBeat = fmin(kMaxTickBeat, rol_header->ticks_per_beat); - - mRefresh = (tickBeat*rol_header->basic_tempo*multiplier) / 60.0f; -} -//--------------------------------------------------------- -float CrolPlayer::getrefresh() -{ - return mRefresh; -} -//--------------------------------------------------------- -void CrolPlayer::UpdateVoice( int const voice, CVoiceData &voiceData ) -{ - TNoteEvents const &nEvents = voiceData.note_events; - - if( nEvents.empty() || voiceData.mEventStatus & CVoiceData::kES_NoteEnd ) - { - return; // no note data to process, don't bother doing anything. + SetNote (voice, noteEvent.number); + voiceData.current_note_duration = 0; + voiceData.mNoteDuration = noteEvent.duration; + voiceData.mForceNote = false; } - - TInstrumentEvents &iEvents = voiceData.instrument_events; - TVolumeEvents &vEvents = voiceData.volume_events; - TPitchEvents &pEvents = voiceData.pitch_events; - - if( !(voiceData.mEventStatus & CVoiceData::kES_InstrEnd ) && - iEvents[voiceData.next_instrument_event].time == mCurrTick ) + else { - if( voiceData.next_instrument_event < iEvents.size() ) - { - send_ins_data_to_chip( voice, iEvents[voiceData.next_instrument_event].ins_index ); - ++voiceData.next_instrument_event; - } - else - { - voiceData.mEventStatus |= CVoiceData::kES_InstrEnd; - } + SetNote (voice, kSilenceNote); + voiceData.mEventStatus |= CVoiceData::kES_NoteEnd; + return; } - - if( !(voiceData.mEventStatus & CVoiceData::kES_VolumeEnd ) && - vEvents[voiceData.next_volume_event].time == mCurrTick ) - { - SVolumeEvent const &volumeEvent = vEvents[voiceData.next_volume_event]; - - if( voiceData.next_volume_event < vEvents.size() ) - { - int const volume = (int)(63.0f*(1.0f - volumeEvent.multiplier)); - - SetVolume( voice, volume ); - - ++voiceData.next_volume_event; // move to next volume event - } - else - { - voiceData.mEventStatus |= CVoiceData::kES_VolumeEnd; - } - } - - if( voiceData.mForceNote || voiceData.current_note_duration > voiceData.mNoteDuration-1 ) - { - if( mCurrTick != 0 ) - { - ++voiceData.current_note; - } + } - if( voiceData.current_note < nEvents.size() ) - { - SNoteEvent const ¬eEvent = nEvents[voiceData.current_note]; - - SetNote( voice, noteEvent.number ); - voiceData.current_note_duration = 0; - voiceData.mNoteDuration = noteEvent.duration; - voiceData.mForceNote = false; - } - else - { - SetNote( voice, kSilenceNote ); - voiceData.mEventStatus |= CVoiceData::kES_NoteEnd; - return; - } - } - - if( !(voiceData.mEventStatus & CVoiceData::kES_PitchEnd ) && - pEvents[voiceData.next_pitch_event].time == mCurrTick ) + if (!(voiceData.mEventStatus & CVoiceData::kES_PitchEnd) && + pEvents[voiceData.next_pitch_event].time == mCurrTick) + { + if (voiceData.next_pitch_event < pEvents.size ()) { - if( voiceData.next_pitch_event < pEvents.size() ) - { - SetPitch(voice,pEvents[voiceData.next_pitch_event].variation); - ++voiceData.next_pitch_event; - } - else - { - voiceData.mEventStatus |= CVoiceData::kES_PitchEnd; - } - } - - ++voiceData.current_note_duration; -} -//--------------------------------------------------------- -void CrolPlayer::SetNote( int const voice, int const note ) -{ - if( voice < kBassDrumChannel || rol_header->mode ) - { - SetNoteMelodic( voice, note ); + SetPitch (voice, pEvents[voiceData.next_pitch_event].variation); + ++voiceData.next_pitch_event; } else { - SetNotePercussive( voice, note ); + voiceData.mEventStatus |= CVoiceData::kES_PitchEnd; } + } + + ++voiceData.current_note_duration; } + //--------------------------------------------------------- -void CrolPlayer::SetNotePercussive( int const voice, int const note ) +void +CrolPlayer::SetNote (int const voice, int const note) { - int const bit_pos = 4-voice+kBassDrumChannel; + if (voice < kBassDrumChannel || rol_header->mode) + { + SetNoteMelodic (voice, note); + } + else + { + SetNotePercussive (voice, note); + } +} - bdRegister &= ~( 1<write( 0xbd, bdRegister ); +//--------------------------------------------------------- +void +CrolPlayer::SetNotePercussive (int const voice, int const note) +{ + int const bit_pos = 4 - voice + kBassDrumChannel; - if( note != kSilenceNote ) + bdRegister &= ~(1 << bit_pos); + opl->write (0xbd, bdRegister); + + if (note != kSilenceNote) + { + switch (voice) { - switch( voice ) - { - case kTomtomChannel: - SetFreq( kSnareDrumChannel, note+7 ); - case kBassDrumChannel: - SetFreq( voice, note ); - break; - } + case kTomtomChannel: + SetFreq (kSnareDrumChannel, note + 7); + case kBassDrumChannel: + SetFreq (voice, note); + break; + } - bdRegister |= 1<write( 0xbd, bdRegister ); - } + bdRegister |= 1 << bit_pos; + opl->write (0xbd, bdRegister); + } } + //--------------------------------------------------------- -void CrolPlayer::SetNoteMelodic( int const voice, int const note ) +void +CrolPlayer::SetNoteMelodic (int const voice, int const note) { - opl->write( 0xb0+voice, bxRegister[voice] & ~0x20 ); + opl->write (0xb0 + voice, bxRegister[voice] & ~0x20); - if( note != kSilenceNote ) - { - SetFreq( voice, note, true ); - } + if (note != kSilenceNote) + { + SetFreq (voice, note, true); + } } + //--------------------------------------------------------- -void CrolPlayer::SetPitch(int const voice, real32 const variation) +void +CrolPlayer::SetPitch (int const voice, real32 const variation) { pitchCache[voice] = variation; - freqCache[voice] += (uint16)((((float)freqCache[voice])*(variation-1.0f)) / kPitchFactor); + freqCache[voice] += + (uint16) ((((float) freqCache[voice]) * (variation - 1.0f)) / + kPitchFactor); - opl->write(0xa0+voice,freqCache[voice] & 0xff); + opl->write (0xa0 + voice, freqCache[voice] & 0xff); } + //--------------------------------------------------------- -void CrolPlayer::SetFreq( int const voice, int const note, bool const keyOn ) +void +CrolPlayer::SetFreq (int const voice, int const note, bool const keyOn) { - uint16 freq = kNoteTable[note%12] + ((note/12) << 10); - freq += (uint16)((((float)freq)*(pitchCache[voice]-1.0f))/kPitchFactor); + uint16 freq = kNoteTable[note % 12] + ((note / 12) << 10); + freq += + (uint16) ((((float) freq) * (pitchCache[voice] - 1.0f)) / kPitchFactor); - freqCache[voice] = freq; - bxRegister[voice] = ((freq >> 8) & 0x1f); + freqCache[voice] = freq; + bxRegister[voice] = ((freq >> 8) & 0x1f); + + opl->write (0xa0 + voice, freq & 0xff); + opl->write (0xb0 + voice, bxRegister[voice] | (keyOn ? 0x20 : 0x0)); +} - opl->write( 0xa0+voice, freq & 0xff ); - opl->write( 0xb0+voice, bxRegister[voice] | (keyOn ? 0x20 : 0x0) ); +//--------------------------------------------------------- +void +CrolPlayer::SetVolume (int const voice, int const volume) +{ + volumeCache[voice] = (volumeCache[voice] & 0xc0) | volume; + + int const op_offset = (voice < kSnareDrumChannel || rol_header->mode) ? + op_table[voice] + 3 : drum_table[voice - kSnareDrumChannel]; + + opl->write (0x40 + op_offset, volumeCache[voice]); } -//--------------------------------------------------------- -void CrolPlayer::SetVolume( int const voice, int const volume ) -{ - volumeCache[voice] = (volumeCache[voice] &0xc0) | volume; - int const op_offset = ( voice < kSnareDrumChannel || rol_header->mode ) ? - op_table[voice]+3 : drum_table[voice-kSnareDrumChannel]; +//--------------------------------------------------------- +void +CrolPlayer::send_ins_data_to_chip (int const voice, int const ins_index) +{ + SRolInstrument & instrument = ins_list[ins_index].instrument; - opl->write( 0x40+op_offset, volumeCache[voice] ); + send_operator (voice, instrument.modulator, instrument.carrier); } + //--------------------------------------------------------- -void CrolPlayer::send_ins_data_to_chip( int const voice, int const ins_index ) +void +CrolPlayer::send_operator (int const voice, SOPL2Op const &modulator, + SOPL2Op const &carrier) { - SRolInstrument &instrument = ins_list[ins_index].instrument; + if (voice < kSnareDrumChannel || rol_header->mode) + { + int const op_offset = op_table[voice]; + + opl->write (0x20 + op_offset, modulator.ammulti); + opl->write (0x40 + op_offset, modulator.ksltl); + opl->write (0x60 + op_offset, modulator.ardr); + opl->write (0x80 + op_offset, modulator.slrr); + opl->write (0xc0 + voice, modulator.fbc); + opl->write (0xe0 + op_offset, modulator.waveform); + + volumeCache[voice] = (carrier.ksltl & 0xc0) | volumeCache[voice] & 0x3f; - send_operator( voice, instrument.modulator, instrument.carrier ); + opl->write (0x23 + op_offset, carrier.ammulti); + opl->write (0x43 + op_offset, volumeCache[voice]); + opl->write (0x63 + op_offset, carrier.ardr); + opl->write (0x83 + op_offset, carrier.slrr); +// opl->write( 0xc3+voice , carrier.fbc ); <- don't bother writing this. + opl->write (0xe3 + op_offset, carrier.waveform); + } + else + { + int const op_offset = drum_table[voice - kSnareDrumChannel]; + + volumeCache[voice] = (modulator.ksltl & 0xc0) | volumeCache[voice] & 0x3f; + + opl->write (0x20 + op_offset, modulator.ammulti); + opl->write (0x40 + op_offset, volumeCache[voice]); + opl->write (0x60 + op_offset, modulator.ardr); + opl->write (0x80 + op_offset, modulator.slrr); + opl->write (0xc0 + voice, modulator.fbc); + opl->write (0xe0 + op_offset, modulator.waveform); + } } -//--------------------------------------------------------- -void CrolPlayer::send_operator( int const voice, SOPL2Op const &modulator, SOPL2Op const &carrier ) -{ - if( voice < kSnareDrumChannel || rol_header->mode ) - { - int const op_offset = op_table[voice]; - opl->write( 0x20+op_offset, modulator.ammulti ); - opl->write( 0x40+op_offset, modulator.ksltl ); - opl->write( 0x60+op_offset, modulator.ardr ); - opl->write( 0x80+op_offset, modulator.slrr ); - opl->write( 0xc0+voice , modulator.fbc ); - opl->write( 0xe0+op_offset, modulator.waveform ); +//--------------------------------------------------------- +void +CrolPlayer::load_tempo_events (binistream * f) +{ + int16 const num_tempo_events = f->readInt (2); + + mTempoEvents.reserve (num_tempo_events); - volumeCache[voice] = (carrier.ksltl & 0xc0) | volumeCache[voice] & 0x3f; + for (int i = 0; i < num_tempo_events; ++i) + { + STempoEvent event; + + event.time = f->readInt (2); + event.multiplier = f->readFloat (binio::Single); + mTempoEvents.push_back (event); + } +} - opl->write( 0x23+op_offset, carrier.ammulti ); - opl->write( 0x43+op_offset, volumeCache[voice] ); - opl->write( 0x63+op_offset, carrier.ardr ); - opl->write( 0x83+op_offset, carrier.slrr ); -// opl->write( 0xc3+voice , carrier.fbc ); <- don't bother writing this. - opl->write( 0xe3+op_offset, carrier.waveform ); - } - else +//--------------------------------------------------------- +bool +CrolPlayer::load_voice_data (binistream * f, std::string const &bnk_filename, + const CFileProvider & fp) +{ + SBnkHeader bnk_header; + VFSFile *fd = vfs_fopen (bnk_filename.c_str (), "rb"); + binistream *bnk_file = fp.open (fd); + + if (bnk_file) + { + load_bnk_info (bnk_file, bnk_header); + + int const numVoices = + rol_header->mode ? kNumMelodicVoices : kNumPercussiveVoices; + + voice_data.reserve (numVoices); + for (int i = 0; i < numVoices; ++i) { - int const op_offset = drum_table[voice-kSnareDrumChannel]; - - volumeCache[voice] = (modulator.ksltl & 0xc0) | volumeCache[voice] & 0x3f; - - opl->write( 0x20+op_offset, modulator.ammulti ); - opl->write( 0x40+op_offset, volumeCache[voice] ); - opl->write( 0x60+op_offset, modulator.ardr ); - opl->write( 0x80+op_offset, modulator.slrr ); - opl->write( 0xc0+voice , modulator.fbc ); - opl->write( 0xe0+op_offset, modulator.waveform ); - } -} -//--------------------------------------------------------- -void CrolPlayer::load_tempo_events( binistream *f ) -{ - int16 const num_tempo_events = f->readInt( 2 ); - - mTempoEvents.reserve( num_tempo_events ); - - for(int i=0; ireadInt( 2 ); - event.multiplier = f->readFloat( binio::Single ); - mTempoEvents.push_back( event ); - } -} -//--------------------------------------------------------- -bool CrolPlayer::load_voice_data( binistream *f, std::string const &bnk_filename, const CFileProvider &fp ) -{ - SBnkHeader bnk_header; - VFSFile *fd = vfs_fopen(bnk_filename.c_str(), "rb"); - binistream *bnk_file = fp.open(fd); - - if( bnk_file ) - { - load_bnk_info( bnk_file, bnk_header ); - - int const numVoices = rol_header->mode ? kNumMelodicVoices : kNumPercussiveVoices; + load_note_events (f, voice); + load_instrument_events (f, voice, bnk_file, bnk_header); + load_volume_events (f, voice); + load_pitch_events (f, voice); - voice_data.reserve( numVoices ); - for(int i=0; iseek( 15, binio::Add ); + fp.close (bnk_file); + vfs_fclose (fd); - int16 const time_of_last_note = f->readInt( 2 ); + return true; + } - if( time_of_last_note != 0 ) - { - TNoteEvents ¬e_events = voice.note_events; - int16 total_duration = 0; + return false; +} - do - { - SNoteEvent event; - - event.number = f->readInt( 2 ); - event.duration = f->readInt( 2 ); +//--------------------------------------------------------- +void +CrolPlayer::load_note_events (binistream * f, CVoiceData & voice) +{ + f->seek (15, binio::Add); - event.number += kSilenceNote; // adding -12 + int16 const time_of_last_note = f->readInt (2); - note_events.push_back( event ); - - total_duration += event.duration; - } while( total_duration < time_of_last_note ); + if (time_of_last_note != 0) + { + TNoteEvents & note_events = voice.note_events; + int16 total_duration = 0; - if( time_of_last_note > mTimeOfLastNote ) - { - mTimeOfLastNote = time_of_last_note; - } - } + do + { + SNoteEvent event; + + event.number = f->readInt (2); + event.duration = f->readInt (2); - f->seek( 15, binio::Add ); -} -//--------------------------------------------------------- -void CrolPlayer::load_instrument_events( binistream *f, CVoiceData &voice, - binistream *bnk_file, SBnkHeader const &bnk_header ) -{ - int16 const number_of_instrument_events = f->readInt( 2 ); + event.number += kSilenceNote; // adding -12 - TInstrumentEvents &instrument_events = voice.instrument_events; + note_events.push_back (event); - instrument_events.reserve( number_of_instrument_events ); + total_duration += event.duration; + } while (total_duration < time_of_last_note); - for(int i=0; i mTimeOfLastNote) { - SInstrumentEvent event; - event.time = f->readInt( 2 ); - f->readString( event.name, 9 ); - - std::string event_name = event.name; - event.ins_index = load_rol_instrument( bnk_file, bnk_header, event_name ); + mTimeOfLastNote = time_of_last_note; + } + } - instrument_events.push_back( event ); - - f->seek( 1+2, binio::Add ); - } + f->seek (15, binio::Add); +} - f->seek( 15, binio::Add ); -} //--------------------------------------------------------- -void CrolPlayer::load_volume_events( binistream *f, CVoiceData &voice ) +void +CrolPlayer::load_instrument_events (binistream * f, CVoiceData & voice, + binistream * bnk_file, + SBnkHeader const &bnk_header) { - int16 const number_of_volume_events = f->readInt( 2 ); + int16 const number_of_instrument_events = f->readInt (2); - TVolumeEvents &volume_events = voice.volume_events; + TInstrumentEvents & instrument_events = voice.instrument_events; - volume_events.reserve( number_of_volume_events ); + instrument_events.reserve (number_of_instrument_events); - for(int i=0; ireadInt( 2 ); - event.multiplier = f->readFloat( binio::Single ); + for (int i = 0; i < number_of_instrument_events; ++i) + { + SInstrumentEvent event; + event.time = f->readInt (2); + f->readString (event.name, 9); - volume_events.push_back( event ); - } + std::string event_name = event.name; + event.ins_index = load_rol_instrument (bnk_file, bnk_header, event_name); + + instrument_events.push_back (event); + + f->seek (1 + 2, binio::Add); + } - f->seek( 15, binio::Add ); + f->seek (15, binio::Add); } + //--------------------------------------------------------- -void CrolPlayer::load_pitch_events( binistream *f, CVoiceData &voice ) +void +CrolPlayer::load_volume_events (binistream * f, CVoiceData & voice) { - int16 const number_of_pitch_events = f->readInt( 2 ); + int16 const number_of_volume_events = f->readInt (2); + + TVolumeEvents & volume_events = voice.volume_events; - TPitchEvents &pitch_events = voice.pitch_events; - - pitch_events.reserve( number_of_pitch_events ); + volume_events.reserve (number_of_volume_events); - for(int i=0; ireadInt( 2 ); - event.variation = f->readFloat( binio::Single ); + for (int i = 0; i < number_of_volume_events; ++i) + { + SVolumeEvent event; + event.time = f->readInt (2); + event.multiplier = f->readFloat (binio::Single); + + volume_events.push_back (event); + } + + f->seek (15, binio::Add); +} - pitch_events.push_back( event ); - } -} //--------------------------------------------------------- -bool CrolPlayer::load_bnk_info( binistream *f, SBnkHeader &header ) +void +CrolPlayer::load_pitch_events (binistream * f, CVoiceData & voice) { - header.version_major = f->readInt(1); - header.version_minor = f->readInt(1); - f->readString( header.signature, 6 ); + int16 const number_of_pitch_events = f->readInt (2); + + TPitchEvents & pitch_events = voice.pitch_events; + + pitch_events.reserve (number_of_pitch_events); - header.number_of_list_entries_used = f->readInt( 2 ); - header.total_number_of_list_entries = f->readInt( 2 ); + for (int i = 0; i < number_of_pitch_events; ++i) + { + SPitchEvent event; + event.time = f->readInt (2); + event.variation = f->readFloat (binio::Single); - header.abs_offset_of_name_list = f->readInt( 4 ); - header.abs_offset_of_data = f->readInt( 4 ); + pitch_events.push_back (event); + } +} - f->seek( header.abs_offset_of_name_list, binio::Set ); +//--------------------------------------------------------- +bool +CrolPlayer::load_bnk_info (binistream * f, SBnkHeader & header) +{ + header.version_major = f->readInt (1); + header.version_minor = f->readInt (1); + f->readString (header.signature, 6); - TInstrumentNames &ins_name_list = header.ins_name_list; - ins_name_list.reserve( header.number_of_list_entries_used ); + header.number_of_list_entries_used = f->readInt (2); + header.total_number_of_list_entries = f->readInt (2); - for(int i=0; ireadInt (4); + header.abs_offset_of_data = f->readInt (4); + + f->seek (header.abs_offset_of_name_list, binio::Set); - instrument.index = f->readInt( 2 ); - instrument.record_used = f->readInt(1); - f->readString( instrument.name, 9 ); + TInstrumentNames & ins_name_list = header.ins_name_list; + ins_name_list.reserve (header.number_of_list_entries_used); + + for (int i = 0; i < header.number_of_list_entries_used; ++i) + { + SInstrumentName instrument; - // printf("%s = #%d\n", instrument.name, i ); + instrument.index = f->readInt (2); + instrument.record_used = f->readInt (1); + f->readString (instrument.name, 9); - ins_name_list.push_back( instrument ); - } + // printf("%s = #%d\n", instrument.name, i ); + + ins_name_list.push_back (instrument); + } //std::sort( ins_name_list.begin(), ins_name_list.end(), StringCompare() ); return true; } + //--------------------------------------------------------- -int CrolPlayer::load_rol_instrument( binistream *f, SBnkHeader const &header, std::string &name ) +int +CrolPlayer::load_rol_instrument (binistream * f, SBnkHeader const &header, + std::string & name) { - TInstrumentNames const &ins_name_list = header.ins_name_list; + TInstrumentNames const &ins_name_list = header.ins_name_list; - int const ins_index = get_ins_index( name ); + int const ins_index = get_ins_index (name); - if( ins_index != -1 ) - { - return ins_index; - } + if (ins_index != -1) + { + return ins_index; + } - typedef TInstrumentNames::const_iterator TInsIter; - typedef std::pair TInsIterPair; + typedef TInstrumentNames::const_iterator TInsIter; + typedef std::pair < TInsIter, TInsIter > TInsIterPair; + + TInsIterPair range = std::equal_range (ins_name_list.begin (), + ins_name_list.end (), + name, + StringCompare ()); - TInsIterPair range = std::equal_range( ins_name_list.begin(), - ins_name_list.end(), - name, - StringCompare() ); + if (range.first != range.second) + { + int const seekOffs = + header.abs_offset_of_data + (range.first->index * kSizeofDataRecord); + f->seek (seekOffs, binio::Set); + } + + SUsedList usedIns; + usedIns.name = name; - if( range.first != range.second ) - { - int const seekOffs = header.abs_offset_of_data + (range.first->index*kSizeofDataRecord); - f->seek( seekOffs, binio::Set ); - } + if (range.first != range.second) + { + read_rol_instrument (f, usedIns.instrument); + } + else + { + // set up default instrument data here + memset (&usedIns.instrument, 0, kSizeofDataRecord); + } + ins_list.push_back (usedIns); - SUsedList usedIns; - usedIns.name = name; + return ins_list.size () - 1; +} - if( range.first != range.second ) - { - read_rol_instrument( f, usedIns.instrument ); - } - else +//--------------------------------------------------------- +int +CrolPlayer::get_ins_index (std::string const &name) const const +{ + for (unsigned int i = 0; i < ins_list.size (); ++i) + { + if (stricmp (ins_list[i].name.c_str (), name.c_str ()) == 0) { - // set up default instrument data here - memset( &usedIns.instrument, 0, kSizeofDataRecord ); - } - ins_list.push_back( usedIns ); - - return ins_list.size()-1; -} -//--------------------------------------------------------- -int CrolPlayer::get_ins_index( std::string const &name ) const -{ - for(unsigned int i=0; ireadInt(1); - ins.voice_number = f->readInt(1); - read_fm_operator( f, ins.modulator ); - read_fm_operator( f, ins.carrier ); +//--------------------------------------------------------- +void +CrolPlayer::read_rol_instrument (binistream * f, SRolInstrument & ins) +{ + ins.mode = f->readInt (1); + ins.voice_number = f->readInt (1); - ins.modulator.waveform = f->readInt(1); - ins.carrier.waveform = f->readInt(1); + read_fm_operator (f, ins.modulator); + read_fm_operator (f, ins.carrier); + + ins.modulator.waveform = f->readInt (1); + ins.carrier.waveform = f->readInt (1); } + //--------------------------------------------------------- -void CrolPlayer::read_fm_operator( binistream *f, SOPL2Op &opl2_op ) +void +CrolPlayer::read_fm_operator (binistream * f, SOPL2Op & opl2_op) { SFMOperator fm_op; - fm_op.key_scale_level = f->readInt(1); - fm_op.freq_multiplier = f->readInt(1); - fm_op.feed_back = f->readInt(1); - fm_op.attack_rate = f->readInt(1); - fm_op.sustain_level = f->readInt(1); - fm_op.sustaining_sound = f->readInt(1); - fm_op.decay_rate = f->readInt(1); - fm_op.release_rate = f->readInt(1); - fm_op.output_level = f->readInt(1); - fm_op.amplitude_vibrato = f->readInt(1); - fm_op.frequency_vibrato = f->readInt(1); - fm_op.envelope_scaling = f->readInt(1); - fm_op.fm_type = f->readInt(1); + fm_op.key_scale_level = f->readInt (1); + fm_op.freq_multiplier = f->readInt (1); + fm_op.feed_back = f->readInt (1); + fm_op.attack_rate = f->readInt (1); + fm_op.sustain_level = f->readInt (1); + fm_op.sustaining_sound = f->readInt (1); + fm_op.decay_rate = f->readInt (1); + fm_op.release_rate = f->readInt (1); + fm_op.output_level = f->readInt (1); + fm_op.amplitude_vibrato = f->readInt (1); + fm_op.frequency_vibrato = f->readInt (1); + fm_op.envelope_scaling = f->readInt (1); + fm_op.fm_type = f->readInt (1); - opl2_op.ammulti = fm_op.amplitude_vibrato << 7 | fm_op.frequency_vibrato << 6 | fm_op.sustaining_sound << 5 | fm_op.envelope_scaling << 4 | fm_op.freq_multiplier; - opl2_op.ksltl = fm_op.key_scale_level << 6 | fm_op.output_level; - opl2_op.ardr = fm_op.attack_rate << 4 | fm_op.decay_rate; - opl2_op.slrr = fm_op.sustain_level << 4 | fm_op.release_rate; - opl2_op.fbc = fm_op.feed_back << 1 | (fm_op.fm_type ^ 1); + opl2_op.ammulti = + fm_op.amplitude_vibrato << 7 | fm_op.frequency_vibrato << 6 | fm_op. + sustaining_sound << 5 | fm_op.envelope_scaling << 4 | fm_op. + freq_multiplier; + opl2_op.ksltl = fm_op.key_scale_level << 6 | fm_op.output_level; + opl2_op.ardr = fm_op.attack_rate << 4 | fm_op.decay_rate; + opl2_op.slrr = fm_op.sustain_level << 4 | fm_op.release_rate; + opl2_op.fbc = fm_op.feed_back << 1 | (fm_op.fm_type ^ 1); } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/s3m.cxx --- a/src/adplug/core/s3m.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/s3m.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -24,512 +24,689 @@ #include "s3m.h" -const char Cs3mPlayer::chnresolv[] = // S3M -> adlib channel conversion - {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,-1,-1,-1,-1,-1,-1,-1}; +const char + Cs3mPlayer::chnresolv[] = // S3M -> adlib channel conversion +{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, + 4, 5, 6, 7, 8, -1, -1, -1, -1, -1, -1, -1 }; -const unsigned short Cs3mPlayer::notetable[12] = // S3M adlib note table - {340,363,385,408,432,458,485,514,544,577,611,647}; +const unsigned short + Cs3mPlayer::notetable[12] = // S3M adlib note table +{ 340, 363, 385, 408, 432, 458, 485, 514, 544, 577, 611, 647 }; -const unsigned char Cs3mPlayer::vibratotab[32] = // vibrato rate table - {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1}; +const unsigned char + Cs3mPlayer::vibratotab[32] = // vibrato rate table +{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 15, 14, 13, 12, + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; /*** public methods *************************************/ -CPlayer *Cs3mPlayer::factory(Copl *newopl) +CPlayer * +Cs3mPlayer::factory (Copl * newopl) { - return new Cs3mPlayer(newopl); + return new Cs3mPlayer (newopl); } -Cs3mPlayer::Cs3mPlayer(Copl *newopl): CPlayer(newopl) +Cs3mPlayer::Cs3mPlayer (Copl * newopl):CPlayer (newopl) { - int i,j,k; - - memset(pattern,255,sizeof(pattern)); - memset(orders,255,sizeof(orders)); + int + i, + j, + k; - for(i=0;i<99;i++) // setup pattern - for(j=0;j<64;j++) - for(k=0;k<32;k++) { - pattern[i][j][k].instrument = 0; - pattern[i][j][k].info = 0; - } + memset (pattern, 255, sizeof (pattern)); + memset (orders, 255, sizeof (orders)); + + for (i = 0; i < 99; i++) // setup pattern + for (j = 0; j < 64; j++) + for (k = 0; k < 32; k++) + { + pattern[i][j][k].instrument = 0; + pattern[i][j][k].info = 0; + } } -bool Cs3mPlayer::load(VFSFile *fd, const CFileProvider &fp) +bool +Cs3mPlayer::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); if(!f) return false; - unsigned short insptr[99],pattptr[99]; - int i,row; - unsigned char bufval,bufval2; - unsigned short ppatlen; - s3mheader *checkhead; - bool adlibins=false; + binistream *f = fp.open (fd); + if (!f) + return false; + unsigned short insptr[99], pattptr[99]; + int i, row; + unsigned char bufval, bufval2; + unsigned short ppatlen; + s3mheader *checkhead; + bool adlibins = false; - // file validation section - checkhead = new s3mheader; - load_header(f, checkhead); - if(checkhead->kennung != 0x1a || checkhead->typ != 16 - || checkhead->insnum > 99) { - delete checkhead; fp.close(f); return false; - } else - if(strncmp(checkhead->scrm,"SCRM",4)) { - delete checkhead; fp.close(f); return false; - } else { // is an adlib module? - f->seek(checkhead->ordnum, binio::Add); - for(i = 0; i < checkhead->insnum; i++) - insptr[i] = f->readInt(2); - for(i=0;iinsnum;i++) { - f->seek(insptr[i]*16); - if(f->readInt(1) >= 2) { - adlibins = true; - break; - } - } - delete checkhead; - if(!adlibins) { fp.close(f); return false; } - } + // file validation section + checkhead = new s3mheader; + load_header (f, checkhead); + if (checkhead->kennung != 0x1a || checkhead->typ != 16 + || checkhead->insnum > 99) + { + delete checkhead; + fp.close (f); + return false; + } + else if (strncmp (checkhead->scrm, "SCRM", 4)) + { + delete checkhead; + fp.close (f); + return false; + } + else + { // is an adlib module? + f->seek (checkhead->ordnum, binio::Add); + for (i = 0; i < checkhead->insnum; i++) + insptr[i] = f->readInt (2); + for (i = 0; i < checkhead->insnum; i++) + { + f->seek (insptr[i] * 16); + if (f->readInt (1) >= 2) + { + adlibins = true; + break; + } + } + delete checkhead; + if (!adlibins) + { + fp.close (f); + return false; + } + } - // load section - f->seek(0); // rewind for load - load_header(f, &header); // read header + // load section + f->seek (0); // rewind for load + load_header (f, &header); // read header // security check - if(header.ordnum > 256 || header.insnum > 99 || header.patnum > 99) { - fp.close(f); + if (header.ordnum > 256 || header.insnum > 99 || header.patnum > 99) + { + fp.close (f); return false; } - for(i = 0; i < header.ordnum; i++) orders[i] = f->readInt(1); // read orders - for(i = 0; i < header.insnum; i++) insptr[i] = f->readInt(2); // instrument parapointers - for(i = 0; i < header.patnum; i++) pattptr[i] = f->readInt(2); // pattern parapointers - - for(i=0;iseek(insptr[i]*16); - inst[i].type = f->readInt(1); - f->readString(inst[i].filename, 15); - inst[i].d00 = f->readInt(1); inst[i].d01 = f->readInt(1); - inst[i].d02 = f->readInt(1); inst[i].d03 = f->readInt(1); - inst[i].d04 = f->readInt(1); inst[i].d05 = f->readInt(1); - inst[i].d06 = f->readInt(1); inst[i].d07 = f->readInt(1); - inst[i].d08 = f->readInt(1); inst[i].d09 = f->readInt(1); - inst[i].d0a = f->readInt(1); inst[i].d0b = f->readInt(1); - inst[i].volume = f->readInt(1); inst[i].dsk = f->readInt(1); - f->ignore(2); - inst[i].c2spd = f->readInt(4); - f->ignore(12); - f->readString(inst[i].name, 28); - f->readString(inst[i].scri, 4); - } + for (i = 0; i < header.ordnum; i++) + orders[i] = f->readInt (1); // read orders + for (i = 0; i < header.insnum; i++) + insptr[i] = f->readInt (2); // instrument parapointers + for (i = 0; i < header.patnum; i++) + pattptr[i] = f->readInt (2); // pattern parapointers - for(i=0;iseek(pattptr[i]*16); - ppatlen = f->readInt(2); - unsigned long pattpos = f->pos(); - for(row=0;(row<64) && (pattpos-pattptr[i]*16<=ppatlen);row++) - do { - bufval = f->readInt(1); - if(bufval & 32) { - bufval2 = f->readInt(1); - pattern[i][row][bufval & 31].note = bufval2 & 15; - pattern[i][row][bufval & 31].oct = (bufval2 & 240) >> 4; - pattern[i][row][bufval & 31].instrument = f->readInt(1); - } - if(bufval & 64) - pattern[i][row][bufval & 31].volume = f->readInt(1); - if(bufval & 128) { - pattern[i][row][bufval & 31].command = f->readInt(1); - pattern[i][row][bufval & 31].info = f->readInt(1); - } - } while(bufval); - } + for (i = 0; i < header.insnum; i++) + { // load instruments + f->seek (insptr[i] * 16); + inst[i].type = f->readInt (1); + f->readString (inst[i].filename, 15); + inst[i].d00 = f->readInt (1); + inst[i].d01 = f->readInt (1); + inst[i].d02 = f->readInt (1); + inst[i].d03 = f->readInt (1); + inst[i].d04 = f->readInt (1); + inst[i].d05 = f->readInt (1); + inst[i].d06 = f->readInt (1); + inst[i].d07 = f->readInt (1); + inst[i].d08 = f->readInt (1); + inst[i].d09 = f->readInt (1); + inst[i].d0a = f->readInt (1); + inst[i].d0b = f->readInt (1); + inst[i].volume = f->readInt (1); + inst[i].dsk = f->readInt (1); + f->ignore (2); + inst[i].c2spd = f->readInt (4); + f->ignore (12); + f->readString (inst[i].name, 28); + f->readString (inst[i].scri, 4); + } - fp.close(f); - rewind(0); - return true; // done + for (i = 0; i < header.patnum; i++) + { // depack patterns + f->seek (pattptr[i] * 16); + ppatlen = f->readInt (2); + unsigned long pattpos = f->pos (); + for (row = 0; (row < 64) && (pattpos - pattptr[i] * 16 <= ppatlen); row++) + do + { + bufval = f->readInt (1); + if (bufval & 32) + { + bufval2 = f->readInt (1); + pattern[i][row][bufval & 31].note = bufval2 & 15; + pattern[i][row][bufval & 31].oct = (bufval2 & 240) >> 4; + pattern[i][row][bufval & 31].instrument = f->readInt (1); + } + if (bufval & 64) + pattern[i][row][bufval & 31].volume = f->readInt (1); + if (bufval & 128) + { + pattern[i][row][bufval & 31].command = f->readInt (1); + pattern[i][row][bufval & 31].info = f->readInt (1); + } + } while (bufval); + } + + fp.close (f); + rewind (0); + return true; // done } -bool Cs3mPlayer::update() +bool +Cs3mPlayer::update () { - unsigned char pattbreak=0,donote; // remember vars - unsigned char pattnr,chan,row,info; // cache vars - signed char realchan; - - // effect handling (timer dependant) - for(realchan=0; realchan<9; realchan++) { - info = channel[realchan].info; // fill infobyte cache - switch(channel[realchan].fx) { - case 11: - case 12: if(channel[realchan].fx == 11) // dual command: H00 and Dxy - vibrato(realchan,channel[realchan].dualinfo); - else // dual command: G00 and Dxy - tone_portamento(realchan,channel[realchan].dualinfo); - case 4: if(info <= 0x0f) // volume slide down - if(channel[realchan].vol - info >= 0) - channel[realchan].vol -= info; - else - channel[realchan].vol = 0; - if((info & 0x0f) == 0) // volume slide up - if(channel[realchan].vol + (info >> 4) <= 63) - channel[realchan].vol += info >> 4; - else - channel[realchan].vol = 63; - setvolume(realchan); - break; - case 5: if(info == 0xf0 || info <= 0xe0) { // slide down - slide_down(realchan,info); - setfreq(realchan); - } - break; - case 6: if(info == 0xf0 || info <= 0xe0) { // slide up - slide_up(realchan,info); - setfreq(realchan); - } - break; - case 7: tone_portamento(realchan,channel[realchan].dualinfo); break; // tone portamento - case 8: vibrato(realchan,channel[realchan].dualinfo); break; // vibrato - case 10: channel[realchan].nextfreq = channel[realchan].freq; // arpeggio - channel[realchan].nextoct = channel[realchan].oct; - switch(channel[realchan].trigger) { - case 0: channel[realchan].freq = notetable[channel[realchan].note]; break; - case 1: if(channel[realchan].note + ((info & 0xf0) >> 4) < 12) - channel[realchan].freq = notetable[channel[realchan].note + ((info & 0xf0) >> 4)]; - else { - channel[realchan].freq = notetable[channel[realchan].note + ((info & 0xf0) >> 4) - 12]; - channel[realchan].oct++; - } - break; - case 2: if(channel[realchan].note + (info & 0x0f) < 12) - channel[realchan].freq = notetable[channel[realchan].note + (info & 0x0f)]; - else { - channel[realchan].freq = notetable[channel[realchan].note + (info & 0x0f) - 12]; - channel[realchan].oct++; - } - break; - } - if(channel[realchan].trigger < 2) - channel[realchan].trigger++; - else - channel[realchan].trigger = 0; - setfreq(realchan); - channel[realchan].freq = channel[realchan].nextfreq; - channel[realchan].oct = channel[realchan].nextoct; - break; - case 21: vibrato(realchan,(unsigned char) (info / 4)); break; // fine vibrato - } - } + unsigned char pattbreak = 0, donote; // remember vars + unsigned char pattnr, chan, row, info; // cache vars + signed char realchan; - if(del) { // speed compensation - del--; - return !songend; - } - - // arrangement handling - pattnr = orders[ord]; - if(pattnr == 0xff || ord > header.ordnum) { // "--" end of song - songend = 1; // set end-flag - ord = 0; - pattnr = orders[ord]; - if(pattnr == 0xff) - return !songend; - } - if(pattnr == 0xfe) { // "++" skip marker - ord++; pattnr = orders[ord]; - } + // effect handling (timer dependant) + for (realchan = 0; realchan < 9; realchan++) + { + info = channel[realchan].info; // fill infobyte cache + switch (channel[realchan].fx) + { + case 11: + case 12: + if (channel[realchan].fx == 11) // dual command: H00 and Dxy + vibrato (realchan, channel[realchan].dualinfo); + else // dual command: G00 and Dxy + tone_portamento (realchan, channel[realchan].dualinfo); + case 4: + if (info <= 0x0f) // volume slide down + if (channel[realchan].vol - info >= 0) + channel[realchan].vol -= info; + else + channel[realchan].vol = 0; + if ((info & 0x0f) == 0) // volume slide up + if (channel[realchan].vol + (info >> 4) <= 63) + channel[realchan].vol += info >> 4; + else + channel[realchan].vol = 63; + setvolume (realchan); + break; + case 5: + if (info == 0xf0 || info <= 0xe0) + { // slide down + slide_down (realchan, info); + setfreq (realchan); + } + break; + case 6: + if (info == 0xf0 || info <= 0xe0) + { // slide up + slide_up (realchan, info); + setfreq (realchan); + } + break; + case 7: + tone_portamento (realchan, channel[realchan].dualinfo); + break; // tone portamento + case 8: + vibrato (realchan, channel[realchan].dualinfo); + break; // vibrato + case 10: + channel[realchan].nextfreq = channel[realchan].freq; // arpeggio + channel[realchan].nextoct = channel[realchan].oct; + switch (channel[realchan].trigger) + { + case 0: + channel[realchan].freq = notetable[channel[realchan].note]; + break; + case 1: + if (channel[realchan].note + ((info & 0xf0) >> 4) < 12) + channel[realchan].freq = + notetable[channel[realchan].note + ((info & 0xf0) >> 4)]; + else + { + channel[realchan].freq = + notetable[channel[realchan].note + ((info & 0xf0) >> 4) - 12]; + channel[realchan].oct++; + } + break; + case 2: + if (channel[realchan].note + (info & 0x0f) < 12) + channel[realchan].freq = + notetable[channel[realchan].note + (info & 0x0f)]; + else + { + channel[realchan].freq = + notetable[channel[realchan].note + (info & 0x0f) - 12]; + channel[realchan].oct++; + } + break; + } + if (channel[realchan].trigger < 2) + channel[realchan].trigger++; + else + channel[realchan].trigger = 0; + setfreq (realchan); + channel[realchan].freq = channel[realchan].nextfreq; + channel[realchan].oct = channel[realchan].nextoct; + break; + case 21: + vibrato (realchan, (unsigned char) (info / 4)); + break; // fine vibrato + } + } - // play row - row = crow; // fill row cache - for(chan=0;chan<32;chan++) { - if(!(header.chanset[chan] & 128)) // resolve S3M -> AdLib channels - realchan = chnresolv[header.chanset[chan] & 127]; - else - realchan = -1; // channel disabled - if(realchan != -1) { // channel playable? - // set channel values - donote = 0; - if(pattern[pattnr][row][chan].note < 14) - // tone portamento - if(pattern[pattnr][row][chan].command == 7 || pattern[pattnr][row][chan].command == 12) { - channel[realchan].nextfreq = notetable[pattern[pattnr][row][chan].note]; - channel[realchan].nextoct = pattern[pattnr][row][chan].oct; - } else { // normal note - channel[realchan].note = pattern[pattnr][row][chan].note; - channel[realchan].freq = notetable[pattern[pattnr][row][chan].note]; - channel[realchan].oct = pattern[pattnr][row][chan].oct; - channel[realchan].key = 1; - donote = 1; - } - if(pattern[pattnr][row][chan].note == 14) { // key off (is 14 here, cause note is only first 4 bits) - channel[realchan].key = 0; - setfreq(realchan); - } - if((channel[realchan].fx != 8 && channel[realchan].fx != 11) && // vibrato begins - (pattern[pattnr][row][chan].command == 8 || pattern[pattnr][row][chan].command == 11)) { - channel[realchan].nextfreq = channel[realchan].freq; - channel[realchan].nextoct = channel[realchan].oct; - } - if(pattern[pattnr][row][chan].note >= 14) - if((channel[realchan].fx == 8 || channel[realchan].fx == 11) && // vibrato ends - (pattern[pattnr][row][chan].command != 8 && pattern[pattnr][row][chan].command != 11)) { - channel[realchan].freq = channel[realchan].nextfreq; - channel[realchan].oct = channel[realchan].nextoct; - setfreq(realchan); - } - if(pattern[pattnr][row][chan].instrument) { // set instrument - channel[realchan].inst = pattern[pattnr][row][chan].instrument - 1; - if(inst[channel[realchan].inst].volume < 64) - channel[realchan].vol = inst[channel[realchan].inst].volume; - else - channel[realchan].vol = 63; - if(pattern[pattnr][row][chan].command != 7) - donote = 1; - } - if(pattern[pattnr][row][chan].volume != 255) - if(pattern[pattnr][row][chan].volume < 64) // set volume - channel[realchan].vol = pattern[pattnr][row][chan].volume; - else - channel[realchan].vol = 63; - channel[realchan].fx = pattern[pattnr][row][chan].command; // set command - if(pattern[pattnr][row][chan].info) // set infobyte - channel[realchan].info = pattern[pattnr][row][chan].info; + if (del) + { // speed compensation + del--; + return !songend; + } + + // arrangement handling + pattnr = orders[ord]; + if (pattnr == 0xff || ord > header.ordnum) + { // "--" end of song + songend = 1; // set end-flag + ord = 0; + pattnr = orders[ord]; + if (pattnr == 0xff) + return !songend; + } + if (pattnr == 0xfe) + { // "++" skip marker + ord++; + pattnr = orders[ord]; + } + + // play row + row = crow; // fill row cache + for (chan = 0; chan < 32; chan++) + { + if (!(header.chanset[chan] & 128)) // resolve S3M -> AdLib channels + realchan = chnresolv[header.chanset[chan] & 127]; + else + realchan = -1; // channel disabled + if (realchan != -1) + { // channel playable? + // set channel values + donote = 0; + if (pattern[pattnr][row][chan].note < 14) + // tone portamento + if (pattern[pattnr][row][chan].command == 7 + || pattern[pattnr][row][chan].command == 12) + { + channel[realchan].nextfreq = + notetable[pattern[pattnr][row][chan].note]; + channel[realchan].nextoct = pattern[pattnr][row][chan].oct; + } + else + { // normal note + channel[realchan].note = pattern[pattnr][row][chan].note; + channel[realchan].freq = notetable[pattern[pattnr][row][chan].note]; + channel[realchan].oct = pattern[pattnr][row][chan].oct; + channel[realchan].key = 1; + donote = 1; + } + if (pattern[pattnr][row][chan].note == 14) + { // key off (is 14 here, cause note is only first 4 bits) + channel[realchan].key = 0; + setfreq (realchan); + } + if ((channel[realchan].fx != 8 && channel[realchan].fx != 11) && // vibrato begins + (pattern[pattnr][row][chan].command == 8 + || pattern[pattnr][row][chan].command == 11)) + { + channel[realchan].nextfreq = channel[realchan].freq; + channel[realchan].nextoct = channel[realchan].oct; + } + if (pattern[pattnr][row][chan].note >= 14) + if ((channel[realchan].fx == 8 || channel[realchan].fx == 11) && // vibrato ends + (pattern[pattnr][row][chan].command != 8 + && pattern[pattnr][row][chan].command != 11)) + { + channel[realchan].freq = channel[realchan].nextfreq; + channel[realchan].oct = channel[realchan].nextoct; + setfreq (realchan); + } + if (pattern[pattnr][row][chan].instrument) + { // set instrument + channel[realchan].inst = pattern[pattnr][row][chan].instrument - 1; + if (inst[channel[realchan].inst].volume < 64) + channel[realchan].vol = inst[channel[realchan].inst].volume; + else + channel[realchan].vol = 63; + if (pattern[pattnr][row][chan].command != 7) + donote = 1; + } + if (pattern[pattnr][row][chan].volume != 255) + if (pattern[pattnr][row][chan].volume < 64) // set volume + channel[realchan].vol = pattern[pattnr][row][chan].volume; + else + channel[realchan].vol = 63; + channel[realchan].fx = pattern[pattnr][row][chan].command; // set command + if (pattern[pattnr][row][chan].info) // set infobyte + channel[realchan].info = pattern[pattnr][row][chan].info; // some commands reset the infobyte memory - switch(channel[realchan].fx) { + switch (channel[realchan].fx) + { case 1: case 2: case 3: case 20: - channel[realchan].info = pattern[pattnr][row][chan].info; - break; + channel[realchan].info = pattern[pattnr][row][chan].info; + break; } - // play note - if(donote) - playnote(realchan); - if(pattern[pattnr][row][chan].volume != 255) // set volume - setvolume(realchan); + // play note + if (donote) + playnote (realchan); + if (pattern[pattnr][row][chan].volume != 255) // set volume + setvolume (realchan); - // command handling (row dependant) - info = channel[realchan].info; // fill infobyte cache - switch(channel[realchan].fx) { - case 1: speed = info; break; // set speed - case 2: if(info <= ord) songend = 1; ord = info; crow = 0; pattbreak = 1; break; // jump to order - case 3: if(!pattbreak) { crow = info; ord++; pattbreak = 1; } break; // pattern break - case 4: if(info > 0xf0) // fine volume down - if(channel[realchan].vol - (info & 0x0f) >= 0) - channel[realchan].vol -= info & 0x0f; - else - channel[realchan].vol = 0; - if((info & 0x0f) == 0x0f && info >= 0x1f) // fine volume up - if(channel[realchan].vol + ((info & 0xf0) >> 4) <= 63) - channel[realchan].vol += (info & 0xf0) >> 4; - else - channel[realchan].vol = 63; - setvolume(realchan); - break; - case 5: if(info > 0xf0) { // fine slide down - slide_down(realchan,(unsigned char) (info & 0x0f)); - setfreq(realchan); - } - if(info > 0xe0 && info < 0xf0) { // extra fine slide down - slide_down(realchan,(unsigned char) ((info & 0x0f) / 4)); - setfreq(realchan); - } - break; - case 6: if(info > 0xf0) { // fine slide up - slide_up(realchan,(unsigned char) (info & 0x0f)); - setfreq(realchan); - } - if(info > 0xe0 && info < 0xf0) { // extra fine slide up - slide_up(realchan,(unsigned char) ((info & 0x0f) / 4)); - setfreq(realchan); - } - break; - case 7: // tone portamento - case 8: if((channel[realchan].fx == 7 || // vibrato (remember info for dual commands) - channel[realchan].fx == 8) && pattern[pattnr][row][chan].info) - channel[realchan].dualinfo = info; - break; - case 10: channel[realchan].trigger = 0; break; // arpeggio (set trigger) - case 19: if(info == 0xb0) // set loop start - loopstart = row; - if(info > 0xb0 && info <= 0xbf) // pattern loop - if(!loopcnt) { - loopcnt = info & 0x0f; - crow = loopstart; - pattbreak = 1; - } else - if(--loopcnt > 0) { - crow = loopstart; - pattbreak = 1; - } - if((info & 0xf0) == 0xe0) // patterndelay - del = speed * (info & 0x0f) - 1; - break; - case 20: tempo = info; break; // set tempo - } - } - } + // command handling (row dependant) + info = channel[realchan].info; // fill infobyte cache + switch (channel[realchan].fx) + { + case 1: + speed = info; + break; // set speed + case 2: + if (info <= ord) + songend = 1; + ord = info; + crow = 0; + pattbreak = 1; + break; // jump to order + case 3: + if (!pattbreak) + { + crow = info; + ord++; + pattbreak = 1; + } + break; // pattern break + case 4: + if (info > 0xf0) // fine volume down + if (channel[realchan].vol - (info & 0x0f) >= 0) + channel[realchan].vol -= info & 0x0f; + else + channel[realchan].vol = 0; + if ((info & 0x0f) == 0x0f && info >= 0x1f) // fine volume up + if (channel[realchan].vol + ((info & 0xf0) >> 4) <= 63) + channel[realchan].vol += (info & 0xf0) >> 4; + else + channel[realchan].vol = 63; + setvolume (realchan); + break; + case 5: + if (info > 0xf0) + { // fine slide down + slide_down (realchan, (unsigned char) (info & 0x0f)); + setfreq (realchan); + } + if (info > 0xe0 && info < 0xf0) + { // extra fine slide down + slide_down (realchan, (unsigned char) ((info & 0x0f) / 4)); + setfreq (realchan); + } + break; + case 6: + if (info > 0xf0) + { // fine slide up + slide_up (realchan, (unsigned char) (info & 0x0f)); + setfreq (realchan); + } + if (info > 0xe0 && info < 0xf0) + { // extra fine slide up + slide_up (realchan, (unsigned char) ((info & 0x0f) / 4)); + setfreq (realchan); + } + break; + case 7: // tone portamento + case 8: + if ((channel[realchan].fx == 7 || // vibrato (remember info for dual commands) + channel[realchan].fx == 8) && pattern[pattnr][row][chan].info) + channel[realchan].dualinfo = info; + break; + case 10: + channel[realchan].trigger = 0; + break; // arpeggio (set trigger) + case 19: + if (info == 0xb0) // set loop start + loopstart = row; + if (info > 0xb0 && info <= 0xbf) // pattern loop + if (!loopcnt) + { + loopcnt = info & 0x0f; + crow = loopstart; + pattbreak = 1; + } + else if (--loopcnt > 0) + { + crow = loopstart; + pattbreak = 1; + } + if ((info & 0xf0) == 0xe0) // patterndelay + del = speed * (info & 0x0f) - 1; + break; + case 20: + tempo = info; + break; // set tempo + } + } + } - if(!del) - del = speed - 1; // speed compensation - if(!pattbreak) { // next row (only if no manual advance) - crow++; - if(crow > 63) { - crow = 0; - ord++; - loopstart = 0; - } - } + if (!del) + del = speed - 1; // speed compensation + if (!pattbreak) + { // next row (only if no manual advance) + crow++; + if (crow > 63) + { + crow = 0; + ord++; + loopstart = 0; + } + } - return !songend; // still playing + return !songend; // still playing } -void Cs3mPlayer::rewind(int subsong) +void +Cs3mPlayer::rewind (int subsong) { - // set basic variables - songend = 0; ord = 0; crow = 0; tempo = header.it; - speed = header.is; del = 0; loopstart = 0; loopcnt = 0; + // set basic variables + songend = 0; + ord = 0; + crow = 0; + tempo = header.it; + speed = header.is; + del = 0; + loopstart = 0; + loopcnt = 0; - memset(channel,0,sizeof(channel)); + memset (channel, 0, sizeof (channel)); - opl->init(); // reset OPL chip - opl->write(1,32); // Go to ym3812 mode + opl->init (); // reset OPL chip + opl->write (1, 32); // Go to ym3812 mode } -std::string Cs3mPlayer::gettype() +std::string Cs3mPlayer::gettype () { - char filever[5]; + char + filever[5]; - switch(header.cwtv) { // determine version number - case 0x1300: strcpy(filever,"3.00"); break; - case 0x1301: strcpy(filever,"3.01"); break; - case 0x1303: strcpy(filever,"3.03"); break; - case 0x1320: strcpy(filever,"3.20"); break; - default: strcpy(filever,"3.??"); - } + switch (header.cwtv) + { // determine version number + case 0x1300: + strcpy (filever, "3.00"); + break; + case 0x1301: + strcpy (filever, "3.01"); + break; + case 0x1303: + strcpy (filever, "3.03"); + break; + case 0x1320: + strcpy (filever, "3.20"); + break; + default: + strcpy (filever, "3.??"); + } - return (std::string("Scream Tracker ") + filever); + return (std::string ("Scream Tracker ") + filever); } -float Cs3mPlayer::getrefresh() +float +Cs3mPlayer::getrefresh () { - return (float) (tempo / 2.5); + return (float) (tempo / 2.5); } /*** private methods *************************************/ -void Cs3mPlayer::load_header(binistream *f, s3mheader *h) +void +Cs3mPlayer::load_header (binistream * f, s3mheader * h) { int i; - f->readString(h->name, 28); - h->kennung = f->readInt(1); h->typ = f->readInt(1); - f->ignore(2); - h->ordnum = f->readInt(2); h->insnum = f->readInt(2); - h->patnum = f->readInt(2); h->flags = f->readInt(2); - h->cwtv = f->readInt(2); h->ffi = f->readInt(2); - f->readString(h->scrm, 4); - h->gv = f->readInt(1); h->is = f->readInt(1); h->it = f->readInt(1); - h->mv = f->readInt(1); h->uc = f->readInt(1); h->dp = f->readInt(1); - f->ignore(8); - h->special = f->readInt(2); - for(i = 0; i < 32; i++) h->chanset[i] = f->readInt(1); -} - -void Cs3mPlayer::setvolume(unsigned char chan) -{ - unsigned char op = op_table[chan], insnr = channel[chan].inst; - - opl->write(0x43 + op,(int)(63-((63-(inst[insnr].d03 & 63))/63.0)*channel[chan].vol) + (inst[insnr].d03 & 192)); - if(inst[insnr].d0a & 1) - opl->write(0x40 + op,(int)(63-((63-(inst[insnr].d02 & 63))/63.0)*channel[chan].vol) + (inst[insnr].d02 & 192)); + f->readString (h->name, 28); + h->kennung = f->readInt (1); + h->typ = f->readInt (1); + f->ignore (2); + h->ordnum = f->readInt (2); + h->insnum = f->readInt (2); + h->patnum = f->readInt (2); + h->flags = f->readInt (2); + h->cwtv = f->readInt (2); + h->ffi = f->readInt (2); + f->readString (h->scrm, 4); + h->gv = f->readInt (1); + h->is = f->readInt (1); + h->it = f->readInt (1); + h->mv = f->readInt (1); + h->uc = f->readInt (1); + h->dp = f->readInt (1); + f->ignore (8); + h->special = f->readInt (2); + for (i = 0; i < 32; i++) + h->chanset[i] = f->readInt (1); } -void Cs3mPlayer::setfreq(unsigned char chan) +void +Cs3mPlayer::setvolume (unsigned char chan) { - opl->write(0xa0 + chan, channel[chan].freq & 255); - if(channel[chan].key) - opl->write(0xb0 + chan, ((channel[chan].freq & 768) >> 8) + (channel[chan].oct << 2) | 32); - else - opl->write(0xb0 + chan, ((channel[chan].freq & 768) >> 8) + (channel[chan].oct << 2)); + unsigned char op = op_table[chan], insnr = channel[chan].inst; + + opl->write (0x43 + op, + (int) (63 - + ((63 - + (inst[insnr].d03 & 63)) / 63.0) * channel[chan].vol) + + (inst[insnr].d03 & 192)); + if (inst[insnr].d0a & 1) + opl->write (0x40 + op, + (int) (63 - + ((63 - + (inst[insnr].d02 & 63)) / 63.0) * + channel[chan].vol) + (inst[insnr].d02 & 192)); } -void Cs3mPlayer::playnote(unsigned char chan) +void +Cs3mPlayer::setfreq (unsigned char chan) { - unsigned char op = op_table[chan], insnr = channel[chan].inst; - - opl->write(0xb0 + chan, 0); // stop old note - - // set instrument data - opl->write(0x20 + op, inst[insnr].d00); - opl->write(0x23 + op, inst[insnr].d01); - opl->write(0x40 + op, inst[insnr].d02); - opl->write(0x43 + op, inst[insnr].d03); - opl->write(0x60 + op, inst[insnr].d04); - opl->write(0x63 + op, inst[insnr].d05); - opl->write(0x80 + op, inst[insnr].d06); - opl->write(0x83 + op, inst[insnr].d07); - opl->write(0xe0 + op, inst[insnr].d08); - opl->write(0xe3 + op, inst[insnr].d09); - opl->write(0xc0 + chan, inst[insnr].d0a); - - // set frequency & play - channel[chan].key = 1; - setfreq(chan); + opl->write (0xa0 + chan, channel[chan].freq & 255); + if (channel[chan].key) + opl->write (0xb0 + chan, + ((channel[chan].freq & 768) >> 8) + + (channel[chan].oct << 2) | 32); + else + opl->write (0xb0 + chan, + ((channel[chan].freq & 768) >> 8) + (channel[chan].oct << 2)); } -void Cs3mPlayer::slide_down(unsigned char chan, unsigned char amount) +void +Cs3mPlayer::playnote (unsigned char chan) { - if(channel[chan].freq - amount > 340) - channel[chan].freq -= amount; - else - if(channel[chan].oct > 0) { - channel[chan].oct--; - channel[chan].freq = 684; - } else - channel[chan].freq = 340; + unsigned char op = op_table[chan], insnr = channel[chan].inst; + + opl->write (0xb0 + chan, 0); // stop old note + + // set instrument data + opl->write (0x20 + op, inst[insnr].d00); + opl->write (0x23 + op, inst[insnr].d01); + opl->write (0x40 + op, inst[insnr].d02); + opl->write (0x43 + op, inst[insnr].d03); + opl->write (0x60 + op, inst[insnr].d04); + opl->write (0x63 + op, inst[insnr].d05); + opl->write (0x80 + op, inst[insnr].d06); + opl->write (0x83 + op, inst[insnr].d07); + opl->write (0xe0 + op, inst[insnr].d08); + opl->write (0xe3 + op, inst[insnr].d09); + opl->write (0xc0 + chan, inst[insnr].d0a); + + // set frequency & play + channel[chan].key = 1; + setfreq (chan); } -void Cs3mPlayer::slide_up(unsigned char chan, unsigned char amount) +void +Cs3mPlayer::slide_down (unsigned char chan, unsigned char amount) { - if(channel[chan].freq + amount < 686) - channel[chan].freq += amount; - else - if(channel[chan].oct < 7) { - channel[chan].oct++; - channel[chan].freq = 341; - } else - channel[chan].freq = 686; + if (channel[chan].freq - amount > 340) + channel[chan].freq -= amount; + else if (channel[chan].oct > 0) + { + channel[chan].oct--; + channel[chan].freq = 684; + } + else + channel[chan].freq = 340; } -void Cs3mPlayer::vibrato(unsigned char chan, unsigned char info) +void +Cs3mPlayer::slide_up (unsigned char chan, unsigned char amount) { - unsigned char i,speed,depth; - - speed = info >> 4; - depth = (info & 0x0f) / 2; - - for(i=0;i= 64) - channel[chan].trigger -= 64; - if(channel[chan].trigger >= 16 && channel[chan].trigger < 48) - slide_down(chan,(unsigned char) (vibratotab[channel[chan].trigger - 16] / (16-depth))); - if(channel[chan].trigger < 16) - slide_up(chan,(unsigned char) (vibratotab[channel[chan].trigger + 16] / (16-depth))); - if(channel[chan].trigger >= 48) - slide_up(chan,(unsigned char) (vibratotab[channel[chan].trigger - 48] / (16-depth))); - } - setfreq(chan); + if (channel[chan].freq + amount < 686) + channel[chan].freq += amount; + else if (channel[chan].oct < 7) + { + channel[chan].oct++; + channel[chan].freq = 341; + } + else + channel[chan].freq = 686; } -void Cs3mPlayer::tone_portamento(unsigned char chan, unsigned char info) +void +Cs3mPlayer::vibrato (unsigned char chan, unsigned char info) { - if(channel[chan].freq + (channel[chan].oct << 10) < channel[chan].nextfreq + - (channel[chan].nextoct << 10)) - slide_up(chan,info); - if(channel[chan].freq + (channel[chan].oct << 10) > channel[chan].nextfreq + - (channel[chan].nextoct << 10)) - slide_down(chan,info); - setfreq(chan); + unsigned char i, speed, depth; + + speed = info >> 4; + depth = (info & 0x0f) / 2; + + for (i = 0; i < speed; i++) + { + channel[chan].trigger++; + while (channel[chan].trigger >= 64) + channel[chan].trigger -= 64; + if (channel[chan].trigger >= 16 && channel[chan].trigger < 48) + slide_down (chan, + (unsigned char) (vibratotab[channel[chan].trigger - 16] / + (16 - depth))); + if (channel[chan].trigger < 16) + slide_up (chan, + (unsigned char) (vibratotab[channel[chan].trigger + 16] / + (16 - depth))); + if (channel[chan].trigger >= 48) + slide_up (chan, + (unsigned char) (vibratotab[channel[chan].trigger - 48] / + (16 - depth))); + } + setfreq (chan); } + +void +Cs3mPlayer::tone_portamento (unsigned char chan, unsigned char info) +{ + if (channel[chan].freq + (channel[chan].oct << 10) < + channel[chan].nextfreq + (channel[chan].nextoct << 10)) + slide_up (chan, info); + if (channel[chan].freq + (channel[chan].oct << 10) > + channel[chan].nextfreq + (channel[chan].nextoct << 10)) + slide_down (chan, info); + setfreq (chan); +} diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/sa2.cxx --- a/src/adplug/core/sa2.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/sa2.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -25,237 +25,289 @@ #include "sa2.h" #include "debug.h" -CPlayer *Csa2Loader::factory(Copl *newopl) +CPlayer * +Csa2Loader::factory (Copl * newopl) { - return new Csa2Loader(newopl); + return new Csa2Loader (newopl); } -bool Csa2Loader::load(VFSFile *fd, const CFileProvider &fp) +bool +Csa2Loader::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); if(!f) return false; - struct { - unsigned char data[11],arpstart,arpspeed,arppos,arpspdcnt; - } insts; - unsigned char buf; - int i,j, k, notedis = 0; - const unsigned char convfx[16] = {0,1,2,3,4,5,6,255,8,255,10,11,12,13,255,15}; - unsigned char sat_type; - enum SAT_TYPE { - HAS_ARPEGIOLIST = (1 << 7), - HAS_V7PATTERNS = (1 << 6), - HAS_ACTIVECHANNELS = (1 << 5), - HAS_TRACKORDER = (1 << 4), - HAS_ARPEGIO = (1 << 3), - HAS_OLDBPM = (1 << 2), - HAS_OLDPATTERNS = (1 << 1), - HAS_UNKNOWN127 = (1 << 0) - }; + binistream *f = fp.open (fd); + if (!f) + return false; + struct + { + unsigned char data[11], arpstart, arpspeed, arppos, arpspdcnt; + } insts; + unsigned char buf; + int i, j, k, notedis = 0; + const unsigned char convfx[16] = + { 0, 1, 2, 3, 4, 5, 6, 255, 8, 255, 10, 11, 12, 13, 255, 15 }; + unsigned char sat_type; + enum SAT_TYPE + { + HAS_ARPEGIOLIST = (1 << 7), + HAS_V7PATTERNS = (1 << 6), + HAS_ACTIVECHANNELS = (1 << 5), + HAS_TRACKORDER = (1 << 4), + HAS_ARPEGIO = (1 << 3), + HAS_OLDBPM = (1 << 2), + HAS_OLDPATTERNS = (1 << 1), + HAS_UNKNOWN127 = (1 << 0) + }; - // read header - f->readString(header.sadt, 4); - header.version = f->readInt(1); + // read header + f->readString (header.sadt, 4); + header.version = f->readInt (1); - // file validation section - if(strncmp(header.sadt,"SAdT",4)) { fp.close(f); return false; } - switch(header.version) { - case 1: - notedis = +0x18; - sat_type = HAS_UNKNOWN127 | HAS_OLDPATTERNS | HAS_OLDBPM; - break; - case 2: - notedis = +0x18; - sat_type = HAS_OLDPATTERNS | HAS_OLDBPM; - break; - case 3: - notedis = +0x0c; - sat_type = HAS_OLDPATTERNS | HAS_OLDBPM; - break; - case 4: - notedis = +0x0c; - sat_type = HAS_ARPEGIO | HAS_OLDPATTERNS | HAS_OLDBPM; - break; - case 5: - notedis = +0x0c; - sat_type = HAS_ARPEGIO | HAS_ARPEGIOLIST | HAS_OLDPATTERNS | HAS_OLDBPM; - break; - case 6: - sat_type = HAS_ARPEGIO | HAS_ARPEGIOLIST | HAS_OLDPATTERNS | HAS_OLDBPM; - break; - case 7: - sat_type = HAS_ARPEGIO | HAS_ARPEGIOLIST | HAS_V7PATTERNS; - break; - case 8: - sat_type = HAS_ARPEGIO | HAS_ARPEGIOLIST | HAS_TRACKORDER; - break; - case 9: - sat_type = HAS_ARPEGIO | HAS_ARPEGIOLIST | HAS_TRACKORDER | HAS_ACTIVECHANNELS; - break; - default: /* unknown */ - fp.close(f); - return false; - } + // file validation section + if (strncmp (header.sadt, "SAdT", 4)) + { + fp.close (f); + return false; + } + switch (header.version) + { + case 1: + notedis = +0x18; + sat_type = HAS_UNKNOWN127 | HAS_OLDPATTERNS | HAS_OLDBPM; + break; + case 2: + notedis = +0x18; + sat_type = HAS_OLDPATTERNS | HAS_OLDBPM; + break; + case 3: + notedis = +0x0c; + sat_type = HAS_OLDPATTERNS | HAS_OLDBPM; + break; + case 4: + notedis = +0x0c; + sat_type = HAS_ARPEGIO | HAS_OLDPATTERNS | HAS_OLDBPM; + break; + case 5: + notedis = +0x0c; + sat_type = HAS_ARPEGIO | HAS_ARPEGIOLIST | HAS_OLDPATTERNS | HAS_OLDBPM; + break; + case 6: + sat_type = HAS_ARPEGIO | HAS_ARPEGIOLIST | HAS_OLDPATTERNS | HAS_OLDBPM; + break; + case 7: + sat_type = HAS_ARPEGIO | HAS_ARPEGIOLIST | HAS_V7PATTERNS; + break; + case 8: + sat_type = HAS_ARPEGIO | HAS_ARPEGIOLIST | HAS_TRACKORDER; + break; + case 9: + sat_type = + HAS_ARPEGIO | HAS_ARPEGIOLIST | HAS_TRACKORDER | HAS_ACTIVECHANNELS; + break; + default: /* unknown */ + fp.close (f); + return false; + } - // load section - // instruments - for(i = 0; i < 31; i++) { - if(sat_type & HAS_ARPEGIO) { - for(j = 0; j < 11; j++) insts.data[j] = f->readInt(1); - insts.arpstart = f->readInt(1); - insts.arpspeed = f->readInt(1); - insts.arppos = f->readInt(1); - insts.arpspdcnt = f->readInt(1); - inst[i].arpstart = insts.arpstart; - inst[i].arpspeed = insts.arpspeed; - inst[i].arppos = insts.arppos; - inst[i].arpspdcnt = insts.arpspdcnt; - } else { - for(j = 0; j < 11; j++) insts.data[j] = f->readInt(1); - inst[i].arpstart = 0; - inst[i].arpspeed = 0; - inst[i].arppos = 0; - inst[i].arpspdcnt = 0; - } - for(j=0;j<11;j++) - inst[i].data[j] = insts.data[j]; - inst[i].misc = 0; - inst[i].slide = 0; - } + // load section + // instruments + for (i = 0; i < 31; i++) + { + if (sat_type & HAS_ARPEGIO) + { + for (j = 0; j < 11; j++) + insts.data[j] = f->readInt (1); + insts.arpstart = f->readInt (1); + insts.arpspeed = f->readInt (1); + insts.arppos = f->readInt (1); + insts.arpspdcnt = f->readInt (1); + inst[i].arpstart = insts.arpstart; + inst[i].arpspeed = insts.arpspeed; + inst[i].arppos = insts.arppos; + inst[i].arpspdcnt = insts.arpspdcnt; + } + else + { + for (j = 0; j < 11; j++) + insts.data[j] = f->readInt (1); + inst[i].arpstart = 0; + inst[i].arpspeed = 0; + inst[i].arppos = 0; + inst[i].arpspdcnt = 0; + } + for (j = 0; j < 11; j++) + inst[i].data[j] = insts.data[j]; + inst[i].misc = 0; + inst[i].slide = 0; + } - // instrument names - for(i = 0; i < 29; i++) f->readString(instname[i], 17); + // instrument names + for (i = 0; i < 29; i++) + f->readString (instname[i], 17); - f->ignore(3); // dummy bytes - for(i = 0; i < 128; i++) order[i] = f->readInt(1); // pattern orders - if(sat_type & HAS_UNKNOWN127) f->ignore(127); + f->ignore (3); // dummy bytes + for (i = 0; i < 128; i++) + order[i] = f->readInt (1); // pattern orders + if (sat_type & HAS_UNKNOWN127) + f->ignore (127); - // infos - nop = f->readInt(2); length = f->readInt(1); restartpos = f->readInt(1); + // infos + nop = f->readInt (2); + length = f->readInt (1); + restartpos = f->readInt (1); - // bpm - bpm = f->readInt(2); - if(sat_type & HAS_OLDBPM) { - bpm = bpm * 125 / 50; // cps -> bpm - } + // bpm + bpm = f->readInt (2); + if (sat_type & HAS_OLDBPM) + { + bpm = bpm * 125 / 50; // cps -> bpm + } - if(sat_type & HAS_ARPEGIOLIST) { - init_specialarp(); - for(i = 0; i < 256; i++) arplist[i] = f->readInt(1); // arpeggio list - for(i = 0; i < 256; i++) arpcmd[i] = f->readInt(1); // arpeggio commands - } + if (sat_type & HAS_ARPEGIOLIST) + { + init_specialarp (); + for (i = 0; i < 256; i++) + arplist[i] = f->readInt (1); // arpeggio list + for (i = 0; i < 256; i++) + arpcmd[i] = f->readInt (1); // arpeggio commands + } - for(i=0;i<64;i++) { // track orders - for(j=0;j<9;j++) { - if(sat_type & HAS_TRACKORDER) - trackord[i][j] = f->readInt(1); - else - { - trackord[i][j] = i * 9 + j; - } - } - } + for (i = 0; i < 64; i++) + { // track orders + for (j = 0; j < 9; j++) + { + if (sat_type & HAS_TRACKORDER) + trackord[i][j] = f->readInt (1); + else + { + trackord[i][j] = i * 9 + j; + } + } + } - if(sat_type & HAS_ACTIVECHANNELS) - activechan = f->readInt(2) << 16; // active channels + if (sat_type & HAS_ACTIVECHANNELS) + activechan = f->readInt (2) << 16; // active channels - AdPlug_LogWrite("Csa2Loader::load(\"%s\"): sat_type = %x, nop = %d, " - "length = %d, restartpos = %d, activechan = %x, bpm = %d\n", - fd->uri, sat_type, nop, length, restartpos, activechan, bpm); + AdPlug_LogWrite ("Csa2Loader::load(\"%s\"): sat_type = %x, nop = %d, " + "length = %d, restartpos = %d, activechan = %x, bpm = %d\n", + fd->uri, sat_type, nop, length, restartpos, activechan, + bpm); - // track data - if(sat_type & HAS_OLDPATTERNS) { - i = 0; - while(!f->ateof()) { - for(j=0;j<64;j++) { - for(k=0;k<9;k++) { - buf = f->readInt(1); - tracks[i+k][j].note = buf ? (buf + notedis) : 0; - tracks[i+k][j].inst = f->readInt(1); - tracks[i+k][j].command = convfx[f->readInt(1) & 0xf]; - tracks[i+k][j].param1 = f->readInt(1); - tracks[i+k][j].param2 = f->readInt(1); - } - } - i+=9; - } - } else - if(sat_type & HAS_V7PATTERNS) { - i = 0; - while(!f->ateof()) { - for(j=0;j<64;j++) { - for(k=0;k<9;k++) { - buf = f->readInt(1); - tracks[i+k][j].note = buf >> 1; - tracks[i+k][j].inst = (buf & 1) << 4; - buf = f->readInt(1); - tracks[i+k][j].inst += buf >> 4; - tracks[i+k][j].command = convfx[buf & 0x0f]; - buf = f->readInt(1); - tracks[i+k][j].param1 = buf >> 4; - tracks[i+k][j].param2 = buf & 0x0f; - } - } - i+=9; - } - } else { - i = 0; - while(!f->ateof()) { - for(j=0;j<64;j++) { - buf = f->readInt(1); - tracks[i][j].note = buf >> 1; - tracks[i][j].inst = (buf & 1) << 4; - buf = f->readInt(1); - tracks[i][j].inst += buf >> 4; - tracks[i][j].command = convfx[buf & 0x0f]; - buf = f->readInt(1); - tracks[i][j].param1 = buf >> 4; - tracks[i][j].param2 = buf & 0x0f; - } - i++; - } - } - fp.close(f); + // track data + if (sat_type & HAS_OLDPATTERNS) + { + i = 0; + while (!f->ateof ()) + { + for (j = 0; j < 64; j++) + { + for (k = 0; k < 9; k++) + { + buf = f->readInt (1); + tracks[i + k][j].note = buf ? (buf + notedis) : 0; + tracks[i + k][j].inst = f->readInt (1); + tracks[i + k][j].command = convfx[f->readInt (1) & 0xf]; + tracks[i + k][j].param1 = f->readInt (1); + tracks[i + k][j].param2 = f->readInt (1); + } + } + i += 9; + } + } + else if (sat_type & HAS_V7PATTERNS) + { + i = 0; + while (!f->ateof ()) + { + for (j = 0; j < 64; j++) + { + for (k = 0; k < 9; k++) + { + buf = f->readInt (1); + tracks[i + k][j].note = buf >> 1; + tracks[i + k][j].inst = (buf & 1) << 4; + buf = f->readInt (1); + tracks[i + k][j].inst += buf >> 4; + tracks[i + k][j].command = convfx[buf & 0x0f]; + buf = f->readInt (1); + tracks[i + k][j].param1 = buf >> 4; + tracks[i + k][j].param2 = buf & 0x0f; + } + } + i += 9; + } + } + else + { + i = 0; + while (!f->ateof ()) + { + for (j = 0; j < 64; j++) + { + buf = f->readInt (1); + tracks[i][j].note = buf >> 1; + tracks[i][j].inst = (buf & 1) << 4; + buf = f->readInt (1); + tracks[i][j].inst += buf >> 4; + tracks[i][j].command = convfx[buf & 0x0f]; + buf = f->readInt (1); + tracks[i][j].param1 = buf >> 4; + tracks[i][j].param2 = buf & 0x0f; + } + i++; + } + } + fp.close (f); - // fix instrument names - for(i=0;i<29;i++) - for(j=0;j<17;j++) - if(!instname[i][j]) - instname[i][j] = ' '; + // fix instrument names + for (i = 0; i < 29; i++) + for (j = 0; j < 17; j++) + if (!instname[i][j]) + instname[i][j] = ' '; - rewind(0); // rewind module - return true; + rewind (0); // rewind module + return true; } -std::string Csa2Loader::gettype() +std::string Csa2Loader::gettype () { - char tmpstr[40]; + char + tmpstr[40]; - sprintf(tmpstr,"Surprise! Adlib Tracker 2 (version %d)",header.version); - return std::string(tmpstr); + sprintf (tmpstr, "Surprise! Adlib Tracker 2 (version %d)", header.version); + return std::string (tmpstr); } -std::string Csa2Loader::gettitle() +std::string Csa2Loader::gettitle () { - char bufinst[29*17],buf[18]; - int i,ptr; + char + bufinst[29 * 17], + buf[18]; + int + i, + ptr; - // parse instrument names for song name - memset(bufinst,'\0',29*17); - for(i=0;i<29;i++) { - buf[16] = ' '; buf[17] = '\0'; - memcpy(buf,instname[i]+1,16); - for(ptr=16;ptr>0;ptr--) - if(buf[ptr] == ' ') - buf[ptr] = '\0'; - else { - if(ptr<16) - buf[ptr+1] = ' '; - break; - } - strcat(bufinst,buf); - } + // parse instrument names for song name + memset (bufinst, '\0', 29 * 17); + for (i = 0; i < 29; i++) + { + buf[16] = ' '; + buf[17] = '\0'; + memcpy (buf, instname[i] + 1, 16); + for (ptr = 16; ptr > 0; ptr--) + if (buf[ptr] == ' ') + buf[ptr] = '\0'; + else + { + if (ptr < 16) + buf[ptr + 1] = ' '; + break; + } + strcat (bufinst, buf); + } - if(strchr(bufinst,'"')) - return std::string(bufinst,strchr(bufinst,'"')-bufinst+1,strrchr(bufinst,'"')-strchr(bufinst,'"')-1); - else - return std::string(); + if (strchr (bufinst, '"')) + return std::string (bufinst, strchr (bufinst, '"') - bufinst + 1, + strrchr (bufinst, '"') - strchr (bufinst, '"') - 1); + else + return std::string (); } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/sng.cxx --- a/src/adplug/core/sng.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/sng.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -21,64 +21,91 @@ #include "sng.h" -CPlayer *CsngPlayer::factory(Copl *newopl) +CPlayer * +CsngPlayer::factory (Copl * newopl) { - return new CsngPlayer(newopl); + return new CsngPlayer (newopl); } -bool CsngPlayer::load(VFSFile *fd, const CFileProvider &fp) +bool +CsngPlayer::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); if(!f) return false; + binistream *f = fp.open (fd); + if (!f) + return false; int i; // load header - f->readString(header.id, 4); - header.length = f->readInt(2); header.start = f->readInt(2); - header.loop = f->readInt(2); header.delay = f->readInt(1); - header.compressed = f->readInt(1) ? true : false; + f->readString (header.id, 4); + header.length = f->readInt (2); + header.start = f->readInt (2); + header.loop = f->readInt (2); + header.delay = f->readInt (1); + header.compressed = f->readInt (1) ? true : false; // file validation section - if(strncmp(header.id,"ObsM",4)) { fp.close(f); return false; } + if (strncmp (header.id, "ObsM", 4)) + { + fp.close (f); + return false; + } // load section - header.length /= 2; header.start /= 2; header.loop /= 2; - data = new Sdata [header.length]; - for(i = 0; i < header.length; i++) { - data[i].val = f->readInt(1); - data[i].reg = f->readInt(1); + header.length /= 2; + header.start /= 2; + header.loop /= 2; + data = new Sdata[header.length]; + for (i = 0; i < header.length; i++) + { + data[i].val = f->readInt (1); + data[i].reg = f->readInt (1); } - rewind(0); - fp.close(f); + rewind (0); + fp.close (f); return true; } -bool CsngPlayer::update() +bool +CsngPlayer::update () { - if(header.compressed && del) { + if (header.compressed && del) + { del--; return !songend; } - while(data[pos].reg) { - opl->write(data[pos].reg, data[pos].val); + while (data[pos].reg) + { + opl->write (data[pos].reg, data[pos].val); pos++; - if(pos >= header.length) { + if (pos >= header.length) + { songend = true; pos = header.loop; } } - if(!header.compressed) - opl->write(data[pos].reg, data[pos].val); + if (!header.compressed) + opl->write (data[pos].reg, data[pos].val); - if(data[pos].val) del = data[pos].val - 1; pos++; - if(pos >= header.length) { songend = true; pos = header.loop; } + if (data[pos].val) + del = data[pos].val - 1; + pos++; + if (pos >= header.length) + { + songend = true; + pos = header.loop; + } return !songend; } -void CsngPlayer::rewind(int subsong) +void +CsngPlayer::rewind (int subsong) { - pos = header.start; del = header.delay; songend = false; - opl->init(); opl->write(1,32); // go to OPL2 mode + pos = header.start; + del = header.delay; + songend = false; + opl->init (); + opl->write (1, 32); // go to OPL2 mode } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/temuopl.cxx --- a/src/adplug/core/temuopl.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/temuopl.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -21,55 +21,65 @@ #include "temuopl.h" -CTemuopl::CTemuopl(int rate, bool bit16, bool usestereo) - : use16bit(bit16), stereo(usestereo) +CTemuopl::CTemuopl (int rate, bool bit16, bool usestereo): +use16bit (bit16), +stereo (usestereo) { - opl = OPLCreate(OPL_TYPE_YM3812, 3579545, rate); + opl = OPLCreate (OPL_TYPE_YM3812, 3579545, rate); } -CTemuopl::~CTemuopl() +CTemuopl::~CTemuopl () { - OPLDestroy(opl); + OPLDestroy (opl); } -void CTemuopl::update(short *buf, int samples) +void +CTemuopl::update (short *buf, int samples) { int i; - if(use16bit) { - YM3812UpdateOne(opl,buf,samples); + if (use16bit) + { + YM3812UpdateOne (opl, buf, samples); - if(stereo) - for(i=samples-1;i>=0;i--) { - buf[i*2] = buf[i]; - buf[i*2+1] = buf[i]; + if (stereo) + for (i = samples - 1; i >= 0; i--) + { + buf[i * 2] = buf[i]; + buf[i * 2 + 1] = buf[i]; } - } else { - short *tempbuf = new short[stereo ? samples*2 : samples]; + } + else + { + short *tempbuf = new short[stereo ? samples * 2 : samples]; int i; - YM3812UpdateOne(opl,tempbuf,samples); + YM3812UpdateOne (opl, tempbuf, samples); - if(stereo) - for(i=samples-1;i>=0;i--) { - tempbuf[i*2] = tempbuf[i]; - tempbuf[i*2+1] = tempbuf[i]; + if (stereo) + for (i = samples - 1; i >= 0; i--) + { + tempbuf[i * 2] = tempbuf[i]; + tempbuf[i * 2 + 1] = tempbuf[i]; } - for(i=0;i<(stereo ? samples*2 : samples);i++) - ((char *)buf)[i] = (tempbuf[i] >> 8) ^ 0x80; + for (i = 0; i < (stereo ? samples * 2 : samples); i++) + ((char *) buf)[i] = (tempbuf[i] >> 8) ^ 0x80; - delete [] tempbuf; tempbuf = 0; + delete[]tempbuf; + tempbuf = 0; } } -void CTemuopl::write(int reg, int val) +void +CTemuopl::write (int reg, int val) { - OPLWrite(opl,0,reg); - OPLWrite(opl,1,val); + OPLWrite (opl, 0, reg); + OPLWrite (opl, 1, val); } -void CTemuopl::init() +void +CTemuopl::init () { - OPLResetChip(opl); + OPLResetChip (opl); } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/u6m.cxx --- a/src/adplug/core/u6m.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/u6m.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -29,166 +29,176 @@ else \ return false; -CPlayer *Cu6mPlayer::factory(Copl *newopl) +CPlayer * +Cu6mPlayer::factory (Copl * newopl) { - return new Cu6mPlayer(newopl); + return new Cu6mPlayer (newopl); } -bool Cu6mPlayer::load(VFSFile *fd, const CFileProvider &fp) +bool +Cu6mPlayer::load (VFSFile * fd, const CFileProvider & fp) { - // file validation section - // this section only checks a few *necessary* conditions - unsigned long filesize, decompressed_filesize; - binistream *f; + // file validation section + // this section only checks a few *necessary* conditions + unsigned long filesize, decompressed_filesize; + binistream *f; + + f = fp.open (fd); + if (!f) + return false; + filesize = fp.filesize (f); - f = fp.open(fd); if(!f) return false; - filesize = fp.filesize(f); + if (filesize >= 6) + { + // check if the file has a valid pseudo-header + unsigned char pseudo_header[6]; + f->readString ((char *) pseudo_header, 6); + decompressed_filesize = pseudo_header[0] + (pseudo_header[1] << 8); - if (filesize >= 6) + if (!((pseudo_header[2] == 0) && (pseudo_header[3] == 0) && + (pseudo_header[4] + ((pseudo_header[5] & 0x1) << 8) == 0x100) && + (decompressed_filesize > (filesize - 4)))) { - // check if the file has a valid pseudo-header - unsigned char pseudo_header[6]; - f->readString((char *)pseudo_header, 6); - decompressed_filesize = pseudo_header[0] + (pseudo_header[1] << 8); - - if (!( (pseudo_header[2]==0) && (pseudo_header[3]==0) && - (pseudo_header[4] + ((pseudo_header[5] & 0x1)<<8) == 0x100) && - (decompressed_filesize > (filesize-4)) )) - { - fp.close(f); - return(false); - } - } - else - { - fp.close(f); - return(false); + fp.close (f); + return (false); } + } + else + { + fp.close (f); + return (false); + } - // load section - song_data = new unsigned char[decompressed_filesize]; - unsigned char* compressed_song_data = new unsigned char[filesize-3]; + // load section + song_data = new unsigned char[decompressed_filesize]; + unsigned char *compressed_song_data = new unsigned char[filesize - 3]; - f->seek(4); - f->readString((char *)compressed_song_data, filesize - 4); - fp.close(f); + f->seek (4); + f->readString ((char *) compressed_song_data, filesize - 4); + fp.close (f); - // attempt to decompress the song data - // if unsuccessful, deallocate song_data[] on the spot, and return(false) - data_block source, destination; - source.size = filesize-4; - source.data = compressed_song_data; - destination.size = decompressed_filesize; - destination.data = song_data; - - if (!lzw_decompress(source,destination)) - { - delete[] compressed_song_data; compressed_song_data = 0; - delete[] song_data; song_data = 0; - return(false); - } + // attempt to decompress the song data + // if unsuccessful, deallocate song_data[] on the spot, and return(false) + data_block source, destination; + source.size = filesize - 4; + source.data = compressed_song_data; + destination.size = decompressed_filesize; + destination.data = song_data; - // deallocation section - delete[] compressed_song_data; compressed_song_data = 0; + if (!lzw_decompress (source, destination)) + { + delete[]compressed_song_data; + compressed_song_data = 0; + delete[]song_data; + song_data = 0; + return (false); + } - rewind(0); - return (true); + // deallocation section + delete[]compressed_song_data; + compressed_song_data = 0; + + rewind (0); + return (true); } -bool Cu6mPlayer::update() +bool +Cu6mPlayer::update () { - if (!driver_active) + if (!driver_active) + { + driver_active = true; + dec_clip (read_delay); + if (read_delay == 0) + { + command_loop (); + } + + // on all Adlib channels: freq slide/vibrato, mute factor slide + for (int i = 0; i < 9; i++) { - driver_active = true; - dec_clip(read_delay); - if (read_delay == 0) + if (channel_freq_signed_delta[i] != 0) + // frequency slide + mute factor slide + { + // freq slide + freq_slide (i); + + // mute factor slide + if (carrier_mf_signed_delta[i] != 0) { - command_loop(); + mf_slide (i); + } + } + else + // vibrato + mute factor slide + { + // vibrato + if ((vb_multiplier[i] != 0) && ((channel_freq[i].hi & 0x20) == 0x20)) + { + vibrato (i); } - // on all Adlib channels: freq slide/vibrato, mute factor slide - for (int i = 0; i < 9; i++) + // mute factor slide + if (carrier_mf_signed_delta[i] != 0) { - if (channel_freq_signed_delta[i]!=0) - // frequency slide + mute factor slide - { - // freq slide - freq_slide(i); - - // mute factor slide - if (carrier_mf_signed_delta[i]!=0) - { - mf_slide(i); - } - } - else - // vibrato + mute factor slide - { - // vibrato - if ((vb_multiplier[i]!=0) && ((channel_freq[i].hi & 0x20)==0x20)) - { - vibrato(i); - } - - // mute factor slide - if (carrier_mf_signed_delta[i]!=0) - { - mf_slide(i); - } - } + mf_slide (i); } - - driver_active = false; + } } - return !songend; + driver_active = false; + } + + return !songend; } -void Cu6mPlayer::rewind(int subsong) +void +Cu6mPlayer::rewind (int subsong) { - played_ticks = 0; - songend = false; - - // set the driver's internal variables - byte_pair freq_word = {0,0}; + played_ticks = 0; + songend = false; - driver_active = false; - song_pos = 0; - loop_position = 0; // position of the loop point - read_delay = 0; // delay (in timer ticks) before further song data is read - - for (int i = 0; i < 9; i++) - { - // frequency - channel_freq_signed_delta[i] = 0; - channel_freq[i] = freq_word; // Adlib freq settings for each channel + // set the driver's internal variables + byte_pair freq_word = { 0, 0 }; + + driver_active = false; + song_pos = 0; + loop_position = 0; // position of the loop point + read_delay = 0; // delay (in timer ticks) before further song data is read - // vibrato ("vb") - vb_current_value[i] = 0; - vb_double_amplitude[i] = 0; - vb_multiplier[i] = 0; - vb_direction_flag[i] = 0; + for (int i = 0; i < 9; i++) + { + // frequency + channel_freq_signed_delta[i] = 0; + channel_freq[i] = freq_word; // Adlib freq settings for each channel + + // vibrato ("vb") + vb_current_value[i] = 0; + vb_double_amplitude[i] = 0; + vb_multiplier[i] = 0; + vb_direction_flag[i] = 0; - // mute factor ("mf") == ~(volume) - carrier_mf[i] = 0; - carrier_mf_signed_delta[i] = 0; - carrier_mf_mod_delay_backup[i] = 0; - carrier_mf_mod_delay[i] = 0; - } + // mute factor ("mf") == ~(volume) + carrier_mf[i] = 0; + carrier_mf_signed_delta[i] = 0; + carrier_mf_mod_delay_backup[i] = 0; + carrier_mf_mod_delay[i] = 0; + } - while (!subsong_stack.empty()) // empty subsong stack - subsong_stack.pop(); + while (!subsong_stack.empty ()) // empty subsong stack + subsong_stack.pop (); - opl->init(); - out_adlib(1,32); // go to OPL2 mode + opl->init (); + out_adlib (1, 32); // go to OPL2 mode } -float Cu6mPlayer::getrefresh() +float +Cu6mPlayer::getrefresh () { - return ((float)60); // the Ultima 6 music driver expects to be called at 60 Hz + return ((float) 60); // the Ultima 6 music driver expects to be called at 60 Hz } @@ -202,108 +212,110 @@ // decompress from memory to memory -bool Cu6mPlayer::lzw_decompress(Cu6mPlayer::data_block source, Cu6mPlayer::data_block dest) +bool +Cu6mPlayer::lzw_decompress (Cu6mPlayer::data_block source, + Cu6mPlayer::data_block dest) { - bool end_marker_reached = false; - int codeword_size = 9; - long bits_read = 0; - int next_free_codeword = 0x102; - int dictionary_size = 0x200; - MyDict dictionary = MyDict(); - std::stack root_stack; + bool end_marker_reached = false; + int codeword_size = 9; + long bits_read = 0; + int next_free_codeword = 0x102; + int dictionary_size = 0x200; + MyDict dictionary = MyDict (); + std::stack < unsigned char >root_stack; + + long bytes_written = 0; + + int cW; + int pW; + unsigned char C; - long bytes_written = 0; - - int cW; - int pW; - unsigned char C; - - while (!end_marker_reached) + while (!end_marker_reached) + { + cW = get_next_codeword (bits_read, source.data, codeword_size); + switch (cW) { - cW = get_next_codeword(bits_read, source.data, codeword_size); - switch (cW) + // re-init the dictionary + case 0x100: + codeword_size = 9; + next_free_codeword = 0x102; + dictionary_size = 0x200; + dictionary.reset (); + cW = get_next_codeword (bits_read, source.data, codeword_size); + SAVE_OUTPUT_ROOT ((unsigned char) cW, dest, bytes_written); + break; + // end of compressed file has been reached + case 0x101: + end_marker_reached = true; + break; + // (cW <> 0x100) && (cW <> 0x101) + default: + if (cW < next_free_codeword) // codeword is already in the dictionary + { + // create the string associated with cW (on the stack) + get_string (cW, dictionary, root_stack); + C = root_stack.top (); + // output the string represented by cW + while (!root_stack.empty ()) { - // re-init the dictionary - case 0x100: - codeword_size = 9; - next_free_codeword = 0x102; - dictionary_size = 0x200; - dictionary.reset(); - cW = get_next_codeword(bits_read, source.data, codeword_size); - SAVE_OUTPUT_ROOT((unsigned char)cW, dest, bytes_written); - break; - // end of compressed file has been reached - case 0x101: - end_marker_reached = true; - break; - // (cW <> 0x100) && (cW <> 0x101) - default: - if (cW < next_free_codeword) // codeword is already in the dictionary - { - // create the string associated with cW (on the stack) - get_string(cW,dictionary,root_stack); - C = root_stack.top(); - // output the string represented by cW - while (!root_stack.empty()) - { - SAVE_OUTPUT_ROOT(root_stack.top(), dest, bytes_written); - root_stack.pop(); - } - // add pW+C to the dictionary - dictionary.add(C,pW); + SAVE_OUTPUT_ROOT (root_stack.top (), dest, bytes_written); + root_stack.pop (); + } + // add pW+C to the dictionary + dictionary.add (C, pW); - next_free_codeword++; - if (next_free_codeword >= dictionary_size) - { - if (codeword_size < max_codeword_length) - { - codeword_size += 1; - dictionary_size *= 2; - } - } - } - else // codeword is not yet defined - { - // create the string associated with pW (on the stack) - get_string(pW,dictionary,root_stack); - C = root_stack.top(); - // output the string represented by pW - while (!root_stack.empty()) - { - SAVE_OUTPUT_ROOT(root_stack.top(), dest, bytes_written); - root_stack.pop(); - } - // output the char C - SAVE_OUTPUT_ROOT(C, dest, bytes_written); + next_free_codeword++; + if (next_free_codeword >= dictionary_size) + { + if (codeword_size < max_codeword_length) + { + codeword_size += 1; + dictionary_size *= 2; + } + } + } + else // codeword is not yet defined + { + // create the string associated with pW (on the stack) + get_string (pW, dictionary, root_stack); + C = root_stack.top (); + // output the string represented by pW + while (!root_stack.empty ()) + { + SAVE_OUTPUT_ROOT (root_stack.top (), dest, bytes_written); + root_stack.pop (); + } + // output the char C + SAVE_OUTPUT_ROOT (C, dest, bytes_written); - // the new dictionary entry must correspond to cW - // if it doesn't, something is wrong with the lzw-compressed data. - if (cW != next_free_codeword) - { - /* printf("cW != next_free_codeword!\n"); - exit(-1); */ - return false; - } - // add pW+C to the dictionary - dictionary.add(C,pW); - - next_free_codeword++; - if (next_free_codeword >= dictionary_size) - { - if (codeword_size < max_codeword_length) - { - codeword_size += 1; - dictionary_size *= 2; - } - } - }; - break; + // the new dictionary entry must correspond to cW + // if it doesn't, something is wrong with the lzw-compressed data. + if (cW != next_free_codeword) + { + /* printf("cW != next_free_codeword!\n"); + exit(-1); */ + return false; } - // shift roles - the current cW becomes the new pW - pW = cW; + // add pW+C to the dictionary + dictionary.add (C, pW); + + next_free_codeword++; + if (next_free_codeword >= dictionary_size) + { + if (codeword_size < max_codeword_length) + { + codeword_size += 1; + dictionary_size *= 2; + } + } + }; + break; } + // shift roles - the current cW becomes the new pW + pW = cW; + } - return(true); // indicate successful decompression + return (true); // indicate successful decompression } @@ -313,66 +325,72 @@ // Read the next code word from the source buffer -int Cu6mPlayer::get_next_codeword (long& bits_read, unsigned char *source, int codeword_size) +int +Cu6mPlayer::get_next_codeword (long &bits_read, unsigned char *source, + int codeword_size) { - unsigned char b0,b1,b2; - int codeword; - - b0 = source[bits_read/8]; - b1 = source[bits_read/8+1]; - b2 = source[bits_read/8+2]; + unsigned char b0, b1, b2; + int codeword; + + b0 = source[bits_read / 8]; + b1 = source[bits_read / 8 + 1]; + b2 = source[bits_read / 8 + 2]; - codeword = ((b2 << 16) + (b1 << 8) + b0); - codeword = codeword >> (bits_read % 8); - switch (codeword_size) - { - case 0x9: - codeword = codeword & 0x1ff; - break; - case 0xa: - codeword = codeword & 0x3ff; - break; - case 0xb: - codeword = codeword & 0x7ff; - break; - case 0xc: - codeword = codeword & 0xfff; - break; - default: - codeword = -1; // indicates that an error has occurred - break; - } + codeword = ((b2 << 16) + (b1 << 8) + b0); + codeword = codeword >> (bits_read % 8); + switch (codeword_size) + { + case 0x9: + codeword = codeword & 0x1ff; + break; + case 0xa: + codeword = codeword & 0x3ff; + break; + case 0xb: + codeword = codeword & 0x7ff; + break; + case 0xc: + codeword = codeword & 0xfff; + break; + default: + codeword = -1; // indicates that an error has occurred + break; + } - bits_read += codeword_size; - return (codeword); + bits_read += codeword_size; + return (codeword); } // output a root to memory -void Cu6mPlayer::output_root(unsigned char root, unsigned char *destination, long& position) +void +Cu6mPlayer::output_root (unsigned char root, unsigned char *destination, + long &position) { - destination[position] = root; - position++; + destination[position] = root; + position++; } // output the string represented by a codeword -void Cu6mPlayer::get_string(int codeword, Cu6mPlayer::MyDict& dictionary, std::stack& root_stack) +void +Cu6mPlayer::get_string (int codeword, Cu6mPlayer::MyDict & dictionary, + std::stack < unsigned char >&root_stack) { - unsigned char root; - int current_codeword; + unsigned char root; + int current_codeword; - current_codeword = codeword; + current_codeword = codeword; - while (current_codeword > 0xff) - { - root = dictionary.get_root(current_codeword); - current_codeword = dictionary.get_codeword(current_codeword); - root_stack.push(root); - } + while (current_codeword > 0xff) + { + root = dictionary.get_root (current_codeword); + current_codeword = dictionary.get_codeword (current_codeword); + root_stack.push (root); + } - // push the root at the leaf - root_stack.push((unsigned char)current_codeword); + // push the root at the leaf + root_stack.push ((unsigned char) current_codeword); } @@ -386,47 +404,81 @@ // This function reads the song data and executes the embedded commands. -void Cu6mPlayer::command_loop() +void +Cu6mPlayer::command_loop () { - unsigned char command_byte; // current command byte - int command_nibble_hi; // command byte, bits 4-7 - int command_nibble_lo; // command byte, bite 0-3 - bool repeat_loop = true; // + unsigned char command_byte; // current command byte + int command_nibble_hi; // command byte, bits 4-7 + int command_nibble_lo; // command byte, bite 0-3 + bool repeat_loop = true; // - do + do + { + // extract low and high command nibbles + command_byte = read_song_byte (); // implicitly increments song_pos + command_nibble_hi = command_byte >> 4; + command_nibble_lo = command_byte & 0xf; + + switch (command_nibble_hi) { - // extract low and high command nibbles - command_byte = read_song_byte(); // implicitly increments song_pos - command_nibble_hi = command_byte >> 4; - command_nibble_lo = command_byte & 0xf; - - switch (command_nibble_hi) - { - case 0x0: command_0(command_nibble_lo); break; - case 0x1: command_1(command_nibble_lo); break; - case 0x2: command_2(command_nibble_lo); break; - case 0x3: command_3(command_nibble_lo); break; - case 0x4: command_4(command_nibble_lo); break; - case 0x5: command_5(command_nibble_lo); break; - case 0x6: command_6(command_nibble_lo); break; - case 0x7: command_7(command_nibble_lo); break; - case 0x8: - switch (command_nibble_lo) - { - case 1: command_81(); break; - case 2: command_82(); repeat_loop = false; break; - case 3: command_83(); break; - case 5: command_85(); break; - case 6: command_86(); break; - default: break; // maybe generate an error? - } - break; - case 0xE: command_E(); break; - case 0xF: command_F(); break; - default: break; // maybe generate an error? - } + case 0x0: + command_0 (command_nibble_lo); + break; + case 0x1: + command_1 (command_nibble_lo); + break; + case 0x2: + command_2 (command_nibble_lo); + break; + case 0x3: + command_3 (command_nibble_lo); + break; + case 0x4: + command_4 (command_nibble_lo); + break; + case 0x5: + command_5 (command_nibble_lo); + break; + case 0x6: + command_6 (command_nibble_lo); + break; + case 0x7: + command_7 (command_nibble_lo); + break; + case 0x8: + switch (command_nibble_lo) + { + case 1: + command_81 (); + break; + case 2: + command_82 (); + repeat_loop = false; + break; + case 3: + command_83 (); + break; + case 5: + command_85 (); + break; + case 6: + command_86 (); + break; + default: + break; // maybe generate an error? + } + break; + case 0xE: + command_E (); + break; + case 0xF: + command_F (); + break; + default: + break; // maybe generate an error? + } - } while (repeat_loop); + } while (repeat_loop); } @@ -439,14 +491,15 @@ // Format: 0c nn // c = channel, nn = packed Adlib frequency // ---------------------------------------- -void Cu6mPlayer::command_0(int channel) +void +Cu6mPlayer::command_0 (int channel) { - unsigned char freq_byte; - byte_pair freq_word; + unsigned char freq_byte; + byte_pair freq_word; - freq_byte = read_song_byte(); - freq_word = expand_freq_byte(freq_byte); - set_adlib_freq(channel,freq_word); + freq_byte = read_song_byte (); + freq_word = expand_freq_byte (freq_byte); + set_adlib_freq (channel, freq_word); } @@ -455,20 +508,21 @@ // Format: 1c nn // c = channel, nn = packed Adlib frequency // --------------------------------------------------- -void Cu6mPlayer::command_1(int channel) +void +Cu6mPlayer::command_1 (int channel) { - unsigned char freq_byte; - byte_pair freq_word; + unsigned char freq_byte; + byte_pair freq_word; - vb_direction_flag[channel] = 0; - vb_current_value[channel] = 0; - - freq_byte = read_song_byte(); - freq_word = expand_freq_byte(freq_byte); - set_adlib_freq(channel,freq_word); + vb_direction_flag[channel] = 0; + vb_current_value[channel] = 0; - freq_word.hi = freq_word.hi | 0x20; // note on - set_adlib_freq(channel,freq_word); + freq_byte = read_song_byte (); + freq_word = expand_freq_byte (freq_byte); + set_adlib_freq (channel, freq_word); + + freq_word.hi = freq_word.hi | 0x20; // note on + set_adlib_freq (channel, freq_word); } @@ -477,15 +531,16 @@ // Format: 2c nn // c = channel, nn = packed Adlib frequency // ---------------------------------------- -void Cu6mPlayer::command_2(int channel) +void +Cu6mPlayer::command_2 (int channel) { - unsigned char freq_byte; - byte_pair freq_word; - - freq_byte = read_song_byte(); - freq_word = expand_freq_byte(freq_byte); - freq_word.hi = freq_word.hi | 0x20; // note on - set_adlib_freq(channel,freq_word); + unsigned char freq_byte; + byte_pair freq_word; + + freq_byte = read_song_byte (); + freq_word = expand_freq_byte (freq_byte); + freq_word.hi = freq_word.hi | 0x20; // note on + set_adlib_freq (channel, freq_word); } @@ -494,13 +549,14 @@ // Format: 3c nn // c = channel, nn = mute factor // -------------------------------------- -void Cu6mPlayer::command_3(int channel) +void +Cu6mPlayer::command_3 (int channel) { - unsigned char mf_byte; + unsigned char mf_byte; - carrier_mf_signed_delta[channel] = 0; - mf_byte = read_song_byte(); - set_carrier_mf(channel,mf_byte); + carrier_mf_signed_delta[channel] = 0; + mf_byte = read_song_byte (); + set_carrier_mf (channel, mf_byte); } @@ -509,12 +565,13 @@ // Format: 4c nn // c = channel, nn = mute factor // ---------------------------------------- -void Cu6mPlayer::command_4(int channel) +void +Cu6mPlayer::command_4 (int channel) { - unsigned char mf_byte; + unsigned char mf_byte; - mf_byte = read_song_byte(); - set_modulator_mf(channel,mf_byte); + mf_byte = read_song_byte (); + set_modulator_mf (channel, mf_byte); } @@ -523,9 +580,10 @@ // Format: 5c nn // c = channel, nn = signed channel pitch delta // -------------------------------------------- -void Cu6mPlayer::command_5(int channel) +void +Cu6mPlayer::command_5 (int channel) { - channel_freq_signed_delta[channel] = read_signed_song_byte(); + channel_freq_signed_delta[channel] = read_signed_song_byte (); } @@ -536,13 +594,14 @@ // m = vibrato double amplitude // n = vibrato multiplier // -------------------------------------------- -void Cu6mPlayer::command_6(int channel) +void +Cu6mPlayer::command_6 (int channel) { - unsigned char vb_parameters; + unsigned char vb_parameters; - vb_parameters = read_song_byte(); - vb_double_amplitude[channel] = vb_parameters >> 4; // high nibble - vb_multiplier[channel] = vb_parameters & 0xF; // low nibble + vb_parameters = read_song_byte (); + vb_double_amplitude[channel] = vb_parameters >> 4; // high nibble + vb_multiplier[channel] = vb_parameters & 0xF; // low nibble } @@ -551,20 +610,31 @@ // Format: 7c nn // c = channel, nn = instrument number // ---------------------------------------- -void Cu6mPlayer::command_7(int channel) +void +Cu6mPlayer::command_7 (int channel) { - int instrument_offset = instrument_offsets[read_song_byte()]; - out_adlib_opcell(channel, false, 0x20, *(song_data + instrument_offset+0)); - out_adlib_opcell(channel, false, 0x40, *(song_data + instrument_offset+1)); - out_adlib_opcell(channel, false, 0x60, *(song_data + instrument_offset+2)); - out_adlib_opcell(channel, false, 0x80, *(song_data + instrument_offset+3)); - out_adlib_opcell(channel, false, 0xE0, *(song_data + instrument_offset+4)); - out_adlib_opcell(channel, true, 0x20, *(song_data + instrument_offset+5)); - out_adlib_opcell(channel, true, 0x40, *(song_data + instrument_offset+6)); - out_adlib_opcell(channel, true, 0x60, *(song_data + instrument_offset+7)); - out_adlib_opcell(channel, true, 0x80, *(song_data + instrument_offset+8)); - out_adlib_opcell(channel, true, 0xE0, *(song_data + instrument_offset+9)); - out_adlib(0xC0+channel, *(song_data + instrument_offset+10)); + int instrument_offset = instrument_offsets[read_song_byte ()]; + out_adlib_opcell (channel, false, 0x20, + *(song_data + instrument_offset + 0)); + out_adlib_opcell (channel, false, 0x40, + *(song_data + instrument_offset + 1)); + out_adlib_opcell (channel, false, 0x60, + *(song_data + instrument_offset + 2)); + out_adlib_opcell (channel, false, 0x80, + *(song_data + instrument_offset + 3)); + out_adlib_opcell (channel, false, 0xE0, + *(song_data + instrument_offset + 4)); + out_adlib_opcell (channel, true, 0x20, + *(song_data + instrument_offset + 5)); + out_adlib_opcell (channel, true, 0x40, + *(song_data + instrument_offset + 6)); + out_adlib_opcell (channel, true, 0x60, + *(song_data + instrument_offset + 7)); + out_adlib_opcell (channel, true, 0x80, + *(song_data + instrument_offset + 8)); + out_adlib_opcell (channel, true, 0xE0, + *(song_data + instrument_offset + 9)); + out_adlib (0xC0 + channel, *(song_data + instrument_offset + 10)); } @@ -575,16 +645,18 @@ // aa == subsong offset (low byte) // bb == subsong offset (high byte) // ------------------------------------------- -void Cu6mPlayer::command_81() +void +Cu6mPlayer::command_81 () { - subsong_info new_ss_info; - - new_ss_info.subsong_repetitions = read_song_byte(); - new_ss_info.subsong_start = read_song_byte(); new_ss_info.subsong_start += read_song_byte() << 8; - new_ss_info.continue_pos = song_pos; + subsong_info new_ss_info; - subsong_stack.push(new_ss_info); - song_pos = new_ss_info.subsong_start; + new_ss_info.subsong_repetitions = read_song_byte (); + new_ss_info.subsong_start = read_song_byte (); + new_ss_info.subsong_start += read_song_byte () << 8; + new_ss_info.continue_pos = song_pos; + + subsong_stack.push (new_ss_info); + song_pos = new_ss_info.subsong_start; } @@ -593,9 +665,10 @@ // Format: 82 nn // nn == delay (in timer ticks) until further data will be read // ------------------------------------------------------------ -void Cu6mPlayer::command_82() +void +Cu6mPlayer::command_82 () { - read_delay = read_song_byte(); + read_delay = read_song_byte (); } @@ -604,11 +677,12 @@ // Format: 83 nn <11 bytes> // nn == instrument number // ----------------------------- -void Cu6mPlayer::command_83() +void +Cu6mPlayer::command_83 () { - unsigned char instrument_number = read_song_byte(); - instrument_offsets[instrument_number] = song_pos; - song_pos += 11; + unsigned char instrument_number = read_song_byte (); + instrument_offsets[instrument_number] = song_pos; + song_pos += 11; } @@ -618,14 +692,15 @@ // c == channel // n == slide delay // ---------------------------------------------- -void Cu6mPlayer::command_85() +void +Cu6mPlayer::command_85 () { - unsigned char data_byte = read_song_byte(); - int channel = data_byte >> 4; // high nibble - unsigned char slide_delay = data_byte & 0xF; // low nibble - carrier_mf_signed_delta[channel] = +1; - carrier_mf_mod_delay[channel] = slide_delay + 1; - carrier_mf_mod_delay_backup[channel] = slide_delay + 1; + unsigned char data_byte = read_song_byte (); + int channel = data_byte >> 4; // high nibble + unsigned char slide_delay = data_byte & 0xF; // low nibble + carrier_mf_signed_delta[channel] = +1; + carrier_mf_mod_delay[channel] = slide_delay + 1; + carrier_mf_mod_delay_backup[channel] = slide_delay + 1; } @@ -635,14 +710,15 @@ // c == channel // n == slide speed // ------------------------------------------------ -void Cu6mPlayer::command_86() +void +Cu6mPlayer::command_86 () { - unsigned char data_byte = read_song_byte(); - int channel = data_byte >> 4; // high nibble - unsigned char slide_delay = data_byte & 0xF; // low nibble - carrier_mf_signed_delta[channel] = -1; - carrier_mf_mod_delay[channel] = slide_delay + 1; - carrier_mf_mod_delay_backup[channel] = slide_delay + 1; + unsigned char data_byte = read_song_byte (); + int channel = data_byte >> 4; // high nibble + unsigned char slide_delay = data_byte & 0xF; // low nibble + carrier_mf_signed_delta[channel] = -1; + carrier_mf_mod_delay[channel] = slide_delay + 1; + carrier_mf_mod_delay_backup[channel] = slide_delay + 1; } @@ -650,9 +726,10 @@ // Set loop point // Format: E? // -------------- -void Cu6mPlayer::command_E() +void +Cu6mPlayer::command_E () { - loop_position = song_pos; + loop_position = song_pos; } @@ -660,28 +737,29 @@ // Return from current subsong // Format: F? // --------------------------- -void Cu6mPlayer::command_F() +void +Cu6mPlayer::command_F () { - if (!subsong_stack.empty()) + if (!subsong_stack.empty ()) + { + subsong_info temp = subsong_stack.top (); + subsong_stack.pop (); + temp.subsong_repetitions--; + if (temp.subsong_repetitions == 0) { - subsong_info temp = subsong_stack.top(); - subsong_stack.pop(); - temp.subsong_repetitions--; - if (temp.subsong_repetitions==0) - { - song_pos = temp.continue_pos; - } - else - { - song_pos = temp.subsong_start; - subsong_stack.push(temp); - } + song_pos = temp.continue_pos; } else { - song_pos = loop_position; - songend = true; + song_pos = temp.subsong_start; + subsong_stack.push (temp); } + } + else + { + song_pos = loop_position; + songend = true; + } } @@ -690,186 +768,234 @@ // -------------------- // This function decrements its argument, without allowing it to become negative. -void Cu6mPlayer::dec_clip(int& param) +void +Cu6mPlayer::dec_clip (int ¶m) { - param--; - if (param < 0) { param = 0; } + param--; + if (param < 0) + { + param = 0; + } } // Returns the byte at the current song position. // Side effect: increments song_pos. -unsigned char Cu6mPlayer::read_song_byte() +unsigned char +Cu6mPlayer::read_song_byte () { - unsigned char song_byte; - song_byte = song_data[song_pos]; - song_pos++; - return(song_byte); + unsigned char song_byte; + song_byte = song_data[song_pos]; + song_pos++; + return (song_byte); } // Same as read_song_byte(), except that it returns a signed byte -signed char Cu6mPlayer::read_signed_song_byte() +signed char +Cu6mPlayer::read_signed_song_byte () { - unsigned char song_byte; - int signed_value; - song_byte = *(song_data + song_pos); - song_pos++; - if (song_byte <= 127) - { - signed_value = song_byte; - } - else - { - signed_value = (int)song_byte - 0x100; - } - return((signed char)signed_value); + unsigned char song_byte; + int signed_value; + song_byte = *(song_data + song_pos); + song_pos++; + if (song_byte <= 127) + { + signed_value = song_byte; + } + else + { + signed_value = (int) song_byte - 0x100; + } + return ((signed char) signed_value); } -Cu6mPlayer::byte_pair Cu6mPlayer::expand_freq_byte(unsigned char freq_byte) +Cu6mPlayer::byte_pair Cu6mPlayer::expand_freq_byte (unsigned char freq_byte) { - const byte_pair freq_table[24] = - { - {0x00,0x00}, {0x58,0x01}, {0x82,0x01}, {0xB0,0x01}, - {0xCC,0x01}, {0x03,0x02}, {0x41,0x02}, {0x86,0x02}, - {0x00,0x00}, {0x6A,0x01}, {0x96,0x01}, {0xC7,0x01}, - {0xE4,0x01}, {0x1E,0x02}, {0x5F,0x02}, {0xA8,0x02}, - {0x00,0x00}, {0x47,0x01}, {0x6E,0x01}, {0x9A,0x01}, - {0xB5,0x01}, {0xE9,0x01}, {0x24,0x02}, {0x66,0x02} - }; + const byte_pair + freq_table[24] = { + {0x00, 0x00}, {0x58, 0x01}, {0x82, 0x01}, {0xB0, 0x01}, + {0xCC, 0x01}, {0x03, 0x02}, {0x41, 0x02}, {0x86, 0x02}, + {0x00, 0x00}, {0x6A, 0x01}, {0x96, 0x01}, {0xC7, 0x01}, + {0xE4, 0x01}, {0x1E, 0x02}, {0x5F, 0x02}, {0xA8, 0x02}, + {0x00, 0x00}, {0x47, 0x01}, {0x6E, 0x01}, {0x9A, 0x01}, + {0xB5, 0x01}, {0xE9, 0x01}, {0x24, 0x02}, {0x66, 0x02} + }; - int packed_freq; - int octave; - byte_pair freq_word; + int + packed_freq; + int + octave; + byte_pair + freq_word; - packed_freq = freq_byte & 0x1F; - octave = freq_byte >> 5; + packed_freq = freq_byte & 0x1F; + octave = freq_byte >> 5; - // range check (not present in the original U6 music driver) - if (packed_freq >= 24) { packed_freq = 0; } + // range check (not present in the original U6 music driver) + if (packed_freq >= 24) + { + packed_freq = 0; + } - freq_word.hi = freq_table[packed_freq].hi + (octave << 2); - freq_word.lo = freq_table[packed_freq].lo; + freq_word.hi = freq_table[packed_freq].hi + (octave << 2); + freq_word.lo = freq_table[packed_freq].lo; - return(freq_word); + return (freq_word); } -void Cu6mPlayer::set_adlib_freq(int channel,Cu6mPlayer::byte_pair freq_word) +void +Cu6mPlayer::set_adlib_freq (int channel, Cu6mPlayer::byte_pair freq_word) { - out_adlib(0xA0+channel,freq_word.lo); - out_adlib(0xB0+channel,freq_word.hi); - // update the Adlib register backups - channel_freq[channel] = freq_word; + out_adlib (0xA0 + channel, freq_word.lo); + out_adlib (0xB0 + channel, freq_word.hi); + // update the Adlib register backups + channel_freq[channel] = freq_word; } // this function sets the Adlib frequency, but does not update the register backups -void Cu6mPlayer::set_adlib_freq_no_update(int channel,Cu6mPlayer::byte_pair freq_word) +void +Cu6mPlayer::set_adlib_freq_no_update (int channel, + Cu6mPlayer::byte_pair freq_word) { - out_adlib(0xA0+channel,freq_word.lo); - out_adlib(0xB0+channel,freq_word.hi); + out_adlib (0xA0 + channel, freq_word.lo); + out_adlib (0xB0 + channel, freq_word.hi); } -void Cu6mPlayer::set_carrier_mf(int channel,unsigned char mute_factor) +void +Cu6mPlayer::set_carrier_mf (int channel, unsigned char mute_factor) { - out_adlib_opcell(channel,true,0x40,mute_factor); - carrier_mf[channel] = mute_factor; + out_adlib_opcell (channel, true, 0x40, mute_factor); + carrier_mf[channel] = mute_factor; } -void Cu6mPlayer::set_modulator_mf(int channel,unsigned char mute_factor) +void +Cu6mPlayer::set_modulator_mf (int channel, unsigned char mute_factor) { - out_adlib_opcell(channel,false,0x40,mute_factor); + out_adlib_opcell (channel, false, 0x40, mute_factor); } -void Cu6mPlayer::freq_slide(int channel) +void +Cu6mPlayer::freq_slide (int channel) { - byte_pair freq = channel_freq[channel]; + byte_pair freq = channel_freq[channel]; - long freq_word = freq.lo + (freq.hi << 8) + channel_freq_signed_delta[channel]; - if (freq_word < 0) { freq_word += 0x10000; } - if (freq_word > 0xFFFF) { freq_word -= 0x10000; } + long freq_word = + freq.lo + (freq.hi << 8) + channel_freq_signed_delta[channel]; + if (freq_word < 0) + { + freq_word += 0x10000; + } + if (freq_word > 0xFFFF) + { + freq_word -= 0x10000; + } - freq.lo = freq_word & 0xFF; - freq.hi = (freq_word >> 8) & 0xFF; - set_adlib_freq(channel,freq); + freq.lo = freq_word & 0xFF; + freq.hi = (freq_word >> 8) & 0xFF; + set_adlib_freq (channel, freq); } -void Cu6mPlayer::vibrato(int channel) +void +Cu6mPlayer::vibrato (int channel) { - byte_pair freq; + byte_pair freq; - if (vb_current_value[channel] >= vb_double_amplitude[channel]) - { vb_direction_flag[channel] = 1; } - else if (vb_current_value[channel] <= 0) - { vb_direction_flag[channel] = 0; } + if (vb_current_value[channel] >= vb_double_amplitude[channel]) + { + vb_direction_flag[channel] = 1; + } + else if (vb_current_value[channel] <= 0) + { + vb_direction_flag[channel] = 0; + } - if (vb_direction_flag[channel]==0) - { vb_current_value[channel]++; } - else - { vb_current_value[channel]--; } + if (vb_direction_flag[channel] == 0) + { + vb_current_value[channel]++; + } + else + { + vb_current_value[channel]--; + } - long freq_word = channel_freq[channel].lo + (channel_freq[channel].hi << 8); - freq_word += (vb_current_value[channel] - (vb_double_amplitude[channel] >> 1)) - * vb_multiplier[channel]; - if (freq_word < 0) { freq_word += 0x10000; } - if (freq_word > 0xFFFF) { freq_word -= 0x10000; } + long freq_word = channel_freq[channel].lo + (channel_freq[channel].hi << 8); + freq_word += + (vb_current_value[channel] - + (vb_double_amplitude[channel] >> 1)) * vb_multiplier[channel]; + if (freq_word < 0) + { + freq_word += 0x10000; + } + if (freq_word > 0xFFFF) + { + freq_word -= 0x10000; + } - freq.lo = freq_word & 0xFF; - freq.hi = (freq_word >> 8) & 0xFF; - set_adlib_freq_no_update(channel,freq); + freq.lo = freq_word & 0xFF; + freq.hi = (freq_word >> 8) & 0xFF; + set_adlib_freq_no_update (channel, freq); } -void Cu6mPlayer::mf_slide(int channel) +void +Cu6mPlayer::mf_slide (int channel) { - carrier_mf_mod_delay[channel]--; - if (carrier_mf_mod_delay[channel]==0) + carrier_mf_mod_delay[channel]--; + if (carrier_mf_mod_delay[channel] == 0) + { + carrier_mf_mod_delay[channel] = carrier_mf_mod_delay_backup[channel]; + int current_mf = carrier_mf[channel] + carrier_mf_signed_delta[channel]; + if (current_mf > 0x3F) { - carrier_mf_mod_delay[channel] = carrier_mf_mod_delay_backup[channel]; - int current_mf = carrier_mf[channel] + carrier_mf_signed_delta[channel]; - if (current_mf > 0x3F) - { - current_mf = 0x3F; - carrier_mf_signed_delta[channel] = 0; - } - else if (current_mf < 0) - { - current_mf = 0; - carrier_mf_signed_delta[channel] = 0; - } + current_mf = 0x3F; + carrier_mf_signed_delta[channel] = 0; + } + else if (current_mf < 0) + { + current_mf = 0; + carrier_mf_signed_delta[channel] = 0; + } - set_carrier_mf(channel,(unsigned char)current_mf); - } + set_carrier_mf (channel, (unsigned char) current_mf); + } } -void Cu6mPlayer::out_adlib(unsigned char adlib_register, unsigned char adlib_data) +void +Cu6mPlayer::out_adlib (unsigned char adlib_register, unsigned char adlib_data) { - opl->write(adlib_register,adlib_data); + opl->write (adlib_register, adlib_data); } -void Cu6mPlayer::out_adlib_opcell(int channel, bool carrier, unsigned char adlib_register, unsigned char out_byte) +void +Cu6mPlayer::out_adlib_opcell (int channel, bool carrier, + unsigned char adlib_register, + unsigned char out_byte) { - const unsigned char adlib_channel_to_carrier_offset[9] = - {0x03,0x04,0x05,0x0B,0x0C,0x0D,0x13,0x14,0x15}; - const unsigned char adlib_channel_to_modulator_offset[9] = - {0x00,0x01,0x02,0x08,0x09,0x0A,0x10,0x11,0x12}; + const unsigned char adlib_channel_to_carrier_offset[9] = + { 0x03, 0x04, 0x05, 0x0B, 0x0C, 0x0D, 0x13, 0x14, 0x15 }; + const unsigned char adlib_channel_to_modulator_offset[9] = + { 0x00, 0x01, 0x02, 0x08, 0x09, 0x0A, 0x10, 0x11, 0x12 }; - if (carrier) - { - out_adlib(adlib_register+adlib_channel_to_carrier_offset[channel],out_byte); - } - else - { - out_adlib(adlib_register+adlib_channel_to_modulator_offset[channel],out_byte); - } + if (carrier) + { + out_adlib (adlib_register + adlib_channel_to_carrier_offset[channel], + out_byte); + } + else + { + out_adlib (adlib_register + adlib_channel_to_modulator_offset[channel], + out_byte); + } } @@ -882,54 +1008,58 @@ // ============================================================================================ -Cu6mPlayer::MyDict::MyDict() +Cu6mPlayer::MyDict::MyDict () { - dict_size = default_dict_size; - dictionary = new dict_entry[dict_size-0x100]; // don't allocate space for the roots - contains = 0x102; + dict_size = default_dict_size; + dictionary = new dict_entry[dict_size - 0x100]; // don't allocate space for the roots + contains = 0x102; } -Cu6mPlayer::MyDict::MyDict(int max_size) +Cu6mPlayer::MyDict::MyDict (int max_size) { - dict_size = max_size; - dictionary = new dict_entry[dict_size-0x100]; // don't allocate space for the roots - contains = 0x102; + dict_size = max_size; + dictionary = new dict_entry[dict_size - 0x100]; // don't allocate space for the roots + contains = 0x102; } -Cu6mPlayer::MyDict::~MyDict() +Cu6mPlayer::MyDict::~MyDict () { - delete [] dictionary; dictionary = 0; + delete[]dictionary; + dictionary = 0; } // re-initializes the dictionary -void Cu6mPlayer::MyDict::reset() +void +Cu6mPlayer::MyDict::reset () { - contains = 0x102; + contains = 0x102; } // Note: If the dictionary is already full, this function does nothing. -void Cu6mPlayer::MyDict::add(unsigned char root, int codeword) +void +Cu6mPlayer::MyDict::add (unsigned char root, int codeword) { - if (contains < dict_size) - { - dictionary[contains-0x100].root = root; - dictionary[contains-0x100].codeword = codeword; - contains++; - } + if (contains < dict_size) + { + dictionary[contains - 0x100].root = root; + dictionary[contains - 0x100].codeword = codeword; + contains++; + } } -unsigned char Cu6mPlayer::MyDict::get_root(int codeword) +unsigned char +Cu6mPlayer::MyDict::get_root (int codeword) { - return (dictionary[codeword-0x100].root); + return (dictionary[codeword - 0x100].root); } -int Cu6mPlayer::MyDict::get_codeword(int codeword) +int +Cu6mPlayer::MyDict::get_codeword (int codeword) { - return (dictionary[codeword-0x100].codeword); + return (dictionary[codeword - 0x100].codeword); } - diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/xad.cxx --- a/src/adplug/core/xad.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/xad.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -24,51 +24,63 @@ /* -------- Public Methods -------------------------------- */ -CxadPlayer::CxadPlayer(Copl * newopl) : CPlayer(newopl) +CxadPlayer::CxadPlayer (Copl * newopl):CPlayer (newopl) { tune = 0; } -CxadPlayer::~CxadPlayer() +CxadPlayer::~CxadPlayer () { - if (tune) { delete [] tune; tune = 0; } + if (tune) + { + delete[]tune; + tune = 0; + } } -bool CxadPlayer::load(VFSFile *fd, const CFileProvider &fp) +bool +CxadPlayer::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); if(!f) return false; + binistream *f = fp.open (fd); + if (!f) + return false; bool ret = false; // load header - xad.id = f->readInt(4); - f->readString(xad.title, 36); - f->readString(xad.author, 36); - xad.fmt = f->readInt(2); - xad.speed = f->readInt(1); - xad.reserved_a = f->readInt(1); + xad.id = f->readInt (4); + f->readString (xad.title, 36); + f->readString (xad.author, 36); + xad.fmt = f->readInt (2); + xad.speed = f->readInt (1); + xad.reserved_a = f->readInt (1); // 'XAD!' - signed ? - if(xad.id != 0x21444158) { fp.close(f); return false; } + if (xad.id != 0x21444158) + { + fp.close (f); + return false; + } // get file size - tune_size = fp.filesize(f) - 80; + tune_size = fp.filesize (f) - 80; // load() - tune = new unsigned char [tune_size]; - f->readString((char *)tune, tune_size); - fp.close(f); + tune = new unsigned char[tune_size]; + f->readString ((char *) tune, tune_size); + fp.close (f); - ret = xadplayer_load(); + ret = xadplayer_load (); if (ret) - rewind(0); + rewind (0); return ret; } -void CxadPlayer::rewind(int subsong) +void +CxadPlayer::rewind (int subsong) { - opl->init(); + opl->init (); plr.speed = xad.speed; plr.speed_counter = 1; @@ -76,14 +88,15 @@ plr.looping = 0; // rewind() - xadplayer_rewind(subsong); + xadplayer_rewind (subsong); #ifdef DEBUG - AdPlug_LogWrite("-----------\n"); + AdPlug_LogWrite ("-----------\n"); #endif } -bool CxadPlayer::update() +bool +CxadPlayer::update () { if (--plr.speed_counter) goto update_end; @@ -91,49 +104,52 @@ plr.speed_counter = plr.speed; // update() - xadplayer_update(); + xadplayer_update (); update_end: return (plr.playing && (!plr.looping)); } -float CxadPlayer::getrefresh() +float +CxadPlayer::getrefresh () { - return xadplayer_getrefresh(); + return xadplayer_getrefresh (); } -std::string CxadPlayer::gettype() +std::string CxadPlayer::gettype () { - return xadplayer_gettype(); + return xadplayer_gettype (); } -std::string CxadPlayer::gettitle() +std::string CxadPlayer::gettitle () { - return xadplayer_gettitle(); + return xadplayer_gettitle (); +} + +std::string CxadPlayer::getauthor () +{ + return xadplayer_getauthor (); } -std::string CxadPlayer::getauthor() +std::string CxadPlayer::getinstrument (unsigned int i) { - return xadplayer_getauthor(); + return xadplayer_getinstrument (i); } -std::string CxadPlayer::getinstrument(unsigned int i) +unsigned int +CxadPlayer::getinstruments () { - return xadplayer_getinstrument(i); -} - -unsigned int CxadPlayer::getinstruments() -{ - return xadplayer_getinstruments(); + return xadplayer_getinstruments (); } /* -------- Protected Methods ------------------------------- */ -void CxadPlayer::opl_write(int reg, int val) +void +CxadPlayer::opl_write (int reg, int val) { adlib[reg] = val; #ifdef DEBUG - AdPlug_LogWrite("[ %02X ] = %02X\n",reg,val); + AdPlug_LogWrite ("[ %02X ] = %02X\n", reg, val); #endif - opl->write(reg,val); + opl->write (reg, val); } diff -r d7a6fd179cd2 -r 4709ce4e209e src/adplug/core/xsm.cxx --- a/src/adplug/core/xsm.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/xsm.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -23,72 +23,87 @@ #include "xsm.h" -CxsmPlayer::CxsmPlayer(Copl *newopl) - : CPlayer(newopl), music(0) +CxsmPlayer::CxsmPlayer (Copl * newopl):CPlayer (newopl), music (0) { } -CxsmPlayer::~CxsmPlayer() +CxsmPlayer::~CxsmPlayer () { - if(music) { delete [] music; music = 0; } + if (music) + { + delete[]music; + music = 0; + } } -bool CxsmPlayer::load(VFSFile *fd, const CFileProvider &fp) +bool +CxsmPlayer::load (VFSFile * fd, const CFileProvider & fp) { - binistream *f = fp.open(fd); if(!f) return false; - char id[6]; - int i, j; + binistream *f = fp.open (fd); + if (!f) + return false; + char id[6]; + int i, j; // check if header matches - f->readString(id, 6); songlen = f->readInt(2); - if(strncmp(id, "ofTAZ!", 6) || songlen > 3200) { fp.close(f); return false; } + f->readString (id, 6); + songlen = f->readInt (2); + if (strncmp (id, "ofTAZ!", 6) || songlen > 3200) + { + fp.close (f); + return false; + } // read and set instruments - for(i = 0; i < 9; i++) { - opl->write(0x20 + op_table[i], f->readInt(1)); - opl->write(0x23 + op_table[i], f->readInt(1)); - opl->write(0x40 + op_table[i], f->readInt(1)); - opl->write(0x43 + op_table[i], f->readInt(1)); - opl->write(0x60 + op_table[i], f->readInt(1)); - opl->write(0x63 + op_table[i], f->readInt(1)); - opl->write(0x80 + op_table[i], f->readInt(1)); - opl->write(0x83 + op_table[i], f->readInt(1)); - opl->write(0xe0 + op_table[i], f->readInt(1)); - opl->write(0xe3 + op_table[i], f->readInt(1)); - opl->write(0xc0 + op_table[i], f->readInt(1)); - f->ignore(5); + for (i = 0; i < 9; i++) + { + opl->write (0x20 + op_table[i], f->readInt (1)); + opl->write (0x23 + op_table[i], f->readInt (1)); + opl->write (0x40 + op_table[i], f->readInt (1)); + opl->write (0x43 + op_table[i], f->readInt (1)); + opl->write (0x60 + op_table[i], f->readInt (1)); + opl->write (0x63 + op_table[i], f->readInt (1)); + opl->write (0x80 + op_table[i], f->readInt (1)); + opl->write (0x83 + op_table[i], f->readInt (1)); + opl->write (0xe0 + op_table[i], f->readInt (1)); + opl->write (0xe3 + op_table[i], f->readInt (1)); + opl->write (0xc0 + op_table[i], f->readInt (1)); + f->ignore (5); } // read song data - music = new char [songlen * 9]; - for(i = 0; i < 9; i++) - for(j = 0; j < songlen; j++) - music[j * 9 + i] = f->readInt(1); + music = new char[songlen * 9]; + for (i = 0; i < 9; i++) + for (j = 0; j < songlen; j++) + music[j * 9 + i] = f->readInt (1); // success - fp.close(f); - rewind(0); + fp.close (f); + rewind (0); return true; } -bool CxsmPlayer::update() +bool +CxsmPlayer::update () { int c; - if(notenum >= songlen) { + if (notenum >= songlen) + { songend = true; notenum = last = 0; } - for(c = 0; c < 9; c++) - if(music[notenum * 9 + c] != music[last * 9 + c]) - opl->write(0xb0 + c, 0); + for (c = 0; c < 9; c++) + if (music[notenum * 9 + c] != music[last * 9 + c]) + opl->write (0xb0 + c, 0); - for(c = 0; c < 9; c++) { - if(music[notenum * 9 + c]) - play_note(c, music[notenum * 9 + c] % 12, music[notenum * 9 + c] / 12); + for (c = 0; c < 9; c++) + { + if (music[notenum * 9 + c]) + play_note (c, music[notenum * 9 + c] % 12, music[notenum * 9 + c] / 12); else - play_note(c, 0, 0); + play_note (c, 0, 0); } last = notenum; @@ -96,22 +111,26 @@ return !songend; } -void CxsmPlayer::rewind(int subsong) +void +CxsmPlayer::rewind (int subsong) { notenum = last = 0; songend = false; } -float CxsmPlayer::getrefresh() +float +CxsmPlayer::getrefresh () { return 5.0f; } -void CxsmPlayer::play_note(int c, int note, int octv) +void +CxsmPlayer::play_note (int c, int note, int octv) { int freq = note_table[note]; - if(!note && !octv) freq = 0; - opl->write(0xa0 + c, freq & 0xff); - opl->write(0xb0 + c, (freq / 0xff) | 32 | (octv * 4)); + if (!note && !octv) + freq = 0; + opl->write (0xa0 + c, freq & 0xff); + opl->write (0xb0 + c, (freq / 0xff) | 32 | (octv * 4)); }