aboutsummaryrefslogtreecommitdiffstats
path: root/src/playerData.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/playerData.c124
1 files changed, 124 insertions, 0 deletions
diff --git a/src/playerData.c b/src/playerData.c
new file mode 100644
index 000000000..fee8ac719
--- /dev/null
+++ b/src/playerData.c
@@ -0,0 +1,124 @@
+/* the Music Player Daemon (MPD)
+ * (c)2003-2004 by Warren Dukes (shank@mercury.chem.pitt.edu)
+ * 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 "playerData.h"
+#include "conf.h"
+#include "log.h"
+
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int buffered_before_play;
+int BUFFERED_CHUNKS;
+
+PlayerData * playerData_pd;
+
+void initPlayerData() {
+ float perc;
+ char * test;
+ int shmid;
+ int crossfade = 0;
+ size_t bufferSize;
+ size_t allocationSize;
+ Buffer * buffer;
+
+ bufferSize = strtol(getConf()[CONF_BUFFER_SIZE],&test,10);
+ if(*test!='\0' || bufferSize<=0) {
+ ERROR("buffer size \"%s\" is not a positive integer\n",
+ getConf()[CONF_BUFFER_SIZE]);
+ exit(-1);
+ }
+ bufferSize*=1024;
+
+ BUFFERED_CHUNKS = bufferSize/CHUNK_SIZE;
+
+ perc = strtod((getConf())[CONF_BUFFER_BEFORE_PLAY],&test);
+ if(*test!='%' || perc<0 || perc>100) {
+ ERROR("buffered before play \"%s\" is not a positive "
+ "percentage and less than 100 percent\n",
+ (getConf())[CONF_BUFFER_BEFORE_PLAY]);
+ exit(-1);
+ }
+ buffered_before_play = (perc/100)*BUFFERED_CHUNKS;
+ if(buffered_before_play>BUFFERED_CHUNKS) {
+ buffered_before_play = BUFFERED_CHUNKS;
+ }
+ else if(buffered_before_play<0) buffered_before_play = 0;
+
+ allocationSize = BUFFERED_CHUNKS*CHUNK_SIZE; /*actual buffer*/
+ allocationSize+= BUFFERED_CHUNKS*sizeof(float); /*for times*/
+ allocationSize+= BUFFERED_CHUNKS*sizeof(mpd_sint16); /*for chunkSize*/
+ allocationSize+= BUFFERED_CHUNKS*sizeof(mpd_sint16); /*for bitRate*/
+ allocationSize+= sizeof(PlayerData); /*for playerData struct*/
+
+ if((shmid = shmget(IPC_PRIVATE,allocationSize,IPC_CREAT|0600))<0) {
+ ERROR("problems shmget'ing\n");
+ exit(-1);
+ }
+ if((playerData_pd = shmat(shmid,NULL,0))<0) {
+ ERROR("problems shmat'ing\n");
+ exit(-1);
+ }
+ if (shmctl(shmid, IPC_RMID, 0)<0) {
+ ERROR("problems shmctl'ing\n");
+ exit(-1);
+ }
+
+ buffer = &(playerData_pd->buffer);
+
+ buffer->chunks = ((char *)playerData_pd)+sizeof(PlayerData);
+ buffer->chunkSize = (mpd_sint16 *)(((char *)buffer->chunks)+
+ BUFFERED_CHUNKS*CHUNK_SIZE);
+ buffer->bitRate = (mpd_sint16 *)(((char *)buffer->chunkSize)+
+ BUFFERED_CHUNKS*sizeof(mpd_sint16));
+ buffer->times = (float *)(((char *)buffer->bitRate)+
+ BUFFERED_CHUNKS*sizeof(mpd_sint16));
+
+ 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.file[0] = '\0';
+ playerData_pd->playerControl.crossFade = crossfade;
+ playerData_pd->playerControl.softwareVolume = 100;
+ playerData_pd->playerControl.totalPlayTime = 0;
+
+ playerData_pd->decoderControl.stop = 0;
+ playerData_pd->decoderControl.start = 0;
+ playerData_pd->decoderControl.state = DECODE_STATE_STOP;
+ playerData_pd->decoderControl.seek = 0;
+ playerData_pd->decoderControl.error = DECODE_ERROR_NOERROR;
+ playerData_pd->decoderControl.file[0] = '\0';
+}
+
+PlayerData * getPlayerData() {
+ return playerData_pd;
+}
+
+void freePlayerData() {
+ shmdt(playerData_pd);
+}