changeset 477:53bdac2e0dcb

Moved sldb glue functions here; Cosmetic cleanups.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 26 Jan 2007 12:53:05 +0000
parents c67a7f2fd586
children 22cd8161c9e7
files src/xmms-sid.c
diffstat 1 files changed, 101 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/src/xmms-sid.c	Fri Jan 26 12:52:05 2007 +0000
+++ b/src/xmms-sid.c	Fri Jan 26 12:53:05 2007 +0000
@@ -93,8 +93,15 @@
 static GtkObject *xs_subctrl_adj = NULL;
 XS_MUTEX(xs_subctrl);
 
-void	xs_subctrl_close(void);
-void	xs_subctrl_update(void);
+void		xs_subctrl_close(void);
+void		xs_subctrl_update(void);
+
+static t_xs_sldb *xs_sldb_db = NULL;
+XS_MUTEX(xs_sldb_db);
+
+gint		xs_songlen_init(void);
+void		xs_songlen_close(void);
+t_xs_sldb_node *xs_songlen_get(const gchar *);
 
 
 /*
@@ -439,7 +446,7 @@
 		xs_plugin_ip.set_info(
 			tmpTitle,
 			(songLength > 0) ? (songLength * 1000) : 0,
-			(myTune->subTunes[myStatus.currSong-1].tuneSpeed > 0) ? (myTune->subTunes[myStatus.currSong-1].tuneSpeed * 1000) : -1,
+			-1,
 			myStatus.audioFrequency,
 			myStatus.audioChannels);
 		
@@ -454,33 +461,37 @@
 			/* Render audio data */
 			if (myStatus.oversampleEnable) {
 				/* Perform oversampled rendering */
-				audioGot = myStatus.sidPlayer->plrFillBuffer(&myStatus,
-									     oversampleBuffer,
-									     (XS_AUDIOBUF_SIZE *
-									      myStatus.oversampleFactor));
+				audioGot = myStatus.sidPlayer->plrFillBuffer(
+					&myStatus,
+					oversampleBuffer,
+					(XS_AUDIOBUF_SIZE * myStatus.oversampleFactor));
 
 				audioGot /= myStatus.oversampleFactor;
 
 				/* Execute rate-conversion with filtering */
 				if (xs_filter_rateconv(audioBuffer, oversampleBuffer,
-						       myStatus.audioFormat, myStatus.oversampleFactor, audioGot) < 0) {
+					myStatus.audioFormat, myStatus.oversampleFactor, audioGot) < 0) {
 					xs_error(_("Oversampling rate-conversion pass failed.\n"));
 					XS_MUTEX_LOCK(xs_status);
 					xs_status.isError = TRUE;
 					XS_MUTEX_UNLOCK(xs_status);
 					goto xs_err_exit;
 				}
-			} else
-				audioGot = myStatus.sidPlayer->plrFillBuffer(&myStatus, audioBuffer, XS_AUDIOBUF_SIZE);
+			} else {
+				audioGot = myStatus.sidPlayer->plrFillBuffer(
+					&myStatus, audioBuffer, XS_AUDIOBUF_SIZE);
+			}
 
 			/* I <3 visualice/haujobb */
-			xs_plugin_ip.add_vis_pcm(xs_plugin_ip.output->written_time(),
-						 myStatus.audioFormat, myStatus.audioChannels, audioGot, audioBuffer);
+			xs_plugin_ip.add_vis_pcm(
+				xs_plugin_ip.output->written_time(),
+				myStatus.audioFormat, myStatus.audioChannels,
+				audioGot, audioBuffer);
 
 			/* Wait a little */
 			while (xs_status.isPlaying &&
-			       (xs_status.currSong == myStatus.currSong) &&
-			       (xs_plugin_ip.output->buffer_free() < audioGot))
+				(xs_status.currSong == myStatus.currSong) &&
+				(xs_plugin_ip.output->buffer_free() < audioGot))
 				xmms_usleep(500);
 
 			/* Output audio */
@@ -491,7 +502,7 @@
 			if (xs_cfg.playMaxTimeEnable) {
 				if (xs_cfg.playMaxTimeUnknown) {
 					if ((songLength < 0) &&
-					    (xs_plugin_ip.output->output_time() >= (xs_cfg.playMaxTime * 1000)))
+						(xs_plugin_ip.output->output_time() >= (xs_cfg.playMaxTime * 1000)))
 						myStatus.isPlaying = FALSE;
 				} else {
 					if (xs_plugin_ip.output->output_time() >= (xs_cfg.playMaxTime * 1000))
@@ -924,9 +935,7 @@
 }
 
 
-/*
- * Return song information
- * This function is called by XMMS when initially loading the playlist.
+/* Return song information: called by XMMS when initially loading the playlist.
  * Subsequent changes to information are made by the player thread,
  * which uses xs_plugin_ip.set_info();
  */
@@ -1044,3 +1053,77 @@
 	g_free(pTune);
 }
 
+
+/* Song length database handling glue
+ */
+gint xs_songlen_init(void)
+{
+	XS_MUTEX_LOCK(xs_cfg);
+
+	if (!xs_cfg.songlenDBPath) {
+		XS_MUTEX_UNLOCK(xs_cfg);
+		return -1;
+	}
+
+	XS_MUTEX_LOCK(xs_sldb_db);
+
+	/* Check if already initialized */
+	if (xs_sldb_db)
+		xs_sldb_free(xs_sldb_db);
+
+	/* Allocate database */
+	xs_sldb_db = (t_xs_sldb *) g_malloc0(sizeof(t_xs_sldb));
+	if (!xs_sldb_db) {
+		XS_MUTEX_UNLOCK(xs_cfg);
+		XS_MUTEX_UNLOCK(xs_sldb_db);
+		return -2;
+	}
+
+	/* Read the database */
+	if (xs_sldb_read(xs_sldb_db, xs_cfg.songlenDBPath) != 0) {
+		xs_sldb_free(xs_sldb_db);
+		xs_sldb_db = NULL;
+		XS_MUTEX_UNLOCK(xs_cfg);
+		XS_MUTEX_UNLOCK(xs_sldb_db);
+		return -3;
+	}
+
+	/* Create index */
+	if (xs_sldb_index(xs_sldb_db) != 0) {
+		xs_sldb_free(xs_sldb_db);
+		xs_sldb_db = NULL;
+		XS_MUTEX_UNLOCK(xs_cfg);
+		XS_MUTEX_UNLOCK(xs_sldb_db);
+		return -4;
+	}
+
+	XS_MUTEX_UNLOCK(xs_cfg);
+	XS_MUTEX_UNLOCK(xs_sldb_db);
+	return 0;
+}
+
+
+void xs_songlen_close(void)
+{
+	XS_MUTEX_LOCK(xs_sldb_db);
+	xs_sldb_free(xs_sldb_db);
+	xs_sldb_db = NULL;
+	XS_MUTEX_UNLOCK(xs_sldb_db);
+}
+
+
+t_xs_sldb_node *xs_songlen_get(const gchar * pcFilename)
+{
+	t_xs_sldb_node *pResult;
+
+	XS_MUTEX_LOCK(xs_sldb_db);
+
+	if (xs_cfg.songlenDBEnable && xs_sldb_db)
+		pResult = xs_sldb_get(xs_sldb_db, pcFilename);
+	else
+		pResult = NULL;
+
+	XS_MUTEX_UNLOCK(xs_sldb_db);
+
+	return pResult;
+}