Commit 98acfa8a authored by Eric Wong's avatar Eric Wong

Get rid of PlayerControl inside the PlayerData struct

It actually increases our image size a small bit and may even hurt performance a very small bit, but makes the code less verbose and easier to manage. I don't see a reason for mpd to ever support playing multiple files at the same time (users can run multiple instances of mpd if they really want to play Zaireeka, but that's such an edge case it's not worth ever supporting in our code). git-svn-id: https://svn.musicpd.org/mpd/trunk@7352 09075e82-0dd4-0310-85a5-a0d7c8717e4f
parent ae133575
...@@ -465,7 +465,7 @@ static int wavpack_streamdecode(OutputBuffer *cb, DecoderControl *dc, ...@@ -465,7 +465,7 @@ static int wavpack_streamdecode(OutputBuffer *cb, DecoderControl *dc,
* As we use dc->utf8url, this function will be bad for * As we use dc->utf8url, this function will be bad for
* single files. utf8url is not absolute file path :/ * 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) { if (utf8url == NULL) {
break; break;
} }
......
...@@ -432,7 +432,7 @@ int main(int argc, char *argv[]) ...@@ -432,7 +432,7 @@ int main(int argc, char *argv[])
openVolumeDevice(); openVolumeDevice();
decoderInit(&getPlayerData()->decoderControl); decoderInit(&getPlayerData()->decoderControl);
playerInit(&getPlayerData()->playerControl); playerInit();
read_state_file(); read_state_file();
while (COMMAND_RETURN_KILL != doIOForInterfaces() && while (COMMAND_RETURN_KILL != doIOForInterfaces() &&
......
...@@ -36,49 +36,47 @@ ...@@ -36,49 +36,47 @@
static void playerCloseAudio(void); 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(); 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) { while (1) {
if (pc->play) { if (pc.play) {
decode(); decode();
continue; /* decode() calls wakeup_main_task */ continue; /* decode() calls wakeup_main_task */
} else if (pc->stop) { } else if (pc.stop) {
pc->stop = 0; pc.stop = 0;
} else if (pc->seek) { } else if (pc.seek) {
pc->seek = 0; pc.seek = 0;
} else if (pc->pause) { } else if (pc.pause) {
pc->pause = 0; pc.pause = 0;
} else if (pc->closeAudio) { } else if (pc.closeAudio) {
closeAudioDevice(); closeAudioDevice();
pc->closeAudio = 0; pc.closeAudio = 0;
} else if (pc->lockQueue) { } else if (pc.lockQueue) {
pc->queueLockState = PLAYER_QUEUE_LOCKED; pc.queueLockState = PLAYER_QUEUE_LOCKED;
pc->lockQueue = 0; pc.lockQueue = 0;
} else if (pc->unlockQueue) { } else if (pc.unlockQueue) {
pc->queueLockState = PLAYER_QUEUE_UNLOCKED; pc.queueLockState = PLAYER_QUEUE_UNLOCKED;
pc->unlockQueue = 0; pc.unlockQueue = 0;
} else { } else {
player_sleep(pc); player_sleep();
continue; continue;
} }
/* we did something, tell the main task about it */ /* we did something, tell the main task about it */
...@@ -87,14 +85,14 @@ static void * player_task(void *arg) ...@@ -87,14 +85,14 @@ static void * player_task(void *arg)
return NULL; return NULL;
} }
void playerInit(PlayerControl * pc) void playerInit(void)
{ {
pthread_attr_t attr; pthread_attr_t attr;
pthread_t player_thread; pthread_t player_thread;
pthread_attr_init(&attr); pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 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)); FATAL("Failed to spawn player task: %s\n", strerror(errno));
} }
...@@ -108,38 +106,34 @@ int playerWait(int fd) ...@@ -108,38 +106,34 @@ int playerWait(int fd)
return 0; 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.fileTime = song->tag ? song->tag->time : 0;
pc->current_song = song; pc.current_song = song;
} }
int playerPlay(int fd, Song * song) int playerPlay(int fd, Song * song)
{ {
PlayerControl *pc = &(getPlayerData()->playerControl);
if (playerStop(fd) < 0) if (playerStop(fd) < 0)
return -1; 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... */ /* 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; return 0;
} }
int playerStop(int fd) int playerStop(int fd)
{ {
PlayerControl *pc = &(getPlayerData()->playerControl); if (pc.state != PLAYER_STATE_STOP) {
pc.stop = 1;
if (pc->state != PLAYER_STATE_STOP) { do { wakeup_player(); } while (pc.stop);
pc->stop = 1;
do { wakeup_player(pc); } while (pc->stop);
} }
pc->queueState = PLAYER_QUEUE_BLANK; pc.queueState = PLAYER_QUEUE_BLANK;
playerQueueUnlock(); playerQueueUnlock();
return 0; return 0;
...@@ -152,11 +146,9 @@ void playerKill(void) /* deprecated */ ...@@ -152,11 +146,9 @@ void playerKill(void) /* deprecated */
int playerPause(int fd) int playerPause(int fd)
{ {
PlayerControl *pc = &(getPlayerData()->playerControl); if (pc.state != PLAYER_STATE_STOP) {
pc.pause = 1;
if (pc->state != PLAYER_STATE_STOP) { do { wakeup_player(); } while (pc.pause);
pc->pause = 1;
do { wakeup_player(pc); } while (pc->pause);
} }
return 0; return 0;
...@@ -164,9 +156,7 @@ int playerPause(int fd) ...@@ -164,9 +156,7 @@ int playerPause(int fd)
int playerSetPause(int fd, int pause_flag) int playerSetPause(int fd, int pause_flag)
{ {
PlayerControl *pc = &(getPlayerData()->playerControl); switch (pc.state) {
switch (pc->state) {
case PLAYER_STATE_PLAY: case PLAYER_STATE_PLAY:
if (pause_flag) if (pause_flag)
playerPause(fd); playerPause(fd);
...@@ -182,32 +172,32 @@ int playerSetPause(int fd, int pause_flag) ...@@ -182,32 +172,32 @@ int playerSetPause(int fd, int pause_flag)
int getPlayerElapsedTime(void) int getPlayerElapsedTime(void)
{ {
return (int)(getPlayerData()->playerControl.elapsedTime + 0.5); return (int)(pc.elapsedTime + 0.5);
} }
unsigned long getPlayerBitRate(void) unsigned long getPlayerBitRate(void)
{ {
return getPlayerData()->playerControl.bitRate; return pc.bitRate;
} }
int getPlayerTotalTime(void) int getPlayerTotalTime(void)
{ {
return (int)(getPlayerData()->playerControl.totalTime + 0.5); return (int)(pc.totalTime + 0.5);
} }
int getPlayerState(void) int getPlayerState(void)
{ {
return getPlayerData()->playerControl.state; return pc.state;
} }
void clearPlayerError(void) void clearPlayerError(void)
{ {
getPlayerData()->playerControl.error = 0; pc.error = 0;
} }
int getPlayerError(void) int getPlayerError(void)
{ {
return getPlayerData()->playerControl.error; return pc.error;
} }
char *getPlayerErrorStr(void) char *getPlayerErrorStr(void)
...@@ -216,18 +206,17 @@ char *getPlayerErrorStr(void) ...@@ -216,18 +206,17 @@ char *getPlayerErrorStr(void)
static char error[MPD_PATH_MAX + 64]; /* still too much */ static char error[MPD_PATH_MAX + 64]; /* still too much */
static const size_t errorlen = sizeof(error); static const size_t errorlen = sizeof(error);
char path_max_tmp[MPD_PATH_MAX]; char path_max_tmp[MPD_PATH_MAX];
PlayerControl *pc = &(getPlayerData()->playerControl);
*error = '\0'; /* likely */ *error = '\0'; /* likely */
switch (pc->error) { switch (pc.error) {
case PLAYER_ERROR_FILENOTFOUND: case PLAYER_ERROR_FILENOTFOUND:
snprintf(error, errorlen, snprintf(error, errorlen,
"file \"%s\" does not exist or is inaccessible", "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; break;
case PLAYER_ERROR_FILE: case PLAYER_ERROR_FILE:
snprintf(error, errorlen, "problems decoding \"%s\"", 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; break;
case PLAYER_ERROR_AUDIO: case PLAYER_ERROR_AUDIO:
strcpy(error, "problems opening audio device"); strcpy(error, "problems opening audio device");
...@@ -237,28 +226,24 @@ char *getPlayerErrorStr(void) ...@@ -237,28 +226,24 @@ char *getPlayerErrorStr(void)
break; break;
case PLAYER_ERROR_UNKTYPE: case PLAYER_ERROR_UNKTYPE:
snprintf(error, errorlen, "file type of \"%s\" is unknown", 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; return *error ? error : NULL;
} }
static void playerCloseAudio(void) static void playerCloseAudio(void)
{ {
PlayerControl *pc = &(getPlayerData()->playerControl);
if (playerStop(STDERR_FILENO) < 0) if (playerStop(STDERR_FILENO) < 0)
return; return;
pc->closeAudio = 1; pc.closeAudio = 1;
do { wakeup_player(pc); } while (pc->closeAudio); do { wakeup_player(); } while (pc.closeAudio);
} }
int queueSong(Song * song) int queueSong(Song * song)
{ {
PlayerControl *pc = &(getPlayerData()->playerControl); if (pc.queueState == PLAYER_QUEUE_BLANK) {
set_current_song(song);
if (pc->queueState == PLAYER_QUEUE_BLANK) { pc.queueState = PLAYER_QUEUE_FULL;
set_current_song(pc, song);
pc->queueState = PLAYER_QUEUE_FULL;
return 0; return 0;
} }
...@@ -267,59 +252,49 @@ int queueSong(Song * song) ...@@ -267,59 +252,49 @@ int queueSong(Song * song)
int getPlayerQueueState(void) int getPlayerQueueState(void)
{ {
PlayerControl *pc = &(getPlayerData()->playerControl); return pc.queueState;
return pc->queueState;
} }
void setQueueState(int queueState) void setQueueState(int queueState)
{ {
PlayerControl *pc = &(getPlayerData()->playerControl); pc.queueState = queueState;
wakeup_player_nb();
pc->queueState = queueState;
wakeup_player_nb(pc);
} }
void playerQueueLock(void) void playerQueueLock(void)
{ {
PlayerControl *pc = &(getPlayerData()->playerControl); if (pc.queueLockState == PLAYER_QUEUE_UNLOCKED) {
pc.lockQueue = 1;
if (pc->queueLockState == PLAYER_QUEUE_UNLOCKED) { do { wakeup_player(); } while (pc.lockQueue);
pc->lockQueue = 1;
do { wakeup_player(pc); } while (pc->lockQueue);
} }
} }
void playerQueueUnlock(void) void playerQueueUnlock(void)
{ {
PlayerControl *pc = &(getPlayerData()->playerControl); if (pc.queueLockState == PLAYER_QUEUE_LOCKED) {
pc.unlockQueue = 1;
if (pc->queueLockState == PLAYER_QUEUE_LOCKED) { do { wakeup_player(); } while (pc.unlockQueue);
pc->unlockQueue = 1;
do { wakeup_player(pc); } while (pc->unlockQueue);
} }
} }
int playerSeek(int fd, Song * song, float seek_time) int playerSeek(int fd, Song * song, float seek_time)
{ {
PlayerControl *pc = &(getPlayerData()->playerControl);
assert(song != NULL); assert(song != NULL);
if (pc->state == PLAYER_STATE_STOP) { if (pc.state == PLAYER_STATE_STOP) {
commandError(fd, ACK_ERROR_PLAYER_SYNC, commandError(fd, ACK_ERROR_PLAYER_SYNC,
"player not currently playing"); "player not currently playing");
return -1; return -1;
} }
if (pc->current_song != song) if (pc.current_song != song)
set_current_song(pc, song); set_current_song(song);
if (pc->error == PLAYER_ERROR_NOERROR) { if (pc.error == PLAYER_ERROR_NOERROR) {
pc->seekWhere = seek_time; pc.seekWhere = seek_time;
pc->seek = 1; pc.seek = 1;
/* FIXME: _nb() is probably wrong here, too */ /* FIXME: _nb() is probably wrong here, too */
do { wakeup_player_nb(pc); } while (pc->seek); do { wakeup_player_nb(); } while (pc.seek);
} }
return 0; return 0;
...@@ -327,58 +302,40 @@ int playerSeek(int fd, Song * song, float seek_time) ...@@ -327,58 +302,40 @@ int playerSeek(int fd, Song * song, float seek_time)
float getPlayerCrossFade(void) float getPlayerCrossFade(void)
{ {
PlayerControl *pc = &(getPlayerData()->playerControl); return pc.crossFade;
return pc->crossFade;
} }
void setPlayerCrossFade(float crossFadeInSeconds) void setPlayerCrossFade(float crossFadeInSeconds)
{ {
PlayerControl *pc;
if (crossFadeInSeconds < 0) if (crossFadeInSeconds < 0)
crossFadeInSeconds = 0; crossFadeInSeconds = 0;
pc.crossFade = crossFadeInSeconds;
pc = &(getPlayerData()->playerControl);
pc->crossFade = crossFadeInSeconds;
} }
void setPlayerSoftwareVolume(int volume) void setPlayerSoftwareVolume(int volume)
{ {
PlayerControl *pc;
volume = (volume > 1000) ? 1000 : (volume < 0 ? 0 : volume); volume = (volume > 1000) ? 1000 : (volume < 0 ? 0 : volume);
pc.softwareVolume = volume;
pc = &(getPlayerData()->playerControl);
pc->softwareVolume = volume;
} }
double getPlayerTotalPlayTime(void) double getPlayerTotalPlayTime(void)
{ {
PlayerControl *pc = &(getPlayerData()->playerControl); return pc.totalPlayTime;
return pc->totalPlayTime;
} }
unsigned int getPlayerSampleRate(void) unsigned int getPlayerSampleRate(void)
{ {
PlayerControl *pc = &(getPlayerData()->playerControl); return pc.sampleRate;
return pc->sampleRate;
} }
int getPlayerBits(void) int getPlayerBits(void)
{ {
PlayerControl *pc = &(getPlayerData()->playerControl); return pc.bits;
return pc->bits;
} }
int getPlayerChannels(void) int getPlayerChannels(void)
{ {
PlayerControl *pc = &(getPlayerData()->playerControl); return pc.channels;
return pc->channels;
} }
/* this actually creates a dupe of the current metadata */ /* this actually creates a dupe of the current metadata */
......
...@@ -76,9 +76,9 @@ typedef struct _PlayerControl { ...@@ -76,9 +76,9 @@ typedef struct _PlayerControl {
volatile double totalPlayTime; volatile double totalPlayTime;
} PlayerControl; } 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); int playerPlay(int fd, Song * song);
...@@ -134,6 +134,6 @@ int getPlayerChannels(void); ...@@ -134,6 +134,6 @@ int getPlayerChannels(void);
Song *playerCurrentDecodeSong(void); Song *playerCurrentDecodeSong(void);
void playerInit(PlayerControl * pc); void playerInit(void);
#endif #endif
...@@ -27,6 +27,7 @@ unsigned int buffered_before_play; ...@@ -27,6 +27,7 @@ unsigned int buffered_before_play;
#define DEFAULT_BUFFER_BEFORE_PLAY 10 #define DEFAULT_BUFFER_BEFORE_PLAY 10
static PlayerData playerData_pd; static PlayerData playerData_pd;
PlayerControl pc;
void initPlayerData(void) void initPlayerData(void)
{ {
...@@ -76,23 +77,13 @@ void initPlayerData(void) ...@@ -76,23 +77,13 @@ void initPlayerData(void)
initOutputBuffer(&(playerData_pd.buffer), buffered_chunks); initOutputBuffer(&(playerData_pd.buffer), buffered_chunks);
notifyInit(&playerData_pd.playerControl.notify); notifyInit(&pc.notify);
playerData_pd.playerControl.stop = 0; pc.error = PLAYER_ERROR_NOERROR;
playerData_pd.playerControl.pause = 0; pc.state = PLAYER_STATE_STOP;
playerData_pd.playerControl.play = 0; pc.queueState = PLAYER_QUEUE_BLANK;
playerData_pd.playerControl.error = PLAYER_ERROR_NOERROR; pc.queueLockState = PLAYER_QUEUE_UNLOCKED;
playerData_pd.playerControl.lockQueue = 0; pc.crossFade = crossfade;
playerData_pd.playerControl.unlockQueue = 0; pc.softwareVolume = 1000;
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(&playerData_pd.decoderControl.notify); notifyInit(&playerData_pd.decoderControl.notify);
playerData_pd.decoderControl.stop = 0; playerData_pd.decoderControl.stop = 0;
......
...@@ -26,10 +26,10 @@ ...@@ -26,10 +26,10 @@
#include "outputBuffer.h" #include "outputBuffer.h"
extern unsigned int buffered_before_play; extern unsigned int buffered_before_play;
extern PlayerControl pc;
typedef struct _PlayerData { typedef struct _PlayerData {
OutputBuffer buffer; OutputBuffer buffer;
PlayerControl playerControl;
DecoderControl decoderControl; DecoderControl decoderControl;
mpd_uint8 *audioDeviceStates; mpd_uint8 *audioDeviceStates;
} PlayerData; } PlayerData;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment