diff options
| -rw-r--r-- | src/main.c | 4 | ||||
| -rw-r--r-- | src/settings.c | 3 | ||||
| -rw-r--r-- | src/settings.h | 1 | ||||
| -rw-r--r-- | src/ui.c | 62 | ||||
| -rw-r--r-- | src/ui.h | 4 | 
5 files changed, 74 insertions, 0 deletions
| @@ -231,6 +231,10 @@ int main (int argc, char **argv) {  					player.gain = curSong->fileGain;  					player.audioFormat = curSong->audioFormat; +					/* throw event */ +					BarUiStartEventCmd (&settings, "songstart", curStation, +							curSong); +  					/* start player */  					pthread_create (&playerThread, NULL, BarPlayerThread,  							&player); diff --git a/src/settings.c b/src/settings.c index a0dabb5..786eb53 100644 --- a/src/settings.c +++ b/src/settings.c @@ -89,6 +89,7 @@ void BarSettingsDestroy (BarSettings_t *settings) {  	free (settings->lastfmUser);  	free (settings->lastfmPassword);  	free (settings->autostartStation); +	free (settings->eventCmd);  	memset (settings, 0, sizeof (*settings));  } @@ -245,6 +246,8 @@ void BarSettingsRead (BarSettings_t *settings) {  			}  		} else if (strcmp ("autostart_station", key) == 0) {  			settings->autostartStation = strdup (val); +		} else if (strcmp ("event_command", key) == 0) { +			settings->eventCmd = strdup (val);  		}  	} diff --git a/src/settings.h b/src/settings.h index 1bea648..3fed541 100644 --- a/src/settings.h +++ b/src/settings.h @@ -52,6 +52,7 @@ struct BarSettings {  	} *keys;  	PianoAudioFormat_t audioFormat;  	char *autostartStation; +	char *eventCmd;  };  typedef struct BarSettings BarSettings_t; @@ -29,6 +29,11 @@ THE SOFTWARE.  #include <stdlib.h>  #include <string.h>  #include <readline/readline.h> +#include <errno.h> + +/* waitpid () */ +#include <sys/types.h> +#include <sys/wait.h>  #include "ui.h" @@ -398,3 +403,60 @@ inline void BarUiPrintSong (PianoSong_t *song, PianoStation_t *station) {  			station != NULL ? " @ " : "",  			station != NULL ? station->name : "");  } + +/*	Excute external event handler + *	@param settings containing the cmdline + *	@param event type + *	@param current station + *	@param current song + *	@param piano error-code + */ +void BarUiStartEventCmd (const BarSettings_t *settings, const char *type, +		const PianoStation_t *curStation, const PianoSong_t *curSong) { +	pid_t chld; +	char pipeBuf[1024]; +	int pipeFd[2]; + +	if (settings->eventCmd == NULL) { +		/* nothing to do... */ +		return; +	} + +	/* prepare stdin content */ +	memset (pipeBuf, 0, sizeof (pipeBuf)); +	snprintf (pipeBuf, sizeof (pipeBuf), +			"artist=%s\n" +			"title=%s\n" +			"album=%s\n" +			"stationName=%s\n", +			curSong->artist, +			curSong->title, +			curSong->album, +			curStation->name); +	 +	if (pipe (pipeFd) == -1) { +		BarUiMsg (MSG_ERR, "Cannot create eventcmd pipe. (%s)\n", strerror (errno)); +		return; +	} + +	chld = fork (); +	if (chld == 0) { +		/* child */ +		close (pipeFd[1]); +		dup2 (pipeFd[0], fileno (stdin)); +		execl (settings->eventCmd, settings->eventCmd, type, NULL); +		BarUiMsg (MSG_ERR, "Cannot start eventcmd. (%s)\n", strerror (errno)); +		close (pipeFd[0]); +		exit (1); +	} else if (chld == -1) { +		BarUiMsg (MSG_ERR, "Cannot fork eventcmd. (%s)\n", strerror (errno)); +	} else { +		/* parent */ +		int status; +		close (pipeFd[0]); +		write (pipeFd[1], pipeBuf, strlen (pipeBuf)); +		close (pipeFd[1]); +		/* wait to get rid of the zombie */ +		waitpid (chld, &status, 0); +	} +} @@ -26,6 +26,8 @@ THE SOFTWARE.  #include <piano.h> +#include "settings.h" +  typedef enum {MSG_NONE, MSG_INFO, MSG_PLAYING, MSG_TIME, MSG_ERR,  		MSG_QUESTION, MSG_LIST} uiMsg_t; @@ -38,5 +40,7 @@ char *BarUiSelectMusicId (const PianoHandle_t *ph);  void BarStationFromGenre (PianoHandle_t *ph);  inline void BarUiPrintStation (PianoStation_t *);  inline void BarUiPrintSong (PianoSong_t *, PianoStation_t *); +void BarUiStartEventCmd (const BarSettings_t *settings, const char *type, +		const PianoStation_t *curStation, const PianoSong_t *curSong);  #endif /* _UI_H */ | 
