aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/decode.c194
-rw-r--r--src/inputPlugins/wavpack_plugin.c2
-rw-r--r--src/main.c2
-rw-r--r--src/player.c199
-rw-r--r--src/player.h6
-rw-r--r--src/playerData.c25
-rw-r--r--src/playerData.h2
7 files changed, 184 insertions, 246 deletions
diff --git a/src/decode.c b/src/decode.c
index a7fc0d562..cb3f919b6 100644
--- a/src/decode.c
+++ b/src/decode.c
@@ -29,15 +29,13 @@
/* called inside decoder_task (inputPlugins) */
void decoder_wakeup_player(void)
{
- PlayerControl *pc = &(getPlayerData()->playerControl);
- wakeup_player_nb(pc);
+ wakeup_player_nb();
}
void decoder_sleep(DecoderControl * dc)
{
- PlayerControl *pc = &(getPlayerData()->playerControl);
notifyWait(&dc->notify);
- wakeup_player_nb(pc);
+ wakeup_player_nb();
}
static void player_wakeup_decoder_nb(DecoderControl * dc)
@@ -46,10 +44,10 @@ static void player_wakeup_decoder_nb(DecoderControl * dc)
}
/* called from player_task */
-static void player_wakeup_decoder(PlayerControl * pc, DecoderControl * dc)
+static void player_wakeup_decoder(DecoderControl * dc)
{
notifySignal(&dc->notify);
- player_sleep(pc);
+ player_sleep();
}
static void stopDecode(DecoderControl * dc)
@@ -60,33 +58,32 @@ static void stopDecode(DecoderControl * dc)
}
}
-static void quitDecode(PlayerControl * pc, DecoderControl * dc)
+static void quitDecode(DecoderControl * dc)
{
stopDecode(dc);
- pc->state = PLAYER_STATE_STOP;
+ pc.state = PLAYER_STATE_STOP;
dc->seek = 0;
- pc->play = 0;
- pc->stop = 0;
- pc->pause = 0;
+ pc.play = 0;
+ pc.stop = 0;
+ pc.pause = 0;
wakeup_main_task();
}
-static unsigned calculateCrossFadeChunks(PlayerControl * pc, AudioFormat * af,
- float totalTime)
+static unsigned calculateCrossFadeChunks(AudioFormat * af, float totalTime)
{
unsigned int buffered_chunks, chunks;
- if (pc->crossFade == 0 || pc->crossFade >= totalTime ||
+ if (pc.crossFade == 0 || pc.crossFade >= totalTime ||
!isCurrentAudioFormat(af))
return 0;
- assert(pc->crossFade > 0);
+ assert(pc.crossFade > 0);
assert(af->bits > 0);
assert(af->channels > 0);
assert(af->sampleRate > 0);
chunks = (af->sampleRate * af->bits * af->channels / 8.0 / CHUNK_SIZE);
- chunks = (chunks * pc->crossFade + 0.5);
+ chunks = (chunks * pc.crossFade + 0.5);
buffered_chunks = getPlayerData()->buffer.size;
assert(buffered_chunks >= buffered_before_play);
@@ -96,98 +93,98 @@ static unsigned calculateCrossFadeChunks(PlayerControl * pc, AudioFormat * af,
return chunks;
}
-static int waitOnDecode(PlayerControl * pc, DecoderControl * dc,
+static int waitOnDecode(DecoderControl * dc,
OutputBuffer * cb, int *decodeWaitedOn)
{
while (dc->start)
- player_wakeup_decoder(pc, dc);
+ player_wakeup_decoder(dc);
if (dc->error != DECODE_ERROR_NOERROR) {
- pc->errored_song = pc->current_song;
- pc->error = PLAYER_ERROR_FILE;
- quitDecode(pc, dc);
+ pc.errored_song = pc.current_song;
+ pc.error = PLAYER_ERROR_FILE;
+ quitDecode(dc);
return -1;
}
- pc->totalTime = pc->fileTime;
- pc->bitRate = 0;
- pc->sampleRate = 0;
- pc->bits = 0;
- pc->channels = 0;
+ pc.totalTime = pc.fileTime;
+ pc.bitRate = 0;
+ pc.sampleRate = 0;
+ pc.bits = 0;
+ pc.channels = 0;
*decodeWaitedOn = 1;
return 0;
}
-static int decodeSeek(PlayerControl * pc, DecoderControl * dc,
+static int decodeSeek(DecoderControl * dc,
OutputBuffer * cb, int *decodeWaitedOn, int *next)
{
int ret = -1;
if (dc->state == DECODE_STATE_STOP ||
dc->error != DECODE_ERROR_NOERROR ||
- dc->current_song != pc->current_song) {
+ dc->current_song != pc.current_song) {
stopDecode(dc);
*next = -1;
clearOutputBuffer(cb);
dc->error = DECODE_ERROR_NOERROR;
dc->start = 1;
- waitOnDecode(pc, dc, cb, decodeWaitedOn);
+ waitOnDecode(dc, cb, decodeWaitedOn);
}
if (dc->state != DECODE_STATE_STOP && dc->seekable) {
*next = -1;
- dc->seekWhere = pc->seekWhere > pc->totalTime - 0.1 ?
- pc->totalTime - 0.1 : pc->seekWhere;
+ dc->seekWhere = pc.seekWhere > pc.totalTime - 0.1 ?
+ pc.totalTime - 0.1 : pc.seekWhere;
dc->seekWhere = 0 > dc->seekWhere ? 0 : dc->seekWhere;
dc->seekError = 0;
dc->seek = 1;
- do { player_wakeup_decoder(pc, dc); } while (dc->seek);
+ do { player_wakeup_decoder(dc); } while (dc->seek);
if (!dc->seekError) {
- pc->elapsedTime = dc->seekWhere;
+ pc.elapsedTime = dc->seekWhere;
ret = 0;
}
}
- pc->seek = 0;
+ pc.seek = 0;
wakeup_main_task();
return ret;
}
-static void processDecodeInput(PlayerControl * pc, DecoderControl * dc,
+static void processDecodeInput(DecoderControl * dc,
OutputBuffer * cb,
int *pause_r, unsigned int *bbp_r,
int *doCrossFade_r,
int *decodeWaitedOn_r,
int *next_r)
{
- if(pc->lockQueue) {
- pc->queueLockState = PLAYER_QUEUE_LOCKED;
- pc->lockQueue = 0;
+ if(pc.lockQueue) {
+ pc.queueLockState = PLAYER_QUEUE_LOCKED;
+ pc.lockQueue = 0;
wakeup_main_task();
}
- if(pc->unlockQueue) {
- pc->queueLockState = PLAYER_QUEUE_UNLOCKED;
- pc->unlockQueue = 0;
+ if(pc.unlockQueue) {
+ pc.queueLockState = PLAYER_QUEUE_UNLOCKED;
+ pc.unlockQueue = 0;
wakeup_main_task();
}
- if(pc->pause) {
+ if(pc.pause) {
*pause_r = !*pause_r;
if (*pause_r) {
- pc->state = PLAYER_STATE_PAUSE;
+ pc.state = PLAYER_STATE_PAUSE;
} else {
if (openAudioDevice(NULL) >= 0) {
- pc->state = PLAYER_STATE_PLAY;
+ pc.state = PLAYER_STATE_PLAY;
} else {
char tmp[MPD_PATH_MAX];
- pc->errored_song = pc->current_song;
- pc->error = PLAYER_ERROR_AUDIO;
+ pc.errored_song = pc.current_song;
+ pc.error = PLAYER_ERROR_AUDIO;
ERROR("problems opening audio device "
"while playing \"%s\"\n",
- get_song_url(tmp, pc->current_song));
+ get_song_url(tmp, pc.current_song));
*pause_r = -1;
}
}
- pc->pause = 0;
+ pc.pause = 0;
wakeup_main_task();
if (*pause_r == -1) {
*pause_r = 1;
@@ -196,17 +193,16 @@ static void processDecodeInput(PlayerControl * pc, DecoderControl * dc,
closeAudioDevice();
}
}
- if(pc->seek) {
+ if(pc.seek) {
dropBufferedAudio();
- if(decodeSeek(pc,dc,cb,decodeWaitedOn_r,next_r) == 0) {
+ if(decodeSeek(dc,cb,decodeWaitedOn_r,next_r) == 0) {
*doCrossFade_r = 0;
*bbp_r = 0;
}
}
}
-static void decodeStart(PlayerControl * pc, OutputBuffer * cb,
- DecoderControl * dc)
+static void decodeStart(OutputBuffer * cb, DecoderControl * dc)
{
int ret;
int close_instream = 1;
@@ -215,7 +211,7 @@ static void decodeStart(PlayerControl * pc, OutputBuffer * cb,
char path_max_fs[MPD_PATH_MAX];
char path_max_utf8[MPD_PATH_MAX];
- if (!get_song_url(path_max_utf8, pc->current_song)) {
+ if (!get_song_url(path_max_utf8, pc.current_song)) {
dc->error = DECODE_ERROR_FILE;
goto stop_no_close;
}
@@ -224,7 +220,7 @@ static void decodeStart(PlayerControl * pc, OutputBuffer * cb,
utf8_to_fs_charset(path_max_fs, path_max_utf8));
}
- dc->current_song = pc->current_song; /* NEED LOCK */
+ dc->current_song = pc.current_song; /* NEED LOCK */
if (openInputStream(&inStream, path_max_fs) < 0) {
dc->error = DECODE_ERROR_FILE;
goto stop_no_close;
@@ -309,7 +305,7 @@ static void decodeStart(PlayerControl * pc, OutputBuffer * cb,
}
if (ret < 0 || ret == DECODE_ERROR_UNKTYPE) {
- pc->errored_song = pc->current_song;
+ pc.errored_song = pc.current_song;
if (ret != DECODE_ERROR_UNKTYPE)
dc->error = DECODE_ERROR_FILE;
else
@@ -328,13 +324,12 @@ static void * decoder_task(void *arg)
{
DecoderControl *dc = arg;
OutputBuffer *cb = &(getPlayerData()->buffer);
- PlayerControl *pc = &(getPlayerData()->playerControl);
notifyEnter(&dc->notify);
while (1) {
if (dc->start || dc->seek) {
- decodeStart(pc, cb, dc);
+ decodeStart(cb, dc);
} else if (dc->stop) {
dc->state = DECODE_STATE_STOP;
dc->stop = 0;
@@ -375,25 +370,24 @@ static void crossFade(OutputBufferChunk * a, OutputBufferChunk * b,
a->chunkSize = b->chunkSize;
}
-static int playChunk(PlayerControl * pc, OutputBufferChunk * chunk,
+static int playChunk(OutputBufferChunk * chunk,
AudioFormat * format, double sizeToTime)
{
- pc->elapsedTime = chunk->times;
- pc->bitRate = chunk->bitRate;
+ pc.elapsedTime = chunk->times;
+ pc.bitRate = chunk->bitRate;
pcm_volumeChange(chunk->data, chunk->chunkSize,
- format, pc->softwareVolume);
+ format, pc.softwareVolume);
if (playAudio(chunk->data,
chunk->chunkSize) < 0)
return -1;
- pc->totalPlayTime +=
- sizeToTime * chunk->chunkSize;
+ pc.totalPlayTime += sizeToTime * chunk->chunkSize;
return 0;
}
-static void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb)
+static void decodeParent(DecoderControl * dc, OutputBuffer * cb)
{
int do_pause = 0;
int buffering = 1;
@@ -411,19 +405,19 @@ static void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer *
/** the position of the first chunk in the next song */
int next = -1;
- if (waitOnDecode(pc, dc, cb, &decodeWaitedOn) < 0)
+ if (waitOnDecode(dc, cb, &decodeWaitedOn) < 0)
return;
- pc->elapsedTime = 0;
- pc->state = PLAYER_STATE_PLAY;
- pc->play = 0;
+ pc.elapsedTime = 0;
+ pc.state = PLAYER_STATE_PLAY;
+ pc.play = 0;
wakeup_main_task();
while (1) {
- processDecodeInput(pc, dc, cb,
+ processDecodeInput(dc, cb,
&do_pause, &bbp, &doCrossFade,
&decodeWaitedOn, &next);
- if (pc->stop) {
+ if (pc.stop) {
dropBufferedAudio();
break;
}
@@ -431,7 +425,7 @@ static void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer *
if (buffering) {
if (availableOutputBuffer(cb) < bbp) {
/* not enough decoded buffer space yet */
- player_sleep(pc);
+ player_sleep();
continue;
} else
/* buffering is complete */
@@ -445,47 +439,47 @@ static void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer *
decodeWaitedOn = 0;
if(openAudioDevice(&(cb->audioFormat))<0) {
char tmp[MPD_PATH_MAX];
- pc->errored_song = pc->current_song;
- pc->error = PLAYER_ERROR_AUDIO;
+ pc.errored_song = pc.current_song;
+ pc.error = PLAYER_ERROR_AUDIO;
ERROR("problems opening audio device "
"while playing \"%s\"\n",
- get_song_url(tmp, pc->current_song));
+ get_song_url(tmp, pc.current_song));
break;
} else {
- player_wakeup_decoder(pc, dc);
+ player_wakeup_decoder(dc);
}
if (do_pause) {
dropBufferedAudio();
closeAudioDevice();
}
- pc->totalTime = dc->totalTime;
- pc->sampleRate = dc->audioFormat.sampleRate;
- pc->bits = dc->audioFormat.bits;
- pc->channels = dc->audioFormat.channels;
+ pc.totalTime = dc->totalTime;
+ pc.sampleRate = dc->audioFormat.sampleRate;
+ pc.bits = dc->audioFormat.bits;
+ pc.channels = dc->audioFormat.channels;
sizeToTime = audioFormatSizeToTime(&cb->audioFormat);
}
else if(dc->state!=DECODE_STATE_START) {
/* the decoder failed */
- pc->errored_song = pc->current_song;
- pc->error = PLAYER_ERROR_FILE;
+ pc.errored_song = pc.current_song;
+ pc.error = PLAYER_ERROR_FILE;
break;
}
else {
/* the decoder is not yet ready; wait
some more */
- player_sleep(pc);
+ player_sleep();
continue;
}
}
if (dc->state == DECODE_STATE_STOP &&
- pc->queueState == PLAYER_QUEUE_FULL &&
- pc->queueLockState == PLAYER_QUEUE_UNLOCKED) {
+ pc.queueState == PLAYER_QUEUE_FULL &&
+ pc.queueLockState == PLAYER_QUEUE_UNLOCKED) {
/* the decoder has finished the current song;
make it decode the next song */
next = cb->end;
dc->start = 1;
- pc->queueState = PLAYER_QUEUE_DECODE;
+ pc.queueState = PLAYER_QUEUE_DECODE;
wakeup_main_task();
player_wakeup_decoder_nb(dc);
}
@@ -495,9 +489,7 @@ static void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer *
calculate how many chunks will be required
for it */
crossFadeChunks =
- calculateCrossFadeChunks(pc,
- &(cb->
- audioFormat),
+ calculateCrossFadeChunks(&(cb->audioFormat),
dc->totalTime);
if (crossFadeChunks > 0) {
doCrossFade = 1;
@@ -509,7 +501,7 @@ static void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer *
}
if (do_pause)
- player_sleep(pc);
+ player_sleep();
else if (!outputBufferEmpty(cb) && (int)cb->begin != next) {
OutputBufferChunk *beginChunk =
outputBufferGetChunk(cb, cb->begin);
@@ -544,14 +536,14 @@ static void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer *
} else {
/* wait for the
decoder */
- player_sleep(pc);
+ player_sleep();
continue;
}
}
}
/* play the current chunk */
- if (playChunk(pc, beginChunk, &(cb->audioFormat),
+ if (playChunk(beginChunk, &(cb->audioFormat),
sizeToTime) < 0)
break;
outputBufferShift(cb);
@@ -569,19 +561,19 @@ static void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer *
doCrossFade = 0;
/* wait for the decoder to work on the new song */
- if (pc->queueState == PLAYER_QUEUE_DECODE ||
- pc->queueLockState == PLAYER_QUEUE_LOCKED) {
- player_sleep(pc);
+ if (pc.queueState == PLAYER_QUEUE_DECODE ||
+ pc.queueLockState == PLAYER_QUEUE_LOCKED) {
+ player_sleep();
continue;
}
- if (pc->queueState != PLAYER_QUEUE_PLAY)
+ if (pc.queueState != PLAYER_QUEUE_PLAY)
break;
next = -1;
- if (waitOnDecode(pc, dc, cb, &decodeWaitedOn) < 0)
+ if (waitOnDecode(dc, cb, &decodeWaitedOn) < 0)
return;
- pc->queueState = PLAYER_QUEUE_EMPTY;
+ pc.queueState = PLAYER_QUEUE_EMPTY;
wakeup_main_task();
} else if (dc->state == DECODE_STATE_STOP && !dc->start) {
break;
@@ -592,7 +584,7 @@ static void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer *
}
}
- quitDecode(pc, dc);
+ quitDecode(dc);
}
/* decode w/ buffering
@@ -603,19 +595,17 @@ static void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer *
void decode(void)
{
OutputBuffer *cb;
- PlayerControl *pc;
DecoderControl *dc;
cb = &(getPlayerData()->buffer);
clearOutputBuffer(cb);
- pc = &(getPlayerData()->playerControl);
dc = &(getPlayerData()->decoderControl);
dc->error = DECODE_ERROR_NOERROR;
dc->seek = 0;
dc->stop = 0;
dc->start = 1;
- do { player_wakeup_decoder(pc, dc); } while (dc->start);
+ do { player_wakeup_decoder(dc); } while (dc->start);
- decodeParent(pc, dc, cb);
+ decodeParent(dc, cb);
}
diff --git a/src/inputPlugins/wavpack_plugin.c b/src/inputPlugins/wavpack_plugin.c
index 113889d2a..c46cdeb75 100644
--- a/src/inputPlugins/wavpack_plugin.c
+++ b/src/inputPlugins/wavpack_plugin.c
@@ -465,7 +465,7 @@ static int wavpack_streamdecode(OutputBuffer *cb, DecoderControl *dc,
* As we use dc->utf8url, this function will be bad for
* single files. utf8url is not absolute file path :/
*/
- utf8url = get_song_url(tmp, getPlayerData()->playerControl.current_song);
+ utf8url = get_song_url(tmp, pc.current_song);
if (utf8url == NULL) {
break;
}
diff --git a/src/main.c b/src/main.c
index 1e77dc2fd..993168a93 100644
--- a/src/main.c
+++ b/src/main.c
@@ -432,7 +432,7 @@ int main(int argc, char *argv[])
openVolumeDevice();
decoderInit(&getPlayerData()->decoderControl);
- playerInit(&getPlayerData()->playerControl);
+ playerInit();
read_state_file();
while (COMMAND_RETURN_KILL != doIOForInterfaces() &&
diff --git a/src/player.c b/src/player.c
index 98bd91177..80e0d2375 100644
--- a/src/player.c
+++ b/src/player.c
@@ -36,49 +36,47 @@
static void playerCloseAudio(void);
-void wakeup_player_nb(PlayerControl *pc)
+void wakeup_player_nb(void)
{
- notifySignal(&pc->notify);
+ notifySignal(&pc.notify);
}
-static void wakeup_player(PlayerControl *pc)
+static void wakeup_player(void)
{
- notifySignal(&pc->notify);
+ notifySignal(&pc.notify);
wait_main_task();
}
-void player_sleep(PlayerControl *pc)
+void player_sleep(void)
{
- notifyWait(&pc->notify);
+ notifyWait(&pc.notify);
}
-static void * player_task(void *arg)
+static void * player_task(mpd_unused void *arg)
{
- PlayerControl *pc = arg;
-
- notifyEnter(&pc->notify);
+ notifyEnter(&pc.notify);
while (1) {
- if (pc->play) {
+ if (pc.play) {
decode();
continue; /* decode() calls wakeup_main_task */
- } else if (pc->stop) {
- pc->stop = 0;
- } else if (pc->seek) {
- pc->seek = 0;
- } else if (pc->pause) {
- pc->pause = 0;
- } else if (pc->closeAudio) {
+ } else if (pc.stop) {
+ pc.stop = 0;
+ } else if (pc.seek) {
+ pc.seek = 0;
+ } else if (pc.pause) {
+ pc.pause = 0;
+ } else if (pc.closeAudio) {
closeAudioDevice();
- pc->closeAudio = 0;
- } else if (pc->lockQueue) {
- pc->queueLockState = PLAYER_QUEUE_LOCKED;
- pc->lockQueue = 0;
- } else if (pc->unlockQueue) {
- pc->queueLockState = PLAYER_QUEUE_UNLOCKED;
- pc->unlockQueue = 0;
+ pc.closeAudio = 0;
+ } else if (pc.lockQueue) {
+ pc.queueLockState = PLAYER_QUEUE_LOCKED;
+ pc.lockQueue = 0;
+ } else if (pc.unlockQueue) {
+ pc.queueLockState = PLAYER_QUEUE_UNLOCKED;
+ pc.unlockQueue = 0;
} else {
- player_sleep(pc);
+ player_sleep();
continue;
}
/* we did something, tell the main task about it */
@@ -87,14 +85,14 @@ static void * player_task(void *arg)
return NULL;
}
-void playerInit(PlayerControl * pc)
+void playerInit(void)
{
pthread_attr_t attr;
pthread_t player_thread;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- if (pthread_create(&player_thread, &attr, player_task, pc))
+ if (pthread_create(&player_thread, &attr, player_task, NULL))
FATAL("Failed to spawn player task: %s\n", strerror(errno));
}
@@ -108,38 +106,34 @@ int playerWait(int fd)
return 0;
}
-static void set_current_song(PlayerControl * pc, Song *song)
+static void set_current_song(Song *song)
{
- pc->fileTime = song->tag ? song->tag->time : 0;
- pc->current_song = song;
+ pc.fileTime = song->tag ? song->tag->time : 0;
+ pc.current_song = song;
}
int playerPlay(int fd, Song * song)
{
- PlayerControl *pc = &(getPlayerData()->playerControl);
-
if (playerStop(fd) < 0)
return -1;
- set_current_song(pc, song);
+ set_current_song(song);
- pc->play = 1;
+ pc.play = 1;
/* FIXME: _nb() variant is probably wrong here, and everywhere... */
- do { wakeup_player_nb(pc); } while (pc->play);
+ do { wakeup_player_nb(); } while (pc.play);
return 0;
}
int playerStop(int fd)
{
- PlayerControl *pc = &(getPlayerData()->playerControl);
-
- if (pc->state != PLAYER_STATE_STOP) {
- pc->stop = 1;
- do { wakeup_player(pc); } while (pc->stop);
+ if (pc.state != PLAYER_STATE_STOP) {
+ pc.stop = 1;
+ do { wakeup_player(); } while (pc.stop);
}
- pc->queueState = PLAYER_QUEUE_BLANK;
+ pc.queueState = PLAYER_QUEUE_BLANK;
playerQueueUnlock();
return 0;
@@ -152,11 +146,9 @@ void playerKill(void) /* deprecated */
int playerPause(int fd)
{
- PlayerControl *pc = &(getPlayerData()->playerControl);
-
- if (pc->state != PLAYER_STATE_STOP) {
- pc->pause = 1;
- do { wakeup_player(pc); } while (pc->pause);
+ if (pc.state != PLAYER_STATE_STOP) {
+ pc.pause = 1;
+ do { wakeup_player(); } while (pc.pause);
}
return 0;
@@ -164,9 +156,7 @@ int playerPause(int fd)
int playerSetPause(int fd, int pause_flag)
{
- PlayerControl *pc = &(getPlayerData()->playerControl);
-
- switch (pc->state) {
+ switch (pc.state) {
case PLAYER_STATE_PLAY:
if (pause_flag)
playerPause(fd);
@@ -182,32 +172,32 @@ int playerSetPause(int fd, int pause_flag)
int getPlayerElapsedTime(void)
{
- return (int)(getPlayerData()->playerControl.elapsedTime + 0.5);
+ return (int)(pc.elapsedTime + 0.5);
}
unsigned long getPlayerBitRate(void)
{
- return getPlayerData()->playerControl.bitRate;
+ return pc.bitRate;
}
int getPlayerTotalTime(void)
{
- return (int)(getPlayerData()->playerControl.totalTime + 0.5);
+ return (int)(pc.totalTime + 0.5);
}
int getPlayerState(void)
{
- return getPlayerData()->playerControl.state;
+ return pc.state;
}
void clearPlayerError(void)
{
- getPlayerData()->playerControl.error = 0;
+ pc.error = 0;
}
int getPlayerError(void)
{
- return getPlayerData()->playerControl.error;
+ return pc.error;
}
char *getPlayerErrorStr(void)
@@ -216,18 +206,17 @@ char *getPlayerErrorStr(void)
static char error[MPD_PATH_MAX + 64]; /* still too much */
static const size_t errorlen = sizeof(error);
char path_max_tmp[MPD_PATH_MAX];
- PlayerControl *pc = &(getPlayerData()->playerControl);
*error = '\0'; /* likely */
- switch (pc->error) {
+ switch (pc.error) {
case PLAYER_ERROR_FILENOTFOUND:
snprintf(error, errorlen,
"file \"%s\" does not exist or is inaccessible",
- get_song_url(path_max_tmp, pc->errored_song));
+ get_song_url(path_max_tmp, pc.errored_song));
break;
case PLAYER_ERROR_FILE:
snprintf(error, errorlen, "problems decoding \"%s\"",
- get_song_url(path_max_tmp, pc->errored_song));
+ get_song_url(path_max_tmp, pc.errored_song));
break;
case PLAYER_ERROR_AUDIO:
strcpy(error, "problems opening audio device");
@@ -237,28 +226,24 @@ char *getPlayerErrorStr(void)
break;
case PLAYER_ERROR_UNKTYPE:
snprintf(error, errorlen, "file type of \"%s\" is unknown",
- get_song_url(path_max_tmp, pc->errored_song));
+ get_song_url(path_max_tmp, pc.errored_song));
}
return *error ? error : NULL;
}
static void playerCloseAudio(void)
{
- PlayerControl *pc = &(getPlayerData()->playerControl);
-
if (playerStop(STDERR_FILENO) < 0)
return;
- pc->closeAudio = 1;
- do { wakeup_player(pc); } while (pc->closeAudio);
+ pc.closeAudio = 1;
+ do { wakeup_player(); } while (pc.closeAudio);
}
int queueSong(Song * song)
{
- PlayerControl *pc = &(getPlayerData()->playerControl);
-
- if (pc->queueState == PLAYER_QUEUE_BLANK) {
- set_current_song(pc, song);
- pc->queueState = PLAYER_QUEUE_FULL;
+ if (pc.queueState == PLAYER_QUEUE_BLANK) {
+ set_current_song(song);
+ pc.queueState = PLAYER_QUEUE_FULL;
return 0;
}
@@ -267,59 +252,49 @@ int queueSong(Song * song)
int getPlayerQueueState(void)
{
- PlayerControl *pc = &(getPlayerData()->playerControl);
-
- return pc->queueState;
+ return pc.queueState;
}
void setQueueState(int queueState)
{
- PlayerControl *pc = &(getPlayerData()->playerControl);
-
- pc->queueState = queueState;
- wakeup_player_nb(pc);
+ pc.queueState = queueState;
+ wakeup_player_nb();
}
void playerQueueLock(void)
{
- PlayerControl *pc = &(getPlayerData()->playerControl);
-
- if (pc->queueLockState == PLAYER_QUEUE_UNLOCKED) {
- pc->lockQueue = 1;
- do { wakeup_player(pc); } while (pc->lockQueue);
+ if (pc.queueLockState == PLAYER_QUEUE_UNLOCKED) {
+ pc.lockQueue = 1;
+ do { wakeup_player(); } while (pc.lockQueue);
}
}
void playerQueueUnlock(void)
{
- PlayerControl *pc = &(getPlayerData()->playerControl);
-
- if (pc->queueLockState == PLAYER_QUEUE_LOCKED) {
- pc->unlockQueue = 1;
- do { wakeup_player(pc); } while (pc->unlockQueue);
+ if (pc.queueLockState == PLAYER_QUEUE_LOCKED) {
+ pc.unlockQueue = 1;
+ do { wakeup_player(); } while (pc.unlockQueue);
}
}
int playerSeek(int fd, Song * song, float seek_time)
{
- PlayerControl *pc = &(getPlayerData()->playerControl);
-
assert(song != NULL);
- if (pc->state == PLAYER_STATE_STOP) {
+ if (pc.state == PLAYER_STATE_STOP) {
commandError(fd, ACK_ERROR_PLAYER_SYNC,
"player not currently playing");
return -1;
}
- if (pc->current_song != song)
- set_current_song(pc, song);
+ if (pc.current_song != song)
+ set_current_song(song);
- if (pc->error == PLAYER_ERROR_NOERROR) {
- pc->seekWhere = seek_time;
- pc->seek = 1;
+ if (pc.error == PLAYER_ERROR_NOERROR) {
+ pc.seekWhere = seek_time;
+ pc.seek = 1;
/* FIXME: _nb() is probably wrong here, too */
- do { wakeup_player_nb(pc); } while (pc->seek);
+ do { wakeup_player_nb(); } while (pc.seek);
}
return 0;
@@ -327,58 +302,40 @@ int playerSeek(int fd, Song * song, float seek_time)
float getPlayerCrossFade(void)
{
- PlayerControl *pc = &(getPlayerData()->playerControl);
-
- return pc->crossFade;
+ return pc.crossFade;
}
void setPlayerCrossFade(float crossFadeInSeconds)
{
- PlayerControl *pc;
if (crossFadeInSeconds < 0)
crossFadeInSeconds = 0;
-
- pc = &(getPlayerData()->playerControl);
-
- pc->crossFade = crossFadeInSeconds;
+ pc.crossFade = crossFadeInSeconds;
}
void setPlayerSoftwareVolume(int volume)
{
- PlayerControl *pc;
volume = (volume > 1000) ? 1000 : (volume < 0 ? 0 : volume);
-
- pc = &(getPlayerData()->playerControl);
-
- pc->softwareVolume = volume;
+ pc.softwareVolume = volume;
}
double getPlayerTotalPlayTime(void)
{
- PlayerControl *pc = &(getPlayerData()->playerControl);
-
- return pc->totalPlayTime;
+ return pc.totalPlayTime;
}
unsigned int getPlayerSampleRate(void)
{
- PlayerControl *pc = &(getPlayerData()->playerControl);
-
- return pc->sampleRate;
+ return pc.sampleRate;
}
int getPlayerBits(void)
{
- PlayerControl *pc = &(getPlayerData()->playerControl);
-
- return pc->bits;
+ return pc.bits;
}
int getPlayerChannels(void)
{
- PlayerControl *pc = &(getPlayerData()->playerControl);
-
- return pc->channels;
+ return pc.channels;
}
/* this actually creates a dupe of the current metadata */
diff --git a/src/player.h b/src/player.h
index 6ec3f8329..623ae1fb0 100644
--- a/src/player.h
+++ b/src/player.h
@@ -76,9 +76,9 @@ typedef struct _PlayerControl {
volatile double totalPlayTime;
} PlayerControl;
-void wakeup_player_nb(PlayerControl *pc);
+void wakeup_player_nb(void);
-void player_sleep(PlayerControl *pc);
+void player_sleep(void);
int playerPlay(int fd, Song * song);
@@ -134,6 +134,6 @@ int getPlayerChannels(void);
Song *playerCurrentDecodeSong(void);
-void playerInit(PlayerControl * pc);
+void playerInit(void);
#endif
diff --git a/src/playerData.c b/src/playerData.c
index ac1be5990..11f86f7f4 100644
--- a/src/playerData.c
+++ b/src/playerData.c
@@ -27,6 +27,7 @@ unsigned int buffered_before_play;
#define DEFAULT_BUFFER_BEFORE_PLAY 10
static PlayerData playerData_pd;
+PlayerControl pc;
void initPlayerData(void)
{
@@ -76,23 +77,13 @@ void initPlayerData(void)
initOutputBuffer(&(playerData_pd.buffer), buffered_chunks);
- notifyInit(&playerData_pd.playerControl.notify);
- playerData_pd.playerControl.stop = 0;
- playerData_pd.playerControl.pause = 0;
- playerData_pd.playerControl.play = 0;
- playerData_pd.playerControl.error = PLAYER_ERROR_NOERROR;
- playerData_pd.playerControl.lockQueue = 0;
- playerData_pd.playerControl.unlockQueue = 0;
- playerData_pd.playerControl.state = PLAYER_STATE_STOP;
- playerData_pd.playerControl.queueState = PLAYER_QUEUE_BLANK;
- playerData_pd.playerControl.queueLockState = PLAYER_QUEUE_UNLOCKED;
- playerData_pd.playerControl.seek = 0;
- playerData_pd.playerControl.closeAudio = 0;
- playerData_pd.playerControl.current_song = NULL;
- playerData_pd.playerControl.errored_song = NULL;
- playerData_pd.playerControl.crossFade = crossfade;
- playerData_pd.playerControl.softwareVolume = 1000;
- playerData_pd.playerControl.totalPlayTime = 0;
+ notifyInit(&pc.notify);
+ pc.error = PLAYER_ERROR_NOERROR;
+ pc.state = PLAYER_STATE_STOP;
+ pc.queueState = PLAYER_QUEUE_BLANK;
+ pc.queueLockState = PLAYER_QUEUE_UNLOCKED;
+ pc.crossFade = crossfade;
+ pc.softwareVolume = 1000;
notifyInit(&playerData_pd.decoderControl.notify);
playerData_pd.decoderControl.stop = 0;
diff --git a/src/playerData.h b/src/playerData.h
index f0f740567..2a8da0ca3 100644
--- a/src/playerData.h
+++ b/src/playerData.h
@@ -26,10 +26,10 @@
#include "outputBuffer.h"
extern unsigned int buffered_before_play;
+extern PlayerControl pc;
typedef struct _PlayerData {
OutputBuffer buffer;
- PlayerControl playerControl;
DecoderControl decoderControl;
mpd_uint8 *audioDeviceStates;
} PlayerData;