diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/decode.c | 194 | ||||
-rw-r--r-- | src/inputPlugins/wavpack_plugin.c | 2 | ||||
-rw-r--r-- | src/main.c | 2 | ||||
-rw-r--r-- | src/player.c | 199 | ||||
-rw-r--r-- | src/player.h | 6 | ||||
-rw-r--r-- | src/playerData.c | 25 | ||||
-rw-r--r-- | src/playerData.h | 2 |
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; |