view src/sid/xs_sidplay.h @ 469:1256144d2a6e trunk

[svn] - fix crash - finish shout metadata support
author nenolod
date Sun, 21 Jan 2007 02:09:42 -0800
parents c488d191b528
children 6c3c7b841382
line wrap: on
line source

/*
 * Here comes the really ugly code...
 * Get all SID-tune information (for all sub-tunes)
 * including name, length, etc.
 */
t_xs_tuneinfo *TFUNCTION(gchar * pcFilename)
{
	t_xs_sldb_node *tuneLength = NULL;
	t_xs_tuneinfo *pResult;
	TTUNEINFO tuneInfo;
	TTUNE *testTune;
	gboolean haveInfo = TRUE;
	gint i;
	gchar *buffer = NULL;
	glong buffer_size = 0;

	if ( TBUFFGETFUNC( pcFilename , &buffer , &buffer_size ) != 0 )
		return NULL;

	/* Check if the tune exists and is readable */
	if ((testTune = new TTUNE((TBUFFTYPEMEM)buffer,(TBUFFTYPESIZE)buffer_size)) == NULL)
		return NULL;

	if (!testTune->getStatus()) {
		g_free( buffer );
		delete testTune;
		return NULL;
	}

	/* Get general tune information */
#ifdef _XS_SIDPLAY1_H
	haveInfo = testTune->getInfo(tuneInfo);
#endif
#ifdef _XS_SIDPLAY2_H
	testTune->getInfo(tuneInfo);
	haveInfo = TRUE;
#endif

	/* Get length information (NOTE: Do not free this!) */
	tuneLength = xs_songlen_get(pcFilename);

	/* Allocate tuneinfo structure */
	pResult = xs_tuneinfo_new(pcFilename,
				  tuneInfo.songs, tuneInfo.startSong,
				  tuneInfo.infoString[0], tuneInfo.infoString[1], tuneInfo.infoString[2],
				  tuneInfo.loadAddr, tuneInfo.initAddr, tuneInfo.playAddr, tuneInfo.dataFileLen);

	if (!pResult) {
		g_free( buffer );
		delete testTune;
		return NULL;
	}

	/* Get information for subtunes */
	for (i = 0; i < pResult->nsubTunes; i++) {
		/* Make the title */
		if (haveInfo) {
			pResult->subTunes[i].tuneTitle =
			    xs_make_titlestring(pcFilename, i + 1, pResult->nsubTunes, tuneInfo.sidModel,
						tuneInfo.formatString, tuneInfo.infoString[0],
						tuneInfo.infoString[1], tuneInfo.infoString[2]);
		} else
			pResult->subTunes[i].tuneTitle = g_strdup(pcFilename);

		/* Get song length */
		if (tuneLength && (i < tuneLength->nLengths))
			pResult->subTunes[i].tuneLength = tuneLength->sLengths[i];
		else
			pResult->subTunes[i].tuneLength = -1;
	}

	g_free( buffer );
	delete testTune;

	return pResult;
}

/* Undefine these */
#undef TFUNCTION
#undef TTUNEINFO
#undef TTUNE
#undef TBUFFGETFUNC
#undef TBUFFTYPEMEM
#undef TBUFFTYPESIZE