diff --git a/src/Makefile.am b/src/Makefile.am index 612a039f4..f4fd080d7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -68,8 +68,8 @@ mpd_headers = \ path.h \ pcm_utils.h \ permission.h \ - player.h \ player_thread.h \ + player_control.h \ playerData.h \ playlist.h \ replayGain.h \ @@ -130,9 +130,8 @@ mpd_SOURCES = \ path.c \ pcm_utils.c \ permission.c \ - player.c \ - player_control.c \ player_thread.c \ + player_control.c \ playerData.c \ playlist.c \ replayGain.c \ diff --git a/src/command.c b/src/command.c index d77b16b42..e95299ab3 100644 --- a/src/command.c +++ b/src/command.c @@ -17,7 +17,7 @@ */ #include "command.h" -#include "player.h" +#include "player_control.h" #include "playlist.h" #include "ls.h" #include "directory.h" diff --git a/src/decoder_api.c b/src/decoder_api.c index 016c27400..bf36886ba 100644 --- a/src/decoder_api.c +++ b/src/decoder_api.c @@ -20,7 +20,7 @@ #include "decoder_internal.h" #include "decoder_list.h" #include "decoder_control.h" -#include "player.h" +#include "player_control.h" #include "audio.h" #include "utils.h" diff --git a/src/decoder_thread.c b/src/decoder_thread.c index 98b0025ec..60381b1f6 100644 --- a/src/decoder_thread.c +++ b/src/decoder_thread.c @@ -20,7 +20,7 @@ #include "decoder_thread.h" #include "decoder_control.h" #include "decoder_internal.h" -#include "player.h" +#include "player_control.h" #include "path.h" #include "log.h" diff --git a/src/main.c b/src/main.c index ebd850abd..4e0079a85 100644 --- a/src/main.c +++ b/src/main.c @@ -26,7 +26,7 @@ #include "path.h" #include "playerData.h" #include "decoder_thread.h" -#include "player.h" +#include "player_control.h" #include "stats.h" #include "sig_handlers.h" #include "audio.h" diff --git a/src/player.c b/src/player.c deleted file mode 100644 index 8687e5409..000000000 --- a/src/player.c +++ /dev/null @@ -1,259 +0,0 @@ -/* the Music Player Daemon (MPD) - * Copyright (C) 2003-2007 by Warren Dukes (warren.dukes@gmail.com) - * This project's homepage is: http://www.musicpd.org - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "player.h" -#include "player_thread.h" -#include "path.h" -#include "ack.h" -#include "os_compat.h" -#include "main_notify.h" - -static void set_current_song(Song *song) -{ - assert(song != NULL); - assert(song->url != NULL); - - pc.fileTime = song->tag ? song->tag->time : 0; - pc.next_song = song; -} - -static void player_command(enum player_command cmd) -{ - pc.command = cmd; - while (pc.command != PLAYER_COMMAND_NONE) { - notify_signal(&pc.notify); - wait_main_task(); - } -} - -void player_command_finished() -{ - assert(pc.command != PLAYER_COMMAND_NONE); - - pc.command = PLAYER_COMMAND_NONE; - wakeup_main_task(); -} - -void playerPlay(Song * song) -{ - assert(pc.queueLockState == PLAYER_QUEUE_UNLOCKED); - - if (pc.state != PLAYER_STATE_STOP) - player_command(PLAYER_COMMAND_STOP); - - pc.queueState = PLAYER_QUEUE_BLANK; - - set_current_song(song); - player_command(PLAYER_COMMAND_PLAY); -} - -void playerWait(void) -{ - player_command(PLAYER_COMMAND_CLOSE_AUDIO); - - assert(pc.queueLockState == PLAYER_QUEUE_UNLOCKED); - - player_command(PLAYER_COMMAND_CLOSE_AUDIO); - - pc.queueState = PLAYER_QUEUE_BLANK; -} - -void playerKill(void) -{ - player_command(PLAYER_COMMAND_EXIT); -} - -void playerPause(void) -{ - if (pc.state != PLAYER_STATE_STOP) - player_command(PLAYER_COMMAND_PAUSE); -} - -void playerSetPause(int pause_flag) -{ - switch (pc.state) { - case PLAYER_STATE_STOP: - break; - - case PLAYER_STATE_PLAY: - if (pause_flag) - playerPause(); - break; - case PLAYER_STATE_PAUSE: - if (!pause_flag) - playerPause(); - break; - } -} - -int getPlayerElapsedTime(void) -{ - return (int)(pc.elapsedTime + 0.5); -} - -unsigned long getPlayerBitRate(void) -{ - return pc.bitRate; -} - -int getPlayerTotalTime(void) -{ - return (int)(pc.totalTime + 0.5); -} - -enum player_state getPlayerState(void) -{ - return pc.state; -} - -void clearPlayerError(void) -{ - pc.error = 0; -} - -int getPlayerError(void) -{ - return pc.error; -} - -char *getPlayerErrorStr(void) -{ - /* static OK here, only one user in main task */ - static char error[MPD_PATH_MAX + 64]; /* still too much */ - static const size_t errorlen = sizeof(error); - char path_max_tmp[MPD_PATH_MAX]; - *error = '\0'; /* likely */ - - 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)); - break; - case PLAYER_ERROR_FILE: - snprintf(error, errorlen, "problems decoding \"%s\"", - get_song_url(path_max_tmp, pc.errored_song)); - break; - case PLAYER_ERROR_AUDIO: - strcpy(error, "problems opening audio device"); - break; - case PLAYER_ERROR_SYSTEM: - strcpy(error, "system error occured"); - break; - case PLAYER_ERROR_UNKTYPE: - snprintf(error, errorlen, "file type of \"%s\" is unknown", - get_song_url(path_max_tmp, pc.errored_song)); - } - return *error ? error : NULL; -} - -void queueSong(Song * song) -{ - assert(pc.queueState == PLAYER_QUEUE_BLANK); - - set_current_song(song); - pc.queueState = PLAYER_QUEUE_FULL; -} - -enum player_queue_state getPlayerQueueState(void) -{ - return pc.queueState; -} - -void setQueueState(enum player_queue_state queueState) -{ - pc.queueState = queueState; - notify_signal(&pc.notify); -} - -void playerQueueLock(void) -{ - assert(pc.queueLockState == PLAYER_QUEUE_UNLOCKED); - player_command(PLAYER_COMMAND_LOCK_QUEUE); - assert(pc.queueLockState == PLAYER_QUEUE_LOCKED); -} - -void playerQueueUnlock(void) -{ - if (pc.queueLockState == PLAYER_QUEUE_LOCKED) - player_command(PLAYER_COMMAND_UNLOCK_QUEUE); - - assert(pc.queueLockState == PLAYER_QUEUE_UNLOCKED); -} - -int playerSeek(Song * song, float seek_time) -{ - assert(song != NULL); - - if (pc.state == PLAYER_STATE_STOP) - return -1; - - if (pc.next_song != song) - set_current_song(song); - - if (pc.error == PLAYER_ERROR_NOERROR) { - pc.seekWhere = seek_time; - player_command(PLAYER_COMMAND_SEEK); - } - - return 0; -} - -float getPlayerCrossFade(void) -{ - return pc.crossFade; -} - -void setPlayerCrossFade(float crossFadeInSeconds) -{ - if (crossFadeInSeconds < 0) - crossFadeInSeconds = 0; - pc.crossFade = crossFadeInSeconds; -} - -void setPlayerSoftwareVolume(int volume) -{ - volume = (volume > 1000) ? 1000 : (volume < 0 ? 0 : volume); - pc.softwareVolume = volume; -} - -double getPlayerTotalPlayTime(void) -{ - return pc.totalPlayTime; -} - -unsigned int getPlayerSampleRate(void) -{ - return pc.sampleRate; -} - -int getPlayerBits(void) -{ - return pc.bits; -} - -int getPlayerChannels(void) -{ - return pc.channels; -} - -/* this actually creates a dupe of the current metadata */ -Song *playerCurrentDecodeSong(void) -{ - return NULL; -} diff --git a/src/playerData.c b/src/playerData.c index 019c8a906..593a1dbd1 100644 --- a/src/playerData.c +++ b/src/playerData.c @@ -17,7 +17,7 @@ */ #include "playerData.h" -#include "player.h" +#include "player_control.h" #include "decoder_control.h" #include "outputBuffer.h" #include "conf.h" diff --git a/src/player_control.c b/src/player_control.c index 1f6aecd97..93dd407e8 100644 --- a/src/player_control.c +++ b/src/player_control.c @@ -16,6 +16,246 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include "player.h" +#include "player_control.h" +#include "path.h" +#include "log.h" +#include "ack.h" +#include "os_compat.h" +#include "main_notify.h" struct player_control pc; + +static void set_current_song(Song *song) +{ + assert(song != NULL); + assert(song->url != NULL); + + pc.fileTime = song->tag ? song->tag->time : 0; + pc.next_song = song; +} + +static void player_command(enum player_command cmd) +{ + pc.command = cmd; + while (pc.command != PLAYER_COMMAND_NONE) { + notify_signal(&pc.notify); + wait_main_task(); + } +} + +void player_command_finished() +{ + assert(pc.command != PLAYER_COMMAND_NONE); + + pc.command = PLAYER_COMMAND_NONE; + wakeup_main_task(); +} + +void playerPlay(Song * song) +{ + assert(pc.queueLockState == PLAYER_QUEUE_UNLOCKED); + + if (pc.state != PLAYER_STATE_STOP) + player_command(PLAYER_COMMAND_STOP); + + pc.queueState = PLAYER_QUEUE_BLANK; + + set_current_song(song); + player_command(PLAYER_COMMAND_PLAY); +} + +void playerWait(void) +{ + player_command(PLAYER_COMMAND_CLOSE_AUDIO); + + assert(pc.queueLockState == PLAYER_QUEUE_UNLOCKED); + + player_command(PLAYER_COMMAND_CLOSE_AUDIO); + + pc.queueState = PLAYER_QUEUE_BLANK; +} + +void playerKill(void) +{ + player_command(PLAYER_COMMAND_EXIT); +} + +void playerPause(void) +{ + if (pc.state != PLAYER_STATE_STOP) + player_command(PLAYER_COMMAND_PAUSE); +} + +void playerSetPause(int pause_flag) +{ + switch (pc.state) { + case PLAYER_STATE_STOP: + break; + + case PLAYER_STATE_PLAY: + if (pause_flag) + playerPause(); + break; + case PLAYER_STATE_PAUSE: + if (!pause_flag) + playerPause(); + break; + } +} + +int getPlayerElapsedTime(void) +{ + return (int)(pc.elapsedTime + 0.5); +} + +unsigned long getPlayerBitRate(void) +{ + return pc.bitRate; +} + +int getPlayerTotalTime(void) +{ + return (int)(pc.totalTime + 0.5); +} + +enum player_state getPlayerState(void) +{ + return pc.state; +} + +void clearPlayerError(void) +{ + pc.error = 0; +} + +int getPlayerError(void) +{ + return pc.error; +} + +char *getPlayerErrorStr(void) +{ + /* static OK here, only one user in main task */ + static char error[MPD_PATH_MAX + 64]; /* still too much */ + static const size_t errorlen = sizeof(error); + char path_max_tmp[MPD_PATH_MAX]; + *error = '\0'; /* likely */ + + 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)); + break; + case PLAYER_ERROR_FILE: + snprintf(error, errorlen, "problems decoding \"%s\"", + get_song_url(path_max_tmp, pc.errored_song)); + break; + case PLAYER_ERROR_AUDIO: + strcpy(error, "problems opening audio device"); + break; + case PLAYER_ERROR_SYSTEM: + strcpy(error, "system error occured"); + break; + case PLAYER_ERROR_UNKTYPE: + snprintf(error, errorlen, "file type of \"%s\" is unknown", + get_song_url(path_max_tmp, pc.errored_song)); + } + return *error ? error : NULL; +} + +void queueSong(Song * song) +{ + assert(pc.queueState == PLAYER_QUEUE_BLANK); + + set_current_song(song); + pc.queueState = PLAYER_QUEUE_FULL; +} + +enum player_queue_state getPlayerQueueState(void) +{ + return pc.queueState; +} + +void setQueueState(enum player_queue_state queueState) +{ + pc.queueState = queueState; + notify_signal(&pc.notify); +} + +void playerQueueLock(void) +{ + assert(pc.queueLockState == PLAYER_QUEUE_UNLOCKED); + player_command(PLAYER_COMMAND_LOCK_QUEUE); + assert(pc.queueLockState == PLAYER_QUEUE_LOCKED); +} + +void playerQueueUnlock(void) +{ + if (pc.queueLockState == PLAYER_QUEUE_LOCKED) + player_command(PLAYER_COMMAND_UNLOCK_QUEUE); + + assert(pc.queueLockState == PLAYER_QUEUE_UNLOCKED); +} + +int playerSeek(Song * song, float seek_time) +{ + assert(song != NULL); + + if (pc.state == PLAYER_STATE_STOP) + return -1; + + if (pc.next_song != song) + set_current_song(song); + + if (pc.error == PLAYER_ERROR_NOERROR) { + pc.seekWhere = seek_time; + player_command(PLAYER_COMMAND_SEEK); + } + + return 0; +} + +float getPlayerCrossFade(void) +{ + return pc.crossFade; +} + +void setPlayerCrossFade(float crossFadeInSeconds) +{ + if (crossFadeInSeconds < 0) + crossFadeInSeconds = 0; + pc.crossFade = crossFadeInSeconds; +} + +void setPlayerSoftwareVolume(int volume) +{ + volume = (volume > 1000) ? 1000 : (volume < 0 ? 0 : volume); + pc.softwareVolume = volume; +} + +double getPlayerTotalPlayTime(void) +{ + return pc.totalPlayTime; +} + +unsigned int getPlayerSampleRate(void) +{ + return pc.sampleRate; +} + +int getPlayerBits(void) +{ + return pc.bits; +} + +int getPlayerChannels(void) +{ + return pc.channels; +} + +/* this actually creates a dupe of the current metadata */ +Song *playerCurrentDecodeSong(void) +{ + return NULL; +} diff --git a/src/player.h b/src/player_control.h similarity index 100% rename from src/player.h rename to src/player_control.h diff --git a/src/player_thread.c b/src/player_thread.c index bb4746132..110705443 100644 --- a/src/player_thread.c +++ b/src/player_thread.c @@ -17,7 +17,7 @@ */ #include "player_thread.h" -#include "player.h" +#include "player_control.h" #include "playerData.h" #include "decoder_control.h" #include "audio.h" diff --git a/src/playlist.c b/src/playlist.c index 4560b85a5..4cc4a7182 100644 --- a/src/playlist.c +++ b/src/playlist.c @@ -17,7 +17,7 @@ */ #include "playlist.h" -#include "player.h" +#include "player_control.h" #include "command.h" #include "ls.h" #include "tag.h" diff --git a/src/stats.c b/src/stats.c index 254595472..192187aca 100644 --- a/src/stats.c +++ b/src/stats.c @@ -20,7 +20,7 @@ #include "directory.h" #include "myfprintf.h" -#include "player.h" +#include "player_control.h" #include "tagTracker.h" #include "os_compat.h" diff --git a/src/volume.c b/src/volume.c index 903e4717a..830b066fe 100644 --- a/src/volume.c +++ b/src/volume.c @@ -20,7 +20,7 @@ #include "command.h" #include "conf.h" #include "log.h" -#include "player.h" +#include "player_control.h" #include "gcc.h" #include "utils.h" #include "ack.h"