wmaker-eukara/dockapps/wmmp/src/mpd_func.c

232 lines
5.1 KiB
C

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "mpd_func.h"
char * mpd_host;
int mpd_port;
char * mpd_password = NULL;
mpd_Connection * connection = NULL;
mpd_Status * status = NULL;
int MpdIsErrored() {
if(!connection->error) return 0;
if(connection->error==MPD_ERROR_UNKHOST ||
connection->error==MPD_ERROR_SYSTEM ||
connection->error==MPD_ERROR_NOTMPD) {
fprintf(stderr,"%s\n",connection->errorStr);
exit(-1);
}
else if(connection->error==MPD_ERROR_TIMEOUT ||
connection->error==MPD_ERROR_SENDING ||
connection->error==MPD_ERROR_CONNCLOSED ||
connection->error==MPD_ERROR_NORESPONSE ||
connection->error==MPD_ERROR_CONNPORT) {
/*fprintf(stderr,"%s\n",connection->errorStr);
fprintf(stderr,"resetting connection\n");*/
mpd_closeConnection(connection);
connection = NULL;
}
else {
fprintf(stderr,"%s\n",connection->errorStr);
connection->error = 0;
}
return 1;
}
void MpdPlay() {
if(status && status->state==MPD_STATUS_STATE_PAUSE) {
MpdPause();
return;
}
mpd_sendPlayCommand(connection,MPD_PLAY_AT_BEGINNING);
if(MpdIsErrored()) return;
mpd_finishCommand(connection);
if(MpdIsErrored()) return;
}
void MpdStop() {
mpd_sendStopCommand(connection);
if(MpdIsErrored()) return;
mpd_finishCommand(connection);
if(MpdIsErrored()) return;
}
void MpdPause() {
mpd_sendPauseCommand(connection);
if(MpdIsErrored()) return;
mpd_finishCommand(connection);
if(MpdIsErrored()) return;
}
void MpdEject() {
}
void MpdPrev() {
mpd_sendPrevCommand(connection);
if(MpdIsErrored()) return;
mpd_finishCommand(connection);
if(MpdIsErrored()) return;
}
void MpdNext() {
mpd_sendNextCommand(connection);
if(MpdIsErrored()) return;
mpd_finishCommand(connection);
if(MpdIsErrored()) return;
}
void MpdFastr() {
if(!status || status->state==MPD_STATUS_STATE_STOP) return;
mpd_sendSeekCommand(connection,status->song,status->elapsedTime-10);
if(MpdIsErrored()) return;
mpd_finishCommand(connection);
if(MpdIsErrored()) return;
MpdStatus();
}
void MpdFastf() {
if(!status || status->state==MPD_STATUS_STATE_STOP) return;
mpd_sendSeekCommand(connection,status->song,status->elapsedTime+10);
if(MpdIsErrored()) return;
mpd_finishCommand(connection);
if(MpdIsErrored()) return;
MpdStatus();
}
int MpdGetVolume() {
if(status && status->volume!=MPD_STATUS_NO_VOLUME) {
return status->volume;
}
return 0;
}
void MpdToggleRandom() {
mpd_sendRandomCommand(connection,!status->random);
if(MpdIsErrored()) return;
mpd_finishCommand(connection);
if(MpdIsErrored()) return;
}
void MpdToggleRepeat() {
mpd_sendRepeatCommand(connection,!status->repeat);
if(MpdIsErrored()) return;
mpd_finishCommand(connection);
if(MpdIsErrored()) return;
}
int MpdStatus() {
if(!connection) {
connection = mpd_newConnection(mpd_host,mpd_port,10);
if(MpdIsErrored()) return 0;
if(mpd_password && strlen(mpd_password)) {
mpd_sendPasswordCommand(connection,mpd_password);
if(MpdIsErrored()) return 0;
mpd_finishCommand(connection);
if(MpdIsErrored()) return 0;
}
}
if(status) mpd_freeStatus(status);
status = mpd_getStatus(connection);
if(MpdIsErrored()) return 0;
mpd_finishCommand(connection);
if(MpdIsErrored()) return 0;
if(!status) return 0;
return 1;
}
int MpdPauseStatus() {
if(status) return (status->state == MPD_STATUS_STATE_PAUSE);
return 0;
}
int MpdRandomStatus() {
if(status) return status->random;
return 0;
}
int MpdRepeatStatus() {
if(status) return status->repeat;
return 0;
}
int MpdPlayStatus() {
if(status) return (status->state == MPD_STATUS_STATE_PLAY);
return 0;
}
int MpdGetTrack() {
if(status) return status->song;
return 0;
}
char *MpdGetTitle() {
static char * ret = NULL;
static unsigned long lastVersion = 0;
static int lastSong = -1;
mpd_InfoEntity * entity;
if(!status || (status->state!=MPD_STATUS_STATE_PLAY &&
status->state!=MPD_STATUS_STATE_PAUSE)) {
if(ret) free(ret);
lastVersion = 0;
lastSong = -1;
ret = strdup("");
return ret;
}
if(ret && lastVersion == status->playlist &&
lastSong == status->song) {
return ret;
}
lastVersion = status->playlist;
lastSong = status->song;
if(ret) free(ret);
mpd_sendPlaylistInfoCommand(connection,status->song);
if(MpdIsErrored()) {
ret = strdup("");
return ret;
}
if((entity = mpd_getNextInfoEntity(connection))) {
if(entity->info.song->artist && entity->info.song->title) {
ret = malloc(strlen(entity->info.song->artist) +
strlen(entity->info.song->title) + 4);
sprintf(ret,"%s - %s",entity->info.song->artist,
entity->info.song->title);
}
else ret = strdup(entity->info.song->file);
mpd_freeInfoEntity(entity);
}
if(MpdIsErrored()) return ret;
mpd_finishCommand(connection);
if(MpdIsErrored()) return ret;
return ret;
}
int MpdGetTime() {
if(status) return status->elapsedTime;
return 0;
}
void MpdSetVolume(int v) {
if(!status || status->volume == MPD_STATUS_NO_VOLUME) return;
mpd_sendSetvolCommand(connection,v);
if(connection->error) {
fprintf(stderr,"%s\n",connection->errorStr);
}
mpd_finishCommand(connection);
if(connection->error) {
fprintf(stderr,"%s\n",connection->errorStr);
}
MpdStatus();
}