Mercurial > hg > xmms-sid
changeset 103:fe83646e6baa
Changed plrFillBuffer()-functions to return actual number of samples computed.
Rudimentary changes for return of fileinfo window.
Minor tweaks for STILdb.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sun, 11 Jan 2004 17:42:00 +0000 |
parents | cf3bbfdb90ac |
children | 7f59f4bfcd6a |
files | src/xmms-sid.c src/xmms-sid.h src/xs_genui.c src/xs_genui.h src/xs_init.c src/xs_sidplay1.cc src/xs_sidplay1.h src/xs_sidplay2.cc src/xs_sidplay2.h src/xs_stil.c |
diffstat | 10 files changed, 238 insertions(+), 129 deletions(-) [+] |
line wrap: on
line diff
--- a/src/xmms-sid.c Sun Jan 11 16:48:05 2004 +0000 +++ b/src/xmms-sid.c Sun Jan 11 17:42:00 2004 +0000 @@ -32,9 +32,11 @@ #include "xs_support.h" #include "xs_config.h" #include "xs_length.h" +#include "xs_stil.h" #include "xs_interface.h" #include "xs_glade.h" + /* * Include player engines */ @@ -58,7 +60,7 @@ gboolean (*plrInit)(t_xs_status *); void (*plrClose)(t_xs_status *); gboolean (*plrInitSong)(t_xs_status *); - gboolean (*plrFillBuffer)(t_xs_status *, gchar *, gint); + guint (*plrFillBuffer)(t_xs_status *, gchar *, guint); gboolean (*plrLoadSID)(t_xs_status *, gchar *); void (*plrDeleteSID)(t_xs_status *); t_xs_tune* (*plrGetSIDInfo)(gchar *); @@ -104,7 +106,7 @@ /* * Global variables */ -static GtkWidget *xs_ctrlwin = NULL; +static GtkWidget *xs_fileinfowin = NULL; static pthread_t xs_decode_thread; static pthread_mutex_t xs_mutex = PTHREAD_MUTEX_INITIALIZER; struct t_xs_cfg xs_cfg; @@ -194,7 +196,6 @@ xs_player->plrDeleteSID(&xs_status); xs_player->plrClose(&xs_status); - /* Free allocated memory */ xs_songlen_close(); xs_stil_close(); @@ -251,6 +252,7 @@ t_xs_status myStatus; t_xs_tune *myTune; gboolean audioOpen, doPlay; + guint audioGot; gint audioFreq, audioChannels, songLength, audioFmt; gchar audioBuffer[XS_BUFSIZE]; @@ -279,11 +281,11 @@ { pthread_mutex_lock(&xs_mutex); myStatus.currSong = xs_status.currSong; - songLength = myTune->subTunes[myStatus.currSong - 1].tuneLength; pthread_mutex_unlock(&xs_mutex); XSDEBUG("subtune #%i selected, initializing...\n", myStatus.currSong); + songLength = myTune->subTunes[myStatus.currSong - 1].tuneLength; /* Initialize song */ if (!xs_player->plrInitSong(&myStatus)) @@ -321,22 +323,22 @@ while (xs_status.isPlaying && myStatus.isPlaying && (xs_status.currSong == myStatus.currSong)) { /* Render audio data */ - xs_player->plrFillBuffer(&myStatus, audioBuffer, XS_BUFSIZE); + audioGot = xs_player->plrFillBuffer(&myStatus, audioBuffer, XS_BUFSIZE); /* I <3 visualice/haujobb */ xs_plugin_ip.add_vis_pcm( xs_plugin_ip.output->written_time(), - audioFmt, audioChannels, XS_BUFSIZE, audioBuffer); + audioFmt, audioChannels, audioGot, audioBuffer); /* Wait a little */ while (xs_status.isPlaying && (xs_status.currSong == myStatus.currSong) && - (xs_plugin_ip.output->buffer_free() < XS_BUFSIZE)) + (xs_plugin_ip.output->buffer_free() < audioGot)) xmms_usleep(10000); /* Output audio */ if (xs_status.isPlaying && (xs_status.currSong == myStatus.currSong)) - xs_plugin_ip.output->write_audio(audioBuffer, XS_BUFSIZE); + xs_plugin_ip.output->write_audio(audioBuffer, audioGot); /* Check if we have played enough */ if (xs_cfg.playMaxTimeEnable) @@ -470,25 +472,37 @@ */ void xs_seek(gint iTime) { - if (!xs_status.pTune) return; - - if (xs_cfg.subsongControl == XS_SSC_POPUP) - { - /* User wants to use the pop-up */ - } + gint n; + if (!xs_status.pTune || !xs_status.isPlaying) return; + + switch (xs_cfg.subsongControl) { + case XS_SSC_POPUP: + pthread_mutex_lock(&xs_mutex); + + n = xs_status.pTune->subTunes[xs_status.currSong].tuneLength; + if ((iTime > 0) && (iTime <= n)) + { + xs_status.currSong = 1 + ((iTime * xs_status.pTune->nsubTunes) / n); + } + + pthread_mutex_unlock(&xs_mutex); + break; /* If we have song-position patch, check settings */ #ifdef HAVE_SONG_POSITION - if (xs_cfg.subsongControl == XS_SSC_PATCH) - { + case XS_SSC_PATCH: pthread_mutex_lock(&xs_mutex); - if ((iTime > 0) && (iTime <= xs_status.pTune->nsubTunes) && xs_status.isPlaying) + if ((iTime > 0) && (iTime <= xs_status.pTune->nsubTunes)) xs_status.currSong = iTime; pthread_mutex_unlock(&xs_mutex); - } + break; #endif + + default: + break; + } } @@ -601,3 +615,114 @@ } +/* + * File-information window + */ +#define LUW(x...) lookup_widget(xs_fileinfowin, ## x) + + +void xs_fileinfo_ok(void) +{ + gtk_widget_destroy(xs_fileinfowin); + xs_fileinfowin = NULL; +} + + +void xs_fileinfo_subtune(GtkWidget *widget, void *data) +{ +#if 0 + T_sid_stil_subtune *a_tune; + GtkWidget *a_item; + gint a_index; + + + /* Get number of subtune */ + a_item = gtk_menu_get_active(GTK_MENU(fileinfo_sub_tune_menu)); + a_index = g_list_index(GTK_MENU_SHELL(fileinfo_sub_tune_menu)->children, a_item); + + a_tune = &xs_stil_info.subtune[a_index]; + + + /* Get and set subtune information */ + if (a_tune->artist != NULL) + gtk_entry_set_text (GTK_ENTRY (fileinfo_sub_artist), a_tune->artist); + + if (a_tune->title != NULL) + gtk_entry_set_text (GTK_ENTRY (fileinfo_sub_title), a_tune->title); + + if (a_tune->comment != NULL) + { + /* Freeze the widget for update */ + gtk_text_freeze(GTK_TEXT(fileinfo_sub_comment)); + + /* Delete the old comment */ + gtk_text_set_point(GTK_TEXT(fileinfo_sub_comment), 0); + gtk_text_forward_delete(GTK_TEXT(fileinfo_sub_comment), + gtk_text_get_length(GTK_TEXT(fileinfo_sub_comment))); + + /* Put in the new comment */ + gtk_text_insert (GTK_TEXT (fileinfo_sub_comment), NULL, NULL, NULL, + a_tune->comment, strlen(a_tune->comment)); + + /* Un-freeze the widget */ + gtk_text_thaw(GTK_TEXT(fileinfo_sub_comment)); + } +#endif +} + + +void xs_fileinfo(gchar *pcFilename) +{ + /* Check if there already is an open fileinfo window */ + if (xs_fileinfowin) + { + gdk_window_raise(xs_fileinfowin->window); + return; + } + + /* If not, create a new one */ + xs_fileinfowin = create_xs_fileinfowin(); + + + /* Set the song informations */ + gtk_entry_set_text(GTK_ENTRY (LUW("fileinfo_filename")), pcFilename); + +#if 0 + gtk_entry_set_text(GTK_ENTRY (LUW("fileinfo_songname")), sidInf.infoString[0]); + gtk_entry_set_text(GTK_ENTRY (LUW("fileinfo_composer")), sidInf.infoString[1]); + gtk_entry_set_text(GTK_ENTRY (LUW("fileinfo_copyright")), sidInf.infoString[2]); + + + /* "main tune" - the pseudo tune */ + tmpMenuItem = gtk_menu_item_new_with_label ("General info"); + gtk_widget_show (tmpMenuItem); + gtk_menu_append (GTK_MENU (fileinfo_sub_tune_menu), tmpMenuItem); + gtk_signal_connect (GTK_OBJECT (tmpMenuItem), "activate", + GTK_SIGNAL_FUNC (xs_fileinfo_sub_tune), fileinfo_sub_tune_menu); + + /* Other menu items */ + for (n = 1; n <= sidInf.songs; n++) + { + snprintf(tmpStr, sizeof(tmpStr), "Tune #%i", n); + + tmpMenuItem = gtk_menu_item_new_with_label (tmpStr); + gtk_widget_show (tmpMenuItem); + gtk_menu_append (GTK_MENU (fileinfo_sub_tune_menu), tmpMenuItem); + + gtk_signal_connect (GTK_OBJECT (tmpMenuItem), "activate", + GTK_SIGNAL_FUNC (xs_fileinfo_sub_tune), fileinfo_sub_tune_menu); + } + + gtk_option_menu_set_menu (GTK_OPTION_MENU (fileinfo_sub_tune), fileinfo_sub_tune_menu); + + /* Check if user wants STIL info */ + if (xs_cfg.usestil) + xs_stil_get(filename); + + /* Set the sub-tune information */ + xs_fileinfo_subtune(NULL, fileinfo_sub_tune_menu); +#endif + + /* Show the window */ + gtk_widget_show(xs_fileinfowin); +}
--- a/src/xmms-sid.h Sun Jan 11 16:48:05 2004 +0000 +++ b/src/xmms-sid.h Sun Jan 11 17:42:00 2004 +0000 @@ -68,7 +68,11 @@ typedef struct { - gchar *tuneFilename; + gchar *tuneFilename, + *tuneName, + *tuneComposer, + *tuneCopyright; + gint nsubTunes, startTune; t_xs_subtune subTunes[XS_STIL_MAXENTRY]; } t_xs_tune; @@ -97,7 +101,7 @@ void xs_seek(gint); gint xs_get_time(void); void xs_get_song_info(gchar *, gchar **, gint *); -//void xs_file_info_box(gchar *); +void xs_fileinfo(gchar *); void xs_about(void); t_xs_tune *xs_tune_new(gchar *, gint, gint);
--- a/src/xs_genui.c Sun Jan 11 16:48:05 2004 +0000 +++ b/src/xs_genui.c Sun Jan 11 17:42:00 2004 +0000 @@ -9,37 +9,3 @@ #include "xs_glade.h" -void -fileinfo_sub_tune_clicked (GtkButton *button, - gpointer user_data) -{ - -} - - -void -fileinfo_ok_clicked (GtkButton *button, - gpointer user_data) -{ - -} - - -void -xs_ctrl_song_prev (GtkButton *button, - gpointer user_data) -{ - -} - - -void -xs_ctrl_song_next (GtkButton *button, - gpointer user_data) -{ - -} - - - -
--- a/src/xs_genui.h Sun Jan 11 16:48:05 2004 +0000 +++ b/src/xs_genui.h Sun Jan 11 17:42:00 2004 +0000 @@ -2,62 +2,6 @@ void -xs_cfg_filter_reset (GtkButton *button, - gpointer user_data); - -void -xs_cfg_sld_dbbrowse (GtkButton *button, - gpointer user_data); - -void -xs_cfg_stil_browse (GtkButton *button, - gpointer user_data); - -void -xs_cfg_ok (GtkButton *button, - gpointer user_data); - -void -xs_cfg_cancel (GtkButton *button, - gpointer user_data); - -void -xs_about_ok (GtkButton *button, - gpointer user_data); - -void -fileinfo_sub_tune_clicked (GtkButton *button, - gpointer user_data); - -void -fileinfo_ok_clicked (GtkButton *button, - gpointer user_data); - -void -xs_ctrl_song_prev (GtkButton *button, - gpointer user_data); - -void -xs_ctrl_song_next (GtkButton *button, - gpointer user_data); - -void -xs_cfg_sldb_fs_ok (GtkButton *button, - gpointer user_data); - -void -xs_cfg_sldb_fs_cancel (GtkButton *button, - gpointer user_data); - -void -xs_cfg_stil_fs_ok (GtkButton *button, - gpointer user_data); - -void -xs_cfg_stil_fs_cancel (GtkButton *button, - gpointer user_data); - -void xs_cfg_emu_sidplay1_toggled (GtkToggleButton *togglebutton, gpointer user_data); @@ -74,5 +18,49 @@ gpointer user_data); void +xs_cfg_filter_reset (GtkButton *button, + gpointer user_data); + +void +xs_cfg_sld_dbbrowse (GtkButton *button, + gpointer user_data); + +void xs_cfg_ftitle_override_toggled (GtkToggleButton *togglebutton, gpointer user_data); + +void +xs_cfg_stil_browse (GtkButton *button, + gpointer user_data); + +void +xs_cfg_ok (GtkButton *button, + gpointer user_data); + +void +xs_cfg_cancel (GtkButton *button, + gpointer user_data); + +void +xs_fileinfo_subtune (GtkButton *button, + gpointer user_data); + +void +xs_fileinfo_ok (GtkButton *button, + gpointer user_data); + +void +xs_cfg_sldb_fs_ok (GtkButton *button, + gpointer user_data); + +void +xs_cfg_sldb_fs_cancel (GtkButton *button, + gpointer user_data); + +void +xs_cfg_stil_fs_ok (GtkButton *button, + gpointer user_data); + +void +xs_cfg_stil_fs_cancel (GtkButton *button, + gpointer user_data);
--- a/src/xs_init.c Sun Jan 11 16:48:05 2004 +0000 +++ b/src/xs_init.c Sun Jan 11 17:42:00 2004 +0000 @@ -46,9 +46,7 @@ NULL, /* Send data to Visualization plugin */ NULL, NULL, /* FILLED BY XMMS */ xs_get_song_info, /* Get song title and length */ - - NULL, // xs_fileinfo_dialog, /* Show file-information dialog */ - + xs_fileinfo, /* Show file-information dialog */ NULL /* FILLED BY XMMS */ };
--- a/src/xs_sidplay1.cc Sun Jan 11 16:48:05 2004 +0000 +++ b/src/xs_sidplay1.cc Sun Jan 11 17:42:00 2004 +0000 @@ -150,7 +150,7 @@ } -gboolean xs_sidplay1_fillbuffer(t_xs_status *myStatus, gchar *audioBuffer, gint audioBufSize) +guint xs_sidplay1_fillbuffer(t_xs_status *myStatus, gchar *audioBuffer, guint audioBufSize) { t_xs_sidplay1 *myPlayer = (t_xs_sidplay1 *) myStatus->player; @@ -162,7 +162,7 @@ audioBuffer, audioBufSize); - return TRUE; + return audioBufSize; }
--- a/src/xs_sidplay1.h Sun Jan 11 16:48:05 2004 +0000 +++ b/src/xs_sidplay1.h Sun Jan 11 17:42:00 2004 +0000 @@ -7,7 +7,7 @@ void xs_sidplay1_close(t_xs_status *); gboolean xs_sidplay1_init(t_xs_status *); gboolean xs_sidplay1_initsong(t_xs_status *); -gboolean xs_sidplay1_fillbuffer(t_xs_status *, gchar *, gint); +guint xs_sidplay1_fillbuffer(t_xs_status *, gchar *, guint); gboolean xs_sidplay1_loadsid(t_xs_status *, gchar *); void xs_sidplay1_deletesid(t_xs_status *); t_xs_tune* xs_sidplay1_getsidinfo(gchar *);
--- a/src/xs_sidplay2.cc Sun Jan 11 16:48:05 2004 +0000 +++ b/src/xs_sidplay2.cc Sun Jan 11 17:42:00 2004 +0000 @@ -195,11 +195,23 @@ } -gboolean xs_sidplay2_fillbuffer(t_xs_status *myStatus, gchar *audioBuffer, gint audioBufSize) +guint xs_sidplay2_fillbuffer(t_xs_status *myStatus, gchar *audioBuffer, guint audioBufSize) { t_xs_sidplay2 *myPlayer = (t_xs_sidplay2 *) myStatus->player; + guint nData, i; + guchar *p; - return (myPlayer->currEng->play(audioBuffer, audioBufSize) == (guint) audioBufSize); + nData = myPlayer->currEng->play(audioBuffer, audioBufSize); + + if ((nData > 0) && (myPlayer->currConfig.precision == 8)) + { + /* SIDPlay2 only outputs SIGNED 8bit, so we need to convert it */ + i = nData; + p = (guchar *) audioBuffer; + while (i--) *(p++) ^= 0x80; + } + + return nData; } @@ -278,19 +290,18 @@ #ifdef HAVE_UNSIGNEDPCM #ifdef WORDS_BIGENDIAN - myPlayer->currConfig.sampleFormat = SID2_BIG_UNSIGNED; + myPlayer->currConfig.sampleFormat = SID2_BIG_UNSIGNED; #else - myPlayer->currConfig.sampleFormat = SID2_LITTLE_UNSIGNED; + myPlayer->currConfig.sampleFormat = SID2_LITTLE_UNSIGNED; #endif #else #ifdef WORDS_BIGENDIAN - myPlayer->currConfig.sampleFormat = SID2_BIG_SIGNED; + myPlayer->currConfig.sampleFormat = SID2_BIG_SIGNED; #else - myPlayer->currConfig.sampleFormat = SID2_LITTLE_SIGNED; + myPlayer->currConfig.sampleFormat = SID2_LITTLE_SIGNED; #endif #endif - /* Now set the emulator configuration */ if (myPlayer->currEng->config(myPlayer->currConfig) < 0) {
--- a/src/xs_sidplay2.h Sun Jan 11 16:48:05 2004 +0000 +++ b/src/xs_sidplay2.h Sun Jan 11 17:42:00 2004 +0000 @@ -7,7 +7,7 @@ void xs_sidplay2_close(t_xs_status *); gboolean xs_sidplay2_init(t_xs_status *); gboolean xs_sidplay2_initsong(t_xs_status *); -gboolean xs_sidplay2_fillbuffer(t_xs_status *, gchar *, gint); +guint xs_sidplay2_fillbuffer(t_xs_status *, gchar *, guint); gboolean xs_sidplay2_loadsid(t_xs_status *, gchar *); void xs_sidplay2_deletesid(t_xs_status *); t_xs_tune* xs_sidplay2_getsidinfo(gchar *);
--- a/src/xs_stil.c Sun Jan 11 16:48:05 2004 +0000 +++ b/src/xs_stil.c Sun Jan 11 17:42:00 2004 +0000 @@ -1,10 +1,9 @@ /* - xmms-sid - SIDPlay input plugin for X MultiMedia System (XMMS) + XMMS-SID - SIDPlay input plugin for X MultiMedia System (XMMS) - STIL-database parsing functions + STIL-database handling functions - Mostly written by Matti "ccr" Hamalainen <ccr@tnsp.org>, - some parts written by Willem Monsuwe <willem@stack.nl> + Written by Matti "ccr" Hamalainen <ccr@tnsp.org> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,7 +19,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - #include "xs_stil.h" #include "xs_support.h" #include "xs_config.h" @@ -29,6 +27,7 @@ #include <ctype.h> #include <string.h> + /* * Pointer to database in memory */ @@ -187,8 +186,26 @@ { fgets(inLine, sizeof(inLine), inFile); lineNum++; + +#if 0 + switch (inLine[0]) { + case '/': + /* A new entry */ + + isEntry = TRUE; + break; + + case '(': + subEntry = + break; + default: + /* End of entry */ + isEntry = FALSE; + break; + } +#endif } /* while */