Mercurial > hg > xmms-sid
diff src/xmms-sid.c @ 230:608f31f6c095
Raw cleanup.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 21 Dec 2004 09:25:03 +0000 |
parents | 2986069309c6 |
children | e613873c3379 |
line wrap: on
line diff
--- a/src/xmms-sid.c Sun Dec 19 16:57:01 2004 +0000 +++ b/src/xmms-sid.c Tue Dec 21 09:25:03 2004 +0000 @@ -62,22 +62,6 @@ /* - * Structure defining methods/functions of each player - */ -typedef struct { - gint plrIdent; - gboolean (*plrIsOurFile)(gchar *); - gboolean (*plrInit)(t_xs_status *); - void (*plrClose)(t_xs_status *); - gboolean (*plrInitSong)(t_xs_status *); - guint (*plrFillBuffer)(t_xs_status *, gchar *, guint); - gboolean (*plrLoadSID)(t_xs_status *, gchar *); - void (*plrDeleteSID)(t_xs_status *); - t_xs_tune* (*plrGetSIDInfo)(gchar *); -} t_xs_player; - - -/* * List of players and links to their functions */ t_xs_player xs_playerlist[] = { @@ -107,23 +91,20 @@ /* * Global variables */ -struct t_xs_cfg xs_cfg; -t_xs_status xs_status; -t_xs_player *xs_player = NULL; -static pthread_t xs_decode_thread; -static pthread_mutex_t xs_mutex = PTHREAD_MUTEX_INITIALIZER; -static GtkWidget *xs_subctrl = NULL; -static GtkObject *xs_subctrl_adj = NULL; -static t_xs_tune *xs_fileinfotune = NULL; -static t_xs_stil_node *xs_fileinfostil = NULL; +t_xs_status xs_status; +XS_MUTEX(xs_status); +static pthread_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); /* - * Re-initialize some settings + * Initialization functions */ void xs_reinit(void) { @@ -153,7 +134,7 @@ if (xs_playerlist[iPlayer].plrInit(&xs_status)) { isInitialized = TRUE; - xs_player = (t_xs_player *) &xs_playerlist[iPlayer]; + xs_status.sidPlayer = (t_xs_player *) &xs_playerlist[iPlayer]; } } iPlayer++; @@ -167,7 +148,7 @@ if (xs_playerlist[iPlayer].plrInit(&xs_status)) { isInitialized = TRUE; - xs_player = (t_xs_player *) &xs_playerlist[iPlayer]; + xs_status.sidPlayer = (t_xs_player *) &xs_playerlist[iPlayer]; } else iPlayer++; } @@ -176,14 +157,14 @@ /* Initialize song-length database */ xs_songlen_close(); - if (xs_cfg.songlenDBEnable && (xs_songlen_init() < 0)) + if (xs_cfg.songlenDBEnable && (xs_songlen_init() != 0)) { XSERR("Error initializing song-length database!\n"); } /* Initialize STIL database */ xs_stil_close(); - if (xs_cfg.stilDBEnable && (xs_stil_init() < 0)) + if (xs_cfg.stilDBEnable && (xs_stil_init() != 0)) { XSERR("Error initializing STIL database!\n"); } @@ -218,11 +199,11 @@ /* Stop playing, free structures */ xs_stop(); - xs_tune_free(xs_status.pTune); - xs_status.pTune = NULL; + xs_tuneinfo_free(xs_status.tuneInfo); + xs_status.tuneInfo = NULL; - xs_player->plrDeleteSID(&xs_status); - xs_player->plrClose(&xs_status); + xs_status.sidPlayer->plrDeleteSID(&xs_status); + xs_status.sidPlayer->plrClose(&xs_status); xs_songlen_close(); xs_stil_close(); @@ -237,14 +218,14 @@ gint xs_is_our_file(gchar *pcFilename) { gchar *pcExt; - assert(xs_player); + assert(xs_status.sidPlayer); /* Check the filename */ if (pcFilename == NULL) return FALSE; /* Try to detect via detection routine, if required */ - if (xs_cfg.detectMagic && xs_player->plrIsOurFile(pcFilename)) + if (xs_cfg.detectMagic && xs_status.sidPlayer->plrIsOurFile(pcFilename)) return TRUE; /* Detect just by checking filename extension */ @@ -274,18 +255,18 @@ void *xs_play_loop(void *argPointer) { t_xs_status myStatus; - t_xs_tune *myTune; + t_xs_tuneinfo *myTune; gboolean audioOpen = FALSE, doPlay = FALSE; guint audioGot; gint songLength; gchar audioBuffer[XS_BUFSIZE]; /* Initialize */ - pthread_mutex_lock(&xs_mutex); - XSDEBUG("entering play thread\n"); + XSDEBUG("entering player thread\n"); + XS_MUTEX_LOCK(xs_status); memcpy(&myStatus, &xs_status, sizeof(t_xs_status)); - myTune = xs_status.pTune; - pthread_mutex_unlock(&xs_mutex); + myTune = xs_status.tuneInfo; + XS_MUTEX_UNLOCK(xs_status); /* @@ -294,27 +275,31 @@ doPlay = TRUE; while (xs_status.isPlaying && doPlay) { - pthread_mutex_lock(&xs_mutex); + XS_MUTEX_LOCK(xs_status); myStatus.currSong = xs_status.currSong; - pthread_mutex_unlock(&xs_mutex); + XS_MUTEX_UNLOCK(xs_status); + XS_MUTEX_LOCK(xs_subctrl); xs_subctrl_update(); + XS_MUTEX_UNLOCK(xs_subctrl); XSDEBUG("subtune #%i selected, initializing...\n", myStatus.currSong); songLength = myTune->subTunes[myStatus.currSong - 1].tuneLength; /* Check minimum playtime */ + XS_MUTEX_LOCK(xs_cfg); if (xs_cfg.playMinTimeEnable) { if (songLength < xs_cfg.playMinTime) songLength = xs_cfg.playMinTime; } + XS_MUTEX_UNLOCK(xs_cfg); /* Initialize song */ - if (!xs_player->plrInitSong(&myStatus)) + if (!myStatus.sidPlayer->plrInitSong(&myStatus)) { XSERR("Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n", - myTune->tuneFilename, myStatus.currSong); + myTune->sidFilename, myStatus.currSong); goto xs_err_exit; } @@ -333,9 +318,10 @@ { XSERR("Couldn't open XMMS audio output (fmt=%x, freq=%i, nchan=%i)!\n", myStatus.audioFormat, myStatus.audioFrequency, myStatus.audioChannels); - pthread_mutex_lock(&xs_mutex); + + XS_MUTEX_LOCK(xs_status); xs_status.isError = TRUE; - pthread_mutex_unlock(&xs_mutex); + XS_MUTEX_UNLOCK(xs_status); goto xs_err_exit; } @@ -347,7 +333,7 @@ while (xs_status.isPlaying && myStatus.isPlaying && (xs_status.currSong == myStatus.currSong)) { /* Render audio data */ - audioGot = xs_player->plrFillBuffer(&myStatus, audioBuffer, XS_BUFSIZE); + audioGot = myStatus.sidPlayer->plrFillBuffer(&myStatus, audioBuffer, XS_BUFSIZE); /* I <3 visualice/haujobb */ xs_plugin_ip.add_vis_pcm( @@ -366,6 +352,7 @@ xs_plugin_ip.output->write_audio(audioBuffer, audioGot); /* Check if we have played enough */ + XS_MUTEX_LOCK(xs_cfg); if (xs_cfg.playMaxTimeEnable) { if (xs_cfg.playMaxTimeUnknown) @@ -378,6 +365,7 @@ myStatus.isPlaying = FALSE; } } + XS_MUTEX_UNLOCK(xs_cfg); if (songLength > 0) { @@ -411,9 +399,9 @@ /* Exit the playing thread */ XSDEBUG("exiting thread, bye.\n"); - pthread_mutex_lock(&xs_mutex); + XS_MUTEX_LOCK(xs_status); xs_status.isPlaying = FALSE; - pthread_mutex_unlock(&xs_mutex); + XS_MUTEX_UNLOCK(xs_status); pthread_exit(NULL); } @@ -426,17 +414,19 @@ */ void xs_play_file(gchar *pcFilename) { + assert(xs_status.sidPlayer); + XSDEBUG("play '%s'\n", pcFilename); /* Get tune information */ - if ((xs_status.pTune = xs_player->plrGetSIDInfo(pcFilename)) == NULL) + if ((xs_status.tuneInfo = xs_status.sidPlayer->plrGetSIDInfo(pcFilename)) == NULL) return; /* Initialize the tune */ - if (!xs_player->plrLoadSID(&xs_status, pcFilename)) + if (!xs_status.sidPlayer->plrLoadSID(&xs_status, pcFilename)) { - xs_tune_free(xs_status.pTune); - xs_status.pTune = NULL; + xs_tuneinfo_free(xs_status.tuneInfo); + xs_status.tuneInfo = NULL; return; } @@ -445,15 +435,15 @@ /* Set general status information */ xs_status.isPlaying = TRUE; xs_status.isError = FALSE; - xs_status.currSong = xs_status.pTune->startTune; + xs_status.currSong = xs_status.tuneInfo->startTune; /* Start the playing thread! */ if (pthread_create(&xs_decode_thread, NULL, xs_play_loop, NULL) < 0) { XSERR("Couldn't start playing thread! Possible reason reported by system: %s\n", strerror(errno)); - xs_tune_free(xs_status.pTune); - xs_status.pTune = NULL; - xs_player->plrDeleteSID(&xs_status); + xs_tuneinfo_free(xs_status.tuneInfo); + xs_status.tuneInfo = NULL; + xs_status.sidPlayer->plrDeleteSID(&xs_status); } XSDEBUG("systems should be up?\n"); @@ -479,16 +469,16 @@ { /* Stop playing */ XSDEBUG("stopping...\n"); - pthread_mutex_lock(&xs_mutex); + XS_MUTEX_LOCK(xs_status); xs_status.isPlaying = FALSE; - pthread_mutex_unlock(&xs_mutex); + XS_MUTEX_UNLOCK(xs_status); pthread_join(xs_decode_thread, NULL); } /* Free tune information */ - xs_player->plrDeleteSID(&xs_status); - xs_tune_free(xs_status.pTune); - xs_status.pTune = NULL; + xs_status.sidPlayer->plrDeleteSID(&xs_status); + xs_tuneinfo_free(xs_status.tuneInfo); + xs_status.tuneInfo = NULL; /* Update subtune control */ xs_subctrl_update(); @@ -506,104 +496,100 @@ /* + * Set or change sub-tune + */ +void xs_set_subtune(int n) +{ + XS_MUTEX_LOCK(xs_status); + + if (xs_status.tuneInfo && xs_status.isPlaying) + { + if ((n >= 1) && (n <= xs_status.tuneInfo->nsubTunes)) + xs_status.currSong = n; + } + + XS_MUTEX_UNLOCK(xs_status); + + xs_subctrl_update(); +} + + +void xs_change_subtune(int n) +{ + XS_MUTEX_LOCK(xs_status); + + if (xs_status.tuneInfo && xs_status.isPlaying) + { + n += xs_status.currSong; + + if ((n >= 1) && (n <= xs_status.tuneInfo->nsubTunes)) + xs_status.currSong = n; + } + + XS_MUTEX_UNLOCK(xs_status); + + xs_subctrl_update(); +} + + +/* * Pop-up subtune selector */ -#define LUW(x...) lookup_widget(xs_fileinfowin, ## x) +void xs_subctrl_setsong(void) +{ + xs_set_subtune(GTK_ADJUSTMENT(xs_subctrl_adj)->value); +} + + +void xs_subctrl_prevsong(void) +{ + xs_change_subtune(-1); +} + + +void xs_subctrl_nextsong(void) +{ + xs_change_subtune( 1); +} + void xs_subctrl_update(void) { GtkAdjustment *tmpAdj; gboolean isEnabled; + XS_MUTEX_LOCK(xs_status); + /* Check if control window exists, we are currently playing and have a tune */ if (xs_subctrl) { - if (xs_status.pTune && xs_status.isPlaying) + if (xs_status.tuneInfo && xs_status.isPlaying) { + XS_MUTEX_LOCK(xs_subctrl); tmpAdj = GTK_ADJUSTMENT(xs_subctrl_adj); tmpAdj->value = xs_status.currSong; tmpAdj->lower = 1; - tmpAdj->upper = xs_status.pTune->nsubTunes; + tmpAdj->upper = xs_status.tuneInfo->nsubTunes; gtk_adjustment_value_changed(tmpAdj); + XS_MUTEX_UNLOCK(xs_subctrl); } else xs_subctrl_close(); } - if (xs_fileinfowin) - { - /* Check if we are currently playing and have a tune */ - if (xs_status.pTune && xs_status.isPlaying && (xs_status.pTune->nsubTunes > 1)) - { - tmpAdj = gtk_range_get_adjustment(GTK_RANGE(LUW("fileinfo_subctrl_adj"))); - - tmpAdj->value = xs_status.currSong; - tmpAdj->lower = 1; - tmpAdj->upper = xs_status.pTune->nsubTunes; - gtk_adjustment_value_changed(tmpAdj); - isEnabled = TRUE; - } else - isEnabled = FALSE; - - /* Enable or disable subtune-control in fileinfo window */ - gtk_widget_set_sensitive(LUW("fileinfo_subctrl_prev"), isEnabled); - gtk_widget_set_sensitive(LUW("fileinfo_subctrl_adj"), isEnabled); - gtk_widget_set_sensitive(LUW("fileinfo_subctrl_next"), isEnabled); - } -} - - -void xs_fileinfo_setsong(void) -{ - pthread_mutex_lock(&xs_mutex); - xs_status.currSong = gtk_range_get_adjustment(GTK_RANGE(LUW("fileinfo_subctrl_adj")))->value; - pthread_mutex_unlock(&xs_mutex); -} - - -void xs_subctrl_setsong(void) -{ - pthread_mutex_lock(&xs_mutex); - xs_status.currSong = GTK_ADJUSTMENT(xs_subctrl_adj)->value; - pthread_mutex_unlock(&xs_mutex); -} - - -void xs_subctrl_prevsong(void) -{ - if (xs_status.pTune && xs_status.isPlaying) - { - pthread_mutex_lock(&xs_mutex); - if (xs_status.currSong > 1) - xs_status.currSong--; - pthread_mutex_unlock(&xs_mutex); - } - - xs_subctrl_update(); -} - - -void xs_subctrl_nextsong(void) -{ - if (xs_status.pTune && xs_status.isPlaying) - { - pthread_mutex_lock(&xs_mutex); - if (xs_status.currSong < xs_status.pTune->nsubTunes) - xs_status.currSong++; - pthread_mutex_unlock(&xs_mutex); - } - - xs_subctrl_update(); + XS_MUTEX_UNLOCK(xs_status); } 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); } @@ -620,8 +606,14 @@ { GtkWidget *frame25, *hbox15, *subctrl_prev, *subctrl_current, *subctrl_next; - if (!xs_status.pTune || !xs_status.isPlaying || - xs_subctrl || (xs_status.pTune->nsubTunes <= 1)) return; + 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_DIALOG); @@ -656,7 +648,7 @@ 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.pTune->nsubTunes, 1, 1, 0); + xs_subctrl_adj = gtk_adjustment_new (xs_status.currSong, 1, xs_status.tuneInfo->nsubTunes, 1, 1, 0); gtk_signal_connect (GTK_OBJECT (xs_subctrl_adj), "value_changed", GTK_SIGNAL_FUNC (xs_subctrl_setsong), NULL); @@ -681,6 +673,8 @@ GTK_SIGNAL_FUNC (xs_subctrl_keypress), NULL); gtk_widget_show_all(xs_subctrl); + + XS_MUTEX_UNLOCK(xs_subctrl); } @@ -696,16 +690,22 @@ void xs_seek(gint iTime) { /* Check status */ - if (!xs_status.pTune || !xs_status.isPlaying) return; + XS_MUTEX_LOCK(xs_status); + if (!xs_status.tuneInfo || !xs_status.isPlaying) + { + XS_MUTEX_UNLOCK(xs_status); + return; + } - /* Act according to settings */ + /* Act according to settings */ + XS_MUTEX_LOCK(xs_cfg); switch (xs_cfg.subsongControl) { case XS_SSC_SEEK: if (iTime < xs_status.lastTime) - xs_subctrl_prevsong(); + xs_change_subtune(-1); else if (iTime > xs_status.lastTime) - xs_subctrl_nextsong(); + xs_change_subtune(1); break; case XS_SSC_POPUP: @@ -715,18 +715,14 @@ /* If we have song-position patch, check settings */ #ifdef HAVE_SONG_POSITION case XS_SSC_PATCH: - pthread_mutex_lock(&xs_mutex); - - if ((iTime > 0) && (iTime <= xs_status.pTune->nsubTunes)) + if ((iTime > 0) && (iTime <= xs_status.tuneInfo->nsubTunes)) xs_status.currSong = iTime; - - pthread_mutex_unlock(&xs_mutex); break; #endif + } - default: - break; - } + XS_MUTEX_UNLOCK(xs_cfg); + XS_MUTEX_UNLOCK(xs_status); } @@ -740,18 +736,30 @@ gint xs_get_time(void) { /* If errorflag is set, return -2 to signal it to XMMS's idle callback */ + XS_MUTEX_LOCK(xs_status); + if (xs_status.isError) + { + XS_MUTEX_UNLOCK(xs_status); return -2; + } /* If there is no tune, return -1 */ - if (!xs_status.pTune) + if (!xs_status.tuneInfo) + { + XS_MUTEX_UNLOCK(xs_status); return -1; + } /* If tune has ended, return -1 */ if (!xs_status.isPlaying) + { + XS_MUTEX_UNLOCK(xs_status); return -1; + } /* Let's see what we do */ + XS_MUTEX_LOCK(xs_cfg); switch (xs_cfg.subsongControl) { case XS_SSC_SEEK: xs_status.lastTime = (xs_plugin_ip.output->output_time() / 1000); @@ -759,13 +767,14 @@ #ifdef HAVE_SONG_POSITION case XS_SSC_PATCH: - pthread_mutex_lock(&xs_mutex); - set_song_position(xs_status.currSong, 1, xs_status.pTune->nsubTunes); - pthread_mutex_unlock(&xs_mutex); + set_song_position(xs_status.currSong, 1, xs_status.tuneInfo->nsubTunes); break; #endif } + XS_MUTEX_UNLOCK(xs_cfg); + XS_MUTEX_UNLOCK(xs_status); + /* Return output time reported by audio output plugin */ return xs_plugin_ip.output->output_time(); } @@ -779,11 +788,11 @@ */ void xs_get_song_info(gchar *songFilename, gchar **songTitle, gint *songLength) { - t_xs_tune *pInfo; + t_xs_tuneinfo *pInfo; gint tmpInt; /* Get tune information from emulation engine */ - pInfo = xs_player->plrGetSIDInfo(songFilename); + pInfo = xs_status.sidPlayer->plrGetSIDInfo(songFilename); if (!pInfo) return; /* Get sub-tune information, if available */ @@ -799,50 +808,54 @@ } /* Free tune information */ - xs_tune_free(pInfo); + xs_tuneinfo_free(pInfo); } -/* - * Allocate a new tune structure +/* Allocate a new tune information structure */ -t_xs_tune *xs_tune_new(gchar *pcFilename, gint nsubTunes, gint startTune, - gchar *tuneName, gchar *tuneComposer, gchar *tuneCopyright) +t_xs_tuneinfo *xs_tuneinfo_new(gchar *pcFilename, gint nsubTunes, gint startTune, + gchar *sidName, gchar *sidComposer, gchar *sidCopyright, + gint loadAddr, gint initAddr, gint playAddr, gint dataFileLen) { - t_xs_tune *pResult; + t_xs_tuneinfo *pResult; - pResult = (t_xs_tune *) g_malloc0(sizeof(t_xs_tune)); + pResult = (t_xs_tuneinfo *) g_malloc0(sizeof(t_xs_tuneinfo)); if (!pResult) return NULL; - pResult->tuneFilename = g_strdup(pcFilename); - if (!pResult->tuneFilename) + pResult->sidFilename = g_strdup(pcFilename); + if (!pResult->sidFilename) { g_free(pResult); return NULL; } - pResult->tuneName = g_strdup(tuneName); - pResult->tuneComposer = g_strdup(tuneComposer); - pResult->tuneCopyright = g_strdup(tuneCopyright); + pResult->sidName = g_strdup(sidName); + pResult->sidComposer = g_strdup(sidComposer); + pResult->sidCopyright = g_strdup(sidCopyright); pResult->nsubTunes = nsubTunes; pResult->startTune = startTune; + + pResult->loadAddr = loadAddr; + pResult->initAddr = initAddr; + pResult->playAddr = playAddr; + pResult->dataFileLen = dataFileLen; return pResult; } -/* - * Free tune information +/* Free given tune information structure */ -void xs_tune_free(t_xs_tune *pTune) +void xs_tuneinfo_free(t_xs_tuneinfo *pTune) { gint i; if (!pTune) return; - g_free(pTune->tuneFilename); pTune->tuneFilename = NULL; - g_free(pTune->tuneName); pTune->tuneName = NULL; - g_free(pTune->tuneComposer); pTune->tuneComposer = NULL; - g_free(pTune->tuneCopyright); pTune->tuneCopyright = NULL; + g_free(pTune->sidFilename); pTune->sidFilename = NULL; + g_free(pTune->sidName); pTune->sidName = NULL; + g_free(pTune->sidComposer); pTune->sidComposer = NULL; + g_free(pTune->sidCopyright); pTune->sidCopyright = NULL; for (i = 0; i < pTune->nsubTunes; i++) { @@ -856,3 +869,7 @@ g_free(pTune); } + +void xs_fileinfo_ok(void) +{ +}