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 */