aboutsummaryrefslogtreecommitdiffstats
path: root/src/player.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/player.c377
1 files changed, 214 insertions, 163 deletions
diff --git a/src/player.c b/src/player.c
index 7ac7d64aa..22c6ff88b 100644
--- a/src/player.c
+++ b/src/player.c
@@ -45,15 +45,17 @@
extern int masterPid;
-static void resetPlayerMetadata() {
- PlayerControl * pc = &(getPlayerData()->playerControl);
+static void resetPlayerMetadata()
+{
+ PlayerControl *pc = &(getPlayerData()->playerControl);
- if(pc->metadataState == PLAYER_METADATA_STATE_READ) {
+ if (pc->metadataState == PLAYER_METADATA_STATE_READ) {
pc->metadataState = PLAYER_METADATA_STATE_WRITE;
}
}
-void resetPlayer() {
+void resetPlayer()
+{
int pid;
setPlayerPid(0);
@@ -65,88 +67,88 @@ void resetPlayer() {
getPlayerData()->playerControl.state = PLAYER_STATE_STOP;
getPlayerData()->playerControl.queueState = PLAYER_QUEUE_UNLOCKED;
getPlayerData()->playerControl.seek = 0;
- getPlayerData()->playerControl.metadataState =
- PLAYER_METADATA_STATE_WRITE;
+ getPlayerData()->playerControl.metadataState =
+ PLAYER_METADATA_STATE_WRITE;
pid = getPlayerData()->playerControl.decode_pid;
- if(pid>0) kill(pid,SIGTERM);
+ if (pid > 0)
+ kill(pid, SIGTERM);
getPlayerData()->playerControl.decode_pid = 0;
}
-void player_sigChldHandler(int pid, int status) {
- if(getPlayerPid()==pid) {
+void player_sigChldHandler(int pid, int status)
+{
+ if (getPlayerPid() == pid) {
DEBUG("SIGCHLD caused by player process\n");
- if(WIFSIGNALED(status) && WTERMSIG(status)!=SIGTERM &&
- WTERMSIG(status)!=SIGINT)
- {
+ if (WIFSIGNALED(status) && WTERMSIG(status) != SIGTERM &&
+ WTERMSIG(status) != SIGINT) {
ERROR("player process died from signal: %i\n",
- WTERMSIG(status));
+ WTERMSIG(status));
}
resetPlayer();
- }
- else if(pid==getPlayerData()->playerControl.decode_pid && getPlayerPid()<=0)
- {
- if(WIFSIGNALED(status) && WTERMSIG(status)!=SIGTERM) {
+ } else if (pid == getPlayerData()->playerControl.decode_pid
+ && getPlayerPid() <= 0) {
+ if (WIFSIGNALED(status) && WTERMSIG(status) != SIGTERM) {
ERROR("(caught by master parent) "
- "decode process died from a "
- "non-TERM signal: %i\n",
- WTERMSIG(status));
+ "decode process died from a "
+ "non-TERM signal: %i\n", WTERMSIG(status));
}
getPlayerData()->playerControl.decode_pid = 0;
}
}
-int playerInit() {
+int playerInit()
+{
kill(masterPid, SIGUSR2);
/* we need to wait for the signal to take effect: */
- while (getPlayerPid()==0) my_usleep(10000);
+ while (getPlayerPid() == 0)
+ my_usleep(10000);
return 0;
}
-int playerInitReal() {
+int playerInitReal()
+{
int player_pid;
blockSignals();
player_pid = fork();
- if(player_pid==0) {
- PlayerControl * pc = &(getPlayerData()->playerControl);
+ if (player_pid == 0) {
+ PlayerControl *pc = &(getPlayerData()->playerControl);
unblockSignals();
setSigHandlersForDecoder();
- while(1) {
- if(pc->play) decode();
- else if(pc->stop) pc->stop = 0;
- else if(pc->pause) pc->pause = 0;
- else if(pc->closeAudio) {
+ while (1) {
+ if (pc->play)
+ decode();
+ else if (pc->stop)
+ pc->stop = 0;
+ else if (pc->pause)
+ pc->pause = 0;
+ else if (pc->closeAudio) {
closeAudioDevice();
pc->closeAudio = 0;
- kill(getppid(),SIGUSR1);
- }
- else if(pc->lockQueue) {
+ kill(getppid(), SIGUSR1);
+ } else if (pc->lockQueue) {
pc->queueLockState = PLAYER_QUEUE_LOCKED;
pc->lockQueue = 0;
- }
- else if(pc->unlockQueue) {
+ } else if (pc->unlockQueue) {
pc->queueLockState = PLAYER_QUEUE_UNLOCKED;
pc->unlockQueue = 0;
- }
- else if(pc->cycleLogFiles) {
+ } else if (pc->cycleLogFiles) {
myfprintfCloseAndOpenLogFile();
pc->cycleLogFiles = 0;
- }
- else my_usleep(10000);
+ } else
+ my_usleep(10000);
}
exit(EXIT_SUCCESS);
- }
- else if(player_pid<0) {
+ } else if (player_pid < 0) {
unblockSignals();
ERROR("player Problems fork()'ing\n");
setPlayerPid(0);
player_pid = 0;
return -1;
- }
- else
+ } else
setPlayerPid(player_pid);
unblockSignals();
@@ -154,15 +156,20 @@ int playerInitReal() {
return 0;
}
-int playerPlay(FILE * fp, Song * song) {
- PlayerControl * pc = &(getPlayerData()->playerControl);
+int playerPlay(FILE * fp, Song * song)
+{
+ PlayerControl *pc = &(getPlayerData()->playerControl);
- if(fp==NULL) fp = stderr;
+ if (fp == NULL)
+ fp = stderr;
- if(playerStop(fp)<0) return -1;
+ if (playerStop(fp) < 0)
+ return -1;
- if(song->tag) pc->fileTime = song->tag->time;
- else pc->fileTime = 0;
+ if (song->tag)
+ pc->fileTime = song->tag->time;
+ else
+ pc->fileTime = 0;
copyMpdTagToMetadataChunk(song->tag, &(pc->fileMetadataChunk));
@@ -170,23 +177,26 @@ int playerPlay(FILE * fp, Song * song) {
pc->utf8url[MAXPATHLEN] = '\0';
pc->play = 1;
- if(getPlayerPid()==0 && playerInit()<0) {
+ if (getPlayerPid() == 0 && playerInit() < 0) {
pc->play = 0;
return -1;
}
-
- resetPlayerMetadata();
- while(getPlayerPid()>0 && pc->play) my_usleep(1000);
-
+
+ resetPlayerMetadata();
+ while (getPlayerPid() > 0 && pc->play)
+ my_usleep(1000);
+
return 0;
}
-int playerStop(FILE * fp) {
- PlayerControl * pc = &(getPlayerData()->playerControl);
+int playerStop(FILE * fp)
+{
+ PlayerControl *pc = &(getPlayerData()->playerControl);
- if(getPlayerPid()>0 && pc->state!=PLAYER_STATE_STOP) {
+ if (getPlayerPid() > 0 && pc->state != PLAYER_STATE_STOP) {
pc->stop = 1;
- while(getPlayerPid()>0 && pc->stop) my_usleep(1000);
+ while (getPlayerPid() > 0 && pc->stop)
+ my_usleep(1000);
}
pc->queueState = PLAYER_QUEUE_BLANK;
@@ -195,127 +205,148 @@ int playerStop(FILE * fp) {
return 0;
}
-void playerKill() {
+void playerKill()
+{
int pid;
/*PlayerControl * pc = &(getPlayerData()->playerControl);
- playerStop(stderr);
- playerCloseAudio(stderr);
- if(player_pid>0 && pc->closeAudio) sleep(1);*/
+ playerStop(stderr);
+ playerCloseAudio(stderr);
+ if(player_pid>0 && pc->closeAudio) sleep(1); */
pid = getPlayerPid();
- if(pid>0) kill(pid,SIGTERM);
+ if (pid > 0)
+ kill(pid, SIGTERM);
}
-int playerPause(FILE * fp) {
- PlayerControl * pc = &(getPlayerData()->playerControl);
+int playerPause(FILE * fp)
+{
+ PlayerControl *pc = &(getPlayerData()->playerControl);
- if(getPlayerPid()>0 && pc->state!=PLAYER_STATE_STOP) {
+ if (getPlayerPid() > 0 && pc->state != PLAYER_STATE_STOP) {
pc->pause = 1;
- while(getPlayerPid()>0 && pc->pause) my_usleep(1000);
+ while (getPlayerPid() > 0 && pc->pause)
+ my_usleep(1000);
}
return 0;
}
-int playerSetPause(FILE * fp, int pause) {
- PlayerControl * pc = &(getPlayerData()->playerControl);
+int playerSetPause(FILE * fp, int pause)
+{
+ PlayerControl *pc = &(getPlayerData()->playerControl);
- if(getPlayerPid()<=0) return 0;
+ if (getPlayerPid() <= 0)
+ return 0;
- switch(pc->state) {
+ switch (pc->state) {
case PLAYER_STATE_PLAY:
- if(pause) playerPause(fp);
+ if (pause)
+ playerPause(fp);
break;
case PLAYER_STATE_PAUSE:
- if(!pause) playerPause(fp);
+ if (!pause)
+ playerPause(fp);
break;
}
return 0;
}
-int getPlayerElapsedTime() {
- return (int)(getPlayerData()->playerControl.elapsedTime+0.5);
+int getPlayerElapsedTime()
+{
+ return (int)(getPlayerData()->playerControl.elapsedTime + 0.5);
}
-unsigned long getPlayerBitRate() {
+unsigned long getPlayerBitRate()
+{
return getPlayerData()->playerControl.bitRate;
}
-int getPlayerTotalTime() {
- return (int)(getPlayerData()->playerControl.totalTime+0.5);
+int getPlayerTotalTime()
+{
+ return (int)(getPlayerData()->playerControl.totalTime + 0.5);
}
-int getPlayerState() {
+int getPlayerState()
+{
return getPlayerData()->playerControl.state;
}
-void clearPlayerError() {
+void clearPlayerError()
+{
getPlayerData()->playerControl.error = 0;
}
-int getPlayerError() {
+int getPlayerError()
+{
return getPlayerData()->playerControl.error;
}
-char * getPlayerErrorStr() {
- static char * error = NULL;
- int errorlen = MAXPATHLEN+1024;
- PlayerControl * pc = &(getPlayerData()->playerControl);
+char *getPlayerErrorStr()
+{
+ static char *error = NULL;
+ int errorlen = MAXPATHLEN + 1024;
+ PlayerControl *pc = &(getPlayerData()->playerControl);
- error = realloc(error,errorlen+1);
- memset(error,0,errorlen+1);
+ error = realloc(error, errorlen + 1);
+ memset(error, 0, errorlen + 1);
- switch(pc->error) {
+ switch (pc->error) {
case PLAYER_ERROR_FILENOTFOUND:
- snprintf(error,errorlen,
- "file \"%s\" does not exist or is inaccesible",
- pc->erroredUrl);
+ snprintf(error, errorlen,
+ "file \"%s\" does not exist or is inaccesible",
+ pc->erroredUrl);
break;
case PLAYER_ERROR_FILE:
- snprintf(error,errorlen,"problems decoding \"%s\"",
- pc->erroredUrl);
+ snprintf(error, errorlen, "problems decoding \"%s\"",
+ pc->erroredUrl);
break;
case PLAYER_ERROR_AUDIO:
- snprintf(error,errorlen,"problems opening audio device");
+ snprintf(error, errorlen, "problems opening audio device");
break;
case PLAYER_ERROR_SYSTEM:
- snprintf(error,errorlen,"system error occured");
+ snprintf(error, errorlen, "system error occured");
break;
case PLAYER_ERROR_UNKTYPE:
- snprintf(error,errorlen,"file type of \"%s\" is unknown",
- pc->erroredUrl);
+ snprintf(error, errorlen, "file type of \"%s\" is unknown",
+ pc->erroredUrl);
default:
break;
}
errorlen = strlen(error);
- error = realloc(error,errorlen+1);
+ error = realloc(error, errorlen + 1);
- if(errorlen) return error;
+ if (errorlen)
+ return error;
return NULL;
}
-void playerCloseAudio() {
- PlayerControl * pc = &(getPlayerData()->playerControl);
+void playerCloseAudio()
+{
+ PlayerControl *pc = &(getPlayerData()->playerControl);
- if(getPlayerPid()>0) {
- if(playerStop(stderr)<0) return;
+ if (getPlayerPid() > 0) {
+ if (playerStop(stderr) < 0)
+ return;
pc->closeAudio = 1;
}
}
-int queueSong(Song * song) {
- PlayerControl * pc = &(getPlayerData()->playerControl);
+int queueSong(Song * song)
+{
+ PlayerControl *pc = &(getPlayerData()->playerControl);
- if(pc->queueState==PLAYER_QUEUE_BLANK) {
- strncpy(pc->utf8url, getSongUrl(song), MAXPATHLEN);
+ if (pc->queueState == PLAYER_QUEUE_BLANK) {
+ strncpy(pc->utf8url, getSongUrl(song), MAXPATHLEN);
pc->utf8url[MAXPATHLEN] = '\0';
- if(song->tag) pc->fileTime = song->tag->time;
- else pc->fileTime = 0;
+ if (song->tag)
+ pc->fileTime = song->tag->time;
+ else
+ pc->fileTime = 0;
copyMpdTagToMetadataChunk(song->tag, &(pc->fileMetadataChunk));
@@ -326,50 +357,57 @@ int queueSong(Song * song) {
return -1;
}
-int getPlayerQueueState() {
- PlayerControl * pc = &(getPlayerData()->playerControl);
+int getPlayerQueueState()
+{
+ PlayerControl *pc = &(getPlayerData()->playerControl);
return pc->queueState;
}
-void setQueueState(int queueState) {
- PlayerControl * pc = &(getPlayerData()->playerControl);
+void setQueueState(int queueState)
+{
+ PlayerControl *pc = &(getPlayerData()->playerControl);
pc->queueState = queueState;
}
-void playerQueueLock() {
- PlayerControl * pc = &(getPlayerData()->playerControl);
+void playerQueueLock()
+{
+ PlayerControl *pc = &(getPlayerData()->playerControl);
- if(getPlayerPid()>0 && pc->queueLockState==PLAYER_QUEUE_UNLOCKED)
- {
+ if (getPlayerPid() > 0 && pc->queueLockState == PLAYER_QUEUE_UNLOCKED) {
pc->lockQueue = 1;
- while(getPlayerPid()>0 && pc->lockQueue) my_usleep(1000);
+ while (getPlayerPid() > 0 && pc->lockQueue)
+ my_usleep(1000);
}
}
-void playerQueueUnlock() {
- PlayerControl * pc = &(getPlayerData()->playerControl);
+void playerQueueUnlock()
+{
+ PlayerControl *pc = &(getPlayerData()->playerControl);
- if(getPlayerPid()>0 && pc->queueLockState==PLAYER_QUEUE_LOCKED)
- {
+ if (getPlayerPid() > 0 && pc->queueLockState == PLAYER_QUEUE_LOCKED) {
pc->unlockQueue = 1;
- while(getPlayerPid()>0 && pc->unlockQueue) my_usleep(1000);
+ while (getPlayerPid() > 0 && pc->unlockQueue)
+ my_usleep(1000);
}
}
-int playerSeek(FILE * fp, Song * song, float time) {
- PlayerControl * pc = &(getPlayerData()->playerControl);
+int playerSeek(FILE * fp, Song * song, float time)
+{
+ PlayerControl *pc = &(getPlayerData()->playerControl);
- if(pc->state==PLAYER_STATE_STOP) {
- commandError(fp, ACK_ERROR_PLAYER_SYNC,
- "player not currently playing", NULL);
+ if (pc->state == PLAYER_STATE_STOP) {
+ commandError(fp, ACK_ERROR_PLAYER_SYNC,
+ "player not currently playing", NULL);
return -1;
}
- if(strcmp(pc->utf8url, getSongUrl(song))!=0) {
- if(song->tag) pc->fileTime = song->tag->time;
- else pc->fileTime = 0;
+ if (strcmp(pc->utf8url, getSongUrl(song)) != 0) {
+ if (song->tag)
+ pc->fileTime = song->tag->time;
+ else
+ pc->fileTime = 0;
copyMpdTagToMetadataChunk(song->tag, &(pc->fileMetadataChunk));
@@ -377,89 +415,102 @@ int playerSeek(FILE * fp, Song * song, float time) {
pc->utf8url[MAXPATHLEN] = '\0';
}
- if(pc->error==PLAYER_ERROR_NOERROR) {
- resetPlayerMetadata();
+ if (pc->error == PLAYER_ERROR_NOERROR) {
+ resetPlayerMetadata();
pc->seekWhere = time;
pc->seek = 1;
- while(getPlayerPid()>0 && pc->seek) my_usleep(1000);
+ while (getPlayerPid() > 0 && pc->seek)
+ my_usleep(1000);
}
return 0;
}
-float getPlayerCrossFade() {
- PlayerControl * pc = &(getPlayerData()->playerControl);
+float getPlayerCrossFade()
+{
+ PlayerControl *pc = &(getPlayerData()->playerControl);
return pc->crossFade;
}
-void setPlayerCrossFade(float crossFadeInSeconds) {
- PlayerControl * pc;
- if(crossFadeInSeconds<0) crossFadeInSeconds = 0;
+void setPlayerCrossFade(float crossFadeInSeconds)
+{
+ PlayerControl *pc;
+ if (crossFadeInSeconds < 0)
+ crossFadeInSeconds = 0;
pc = &(getPlayerData()->playerControl);
pc->crossFade = crossFadeInSeconds;
}
-void setPlayerSoftwareVolume(int volume) {
- PlayerControl * pc;
- volume = (volume>1000) ? 1000 : (volume<0 ? 0 : volume);
+void setPlayerSoftwareVolume(int volume)
+{
+ PlayerControl *pc;
+ volume = (volume > 1000) ? 1000 : (volume < 0 ? 0 : volume);
pc = &(getPlayerData()->playerControl);
pc->softwareVolume = volume;
}
-double getPlayerTotalPlayTime() {
- PlayerControl * pc = &(getPlayerData()->playerControl);
+double getPlayerTotalPlayTime()
+{
+ PlayerControl *pc = &(getPlayerData()->playerControl);
return pc->totalPlayTime;
}
-unsigned int getPlayerSampleRate() {
- PlayerControl * pc = &(getPlayerData()->playerControl);
+unsigned int getPlayerSampleRate()
+{
+ PlayerControl *pc = &(getPlayerData()->playerControl);
return pc->sampleRate;
}
-int getPlayerBits() {
- PlayerControl * pc = &(getPlayerData()->playerControl);
+int getPlayerBits()
+{
+ PlayerControl *pc = &(getPlayerData()->playerControl);
return pc->bits;
}
-int getPlayerChannels() {
- PlayerControl * pc = &(getPlayerData()->playerControl);
+int getPlayerChannels()
+{
+ PlayerControl *pc = &(getPlayerData()->playerControl);
return pc->channels;
}
-void playerCycleLogFiles() {
- PlayerControl * pc = &(getPlayerData()->playerControl);
- DecoderControl * dc = &(getPlayerData()->decoderControl);
+void playerCycleLogFiles()
+{
+ PlayerControl *pc = &(getPlayerData()->playerControl);
+ DecoderControl *dc = &(getPlayerData()->decoderControl);
pc->cycleLogFiles = 1;
dc->cycleLogFiles = 1;
}
/* this actually creates a dupe of the current metadata */
-Song * playerCurrentDecodeSong() {
- static Song * song = NULL;
- static MetadataChunk * prev = NULL;
- Song * ret = NULL;
- PlayerControl * pc = &(getPlayerData()->playerControl);
-
- if(pc->metadataState == PLAYER_METADATA_STATE_READ) {
+Song *playerCurrentDecodeSong()
+{
+ static Song *song = NULL;
+ static MetadataChunk *prev = NULL;
+ Song *ret = NULL;
+ PlayerControl *pc = &(getPlayerData()->playerControl);
+
+ if (pc->metadataState == PLAYER_METADATA_STATE_READ) {
DEBUG("playerCurrentDecodeSong: caught new metadata!\n");
- if(prev) free(prev);
+ if (prev)
+ free(prev);
prev = malloc(sizeof(MetadataChunk));
memcpy(prev, &(pc->metadataChunk), sizeof(MetadataChunk));
- if(song) freeJustSong(song);
+ if (song)
+ freeJustSong(song);
song = newNullSong();
song->url = strdup(pc->currentUrl);
song->tag = metadataChunkToMpdTagDup(prev);
- ret = song;
+ ret = song;
resetPlayerMetadata();
}