new command, plchanges, and also add Num: to songinfo of playlistinfo

git-svn-id: https://svn.musicpd.org/mpd/trunk@1339 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
Warren Dukes 2004-06-05 01:14:37 +00:00
parent 744c0fa256
commit c2c34f78dd
8 changed files with 137 additions and 66 deletions

17
TODO
View File

@ -1,20 +1,15 @@
1) add song# to metadata when printing songs 1) Parse icymetadata
2) add updated songs command, to output list of updated songs: 2) Put a new metadata entry for icyName for Song's
updatesongs <since-playlist-version>
3) Parse icymetadata 3) Add a list_OK options for command_lists, to get a list_OK after each
4) Put a new metadata entry for icyName for Song's
5) Add a list_OK options for command_lists, to get a list_OK after each
command command
6) put some sort of error reporting for streaming/inputStream! 4) put some sort of error reporting for streaming/inputStream!
7) Fix charset errors so they don't goto stderr/out 5) Fix charset errors so they don't goto stderr/out
8) Add a timeout for streams (how long? 1 minutes?) 6) Add a timeout for streams (how long? 1 minutes?)
Post-1.0 Post-1.0

View File

@ -37,43 +37,44 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#define COMMAND_PLAY "play" #define COMMAND_PLAY "play"
#define COMMAND_STOP "stop" #define COMMAND_STOP "stop"
#define COMMAND_PAUSE "pause" #define COMMAND_PAUSE "pause"
#define COMMAND_STATUS "status" #define COMMAND_STATUS "status"
#define COMMAND_KILL "kill" #define COMMAND_KILL "kill"
#define COMMAND_CLOSE "close" #define COMMAND_CLOSE "close"
#define COMMAND_ADD "add" #define COMMAND_ADD "add"
#define COMMAND_DELETE "delete" #define COMMAND_DELETE "delete"
#define COMMAND_PLAYLIST "playlist" #define COMMAND_PLAYLIST "playlist"
#define COMMAND_SHUFFLE "shuffle" #define COMMAND_SHUFFLE "shuffle"
#define COMMAND_CLEAR "clear" #define COMMAND_CLEAR "clear"
#define COMMAND_SAVE "save" #define COMMAND_SAVE "save"
#define COMMAND_LOAD "load" #define COMMAND_LOAD "load"
#define COMMAND_LSINFO "lsinfo" #define COMMAND_LSINFO "lsinfo"
#define COMMAND_RM "rm" #define COMMAND_RM "rm"
#define COMMAND_PLAYLISTINFO "playlistinfo" #define COMMAND_PLAYLISTINFO "playlistinfo"
#define COMMAND_FIND "find" #define COMMAND_FIND "find"
#define COMMAND_SEARCH "search" #define COMMAND_SEARCH "search"
#define COMMAND_UPDATE "update" #define COMMAND_UPDATE "update"
#define COMMAND_NEXT "next" #define COMMAND_NEXT "next"
#define COMMAND_PREVIOUS "previous" #define COMMAND_PREVIOUS "previous"
#define COMMAND_LISTALL "listall" #define COMMAND_LISTALL "listall"
#define COMMAND_VOLUME "volume" #define COMMAND_VOLUME "volume"
#define COMMAND_REPEAT "repeat" #define COMMAND_REPEAT "repeat"
#define COMMAND_RANDOM "random" #define COMMAND_RANDOM "random"
#define COMMAND_STATS "stats" #define COMMAND_STATS "stats"
#define COMMAND_CLEAR_ERROR "clearerror" #define COMMAND_CLEAR_ERROR "clearerror"
#define COMMAND_LIST "list" #define COMMAND_LIST "list"
#define COMMAND_MOVE "move" #define COMMAND_MOVE "move"
#define COMMAND_SWAP "swap" #define COMMAND_SWAP "swap"
#define COMMAND_SEEK "seek" #define COMMAND_SEEK "seek"
#define COMMAND_LISTALLINFO "listallinfo" #define COMMAND_LISTALLINFO "listallinfo"
#define COMMAND_PING "ping" #define COMMAND_PING "ping"
#define COMMAND_SETVOL "setvol" #define COMMAND_SETVOL "setvol"
#define COMMAND_PASSWORD "password" #define COMMAND_PASSWORD "password"
#define COMMAND_CROSSFADE "crossfade" #define COMMAND_CROSSFADE "crossfade"
#define COMMAND_URL_HANDLERS "urlhandlers" #define COMMAND_URL_HANDLERS "urlhandlers"
#define COMMAND_PLCHANGES "plchanges"
#define COMMAND_STATUS_VOLUME "volume" #define COMMAND_STATUS_VOLUME "volume"
#define COMMAND_STATUS_STATE "state" #define COMMAND_STATUS_STATE "state"
@ -322,6 +323,20 @@ int handleRm(FILE * fp, unsigned int * permission, int argArrayLength,
return deletePlaylist(fp,argArray[1]); return deletePlaylist(fp,argArray[1]);
} }
int handlePlaylistChanges(FILE * fp, unsigned int * permission,
int argArrayLength, char ** argArray)
{
unsigned long version;
char * test;
version = strtoul(argArray[1], &test, 10);
if(*test!='\0') {
commandError(fp, ACK_ERROR_ARG, "need a positive integer");
return -1;
}
return playlistChanges(fp, version);
}
int handlePlaylistInfo(FILE * fp, unsigned int * permission, int handlePlaylistInfo(FILE * fp, unsigned int * permission,
int argArrayLength, char ** argArray) int argArrayLength, char ** argArray)
{ {
@ -641,6 +656,7 @@ void initCommands() {
addCommand(COMMAND_PASSWORD ,0, 1, 1,handlePassword,NULL); addCommand(COMMAND_PASSWORD ,0, 1, 1,handlePassword,NULL);
addCommand(COMMAND_CROSSFADE ,PERMISSION_CONTROL, 1, 1,handleCrossfade,NULL); addCommand(COMMAND_CROSSFADE ,PERMISSION_CONTROL, 1, 1,handleCrossfade,NULL);
addCommand(COMMAND_URL_HANDLERS,PERMISSION_READ, 0, 0,handleUrlHandlers,NULL); addCommand(COMMAND_URL_HANDLERS,PERMISSION_READ, 0, 0,handleUrlHandlers,NULL);
addCommand(COMMAND_PLCHANGES ,PERMISSION_READ, 1, 1,handlePlaylistChanges,NULL);
sortList(commandList); sortList(commandList);
} }

View File

@ -54,7 +54,7 @@ void finishCommands();
current_command = NULL; \ current_command = NULL; \
} \ } \
else { \ else { \
myfprintf(fp, "ACK [%i@%i] " format "\n", \ myfprintf(stderr, "ACK [%i@%i] " format "\n", \
(int)error, command_listNum, \ (int)error, command_listNum, \
##__VA_ARGS__); \ ##__VA_ARGS__); \
} \ } \

View File

@ -69,7 +69,7 @@
#endif #endif
#endif #endif
char * conf_params[CONF_NUMBER_OF_PARAMS]; static char * conf_params[CONF_NUMBER_OF_PARAMS];
void initConf() { void initConf() {
int i; int i;

View File

@ -159,7 +159,7 @@ void readDirectoryDBIfUpdateIsFinished() {
if(directory_reReadDB && 0==directory_updatePid) { if(directory_reReadDB && 0==directory_updatePid) {
DEBUG("readDirectoryDB since update finished successfully\n"); DEBUG("readDirectoryDB since update finished successfully\n");
readDirectoryDB(); readDirectoryDB();
incrPlaylistVersion(); playlistVersionChange();
directory_reReadDB = 0; directory_reReadDB = 0;
} }
} }

View File

@ -36,8 +36,6 @@
#include <unistd.h> #include <unistd.h>
#include <time.h> #include <time.h>
#define BITS_FOR_VERSION 31
#define PLAYLIST_COMMENT '#' #define PLAYLIST_COMMENT '#'
#define PLAYLIST_STATE_STOP 0 #define PLAYLIST_STATE_STOP 0
@ -62,13 +60,15 @@
typedef struct _Playlist { typedef struct _Playlist {
Song ** songs; Song ** songs;
/* holds version a song was modified on */
mpd_uint32 * songMod;
int * order; int * order;
int length; int length;
int current; int current;
int queued; int queued;
int repeat; int repeat;
int random; int random;
unsigned long version; mpd_uint32 version;
} Playlist; } Playlist;
static Playlist playlist; static Playlist playlist;
@ -87,10 +87,28 @@ static void swapOrder(int a, int b);
static int playPlaylistOrderNumber(FILE * fp, int orderNum); static int playPlaylistOrderNumber(FILE * fp, int orderNum);
static void randomizeOrder(int start, int end); static void randomizeOrder(int start, int end);
void incrPlaylistVersion() { static void incrPlaylistVersion() {
static unsigned long max = ((unsigned long)1<<BITS_FOR_VERSION)-1; static unsigned long max = ((mpd_uint32)1<<31)-1;
playlist.version++; playlist.version++;
if(playlist.version>=max) playlist.version = 0; if(playlist.version>=max) {
int i;
for(i=0; i<playlist.length; i++) {
playlist.songMod[i] = 0;
}
playlist.version = 1;
}
}
void playlistVersionChange() {
int i = 0;
for(i=0; i<playlist.length; i++) {
playlist.songMod[i] = playlist.version;
}
incrPlaylistVersion();
} }
static void incrPlaylistCurrent() { static void incrPlaylistCurrent() {
@ -108,7 +126,7 @@ void initPlaylist() {
playlist.length = 0; playlist.length = 0;
playlist.repeat = 0; playlist.repeat = 0;
playlist.version = 0; playlist.version = 1;
playlist.random = 0; playlist.random = 0;
playlist.queued = -1; playlist.queued = -1;
playlist.current = -1; playlist.current = -1;
@ -136,7 +154,8 @@ void initPlaylist() {
} }
playlist.songs = malloc(sizeof(Song *)*playlist_max_length); playlist.songs = malloc(sizeof(Song *)*playlist_max_length);
playlist.order = malloc(sizeof(Song *)*playlist_max_length); playlist.songMod = malloc(sizeof(mpd_uint32)*playlist_max_length);
playlist.order = malloc(sizeof(int)*playlist_max_length);
memset(playlist.songs,0,sizeof(char *)*playlist_max_length); memset(playlist.songs,0,sizeof(char *)*playlist_max_length);
@ -155,8 +174,13 @@ void finishPlaylist() {
freeJustSong(playlist.songs[i]); freeJustSong(playlist.songs[i]);
} }
} }
playlist.length = 0;
free(playlist.songs); free(playlist.songs);
playlist.songs = NULL; playlist.songs = NULL;
free(playlist.songMod);
playlist.songMod = NULL;
free(playlist.order); free(playlist.order);
playlist.order = NULL; playlist.order = NULL;
} }
@ -364,8 +388,32 @@ void readPlaylistState() {
} }
} }
int playlistInfo(FILE * fp,int song) { void printPlaylistSongInfo(FILE * fp, int song) {
MpdTag * tag; MpdTag * tag;
myfprintf(fp, "file: %s\n", (playlist.songs[song])->utf8url);
if((tag = (playlist.songs[song])->tag)) {
printMpdTag(fp, tag);
}
myfprintf(fp, "Num: %i\n", song);
}
int playlistChanges(FILE * fp, mpd_uint32 version) {
int i;
for(i=0; i<playlist.length; i++) {
if(version > playlist.version ||
playlist.songMod[i] >= version ||
playlist.songMod[i] == 0)
{
printPlaylistSongInfo(fp, i);
}
}
return 0;
}
int playlistInfo(FILE * fp, int song) {
int i; int i;
int begin = 0; int begin = 0;
int end = playlist.length; int end = playlist.length;
@ -380,12 +428,7 @@ int playlistInfo(FILE * fp,int song) {
return -1; return -1;
} }
for(i=begin;i<end;i++) { for(i=begin; i<end; i++) printPlaylistSongInfo(fp, i);
myfprintf(fp,"file: %s\n",(playlist.songs[i])->utf8url);
if((tag = (playlist.songs[i])->tag)) {
printMpdTag(fp,tag);
}
}
return 0; return 0;
} }
@ -396,6 +439,8 @@ void swapSongs(int song1, int song2) {
temp = playlist.songs[song1]; temp = playlist.songs[song1];
playlist.songs[song1] = playlist.songs[song2]; playlist.songs[song1] = playlist.songs[song2];
playlist.songs[song2] = temp; playlist.songs[song2] = temp;
playlist.songMod[song1] = playlist.version;
playlist.songMod[song2] = playlist.version;
} }
void queueNextSongInPlaylist() { void queueNextSongInPlaylist() {
@ -512,6 +557,7 @@ int addSongToPlaylist(FILE * fp, Song * song) {
} }
playlist.songs[playlist.length] = song; playlist.songs[playlist.length] = song;
playlist.songMod[playlist.length] = playlist.version;
playlist.order[playlist.length] = playlist.length; playlist.order[playlist.length] = playlist.length;
playlist.length++; playlist.length++;
@ -613,6 +659,7 @@ int deleteFromPlaylist(FILE * fp, int song) {
/* delete song from songs array */ /* delete song from songs array */
for(i=song;i<playlist.length-1;i++) { for(i=song;i<playlist.length-1;i++) {
playlist.songs[i] = playlist.songs[i+1]; playlist.songs[i] = playlist.songs[i+1];
playlist.songMod[i] = playlist.version;
} }
/* now find it in the order array */ /* now find it in the order array */
for(i=0;i<playlist.length-1;i++) { for(i=0;i<playlist.length-1;i++) {
@ -746,12 +793,14 @@ int playPlaylist(FILE * fp, int song, int stopOnError) {
void syncCurrentPlayerDecodeMetadata() { void syncCurrentPlayerDecodeMetadata() {
Song * songPlayer = playerCurrentDecodeSong(); Song * songPlayer = playerCurrentDecodeSong();
Song * song; Song * song;
int songNum;
if(!songPlayer) return; if(!songPlayer) return;
if(playlist_state!=PLAYLIST_STATE_PLAY) return; if(playlist_state!=PLAYLIST_STATE_PLAY) return;
song = playlist.songs[playlist.order[playlist.current]]; songNum = playlist.order[playlist.current];
song = playlist.songs[songNum];
if(song->type == SONG_TYPE_URL && if(song->type == SONG_TYPE_URL &&
0 == strcmp(song->utf8url, songPlayer->utf8url) && 0 == strcmp(song->utf8url, songPlayer->utf8url) &&
@ -759,6 +808,7 @@ void syncCurrentPlayerDecodeMetadata() {
{ {
if(song->tag) freeMpdTag(song->tag); if(song->tag) freeMpdTag(song->tag);
song->tag = mpdTagDup(songPlayer->tag); song->tag = mpdTagDup(songPlayer->tag);
playlist.songMod[songNum] = playlist.version;
incrPlaylistVersion(); incrPlaylistVersion();
} }
} }
@ -891,11 +941,18 @@ int moveSongInPlaylist(FILE * fp, int from, int to) {
tmpSong = playlist.songs[from]; tmpSong = playlist.songs[from];
/* move songs to one less in from->to */ /* move songs to one less in from->to */
for(i=from;i<to;i++) playlist.songs[i] = playlist.songs[i+1]; for(i=from;i<to;i++) {
playlist.songs[i] = playlist.songs[i+1];
playlist.songMod[i] = playlist.version;
}
/* move songs to one more in to->from */ /* move songs to one more in to->from */
for(i=from;i>to;i--) playlist.songs[i] = playlist.songs[i-1]; for(i=from;i>to;i--) {
playlist.songs[i] = playlist.songs[i-1];
playlist.songMod[i] = playlist.version;
}
/* put song at _to_ */ /* put song at _to_ */
playlist.songs[to] = tmpSong; playlist.songs[to] = tmpSong;
playlist.songMod[to] = playlist.version;
/* now deal with order */ /* now deal with order */
if(playlist.random) { if(playlist.random) {
for(i=0;i<playlist.length;i++) { for(i=0;i<playlist.length;i++) {

View File

@ -22,6 +22,7 @@
#include "../config.h" #include "../config.h"
#include "song.h" #include "song.h"
#include "mpd_types.h"
#include <stdio.h> #include <stdio.h>
#include <sys/param.h> #include <sys/param.h>
@ -93,7 +94,9 @@ void playPlaylistIfPlayerStopped();
int seekSongInPlaylist(FILE * fp, int song, float time); int seekSongInPlaylist(FILE * fp, int song, float time);
void incrPlaylistVersion(); void playlistVersionChange();
int playlistChanges(FILE * fp, mpd_uint32 version);
#endif #endif
/* vim:set shiftwidth=4 tabstop=8 expandtab: */ /* vim:set shiftwidth=4 tabstop=8 expandtab: */

View File

@ -44,7 +44,7 @@ int handlePendingSignals() {
signal_clear(SIGHUP); signal_clear(SIGHUP);
if(!isUpdatingDB()) { if(!isUpdatingDB()) {
readDirectoryDB(); readDirectoryDB();
incrPlaylistVersion(); playlistVersionChange();
} }
if(myfprintfCloseAndOpenLogFile()<0) return COMMAND_RETURN_KILL; if(myfprintfCloseAndOpenLogFile()<0) return COMMAND_RETURN_KILL;
playerCycleLogFiles(); playerCycleLogFiles();