📄 libmpdclient.c
字号:
connection->doneListOk = 1; connection->listOks--; } return; } if(strncmp(output,"ACK",strlen("ACK"))==0) { char * test; char * needle; int val; strcpy(connection->errorStr, output); connection->error = MPD_ERROR_ACK; connection->errorCode = MPD_ACK_ERROR_UNK; connection->errorAt = MPD_ERROR_AT_UNK; connection->doneProcessing = 1; connection->doneListOk = 0; needle = strchr(output, '['); if(!needle) return; val = strtol(needle+1, &test, 10); if(*test != '@') return; connection->errorCode = val; val = strtol(test+1, &test, 10); if(*test != ']') return; connection->errorAt = val; return; } name = strtok_r(output,":",&tok); if(name && (value = strtok_r(NULL,"",&tok)) && value[0]==' ') { connection->returnElement = mpd_newReturnElement(name,&(value[1])); } else { if(!name || !value) { snprintf(connection->errorStr,MPD_BUFFER_MAX_LENGTH, "error parsing: %s",output); } else { snprintf(connection->errorStr,MPD_BUFFER_MAX_LENGTH, "error parsing: %s:%s",name,value); } connection->errorStr[MPD_BUFFER_MAX_LENGTH] = '\0'; connection->error = 1; }}void mpd_finishCommand(mpd_Connection * connection) { while(!connection->doneProcessing) { if(connection->doneListOk) connection->doneListOk = 0; mpd_getNextReturnElement(connection); }}void mpd_finishListOkCommand(mpd_Connection * connection) { while(!connection->doneProcessing && connection->listOks && !connection->doneListOk ) { mpd_getNextReturnElement(connection); }}int mpd_nextListOkCommand(mpd_Connection * connection) { mpd_finishListOkCommand(connection); if(!connection->doneProcessing) connection->doneListOk = 0; if(connection->listOks == 0 || connection->doneProcessing) return -1; return 0;}void mpd_sendStatusCommand(mpd_Connection * connection) { mpd_executeCommand(connection,"status\n");}mpd_Status * mpd_getStatus(mpd_Connection * connection) { mpd_Status * status; /*mpd_executeCommand(connection,"status\n"); if(connection->error) return NULL;*/ if(connection->doneProcessing || (connection->listOks && connection->doneListOk)) { return NULL; } if(!connection->returnElement) mpd_getNextReturnElement(connection); status = malloc(sizeof(mpd_Status)); status->volume = -1; status->repeat = 0; status->random = 0; status->playlist = -1; status->playlistLength = -1; status->state = -1; status->song = 0; status->elapsedTime = 0; status->totalTime = 0; status->bitRate = 0; status->sampleRate = 0; status->bits = 0; status->channels = 0; status->crossfade = -1; status->error = NULL; status->updatingDb = 0; if(connection->error) { free(status); return NULL; } while(connection->returnElement) { mpd_ReturnElement * re = connection->returnElement; if(strcmp(re->name,"volume")==0) { status->volume = atoi(re->value); } else if(strcmp(re->name,"repeat")==0) { status->repeat = atoi(re->value); } else if(strcmp(re->name,"random")==0) { status->random = atoi(re->value); } else if(strcmp(re->name,"playlist")==0) { status->playlist = strtol(re->value,NULL,10); } else if(strcmp(re->name,"playlistlength")==0) { status->playlistLength = atoi(re->value); } else if(strcmp(re->name,"bitrate")==0) { status->bitRate = atoi(re->value); } else if(strcmp(re->name,"state")==0) { if(strcmp(re->value,"play")==0) { status->state = MPD_STATUS_STATE_PLAY; } else if(strcmp(re->value,"stop")==0) { status->state = MPD_STATUS_STATE_STOP; } else if(strcmp(re->value,"pause")==0) { status->state = MPD_STATUS_STATE_PAUSE; } else { status->state = MPD_STATUS_STATE_UNKNOWN; } } else if(strcmp(re->name,"song")==0) { status->song = atoi(re->value); } else if(strcmp(re->name,"songid")==0) { status->songid = atoi(re->value); } else if(strcmp(re->name,"time")==0) { char * tok; char * copy; char * temp; copy = strdup(re->value); temp = strtok_r(copy,":",&tok); if(temp) { status->elapsedTime = atoi(temp); temp = strtok_r(NULL,"",&tok); if(temp) status->totalTime = atoi(temp); } free(copy); } else if(strcmp(re->name,"error")==0) { status->error = strdup(re->value); } else if(strcmp(re->name,"xfade")==0) { status->crossfade = atoi(re->value); } else if(strcmp(re->name,"updating_db")==0) { status->updatingDb = atoi(re->value); } else if(strcmp(re->name,"audio")==0) { char * tok; char * copy; char * temp; copy = strdup(re->value); temp = strtok_r(copy,":",&tok); if(temp) { status->sampleRate = atoi(temp); temp = strtok_r(NULL,":",&tok); if(temp) { status->bits = atoi(temp); temp = strtok_r(NULL,"",&tok); if(temp) status->channels = atoi(temp); } } free(copy); } mpd_getNextReturnElement(connection); if(connection->error) { free(status); return NULL; } } if(connection->error) { free(status); return NULL; } else if(status->state<0) { strcpy(connection->errorStr,"state not found"); connection->error = 1; free(status); return NULL; } return status;}void mpd_freeStatus(mpd_Status * status) { if(status->error) free(status->error); free(status);}void mpd_sendStatsCommand(mpd_Connection * connection) { mpd_executeCommand(connection,"stats\n");}mpd_Stats * mpd_getStats(mpd_Connection * connection) { mpd_Stats * stats; /*mpd_executeCommand(connection,"stats\n"); if(connection->error) return NULL;*/ if(connection->doneProcessing || (connection->listOks && connection->doneListOk)) { return NULL; } if(!connection->returnElement) mpd_getNextReturnElement(connection); stats = malloc(sizeof(mpd_Stats)); stats->numberOfArtists = 0; stats->numberOfAlbums = 0; stats->numberOfSongs = 0; stats->uptime = 0; stats->dbUpdateTime = 0; stats->playTime = 0; stats->dbPlayTime = 0; if(connection->error) { free(stats); return NULL; } while(connection->returnElement) { mpd_ReturnElement * re = connection->returnElement; if(strcmp(re->name,"artists")==0) { stats->numberOfArtists = atoi(re->value); } else if(strcmp(re->name,"albums")==0) { stats->numberOfAlbums = atoi(re->value); } else if(strcmp(re->name,"songs")==0) { stats->numberOfSongs = atoi(re->value); } else if(strcmp(re->name,"uptime")==0) { stats->uptime = strtol(re->value,NULL,10); } else if(strcmp(re->name,"db_update")==0) { stats->dbUpdateTime = strtol(re->value,NULL,10); } else if(strcmp(re->name,"playtime")==0) { stats->playTime = strtol(re->value,NULL,10); } else if(strcmp(re->name,"db_playtime")==0) { stats->dbPlayTime = strtol(re->value,NULL,10); } mpd_getNextReturnElement(connection); if(connection->error) { free(stats); return NULL; } } if(connection->error) { free(stats); return NULL; } return stats;}void mpd_freeStats(mpd_Stats * stats) { free(stats);}void mpd_initSong(mpd_Song * song) { song->file = NULL; song->artist = NULL; song->album = NULL; song->track = NULL; song->title = NULL; song->name = NULL; song->date = NULL; song->time = MPD_SONG_NO_TIME; song->pos = MPD_SONG_NO_NUM; song->id = MPD_SONG_NO_ID;}void mpd_finishSong(mpd_Song * song) { if(song->file) free(song->file); if(song->artist) free(song->artist); if(song->album) free(song->album); if(song->title) free(song->title); if(song->track) free(song->track); if(song->name) free(song->name); if(song->date) free(song->date);}mpd_Song * mpd_newSong() { mpd_Song * ret = malloc(sizeof(mpd_Song)); mpd_initSong(ret); return ret;}void mpd_freeSong(mpd_Song * song) { mpd_finishSong(song); free(song);}mpd_Song * mpd_songDup(mpd_Song * song) { mpd_Song * ret = mpd_newSong(); if(song->file) ret->file = strdup(song->file); if(song->artist) ret->artist = strdup(song->artist); if(song->album) ret->album = strdup(song->album); if(song->title) ret->title = strdup(song->title); if(song->track) ret->track = strdup(song->track); if(song->name) ret->name = strdup(song->name); if(song->date) ret->date = strdup(song->date); ret->time = song->time; ret->pos = song->pos; ret->id = song->id; return ret;}void mpd_initDirectory(mpd_Directory * directory) { directory->path = NULL;}void mpd_finishDirectory(mpd_Directory * directory) { if(directory->path) free(directory->path);}mpd_Directory * mpd_newDirectory () { mpd_Directory * directory = malloc(sizeof(mpd_Directory));; mpd_initDirectory(directory); return directory;}void mpd_freeDirectory(mpd_Directory * directory) { mpd_finishDirectory(directory); free(directory);}mpd_Directory * mpd_directoryDup(mpd_Directory * directory) { mpd_Directory * ret = mpd_newDirectory(); if(directory->path) ret->path = strdup(directory->path); return ret;}void mpd_initPlaylistFile(mpd_PlaylistFile * playlist) { playlist->path = NULL;}void mpd_finishPlaylistFile(mpd_PlaylistFile * playlist) { if(playlist->path) free(playlist->path);}mpd_PlaylistFile * mpd_newPlaylistFile() { mpd_PlaylistFile * playlist = malloc(sizeof(mpd_PlaylistFile)); mpd_initPlaylistFile(playlist); return playlist;}void mpd_freePlaylistFile(mpd_PlaylistFile * playlist) { mpd_finishPlaylistFile(playlist); free(playlist);}mpd_PlaylistFile * mpd_playlistFileDup(mpd_PlaylistFile * playlist) { mpd_PlaylistFile * ret = mpd_newPlaylistFile(); if(playlist->path) ret->path = strdup(playlist->path); return ret;}void mpd_initInfoEntity(mpd_InfoEntity * entity) { entity->info.directory = NULL;} void mpd_finishInfoEntity(mpd_InfoEntity * entity) { if(entity->info.directory) { if(entity->type == MPD_INFO_ENTITY_TYPE_DIRECTORY) { mpd_freeDirectory(entity->info.directory); } else if(entity->type == MPD_INFO_ENTITY_TYPE_SONG) { mpd_freeSong(entity->info.song); } else if(entity->type == MPD_INFO_ENTITY_TYPE_PLAYLISTFILE) { mpd_freePlaylistFile(entity->info.playlistFile); } }}mpd_InfoEntity * mpd_newInfoEntity() { mpd_InfoEntity * entity = malloc(sizeof(mpd_InfoEntity)); mpd_initInfoEntity(entity); return entity;}void mpd_freeInfoEntity(mpd_InfoEntity * entity) { mpd_finishInfoEntity(entity); free(entity);}void mpd_sendInfoCommand(mpd_Connection * connection, char * command) { mpd_executeCommand(connection,command);}mpd_InfoEntity * mpd_getNextInfoEntity(mpd_Connection * connection) { mpd_InfoEntity * entity = NULL; if(connection->doneProcessing || (connection->listOks && connection->doneListOk)) { return NULL; } if(!connection->returnElement) mpd_getNextReturnElement(connection); if(connection->returnElement) { if(strcmp(connection->returnElement->name,"file")==0) { entity = mpd_newInfoEntity(); entity->type = MPD_INFO_ENTITY_TYPE_SONG; entity->info.song = mpd_newSong(); entity->info.song->file = strdup(connection->returnElement->value); } else if(strcmp(connection->returnElement->name, "directory")==0) { entity = mpd_newInfoEntity(); entity->type = MPD_INFO_ENTITY_TYPE_DIRECTORY; entity->info.directory = mpd_newDirectory(); entity->info.directory->path = strdup(connection->returnElement->value); } else if(strcmp(connection->returnElement->name,"playlist")==0) { entity = mpd_newInfoEntity(); entity->type = MPD_INFO_ENTITY_TYPE_PLAYLISTFILE; entity->info.playlistFile = mpd_newPlaylistFile(); entity->info.playlistFile->path = strdup(connection->returnElement->value); } else { connection->error = 1; strcpy(connection->errorStr,"problem parsing song info"); return NULL; } } else return NULL; mpd_getNextReturnElement(connection); while(connection->returnElement) { mpd_ReturnElement * re = connection->returnElement; if(strcmp(re->name,"file")==0) return entity; else if(strcmp(re->name,"directory")==0) return entity; else if(strcmp(re->name,"playlist")==0) return entity; if(entity->type == MPD_INFO_ENTITY_TYPE_SONG && strlen(re->value)) { if(!entity->info.song->artist && strcmp(re->name,"Artist")==0) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -