diff options
| -rw-r--r-- | Makefile | 3 | ||||
| -rw-r--r-- | src/main.c | 216 | ||||
| -rw-r--r-- | src/main.h | 46 | ||||
| -rw-r--r-- | src/settings.h | 10 | ||||
| -rw-r--r-- | src/ui_act.c | 300 | ||||
| -rw-r--r-- | src/ui_act.h | 50 | 
6 files changed, 332 insertions, 293 deletions
| @@ -21,7 +21,8 @@ PIANOBAR_HDR=\  		${PIANOBAR_DIR}/terminal.h \  		${PIANOBAR_DIR}/ui_act.h \  		${PIANOBAR_DIR}/ui.h \ -		${PIANOBAR_DIR}/ui_readline.h +		${PIANOBAR_DIR}/ui_readline.h \ +		${PIANOBAR_DIR}/main.h  PIANOBAR_OBJ=${PIANOBAR_SRC:.c=.o}  LIBPIANO_DIR=libpiano/src @@ -44,26 +44,18 @@ THE SOFTWARE.  /* pandora.com library */  #include <piano.h> -#include "player.h" -#include "settings.h" +#include "main.h"  #include "terminal.h"  #include "config.h"  #include "ui.h"  #include "ui_act.h"  #include "ui_readline.h" +typedef void (*BarKeyShortcutFunc_t) (BarApp_t *app, FILE *curFd); +  int main (int argc, char **argv) { -	/* handles */ -	PianoHandle_t ph; -	WaitressHandle_t waith; -	static struct audioPlayer player; -	BarSettings_t settings; +	static BarApp_t app;  	pthread_t playerThread; -	/* playlist; first item is current song */ -	PianoSong_t *playlist = NULL; -	PianoSong_t *songHistory = NULL; -	PianoStation_t *curStation = NULL; -	char doQuit = 0;  	/* FIXME: max path length? */  	char ctlPath[1024];  	FILE *ctlFd = NULL; @@ -74,6 +66,8 @@ int main (int argc, char **argv) {  	/* terminal attributes _before_ we started messing around with ~ECHO */  	struct termios termOrig; +	memset (&app, 0, sizeof (app)); +  	/* save terminal attributes, before disabling echoing */  	BarTermSave (&termOrig); @@ -81,17 +75,17 @@ int main (int argc, char **argv) {  	BarTermSetBuffer (0);  	/* init some things */  	ao_initialize (); -	PianoInit (&ph); +	PianoInit (&app.ph); -	WaitressInit (&waith); -	strncpy (waith.host, PIANO_RPC_HOST, sizeof (waith.host)-1); -	strncpy (waith.port, PIANO_RPC_PORT, sizeof (waith.port)-1); +	WaitressInit (&app.waith); +	strncpy (app.waith.host, PIANO_RPC_HOST, sizeof (app.waith.host)-1); +	strncpy (app.waith.port, PIANO_RPC_PORT, sizeof (app.waith.port)-1); -	BarSettingsInit (&settings); -	BarSettingsRead (&settings); +	BarSettingsInit (&app.settings); +	BarSettingsRead (&app.settings);  	BarUiMsg (MSG_NONE, "Welcome to " PACKAGE "! Press %c for a list of commands.\n", -			settings.keys[BAR_KS_HELP]); +			app.settings.keys[BAR_KS_HELP]);  	/* init fds */  	FD_ZERO(&readSet); @@ -110,44 +104,44 @@ int main (int argc, char **argv) {  		BarUiMsg (MSG_INFO, "Control fifo at %s opened\n", ctlPath);  	} -	if (settings.username == NULL) { +	if (app.settings.username == NULL) {  		char nameBuf[100];  		BarUiMsg (MSG_QUESTION, "Username: ");  		BarReadlineStr (nameBuf, sizeof (nameBuf), 0, stdin); -		settings.username = strdup (nameBuf); +		app.settings.username = strdup (nameBuf);  	} -	if (settings.password == NULL) { +	if (app.settings.password == NULL) {  		char passBuf[100];  		BarUiMsg (MSG_QUESTION, "Password: ");  		BarReadlineStr (passBuf, sizeof (passBuf), 1, stdin); -		settings.password = strdup (passBuf); +		app.settings.password = strdup (passBuf);  	}  	/* set up proxy (control proxy for non-us citizen or global proxy for poor  	 * firewalled fellows) */ -	if (settings.controlProxy != NULL) { +	if (app.settings.controlProxy != NULL) {  		/* control proxy overrides global proxy */  		char tmpPath[2]; -		WaitressSplitUrl (settings.controlProxy, waith.proxyHost, -				sizeof (waith.proxyHost), waith.proxyPort, -				sizeof (waith.proxyPort), tmpPath, sizeof (tmpPath)); -	} else if (settings.proxy != NULL && strlen (settings.proxy) > 0) { +		WaitressSplitUrl (app.settings.controlProxy, app.waith.proxyHost, +				sizeof (app.waith.proxyHost), app.waith.proxyPort, +				sizeof (app.waith.proxyPort), tmpPath, sizeof (tmpPath)); +	} else if (app.settings.proxy != NULL && strlen (app.settings.proxy) > 0) {  		char tmpPath[2]; -		WaitressSplitUrl (settings.proxy, waith.proxyHost, -				sizeof (waith.proxyHost), waith.proxyPort, -				sizeof (waith.proxyPort), tmpPath, sizeof (tmpPath)); +		WaitressSplitUrl (app.settings.proxy, app.waith.proxyHost, +				sizeof (app.waith.proxyHost), app.waith.proxyPort, +				sizeof (app.waith.proxyPort), tmpPath, sizeof (tmpPath));  	}  	{  		PianoReturn_t pRet;  		WaitressReturn_t wRet;  		PianoRequestDataLogin_t reqData; -		reqData.user = settings.username; -		reqData.password = settings.password; +		reqData.user = app.settings.username; +		reqData.password = app.settings.password;  		BarUiMsg (MSG_INFO, "Login... "); -		if (!BarUiPianoCall (&ph, PIANO_REQUEST_LOGIN, &waith, &reqData, &pRet, -				&wRet)) { +		if (!BarUiPianoCall (&app.ph, PIANO_REQUEST_LOGIN, &app.waith, +				&reqData, &pRet, &wRet)) {  			BarTermRestore (&termOrig);  			return 0;  		} @@ -158,71 +152,71 @@ int main (int argc, char **argv) {  		WaitressReturn_t wRet;  		BarUiMsg (MSG_INFO, "Get stations... "); -		if (!BarUiPianoCall (&ph, PIANO_REQUEST_GET_STATIONS, &waith, NULL, -				&pRet, &wRet)) { +		if (!BarUiPianoCall (&app.ph, PIANO_REQUEST_GET_STATIONS, &app.waith, +				NULL, &pRet, &wRet)) {  			BarTermRestore (&termOrig);  			return 0;  		}  	}  	/* try to get autostart station */ -	if (settings.autostartStation != NULL) { -		curStation = PianoFindStationById (ph.stations, -				settings.autostartStation); -		if (curStation == NULL) { +	if (app.settings.autostartStation != NULL) { +		app.curStation = PianoFindStationById (app.ph.stations, +				app.settings.autostartStation); +		if (app.curStation == NULL) {  			BarUiMsg (MSG_ERR, "Error: Autostart station not found.\n");  		}  	}  	/* no autostart? ask the user */ -	if (curStation == NULL) { -		curStation = BarUiSelectStation (&ph, "Select station: ", -				settings.sortOrder, stdin); +	if (app.curStation == NULL) { +		app.curStation = BarUiSelectStation (&app.ph, "Select station: ", +				app.settings.sortOrder, stdin);  	} -	if (curStation != NULL) { -		BarUiPrintStation (curStation); +	if (app.curStation != NULL) { +		BarUiPrintStation (app.curStation);  	}  	/* little hack, needed to signal: hey! we need a playlist, but don't  	 * free anything (there is nothing to be freed yet) */ -	memset (&player, 0, sizeof (player)); +	memset (&app.player, 0, sizeof (app.player)); -	while (!doQuit) { +	while (!app.doQuit) {  		/* song finished playing, clean up things/scrobble song */ -		if (player.mode == PLAYER_FINISHED_PLAYBACK) { -			BarUiStartEventCmd (&settings, "songfinish", curStation, playlist, -					&player, PIANO_RET_OK, WAITRESS_RET_OK); +		if (app.player.mode == PLAYER_FINISHED_PLAYBACK) { +			BarUiStartEventCmd (&app.settings, "songfinish", app.curStation, +					app.playlist, &app.player, PIANO_RET_OK, WAITRESS_RET_OK);  			/* FIXME: pthread_join blocks everything if network connection  			 * is hung up e.g. */  			void *threadRet;  			pthread_join (playerThread, &threadRet);  			/* don't continue playback if thread reports error */  			if (threadRet != (void *) PLAYER_RET_OK) { -				curStation = NULL; +				app.curStation = NULL;  			} -			memset (&player, 0, sizeof (player)); +			memset (&app.player, 0, sizeof (app.player));  		}  		/* check whether player finished playing and start playing new  		 * song */ -		if (player.mode >= PLAYER_FINISHED_PLAYBACK || -				player.mode == PLAYER_FREED) { -			if (curStation != NULL) { +		if (app.player.mode >= PLAYER_FINISHED_PLAYBACK || +				app.player.mode == PLAYER_FREED) { +			if (app.curStation != NULL) {  				/* what's next? */ -				if (playlist != NULL) { -					if (settings.history != 0) { +				if (app.playlist != NULL) { +					if (app.settings.history != 0) {  						/* prepend song to history list */ -						PianoSong_t *tmpSong = songHistory; -						songHistory = playlist; +						PianoSong_t *tmpSong = app.songHistory; +						app.songHistory = app.playlist;  						/* select next song */ -						playlist = playlist->next; -						songHistory->next = tmpSong; +						app.playlist = app.playlist->next; +						app.songHistory->next = tmpSong;  						/* limit history's length */  						/* start with 1, so we're stopping at n-1 and have the  						 * chance to set ->next = NULL */  						unsigned int i = 1; -						tmpSong = songHistory; -						while (i < settings.history && tmpSong != NULL) { +						tmpSong = app.songHistory; +						while (i < app.settings.history && tmpSong != NULL) {  							tmpSong = tmpSong->next;  							++i;  						} @@ -236,70 +230,71 @@ int main (int argc, char **argv) {  						}  					} else {  						/* don't keep history */ -						playlist = playlist->next; +						app.playlist = app.playlist->next;  					}  				} -				if (playlist == NULL) { +				if (app.playlist == NULL) {  					PianoReturn_t pRet;  					WaitressReturn_t wRet;  					PianoRequestDataGetPlaylist_t reqData; -					reqData.station = curStation; -					reqData.format = settings.audioFormat; +					reqData.station = app.curStation; +					reqData.format = app.settings.audioFormat;  					BarUiMsg (MSG_INFO, "Receiving new playlist... "); -					if (!BarUiPianoCall (&ph, PIANO_REQUEST_GET_PLAYLIST, -							&waith, &reqData, &pRet, &wRet)) { -						curStation = NULL; +					if (!BarUiPianoCall (&app.ph, PIANO_REQUEST_GET_PLAYLIST, +							&app.waith, &reqData, &pRet, &wRet)) { +						app.curStation = NULL;  					} else { -						playlist = reqData.retPlaylist; -						if (playlist == NULL) { +						app.playlist = reqData.retPlaylist; +						if (app.playlist == NULL) {  							BarUiMsg (MSG_INFO, "No tracks left.\n"); -							curStation = NULL; +							app.curStation = NULL;  						}  					} -					BarUiStartEventCmd (&settings, "stationfetchplaylist", -							curStation, playlist, &player, pRet, wRet); +					BarUiStartEventCmd (&app.settings, "stationfetchplaylist", +							app.curStation, app.playlist, &app.player, pRet, +							wRet);  				}  				/* song ready to play */ -				if (playlist != NULL) { -					BarUiPrintSong (playlist, curStation->isQuickMix ? -							PianoFindStationById (ph.stations, -							playlist->stationId) : NULL); +				if (app.playlist != NULL) { +					BarUiPrintSong (app.playlist, app.curStation->isQuickMix ? +							PianoFindStationById (app.ph.stations, +							app.playlist->stationId) : NULL); -					if (playlist->audioUrl == NULL) { +					if (app.playlist->audioUrl == NULL) {  						BarUiMsg (MSG_ERR, "Invalid song url.\n");  					} else {  						/* setup player */ -						memset (&player, 0, sizeof (player)); +						memset (&app.player, 0, sizeof (app.player)); -						WaitressInit (&player.waith); -						WaitressSetUrl (&player.waith, playlist->audioUrl); +						WaitressInit (&app.player.waith); +						WaitressSetUrl (&app.player.waith, app.playlist->audioUrl);  						/* set up global proxy, player is NULLed on songfinish */ -						if (settings.proxy != NULL) { +						if (app.settings.proxy != NULL) {  							char tmpPath[2]; -							WaitressSplitUrl (settings.proxy, -									player.waith.proxyHost, -									sizeof (player.waith.proxyHost), -									player.waith.proxyPort, -									sizeof (player.waith.proxyPort), tmpPath, +							WaitressSplitUrl (app.settings.proxy, +									app.player.waith.proxyHost, +									sizeof (app.player.waith.proxyHost), +									app.player.waith.proxyPort, +									sizeof (app.player.waith.proxyPort), tmpPath,  									sizeof (tmpPath));  						} -						player.gain = playlist->fileGain; -						player.audioFormat = playlist->audioFormat; +						app.player.gain = app.playlist->fileGain; +						app.player.audioFormat = app.playlist->audioFormat;  						/* throw event */ -						BarUiStartEventCmd (&settings, "songstart", curStation, -								playlist, &player, PIANO_RET_OK, -								WAITRESS_RET_OK); +						BarUiStartEventCmd (&app.settings, "songstart", +								app.curStation, app.playlist, &app.player, +								PIANO_RET_OK, WAITRESS_RET_OK);  						/* prevent race condition, mode must _not_ be FREED if  						 * thread has been started */ -						player.mode = PLAYER_STARTING; +						app.player.mode = PLAYER_STARTING;  						/* start player */  						pthread_create (&playerThread, NULL, BarPlayerThread, -								&player); +								&app.player);  					} /* end if audioUrl == NULL */  				} /* end if playlist != NULL */  			} /* end if curStation != NULL */ @@ -323,7 +318,7 @@ int main (int argc, char **argv) {  			size_t i;  			for (i = 0; i < BAR_KS_COUNT; i++) { -				if (settings.keys[i] == buf) { +				if (app.settings.keys[i] == buf) {  					static const BarKeyShortcutFunc_t idToF[] = {BarUiActHelp,  							BarUiActLoveSong, BarUiActBanSong,  							BarUiActAddMusic, BarUiActCreateStation, @@ -335,20 +330,19 @@ int main (int argc, char **argv) {  							BarUiActSelectStation, BarUiActTempBanSong,  							BarUiActPrintUpcoming, BarUiActSelectQuickMix,  							BarUiActDebug, BarUiActBookmark}; -					idToF[i] (&ph, &waith, &player, &settings, &playlist, -							&curStation, &songHistory, &doQuit, curFd); +					idToF[i] (&app, curFd);  					break;  				}  			}  		}  		/* show time */ -		if (player.mode >= PLAYER_SAMPLESIZE_INITIALIZED && -				player.mode < PLAYER_FINISHED_PLAYBACK) { +		if (app.player.mode >= PLAYER_SAMPLESIZE_INITIALIZED && +				app.player.mode < PLAYER_FINISHED_PLAYBACK) {  			/* Ugly: songDuration is unsigned _long_ int! Lets hope this won't  			 * overflow */ -			int songRemaining = (signed long int) (player.songDuration - player.songPlayed) -					/ BAR_PLAYER_MS_TO_S_FACTOR; +			int songRemaining = (signed long int) (app.player.songDuration - +					app.player.songPlayed) / BAR_PLAYER_MS_TO_S_FACTOR;  			char pos = 0;  			if (songRemaining < 0) {  				/* Use plus sign if song is longer than expected */ @@ -357,23 +351,23 @@ int main (int argc, char **argv) {  			}  			BarUiMsg (MSG_TIME, "%c%02i:%02i/%02i:%02i\r", (pos ? '+' : '-'),  					songRemaining / 60, songRemaining % 60, -					player.songDuration / BAR_PLAYER_MS_TO_S_FACTOR / 60, -					player.songDuration / BAR_PLAYER_MS_TO_S_FACTOR % 60); +					app.player.songDuration / BAR_PLAYER_MS_TO_S_FACTOR / 60, +					app.player.songDuration / BAR_PLAYER_MS_TO_S_FACTOR % 60);  		}  	}  	/* destroy everything (including the world...) */ -	if (player.mode != PLAYER_FREED) { +	if (app.player.mode != PLAYER_FREED) {  		pthread_join (playerThread, NULL);  	}  	if (ctlFd != NULL) {  		fclose (ctlFd);  	} -	PianoDestroy (&ph); -	PianoDestroyPlaylist (songHistory); -	PianoDestroyPlaylist (playlist); +	PianoDestroy (&app.ph); +	PianoDestroyPlaylist (app.songHistory); +	PianoDestroyPlaylist (app.playlist);  	ao_shutdown(); -	BarSettingsDestroy (&settings); +	BarSettingsDestroy (&app.settings);  	/* restore terminal attributes, zsh doesn't need this, bash does... */  	BarTermRestore (&termOrig); diff --git a/src/main.h b/src/main.h new file mode 100644 index 0000000..e22e2c0 --- /dev/null +++ b/src/main.h @@ -0,0 +1,46 @@ +/* +Copyright (c) 2008-2010 +	Lars-Dominik Braun <PromyLOPh@lavabit.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +#ifndef _MAIN_H +#define _MAIN_H + +#include <piano.h> +#include <waitress.h> + +#include "player.h" +#include "settings.h" + +typedef struct { +	PianoHandle_t ph; +	WaitressHandle_t waith; +	struct audioPlayer player; +	BarSettings_t settings; +	/* first item is current song */ +	PianoSong_t *playlist; +	PianoSong_t *songHistory; +	PianoStation_t *curStation; +	char doQuit; +} BarApp_t; + +#endif /* _MAIN_H */ + diff --git a/src/settings.h b/src/settings.h index 2505321..f977a47 100644 --- a/src/settings.h +++ b/src/settings.h @@ -27,14 +27,6 @@ THE SOFTWARE.  #include <piano.h>  #include <waitress.h> -#include "player.h" - -#define BAR_KS_ARGS PianoHandle_t *ph, WaitressHandle_t *waith, \ -		struct audioPlayer *player, \ -		BarSettings_t *settings, PianoSong_t **curSong, \ -		PianoStation_t **curStation, PianoSong_t **songHistory, char *doQuit, \ -		FILE *curFd -  /* keep in mind that you have to update several arrays in main.c/ui_act.c too,   * if you're adding new shortcuts */  typedef enum { @@ -87,8 +79,6 @@ typedef struct {  	char *eventCmd;  } BarSettings_t; -typedef void (*BarKeyShortcutFunc_t) (BAR_KS_ARGS); -  void BarSettingsInit (BarSettings_t *);  void BarSettingsDestroy (BarSettings_t *);  void BarSettingsRead (BarSettings_t *); diff --git a/src/ui_act.c b/src/ui_act.c index d907304..d411474 100644 --- a/src/ui_act.c +++ b/src/ui_act.c @@ -31,11 +31,11 @@ THE SOFTWARE.  #include "ui_act.h"  #include "ui_readline.h" -#define RETURN_IF_NO_STATION if (*curStation == NULL) { \ +#define RETURN_IF_NO_STATION if (app->curStation == NULL) { \  		BarUiMsg (MSG_ERR, "No station selected.\n"); \  		return; } -#define RETURN_IF_NO_SONG if (*curStation == NULL || *curSong == NULL) { \ +#define RETURN_IF_NO_SONG if (app->curStation == NULL || app->playlist == NULL) { \  		BarUiMsg (MSG_ERR, "No song playing.\n"); \  		return; } @@ -70,7 +70,7 @@ static int BarTransformIfShared (PianoHandle_t *ph, WaitressHandle_t *waith,  /*	print current shortcut configuration   */ -void BarUiActHelp (BAR_KS_ARGS) { +BarUiActCallback(BarUiActHelp) {  	static const char *idToDesc[] = {  			NULL,  			"love current song", @@ -100,85 +100,86 @@ void BarUiActHelp (BAR_KS_ARGS) {  	BarUiMsg (MSG_NONE, "\r");  	for (i = 0; i < BAR_KS_COUNT; i++) {  		if (idToDesc[i] != NULL) { -			BarUiMsg (MSG_LIST, "%c    %s\n", settings->keys[i], idToDesc[i]); +			BarUiMsg (MSG_LIST, "%c    %s\n", app->settings.keys[i], idToDesc[i]);  		}  	}  }  /*	add more music to current station   */ -void BarUiActAddMusic (BAR_KS_ARGS) { +BarUiActCallback(BarUiActAddMusic) {  	PianoReturn_t pRet;  	WaitressReturn_t wRet;  	PianoRequestDataAddSeed_t reqData;  	RETURN_IF_NO_STATION; -	reqData.musicId = BarUiSelectMusicId (ph, waith, curFd, (*curSong)->musicId); +	reqData.musicId = BarUiSelectMusicId (&app->ph, &app->waith, curFd, +			app->playlist->musicId);  	if (reqData.musicId != NULL) { -		if (!BarTransformIfShared (ph, waith, *curStation)) { +		if (!BarTransformIfShared (&app->ph, &app->waith, app->curStation)) {  			return;  		} -		reqData.station = *curStation; +		reqData.station = app->curStation;  		BarUiMsg (MSG_INFO, "Adding music to station... "); -		BarUiPianoCall (ph, PIANO_REQUEST_ADD_SEED, waith, &reqData, &pRet, -				&wRet); +		BarUiPianoCall (&app->ph, PIANO_REQUEST_ADD_SEED, &app->waith, &reqData, +				&pRet, &wRet);  		free (reqData.musicId); -		BarUiStartEventCmd (settings, "stationaddmusic", *curStation, *curSong, -				player, pRet, wRet); +		BarUiStartEventCmd (&app->settings, "stationaddmusic", app->curStation, +				app->playlist, &app->player, pRet, wRet);  	}  }  /*	ban song   */ -void BarUiActBanSong (BAR_KS_ARGS) { +BarUiActCallback(BarUiActBanSong) {  	PianoReturn_t pRet;  	WaitressReturn_t wRet;  	RETURN_IF_NO_SONG; -	if (!BarTransformIfShared (ph, waith, *curStation)) { +	if (!BarTransformIfShared (&app->ph, &app->waith, app->curStation)) {  		return;  	}  	PianoRequestDataRateSong_t reqData; -	reqData.song = *curSong; +	reqData.song = app->playlist;  	reqData.rating = PIANO_RATE_BAN;  	BarUiMsg (MSG_INFO, "Banning song... "); -	if (BarUiPianoCall (ph, PIANO_REQUEST_RATE_SONG, waith, &reqData, &pRet, -			&wRet)) { -		BarUiDoSkipSong (player); +	if (BarUiPianoCall (&app->ph, PIANO_REQUEST_RATE_SONG, &app->waith, &reqData, +			&pRet, &wRet)) { +		BarUiDoSkipSong (&app->player);  	} -	BarUiStartEventCmd (settings, "songban", *curStation, *curSong, player, -			pRet, wRet); +	BarUiStartEventCmd (&app->settings, "songban", app->curStation, +			app->playlist, &app->player, pRet, wRet);  }  /*	create new station   */ -void BarUiActCreateStation (BAR_KS_ARGS) { +BarUiActCallback(BarUiActCreateStation) {  	PianoReturn_t pRet;  	WaitressReturn_t wRet;  	PianoRequestDataCreateStation_t reqData; -	reqData.id = BarUiSelectMusicId (ph, waith, curFd, NULL); +	reqData.id = BarUiSelectMusicId (&app->ph, &app->waith, curFd, NULL);  	if (reqData.id != NULL) {  		reqData.type = "mi";  		BarUiMsg (MSG_INFO, "Creating station... "); -		BarUiPianoCall (ph, PIANO_REQUEST_CREATE_STATION, waith, &reqData, -				&pRet, &wRet); +		BarUiPianoCall (&app->ph, PIANO_REQUEST_CREATE_STATION, &app->waith, +				&reqData, &pRet, &wRet);  		free (reqData.id); -		BarUiStartEventCmd (settings, "stationcreate", *curStation, *curSong, -				player, pRet, wRet); +		BarUiStartEventCmd (&app->settings, "stationcreate", app->curStation, +				app->playlist, &app->player, pRet, wRet);  	}  }  /*	add shared station by id   */ -void BarUiActAddSharedStation (BAR_KS_ARGS) { +BarUiActCallback(BarUiActAddSharedStation) {  	PianoReturn_t pRet;  	WaitressReturn_t wRet;  	PianoRequestDataCreateStation_t reqData; @@ -190,79 +191,80 @@ void BarUiActAddSharedStation (BAR_KS_ARGS) {  		reqData.id = stationId;  		reqData.type = "sh";  		BarUiMsg (MSG_INFO, "Adding shared station... "); -		BarUiPianoCall (ph, PIANO_REQUEST_CREATE_STATION, waith, &reqData, -				&pRet, &wRet); -		BarUiStartEventCmd (settings, "stationaddshared", *curStation, -				*curSong, player, pRet, wRet); +		BarUiPianoCall (&app->ph, PIANO_REQUEST_CREATE_STATION, &app->waith, +				&reqData, &pRet, &wRet); +		BarUiStartEventCmd (&app->settings, "stationaddshared", +				app->curStation, app->playlist, &app->player, pRet, wRet);  	}  }  /*	delete current station   */ -void BarUiActDeleteStation (BAR_KS_ARGS) { +BarUiActCallback(BarUiActDeleteStation) {  	PianoReturn_t pRet;  	WaitressReturn_t wRet;  	RETURN_IF_NO_STATION;  	BarUiMsg (MSG_QUESTION, "Really delete \"%s\"? [yN] ", -			(*curStation)->name); +			app->curStation->name);  	if (BarReadlineYesNo (0, curFd)) {  		BarUiMsg (MSG_INFO, "Deleting station... "); -		if (BarUiPianoCall (ph, PIANO_REQUEST_DELETE_STATION, waith, -				*curStation, &pRet, &wRet)) { -			BarUiDoSkipSong (player); -			PianoDestroyPlaylist (*curSong); -			*curSong = NULL; -			*curStation = NULL; +		if (BarUiPianoCall (&app->ph, PIANO_REQUEST_DELETE_STATION, +				&app->waith, app->curStation, &pRet, &wRet)) { +			BarUiDoSkipSong (&app->player); +			PianoDestroyPlaylist (app->playlist); +			app->playlist = NULL; +			app->curStation = NULL;  		} -		BarUiStartEventCmd (settings, "stationdelete", *curStation, *curSong, -				player, pRet, wRet); +		BarUiStartEventCmd (&app->settings, "stationdelete", app->curStation, +				app->playlist, &app->player, pRet, wRet);  	}  }  /*	explain pandora's song choice   */ -void BarUiActExplain (BAR_KS_ARGS) { +BarUiActCallback(BarUiActExplain) {  	PianoReturn_t pRet;  	WaitressReturn_t wRet;  	PianoRequestDataExplain_t reqData;  	RETURN_IF_NO_STATION; -	reqData.song = *curSong; +	reqData.song = app->playlist;  	BarUiMsg (MSG_INFO, "Receiving explanation... "); -	if (BarUiPianoCall (ph, PIANO_REQUEST_EXPLAIN, waith, &reqData, &pRet, -			&wRet)) { +	if (BarUiPianoCall (&app->ph, PIANO_REQUEST_EXPLAIN, &app->waith, &reqData, +			&pRet, &wRet)) {  		BarUiMsg (MSG_INFO, "%s\n", reqData.retExplain);  		free (reqData.retExplain);  	} -	BarUiStartEventCmd (settings, "songexplain", *curStation, *curSong, player, -			pRet, wRet); +	BarUiStartEventCmd (&app->settings, "songexplain", app->curStation, +			app->playlist, &app->player, pRet, wRet);  }  /*	choose genre station and add it as shared station   */ -void BarUiActStationFromGenre (BAR_KS_ARGS) { +BarUiActCallback(BarUiActStationFromGenre) {  	/* use genre station */ -	BarStationFromGenre (ph, waith, curFd); +	BarStationFromGenre (&app->ph, &app->waith, curFd);  }  /*	print verbose song information   */ -void BarUiActSongInfo (BAR_KS_ARGS) { +BarUiActCallback(BarUiActSongInfo) {  	RETURN_IF_NO_SONG; -	BarUiPrintStation ((*curStation)); +	BarUiPrintStation (app->curStation);  	/* print real station if quickmix */ -	BarUiPrintSong ((*curSong), (*curStation)->isQuickMix ? -			PianoFindStationById (ph->stations, (*curSong)->stationId) : NULL); +	BarUiPrintSong (app->playlist, app->curStation->isQuickMix ? +			PianoFindStationById (app->ph.stations, app->playlist->stationId) : +			NULL);  }  /*	print some debugging information   */ -void BarUiActDebug (BAR_KS_ARGS) { +BarUiActCallback(BarUiActDebug) {  	RETURN_IF_NO_SONG;  	/* print debug-alike infos */ @@ -280,45 +282,47 @@ void BarUiActDebug (BAR_KS_ARGS) {  			"stationId:\t%s\n"  			"title:\t%s\n"  			"userSeed:\t%s\n", -			(*curSong)->album, (*curSong)->artist, (*curSong)->audioFormat, -			(*curSong)->audioUrl, (*curSong)->fileGain, -			(*curSong)->focusTraitId, (*curSong)->identity, -			(*curSong)->matchingSeed, (*curSong)->musicId, (*curSong)->rating, -			(*curSong)->stationId, (*curSong)->title, (*curSong)->userSeed); +			app->playlist->album, app->playlist->artist, +			app->playlist->audioFormat, app->playlist->audioUrl, +			app->playlist->fileGain, app->playlist->focusTraitId, +			app->playlist->identity, app->playlist->matchingSeed, +			app->playlist->musicId, app->playlist->rating, +			app->playlist->stationId, app->playlist->title, +			app->playlist->userSeed);  }  /*	rate current song   */ -void BarUiActLoveSong (BAR_KS_ARGS) { +BarUiActCallback(BarUiActLoveSong) {  	PianoReturn_t pRet;  	WaitressReturn_t wRet;  	RETURN_IF_NO_SONG; -	if (!BarTransformIfShared (ph, waith, *curStation)) { +	if (!BarTransformIfShared (&app->ph, &app->waith, app->curStation)) {  		return;  	}  	PianoRequestDataRateSong_t reqData; -	reqData.song = *curSong; +	reqData.song = app->playlist;  	reqData.rating = PIANO_RATE_LOVE;  	BarUiMsg (MSG_INFO, "Loving song... "); -	BarUiPianoCall (ph, PIANO_REQUEST_RATE_SONG, waith, &reqData, &pRet, -			&wRet); -	BarUiStartEventCmd (settings, "songlove", *curStation, *curSong, player, -			pRet, wRet); +	BarUiPianoCall (&app->ph, PIANO_REQUEST_RATE_SONG, &app->waith, &reqData, +			&pRet, &wRet); +	BarUiStartEventCmd (&app->settings, "songlove", app->curStation, +			app->playlist, &app->player, pRet, wRet);  }  /*	skip song   */ -void BarUiActSkipSong (BAR_KS_ARGS) { -	BarUiDoSkipSong (player); +BarUiActCallback(BarUiActSkipSong) { +	BarUiDoSkipSong (&app->player);  }  /*	move song to different station   */ -void BarUiActMoveSong (BAR_KS_ARGS) { +BarUiActCallback(BarUiActMoveSong) {  	PianoReturn_t pRet;  	WaitressReturn_t wRet;  	PianoRequestDataMoveSong_t reqData; @@ -327,44 +331,45 @@ void BarUiActMoveSong (BAR_KS_ARGS) {  	RETURN_IF_NO_SONG; -	reqData.to = BarUiSelectStation (ph, "Move song to station: ", -			settings->sortOrder, curFd); +	reqData.to = BarUiSelectStation (&app->ph, "Move song to station: ", +			app->settings.sortOrder, curFd);  	if (reqData.to != NULL) {  		/* find original station (just is case we're playing a quickmix  		 * station) */ -		reqData.from = PianoFindStationById (ph->stations, (*curSong)->stationId); +		reqData.from = PianoFindStationById (app->ph.stations, +				app->playlist->stationId);  		if (reqData.from == NULL) {  			BarUiMsg (MSG_ERR, "Station not found\n");  			return;  		} -		if (!BarTransformIfShared (ph, waith, reqData.from) || -				!BarTransformIfShared (ph, waith, reqData.to)) { +		if (!BarTransformIfShared (&app->ph, &app->waith, reqData.from) || +				!BarTransformIfShared (&app->ph, &app->waith, reqData.to)) {  			return;  		}  		BarUiMsg (MSG_INFO, "Moving song to \"%s\"... ", reqData.to->name); -		reqData.song = *curSong; -		if (BarUiPianoCall (ph, PIANO_REQUEST_MOVE_SONG, waith, &reqData, -				&pRet, &wRet)) { -			BarUiDoSkipSong (player); +		reqData.song = app->playlist; +		if (BarUiPianoCall (&app->ph, PIANO_REQUEST_MOVE_SONG, &app->waith, +				&reqData, &pRet, &wRet)) { +			BarUiDoSkipSong (&app->player);  		} -		BarUiStartEventCmd (settings, "songmove", *curStation, *curSong, -				player, pRet, wRet); +		BarUiStartEventCmd (&app->settings, "songmove", app->curStation, +				app->playlist, &app->player, pRet, wRet);  	}  }  /*	pause   */ -void BarUiActPause (BAR_KS_ARGS) { +BarUiActCallback(BarUiActPause) {  	/* already locked => unlock/unpause */ -	if (pthread_mutex_trylock (&player->pauseMutex) == EBUSY) { -		pthread_mutex_unlock (&player->pauseMutex); +	if (pthread_mutex_trylock (&app->player.pauseMutex) == EBUSY) { +		pthread_mutex_unlock (&app->player.pauseMutex);  	}  }  /*	rename current station   */ -void BarUiActRenameStation (BAR_KS_ARGS) { +BarUiActCallback(BarUiActRenameStation) {  	PianoReturn_t pRet;  	WaitressReturn_t wRet;  	char lineBuf[100]; @@ -374,58 +379,58 @@ void BarUiActRenameStation (BAR_KS_ARGS) {  	BarUiMsg (MSG_QUESTION, "New name: ");  	if (BarReadlineStr (lineBuf, sizeof (lineBuf), 0, curFd) > 0) {  		PianoRequestDataRenameStation_t reqData; -		if (!BarTransformIfShared (ph, waith, *curStation)) { +		if (!BarTransformIfShared (&app->ph, &app->waith, app->curStation)) {  			return;  		} -		reqData.station = *curStation; +		reqData.station = app->curStation;  		reqData.newName = lineBuf;  		BarUiMsg (MSG_INFO, "Renaming station... "); -		BarUiPianoCall (ph, PIANO_REQUEST_RENAME_STATION, waith, &reqData, -				&pRet, &wRet); -		BarUiStartEventCmd (settings, "stationrename", *curStation, *curSong, -				player, pRet, wRet); +		BarUiPianoCall (&app->ph, PIANO_REQUEST_RENAME_STATION, &app->waith, +				&reqData, &pRet, &wRet); +		BarUiStartEventCmd (&app->settings, "stationrename", app->curStation, +				app->playlist, &app->player, pRet, wRet);  	}  }  /*	play another station   */ -void BarUiActSelectStation (BAR_KS_ARGS) { -	PianoStation_t *newStation = BarUiSelectStation (ph, "Select station: ", -			settings->sortOrder, curFd); +BarUiActCallback(BarUiActSelectStation) { +	PianoStation_t *newStation = BarUiSelectStation (&app->ph, "Select station: ", +			app->settings.sortOrder, curFd);  	if (newStation != NULL) { -		*curStation = newStation; -		BarUiPrintStation ((*curStation)); -		BarUiDoSkipSong (player); -		PianoDestroyPlaylist (*curSong); -		*curSong = NULL; +		app->curStation = newStation; +		BarUiPrintStation (app->curStation); +		BarUiDoSkipSong (&app->player); +		PianoDestroyPlaylist (app->playlist); +		app->playlist = NULL;  	}  }  /*	ban song for 1 month   */ -void BarUiActTempBanSong (BAR_KS_ARGS) { +BarUiActCallback(BarUiActTempBanSong) {  	PianoReturn_t pRet;  	WaitressReturn_t wRet;  	RETURN_IF_NO_SONG;  	BarUiMsg (MSG_INFO, "Putting song on shelf... "); -	if (BarUiPianoCall (ph, PIANO_REQUEST_ADD_TIRED_SONG, waith, *curSong, -			&pRet, &wRet)) { -		BarUiDoSkipSong (player); +	if (BarUiPianoCall (&app->ph, PIANO_REQUEST_ADD_TIRED_SONG, &app->waith, +			app->playlist, &pRet, &wRet)) { +		BarUiDoSkipSong (&app->player);  	} -	BarUiStartEventCmd (settings, "songshelf", *curStation, *curSong, player, -			pRet, wRet); +	BarUiStartEventCmd (&app->settings, "songshelf", app->curStation, +			app->playlist, &app->player, pRet, wRet);  }  /*	print upcoming songs   */ -void BarUiActPrintUpcoming (BAR_KS_ARGS) { +BarUiActCallback(BarUiActPrintUpcoming) {  	RETURN_IF_NO_SONG; -	PianoSong_t *nextSong = (*curSong)->next; +	PianoSong_t *nextSong = app->playlist->next;  	if (nextSong != NULL) {  		int i = 0;  		while (nextSong != NULL) { @@ -442,24 +447,24 @@ void BarUiActPrintUpcoming (BAR_KS_ARGS) {  /*	if current station is a quickmix: select stations that are played in   *	quickmix   */ -void BarUiActSelectQuickMix (BAR_KS_ARGS) { +BarUiActCallback(BarUiActSelectQuickMix) {  	PianoReturn_t pRet;  	WaitressReturn_t wRet;  	RETURN_IF_NO_STATION; -	if ((*curStation)->isQuickMix) { +	if (app->curStation->isQuickMix) {  		PianoStation_t *selStation; -		while ((selStation = BarUiSelectStation (ph, -				"Toggle quickmix for station: ", settings->sortOrder, +		while ((selStation = BarUiSelectStation (&app->ph, +				"Toggle quickmix for station: ", app->settings.sortOrder,  				curFd)) != NULL) {  			selStation->useQuickMix = !selStation->useQuickMix;  		}  		BarUiMsg (MSG_INFO, "Setting quickmix stations... "); -		BarUiPianoCall (ph, PIANO_REQUEST_SET_QUICKMIX, waith, NULL, &pRet, -				&wRet); -		BarUiStartEventCmd (settings, "stationquickmixtoggle", *curStation, -				*curSong, player, pRet, wRet); +		BarUiPianoCall (&app->ph, PIANO_REQUEST_SET_QUICKMIX, &app->waith, +				NULL, &pRet, &wRet); +		BarUiStartEventCmd (&app->settings, "stationquickmixtoggle", app->curStation, +				app->playlist, &app->player, pRet, wRet);  	} else {  		BarUiMsg (MSG_ERR, "Not a QuickMix station.\n");  	} @@ -467,38 +472,39 @@ void BarUiActSelectQuickMix (BAR_KS_ARGS) {  /*	quit   */ -void BarUiActQuit (BAR_KS_ARGS) { -	*doQuit = 1; -	BarUiDoSkipSong (player); +BarUiActCallback(BarUiActQuit) { +	app->doQuit = 1; +	BarUiDoSkipSong (&app->player);  }  /*	song history   */ -void BarUiActHistory (BAR_KS_ARGS) { +BarUiActCallback(BarUiActHistory) {  	PianoReturn_t pRet;  	WaitressReturn_t wRet;  	char selectBuf[2], allowedBuf[3];  	PianoSong_t *selectedSong; -	if (*songHistory != NULL) { -		selectedSong = BarUiSelectSong (*songHistory, curFd); +	if (app->songHistory != NULL) { +		selectedSong = BarUiSelectSong (app->songHistory, curFd);  		if (selectedSong != NULL) {  			/* use user-defined keybindings */ -			allowedBuf[0] = settings->keys[BAR_KS_LOVE]; -			allowedBuf[1] = settings->keys[BAR_KS_BAN]; +			allowedBuf[0] = app->settings.keys[BAR_KS_LOVE]; +			allowedBuf[1] = app->settings.keys[BAR_KS_BAN];  			allowedBuf[2] = '\0';  			BarUiMsg (MSG_QUESTION, "%s - %s: love[%c] or ban[%c]? ",  					selectedSong->artist, selectedSong->title, -					settings->keys[BAR_KS_LOVE], settings->keys[BAR_KS_BAN]); +					app->settings.keys[BAR_KS_LOVE], +					app->settings.keys[BAR_KS_BAN]);  			BarReadline (selectBuf, sizeof (selectBuf), allowedBuf, 1, 0, curFd); -			if (selectBuf[0] == settings->keys[BAR_KS_LOVE] || -					selectBuf[0] == settings->keys[BAR_KS_BAN]) { +			if (selectBuf[0] == app->settings.keys[BAR_KS_LOVE] || +					selectBuf[0] == app->settings.keys[BAR_KS_BAN]) {  				/* make sure we're transforming the _original_ station (not  				 * curStation) */  				PianoStation_t *songStation = -						PianoFindStationById (ph->stations, +						PianoFindStationById (app->ph.stations,  								selectedSong->stationId);  				if (songStation == NULL) { @@ -506,44 +512,44 @@ void BarUiActHistory (BAR_KS_ARGS) {  					return;  				} -				if (!BarTransformIfShared (ph, waith, songStation)) { +				if (!BarTransformIfShared (&app->ph, &app->waith, songStation)) {  					return;  				} -				if (selectBuf[0] == settings->keys[BAR_KS_LOVE]) { +				if (selectBuf[0] == app->settings.keys[BAR_KS_LOVE]) {  					/* FIXME: copy&waste */  					PianoRequestDataRateSong_t reqData;  					reqData.song = selectedSong;  					reqData.rating = PIANO_RATE_LOVE;  					BarUiMsg (MSG_INFO, "Loving song... "); -					BarUiPianoCall (ph, PIANO_REQUEST_RATE_SONG, waith, -							&reqData, &pRet, &wRet); +					BarUiPianoCall (&app->ph, PIANO_REQUEST_RATE_SONG, +							&app->waith, &reqData, &pRet, &wRet); -					BarUiStartEventCmd (settings, "songlove", songStation, -							selectedSong, player, pRet, wRet); -				} else if (selectBuf[0] == settings->keys[BAR_KS_BAN]) { +					BarUiStartEventCmd (&app->settings, "songlove", songStation, +							selectedSong, &app->player, pRet, wRet); +				} else if (selectBuf[0] == app->settings.keys[BAR_KS_BAN]) {  					PianoRequestDataRateSong_t reqData;  					reqData.song = selectedSong;  					reqData.rating = PIANO_RATE_BAN;  					BarUiMsg (MSG_INFO, "Banning song... "); -					BarUiPianoCall (ph, PIANO_REQUEST_RATE_SONG, waith, -							&reqData, &pRet, &wRet); -					BarUiStartEventCmd (settings, "songban", songStation, -							selectedSong, player, pRet, wRet); +					BarUiPianoCall (&app->ph, PIANO_REQUEST_RATE_SONG, +							&app->waith, &reqData, &pRet, &wRet); +					BarUiStartEventCmd (&app->settings, "songban", songStation, +							selectedSong, &app->player, pRet, wRet);  				} /* end if */  			} /* end if selectBuf[0] */  		} /* end if selectedSong != NULL */  	} else { -		BarUiMsg (MSG_INFO, (settings->history == 0) ? "History disabled.\n" : +		BarUiMsg (MSG_INFO, (app->settings.history == 0) ? "History disabled.\n" :  				"No history yet.\n");  	}  }  /*	create song bookmark   */ -void BarUiActBookmark (BAR_KS_ARGS) { +BarUiActCallback(BarUiActBookmark) {  	PianoReturn_t pRet;  	WaitressReturn_t wRet;  	char selectBuf[2]; @@ -554,16 +560,16 @@ void BarUiActBookmark (BAR_KS_ARGS) {  	BarReadline (selectBuf, sizeof (selectBuf), "sa", 1, 0, curFd);  	if (selectBuf[0] == 's') {  		BarUiMsg (MSG_INFO, "Bookmarking song... "); -		BarUiPianoCall (ph, PIANO_REQUEST_BOOKMARK_SONG, waith, *curSong, -				&pRet, &wRet); -		BarUiStartEventCmd (settings, "songbookmark", *curStation, *curSong, -				player, pRet, wRet); +		BarUiPianoCall (&app->ph, PIANO_REQUEST_BOOKMARK_SONG, &app->waith, +				app->playlist, &pRet, &wRet); +		BarUiStartEventCmd (&app->settings, "songbookmark", app->curStation, +				app->playlist, &app->player, pRet, wRet);  	} else if (selectBuf[0] == 'a') {  		BarUiMsg (MSG_INFO, "Bookmarking artist... "); -		BarUiPianoCall (ph, PIANO_REQUEST_BOOKMARK_ARTIST, waith, *curSong, -				&pRet, &wRet); -		BarUiStartEventCmd (settings, "artistbookmark", *curStation, *curSong, -				player, pRet, wRet); +		BarUiPianoCall (&app->ph, PIANO_REQUEST_BOOKMARK_ARTIST, &app->waith, +				app->playlist, &pRet, &wRet); +		BarUiStartEventCmd (&app->settings, "artistbookmark", app->curStation, +				app->playlist, &app->player, pRet, wRet);  	}  } diff --git a/src/ui_act.h b/src/ui_act.h index 2da5883..f731f72 100644 --- a/src/ui_act.h +++ b/src/ui_act.h @@ -24,29 +24,31 @@ THE SOFTWARE.  #ifndef _UI_ACT_H  #define _UI_ACT_H -#include "settings.h" - -void BarUiActHelp (BAR_KS_ARGS); -void BarUiActAddMusic (BAR_KS_ARGS); -void BarUiActBanSong (BAR_KS_ARGS); -void BarUiActCreateStation (BAR_KS_ARGS); -void BarUiActAddSharedStation (BAR_KS_ARGS); -void BarUiActDeleteStation (BAR_KS_ARGS); -void BarUiActExplain (BAR_KS_ARGS); -void BarUiActStationFromGenre (BAR_KS_ARGS); -void BarUiActSongInfo (BAR_KS_ARGS); -void BarUiActLoveSong (BAR_KS_ARGS); -void BarUiActSkipSong (BAR_KS_ARGS); -void BarUiActMoveSong (BAR_KS_ARGS); -void BarUiActPause (BAR_KS_ARGS); -void BarUiActRenameStation (BAR_KS_ARGS); -void BarUiActSelectStation (BAR_KS_ARGS); -void BarUiActTempBanSong (BAR_KS_ARGS); -void BarUiActPrintUpcoming (BAR_KS_ARGS); -void BarUiActSelectQuickMix (BAR_KS_ARGS); -void BarUiActQuit (BAR_KS_ARGS); -void BarUiActDebug (BAR_KS_ARGS); -void BarUiActHistory (BAR_KS_ARGS); -void BarUiActBookmark (BAR_KS_ARGS); +#include "main.h" + +#define BarUiActCallback(name) void name (BarApp_t *app, FILE *curFd) + +BarUiActCallback(BarUiActHelp); +BarUiActCallback(BarUiActAddMusic); +BarUiActCallback(BarUiActBanSong); +BarUiActCallback(BarUiActCreateStation); +BarUiActCallback(BarUiActAddSharedStation); +BarUiActCallback(BarUiActDeleteStation); +BarUiActCallback(BarUiActExplain); +BarUiActCallback(BarUiActStationFromGenre); +BarUiActCallback(BarUiActSongInfo); +BarUiActCallback(BarUiActLoveSong); +BarUiActCallback(BarUiActSkipSong); +BarUiActCallback(BarUiActMoveSong); +BarUiActCallback(BarUiActPause); +BarUiActCallback(BarUiActRenameStation); +BarUiActCallback(BarUiActSelectStation); +BarUiActCallback(BarUiActTempBanSong); +BarUiActCallback(BarUiActPrintUpcoming); +BarUiActCallback(BarUiActSelectQuickMix); +BarUiActCallback(BarUiActQuit); +BarUiActCallback(BarUiActDebug); +BarUiActCallback(BarUiActHistory); +BarUiActCallback(BarUiActBookmark);  #endif /* _UI_ACT_H */ | 
