# HG changeset patch # User Matti Hamalainen # Date 1169815985 0 # Node ID 53bdac2e0dcb62d194ef41b44b16fbe8197124df # Parent c67a7f2fd586b4ce3242a5a361c769624ee8cfbc Moved sldb glue functions here; Cosmetic cleanups. diff -r c67a7f2fd586 -r 53bdac2e0dcb src/xmms-sid.c --- 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; +}