diff src/sid/xmms-sid.c @ 1574:e566e18e9e3d

Huge cleanup and some bugfixes. Temporarily breaks / removes sub-tune changing.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 03 Sep 2007 06:28:17 +0300
parents 5e4393a4c099
children a5725f7f1a5e
line wrap: on
line diff
--- a/src/sid/xmms-sid.c	Mon Sep 03 06:25:55 2007 +0300
+++ b/src/sid/xmms-sid.c	Mon Sep 03 06:28:17 2007 +0300
@@ -38,6 +38,8 @@
 #include "xs_interface.h"
 #include "xs_glade.h"
 #include "xs_player.h"
+#include "xs_slsup.h"
+
 
 /*
  * Include player engines
@@ -86,20 +88,6 @@
 XS_MUTEX(xs_status);
 static XS_THREAD_T xs_decode_thread;
 
-static GtkWidget *xs_subctrl = NULL;
-static GtkObject *xs_subctrl_adj = NULL;
-XS_MUTEX(xs_subctrl);
-
-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 *);
-
 
 /*
  * Error messages
@@ -107,7 +95,7 @@
 void xs_error(const char *fmt, ...)
 {
 	va_list ap;
-	fprintf(stderr, "XMMS-SID: ");
+	fprintf(stderr, "AUD-SID: ");
 	va_start(ap, fmt);
 	vfprintf(stderr, fmt, ap);
 	va_end(ap);
@@ -297,22 +285,6 @@
 }
 
 
-static gboolean xs_schedule_subctrl_update(gpointer unused)
-{
-	(void) unused;
-	gboolean isPlaying;
-	
-	XS_MUTEX_LOCK(xs_status);
-	isPlaying = xs_status.isPlaying;
-	XS_MUTEX_UNLOCK(xs_status);
-
-	if (isPlaying)
-		xs_subctrl_update();
-
-	return FALSE;
-}
-
-
 /*
  * Main playing thread loop
  */
@@ -411,8 +383,6 @@
 
 		XSDEBUG("subtune #%i selected, initializing...\n", myStatus.currSong);
 
-		g_idle_add_full( G_PRIORITY_HIGH_IDLE , xs_schedule_subctrl_update , NULL , NULL );
-
 		/* Check minimum playtime */
 		songLength = myTune->subTunes[myStatus.currSong-1].tuneLength;
 		if (xs_cfg.playMinTimeEnable && (songLength >= 0)) {
@@ -618,9 +588,6 @@
 	
 	XSDEBUG("stop requested\n");
 
-	/* Close the sub-tune control window, if any */
-	xs_subctrl_close();
-
 	/* Lock xs_status and stop playing thread */
 	XS_MUTEX_LOCK(xs_status);
 	if (xs_status.isPlaying) {
@@ -634,11 +601,6 @@
 
 	XSDEBUG("done, updating status\n");
 	
-	/* Status is now stopped, update the sub-tune
-	 * controller in fileinfo window (if open)
-	 */
-	xs_fileinfo_update();
-
 	/* Free tune information */
 	XS_MUTEX_LOCK(xs_status);
 	xs_status.sidPlayer->plrDeleteSID(&xs_status);
@@ -654,233 +616,15 @@
  */
 void xs_pause(InputPlayback *pb, short pauseState)
 {
-	xs_subctrl_close();
-	xs_fileinfo_update();
 	pb->output->pause(pauseState);
 }
 
 
 /*
- * Pop-up subtune selector
- */
-void xs_subctrl_setsong(void)
-{
-	gint n;
-
-	XS_MUTEX_LOCK(xs_status);
-	XS_MUTEX_LOCK(xs_subctrl);
-
-	if (xs_status.tuneInfo && xs_status.isPlaying) {
-		n = (gint) GTK_ADJUSTMENT(xs_subctrl_adj)->value;
-		if ((n >= 1) && (n <= xs_status.tuneInfo->nsubTunes))
-			xs_status.currSong = n;
-	}
-
-	XS_MUTEX_UNLOCK(xs_subctrl);
-	XS_MUTEX_UNLOCK(xs_status);
-}
-
-
-void xs_subctrl_prevsong(void)
-{
-	XS_MUTEX_LOCK(xs_status);
-
-	if (xs_status.tuneInfo && xs_status.isPlaying) {
-		if (xs_status.currSong > 1)
-			xs_status.currSong--;
-	}
-
-	XS_MUTEX_UNLOCK(xs_status);
-
-	xs_subctrl_update();
-}
-
-
-void xs_subctrl_nextsong(void)
-{
-	XS_MUTEX_LOCK(xs_status);
-
-	if (xs_status.tuneInfo && xs_status.isPlaying) {
-		if (xs_status.currSong < xs_status.tuneInfo->nsubTunes)
-			xs_status.currSong++;
-	}
-
-	XS_MUTEX_UNLOCK(xs_status);
-
-	xs_subctrl_update();
-}
-
-
-void xs_subctrl_update(void)
-{
-	GtkAdjustment *tmpAdj;
-
-	XS_MUTEX_LOCK(xs_status);
-	XS_MUTEX_LOCK(xs_subctrl);
-
-	/* Check if control window exists, we are currently playing and have a tune */
-	if (xs_subctrl) {
-		if (xs_status.tuneInfo && xs_status.isPlaying) {
-			tmpAdj = GTK_ADJUSTMENT(xs_subctrl_adj);
-
-			tmpAdj->value = xs_status.currSong;
-			tmpAdj->lower = 1;
-			tmpAdj->upper = xs_status.tuneInfo->nsubTunes;
-			XS_MUTEX_UNLOCK(xs_status);
-			XS_MUTEX_UNLOCK(xs_subctrl);
-			gtk_adjustment_value_changed(tmpAdj);
-		} else {
-			XS_MUTEX_UNLOCK(xs_status);
-			XS_MUTEX_UNLOCK(xs_subctrl);
-			xs_subctrl_close();
-		}
-	} else {
-		XS_MUTEX_UNLOCK(xs_subctrl);
-		XS_MUTEX_UNLOCK(xs_status);
-	}
-
-	xs_fileinfo_update();
-}
-
-
-void xs_subctrl_close(void)
-{
-	XS_MUTEX_LOCK(xs_subctrl);
-
-	if (xs_subctrl) {
-		gtk_widget_destroy(xs_subctrl);
-		xs_subctrl = NULL;
-	}
-
-	XS_MUTEX_UNLOCK(xs_subctrl);
-}
-
-
-gboolean xs_subctrl_keypress(GtkWidget * win, GdkEventKey * ev)
-{
-	(void) win;
-
-	if (ev->keyval == GDK_Escape)
-		xs_subctrl_close();
-
-	return FALSE;
-}
-
-
-void xs_subctrl_open(void)
-{
-	GtkWidget *frame25, *hbox15, *subctrl_prev, *subctrl_current, *subctrl_next;
-
-	XS_MUTEX_LOCK(xs_subctrl);
-	if (!xs_status.tuneInfo || !xs_status.isPlaying ||
-		xs_subctrl || (xs_status.tuneInfo->nsubTunes <= 1)) {
-		XS_MUTEX_UNLOCK(xs_subctrl);
-		return;
-	}
-
-	/* Create the pop-up window */
-	xs_subctrl = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-	gtk_window_set_type_hint(GTK_WINDOW(xs_subctrl), GDK_WINDOW_TYPE_HINT_DIALOG);
-	gtk_widget_set_name(xs_subctrl, "xs_subctrl");
-	g_object_set_data(G_OBJECT(xs_subctrl), "xs_subctrl", xs_subctrl);
-
-	gtk_window_set_title(GTK_WINDOW(xs_subctrl), _("Subtune Control"));
-	gtk_window_set_position(GTK_WINDOW(xs_subctrl), GTK_WIN_POS_MOUSE);
-	gtk_container_set_border_width(GTK_CONTAINER(xs_subctrl), 0);
-	gtk_window_set_policy(GTK_WINDOW(xs_subctrl), FALSE, FALSE, FALSE);
-
-	g_signal_connect(G_OBJECT(xs_subctrl), "destroy", G_CALLBACK(gtk_widget_destroyed), &xs_subctrl);
-
-	g_signal_connect(G_OBJECT(xs_subctrl), "focus_out_event", G_CALLBACK(xs_subctrl_close), NULL);
-
-	gtk_widget_realize(xs_subctrl);
-	gdk_window_set_decorations(xs_subctrl->window, (GdkWMDecoration) 0);
-
-
-	/* Create the control widgets */
-	frame25 = gtk_frame_new(NULL);
-	gtk_container_add(GTK_CONTAINER(xs_subctrl), frame25);
-	gtk_container_set_border_width(GTK_CONTAINER(frame25), 2);
-	gtk_frame_set_shadow_type(GTK_FRAME(frame25), GTK_SHADOW_OUT);
-
-	hbox15 = gtk_hbox_new(FALSE, 4);
-	gtk_container_add(GTK_CONTAINER(frame25), hbox15);
-
-	subctrl_prev = gtk_button_new_with_label(" < ");
-	gtk_widget_set_name(subctrl_prev, "subctrl_prev");
-	gtk_box_pack_start(GTK_BOX(hbox15), subctrl_prev, FALSE, FALSE, 0);
-
-	xs_subctrl_adj = gtk_adjustment_new(xs_status.currSong, 1, xs_status.tuneInfo->nsubTunes, 1, 1, 0);
-	g_signal_connect(G_OBJECT(xs_subctrl_adj), "value_changed", G_CALLBACK(xs_subctrl_setsong), NULL);
-
-	subctrl_current = gtk_hscale_new(GTK_ADJUSTMENT(xs_subctrl_adj));
-	gtk_widget_set_size_request(subctrl_current, 80, -1);
-	gtk_widget_set_name(subctrl_current, "subctrl_current");
-	gtk_box_pack_start(GTK_BOX(hbox15), subctrl_current, FALSE, TRUE, 0);
-	gtk_scale_set_digits(GTK_SCALE(subctrl_current), 0);
-	gtk_range_set_update_policy(GTK_RANGE(subctrl_current), GTK_UPDATE_DELAYED);
-	gtk_widget_grab_focus(subctrl_current);
-
-	subctrl_next = gtk_button_new_with_label(" > ");
-	gtk_widget_set_name(subctrl_next, "subctrl_next");
-	gtk_box_pack_start(GTK_BOX(hbox15), subctrl_next, FALSE, FALSE, 0);
-
-	g_signal_connect(G_OBJECT(subctrl_prev), "clicked", G_CALLBACK(xs_subctrl_prevsong), NULL);
-
-	g_signal_connect(G_OBJECT(subctrl_next), "clicked", G_CALLBACK(xs_subctrl_nextsong), NULL);
-
-	g_signal_connect(G_OBJECT(xs_subctrl), "key_press_event", G_CALLBACK(xs_subctrl_keypress), NULL);
-
-	gtk_widget_show_all(xs_subctrl);
-
-	XS_MUTEX_UNLOCK(xs_subctrl);
-}
-
-
-/*
- * Set the time-seek position
- * The playing thread will do the "seeking", which means sub-tune
- * changing in XMMS-SID's case. iTime argument is time in seconds,
- * in contrast to milliseconds used in other occasions.
- *
- * This function is called whenever position slider is clicked or
- * other method of seeking is used (keyboard, etc.)
+ * A stub seek function (Audacious will crash if seek is NULL)
  */
 void xs_seek(InputPlayback *pb, gint iTime)
 {
-	/* Check status */
-	XS_MUTEX_LOCK(xs_status);
-	if (!xs_status.tuneInfo || !xs_status.isPlaying) {
-		XS_MUTEX_UNLOCK(xs_status);
-		return;
-	}
-
-	/* Act according to settings */
-	switch (xs_cfg.subsongControl) {
-	case XS_SSC_SEEK:
-		if (iTime < xs_status.lastTime) {
-			if (xs_status.currSong > 1)
-				xs_status.currSong--;
-		} else if (iTime > xs_status.lastTime) {
-			if (xs_status.currSong < xs_status.tuneInfo->nsubTunes)
-				xs_status.currSong++;
-		}
-		break;
-
-	case XS_SSC_POPUP:
-		xs_subctrl_open();
-		break;
-
-		/* If we have song-position patch, check settings */
-#ifdef HAVE_SONG_POSITION
-	case XS_SSC_PATCH:
-		if ((iTime > 0) && (iTime <= xs_status.tuneInfo->nsubTunes))
-			xs_status.currSong = iTime;
-		break;
-#endif
-	}
-
-	XS_MUTEX_UNLOCK(xs_status);
 }
 
 
@@ -912,19 +656,6 @@
 		return -1;
 	}
 
-	/* Let's see what we do */
-	switch (xs_cfg.subsongControl) {
-	case XS_SSC_SEEK:
-		xs_status.lastTime = (pb->output->output_time() / 1000);
-		break;
-
-#ifdef HAVE_SONG_POSITION
-	case XS_SSC_PATCH:
-		set_song_position(xs_status.currSong, 1, xs_status.tuneInfo->nsubTunes);
-		break;
-#endif
-	}
-
 	XS_MUTEX_UNLOCK(xs_status);
 
 	/* Return output time reported by audio output plugin */
@@ -932,44 +663,8 @@
 }
 
 
-#ifndef AUDACIOUS_PLUGIN
-/* 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();
+/* Return song information Tuple
  */
-void xs_get_song_info(gchar * songFilename, gchar ** songTitle, gint * songLength)
-{
-	t_xs_tuneinfo *pInfo;
-	
-	XS_MUTEX_LOCK(xs_status);
-
-	/* Get tune information from emulation engine */
-	pInfo = xs_status.sidPlayer->plrGetSIDInfo(songFilename);
-	if (!pInfo) {
-		XS_MUTEX_UNLOCK(xs_status);
-		return;
-	}
-
-	/* Get sub-tune information, if available */
-	if ((pInfo->startTune > 0) && (pInfo->startTune <= pInfo->nsubTunes)) {
-		gint tmpInt;
-		
-		(*songTitle) = xs_make_titlestring(pInfo, pInfo->startTune);
-
-		tmpInt = pInfo->subTunes[pInfo->startTune-1].tuneLength;
-		if (tmpInt < 0)
-			(*songLength) = -1;
-		else
-			(*songLength) = (tmpInt * 1000);
-	}
-
-	/* Free tune information */
-	xs_tuneinfo_free(pInfo);
-	XS_MUTEX_UNLOCK(xs_status);
-}
-
-#else
-
 Tuple * xs_get_song_tuple(gchar *songFilename)
 {
 	t_xs_tuneinfo *pInfo;
@@ -1007,7 +702,6 @@
 	if ((pInfo->startTune > 0) && (pInfo->startTune <= pInfo->nsubTunes)) {
 		gint tmpInt = pInfo->subTunes[pInfo->startTune-1].tuneLength;
 		tuple_associate_int(pResult, "length", (tmpInt < 0) ? -1 : tmpInt * 1000);
-		
 	}
 
 	/* Free tune information */
@@ -1015,167 +709,3 @@
 	XS_MUTEX_UNLOCK(xs_status);
 	return pResult;
 }
-#endif
-
-
-/* Allocate a new tune information structure
- */
-t_xs_tuneinfo *xs_tuneinfo_new(const gchar * pcFilename,
-		gint nsubTunes, gint startTune, const gchar * sidName,
-		const gchar * sidComposer, const gchar * sidCopyright,
-		gint loadAddr, gint initAddr, gint playAddr,
-		gint dataFileLen, const gchar *sidFormat, gint sidModel)
-{
-	t_xs_tuneinfo *pResult;
-	t_xs_sldb_node *tmpLength;
-	gint i;
-
-	/* Allocate structure */
-	pResult = (t_xs_tuneinfo *) g_malloc0(sizeof(t_xs_tuneinfo));
-	if (!pResult) {
-		xs_error(_("Could not allocate memory for t_xs_tuneinfo ('%s')\n"),
-			pcFilename);
-		return NULL;
-	}
-
-	pResult->sidFilename = g_filename_to_utf8(pcFilename, -1, NULL, NULL, NULL);
-	if (!pResult->sidFilename) {
-		xs_error(_("Could not allocate sidFilename ('%s')\n"),
-			pcFilename);
-		g_free(pResult);
-		return NULL;
-	}
-
-	/* Allocate space for subtune information */
-	pResult->subTunes = g_malloc0(sizeof(t_xs_subtuneinfo) * (nsubTunes + 1));
-	if (!pResult->subTunes) {
-		xs_error(_("Could not allocate memory for t_xs_subtuneinfo ('%s', %i)\n"),
-			pcFilename, nsubTunes);
-
-		g_free(pResult->sidFilename);
-		g_free(pResult);
-		return NULL;
-	}
-
-	/* The following allocations don't matter if they fail */
-	pResult->sidName = XS_CS_SID(sidName);
-	pResult->sidComposer = XS_CS_SID(sidComposer);
-	pResult->sidCopyright = XS_CS_SID(sidCopyright);
-
-	pResult->nsubTunes = nsubTunes;
-	pResult->startTune = startTune;
-
-	pResult->loadAddr = loadAddr;
-	pResult->initAddr = initAddr;
-	pResult->playAddr = playAddr;
-	pResult->dataFileLen = dataFileLen;
-	pResult->sidFormat = XS_CS_SID(sidFormat);
-	
-	pResult->sidModel = sidModel;
-
-	/* Get length information (NOTE: Do not free this!) */
-	tmpLength = xs_songlen_get(pcFilename);
-	
-	/* Fill in sub-tune information */
-	for (i = 0; i < pResult->nsubTunes; i++) {
-		if (tmpLength && (i < tmpLength->nLengths))
-			pResult->subTunes[i].tuneLength = tmpLength->sLengths[i];
-		else
-			pResult->subTunes[i].tuneLength = -1;
-		
-		pResult->subTunes[i].tuneSpeed = -1;
-	}
-	
-	return pResult;
-}
-
-
-/* Free given tune information structure
- */
-void xs_tuneinfo_free(t_xs_tuneinfo * pTune)
-{
-	if (!pTune) return;
-
-	g_free(pTune->subTunes);
-	g_free(pTune->sidFilename);
-	g_free(pTune->sidName);
-	g_free(pTune->sidComposer);
-	g_free(pTune->sidCopyright);
-	g_free(pTune->sidFormat);
-	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;
-}