int mpd_put_state(char *buffer, int *current_song_id, unsigned *queue_version) { struct mpd_status *status; int len; status = mpd_run_status(mpd.conn); if (!status) { fprintf(stderr, "MPD mpd_run_status: %s\n", mpd_connection_get_error_message(mpd.conn)); mpd.conn_state = MPD_FAILURE; return 0; } len = snprintf(buffer, MAX_SIZE, "{\"type\":\"state\", \"data\":{" " \"state\":%d, \"volume\":%d, \"repeat\":%d," " \"single\":%d, \"consume\":%d, \"random\":%d, " " \"songpos\": %d, \"elapsedTime\": %d, \"totalTime\":%d, " " \"currentsongid\": %d" "}}", mpd_status_get_state(status), mpd_status_get_volume(status), mpd_status_get_repeat(status), mpd_status_get_single(status), mpd_status_get_consume(status), mpd_status_get_random(status), mpd_status_get_song_pos(status), mpd_status_get_elapsed_time(status), mpd_status_get_total_time(status), mpd_status_get_song_id(status)); *current_song_id = mpd_status_get_song_id(status); *queue_version = mpd_status_get_queue_version(status); mpd_status_free(status); return len; }
static bool setup_seek(struct mpdclient *c) { if (!mpdclient_is_playing(c)) return false; if (seek_id != (int)mpd_status_get_song_id(c->status)) { seek_id = mpd_status_get_song_id(c->status); seek_target_time = mpd_status_get_elapsed_time(c->status); } schedule_seek_timer(c); return true; }
void mpd_put_state(void) { struct mpd_status *status; int len; unsigned queue_len; int song_pos, next_song_pos; status = mpd_run_status(mpd.conn); if (!status) { syslog(LOG_ERR, "%s mpd_run_status: %s\n", __func__, mpd_connection_get_error_message(mpd.conn)); mpd.conn_state = MPD_FAILURE; return; } mpd.song_pos = mpd_status_get_song_pos(status); mpd.next_song_pos = song_pos+1; //TODO: mpd_status_get_next_song_pos(status); mpd.queue_len = mpd_status_get_queue_length(status); mpd.volume = mpd_status_get_volume(status); mpd.state = mpd_status_get_state(status); mpd.repeat = mpd_status_get_repeat(status); mpd.single = mpd_status_get_single(status); mpd.consume = mpd_status_get_consume(status); mpd.random = mpd_status_get_random(status); mpd.elapsed_time = mpd_status_get_elapsed_time(status); mpd.total_time = mpd_status_get_total_time(status); mpd.song_id = mpd_status_get_song_id(status); // printf("%d\n", mpd.song_id); mpd_status_free(status); }
/** * Returns the id of the current song, but only if it is really * playing (playing or paused). */ static int get_active_song(const struct mpd_status *status) { return mpd_status_get_state(status) == MPD_STATE_PLAY || mpd_status_get_state(status) == MPD_STATE_PAUSE ? mpd_status_get_song_id(status) : -1; }
int cmd_cdprev(gcc_unused int argc, gcc_unused char **argv, struct mpd_connection *conn) { struct mpd_status *status = getStatus(conn); /* go to previous track if mpd is playing first 3 seconds of current track otherwise seek to beginning of current track */ if (mpd_status_get_elapsed_time(status) < 3) { cmd_prev(0, NULL, conn); } else { if (!mpd_run_seek_id(conn, mpd_status_get_song_id(status), 0)) printErrorAndExit(conn); } return 1; }
static void update_progress_window(struct mpdclient *c, bool repaint) { unsigned elapsed, duration; if (c->status == NULL) elapsed = 0; else if (seek_id >= 0 && seek_id == mpd_status_get_song_id(c->status)) elapsed = seek_target_time; else elapsed = mpd_status_get_elapsed_time(c->status); duration = mpdclient_is_playing(c) ? mpd_status_get_total_time(c->status) : 0; if (progress_bar_set(&screen.progress_bar, elapsed, duration) || repaint) progress_bar_paint(&screen.progress_bar); }
void Mpd_status::assign_status(struct mpd_status * status) { const struct mpd_audio_format *format; uint32_t ms; volume = mpd_status_get_volume(status); repeat = mpd_status_get_repeat(status); single = mpd_status_get_single(status); random = mpd_status_get_random(status); consume = mpd_status_get_consume(status); playlist_length = mpd_status_get_queue_length(status); playlist = mpd_status_get_queue_version(status); state = mpd_status_get_state(status); crossfade = mpd_status_get_crossfade(status); song = mpd_status_get_song_pos(status); songid = mpd_status_get_song_id(status); time_total = mpd_status_get_total_time(status); db_updating = mpd_status_get_update_id(status); /* Time elapsed */ #if LIBMPDCLIENT_CHECK_VERSION(2, 1, 0) ms = mpd_status_get_elapsed_ms(status); #else ms = mpd_status_get_elapsed(status) * 1000; #endif set_time_elapsed_ms(ms); /* Audio format */ bitrate = mpd_status_get_kbit_rate(status); format = mpd_status_get_audio_format(status); if (!format) { return; } samplerate = format->sample_rate; bits = format->bits; channels = format->channels; }
static void env_export_status(struct mpd_status *status) { char *envstr; const struct mpd_audio_format *fmt; envstr = g_strdup_printf("%d", mpd_status_get_volume(status)); g_setenv("MPD_STATUS_VOLUME", envstr, 1); g_free(envstr); envstr = g_strdup_printf("%d", mpd_status_get_repeat(status)); g_setenv("MPD_STATUS_REPEAT", envstr, 1); g_free(envstr); envstr = g_strdup_printf("%d", mpd_status_get_random(status)); g_setenv("MPD_STATUS_RANDOM", envstr, 1); g_free(envstr); envstr = g_strdup_printf("%d", mpd_status_get_single(status)); g_setenv("MPD_STATUS_SINGLE", envstr, 1); g_free(envstr); envstr = g_strdup_printf("%d", mpd_status_get_consume(status)); g_setenv("MPD_STATUS_CONSUME", envstr, 1); g_free(envstr); envstr = g_strdup_printf("%d", mpd_status_get_queue_length(status)); g_setenv("MPD_STATUS_QUEUE_LENGTH", envstr, 1); g_free(envstr); envstr = g_strdup_printf("%d", mpd_status_get_queue_version(status)); g_setenv("MPD_STATUS_QUEUE_VERSION", envstr, 1); g_free(envstr); envstr = g_strdup_printf("%d", mpd_status_get_crossfade(status)); g_setenv("MPD_STATUS_CROSSFADE", envstr, 1); g_free(envstr); envstr = g_strdup_printf("%d", mpd_status_get_song_pos(status)); g_setenv("MPD_STATUS_SONG_POS", envstr, 1); g_free(envstr); envstr = g_strdup_printf("%d", mpd_status_get_song_id(status)); g_setenv("MPD_STATUS_SONG_ID", envstr, 1); g_free(envstr); envstr = g_strdup_printf("%u", mpd_status_get_elapsed_time(status)); g_setenv("MPD_STATUS_ELAPSED_TIME", envstr, 1); g_free(envstr); envstr = g_strdup_printf("%u", mpd_status_get_elapsed_ms(status)); g_setenv("MPD_STATUS_ELAPSED_MS", envstr, 1); g_free(envstr); envstr = g_strdup_printf("%u", mpd_status_get_total_time(status)); g_setenv("MPD_STATUS_TOTAL_TIME", envstr, 1); g_free(envstr); envstr = g_strdup_printf("%u", mpd_status_get_kbit_rate(status)); g_setenv("MPD_STATUS_KBIT_RATE", envstr, 1); g_free(envstr); envstr = g_strdup_printf("%u", mpd_status_get_update_id(status)); g_setenv("MPD_STATUS_UPDATE_ID", envstr, 1); g_free(envstr); g_setenv("MPD_STATUS_STATE", env_strstate(mpd_status_get_state(status)), 1); if ((fmt = mpd_status_get_audio_format(status)) == NULL) g_setenv("MPD_STATUS_AUDIO_FORMAT", "0", 1); else { g_setenv("MPD_STATUS_AUDIO_FORMAT", "1", 1); envstr = g_strdup_printf("%u", fmt->sample_rate); g_setenv("MPD_STATUS_AUDIO_FORMAT_SAMPLE_RATE", envstr, 1); g_free(envstr); envstr = g_strdup_printf("%u", fmt->bits); g_setenv("MPD_STATUS_AUDIO_FORMAT_BITS", envstr, 1); g_free(envstr); envstr = g_strdup_printf("%u", fmt->channels); g_setenv("MPD_STATUS_AUDIO_FORMAT_CHANNELS", envstr, 1); g_free(envstr); } }
int cmd_seek(gcc_unused int argc, gcc_unused char **argv, struct mpd_connection *conn) { struct mpd_status *status; char * arg = argv[0]; int seekchange; int total_secs; int rel = 0; status = getStatus(conn); if (mpd_status_get_state(status) == MPD_STATE_STOP) DIE("not currently playing\n"); /* Detect +/- if exists point to the next char */ if (*arg == '+') rel = 1; else if (*arg == '-') rel = -1; if (rel != 0) ++arg; /* If seeking by percent */ if (arg[strlen(arg) - 1] == '%') { /* Remove the % */ arg[strlen(arg) - 1] = '\0'; /* percent seek, strtod is needed for percent with decimals */ char *test; double perc = strtod(arg,&test); if (*test != '\0' || (rel == 0 && (perc < 0 || perc > 100)) || (rel && perc > abs(100))) DIE("\"%s\" is not an number between 0 and 100\n", arg); seekchange = perc * mpd_status_get_total_time(status) / 100 + 0.5; } else { /* If seeking by absolute seek time */ if (strchr(arg, ':') != NULL) { int hr = 0; int min = 0; int sec = 0; /* Take the seconds off the end of arg */ char *sec_ptr = strrchr(arg, ':'); /* Remove ':' and move the pointer one byte up */ *sec_ptr = '\0'; ++sec_ptr; /* If hour is in the argument, else just point to the arg */ char *min_ptr = strrchr(arg, ':'); if (min_ptr != NULL) { /* Remove ':' and move the pointer one byte up */ *min_ptr = '\0'; ++min_ptr; /* If the argument still exists, it's the hour */ if (arg != NULL) { char *hr_ptr = arg; char *test; hr = strtol(hr_ptr, &test, 10); if (*test != '\0' || (rel == 0 && hr < 0)) DIE("\"%s\" is not a positive number\n", sec_ptr); } } else { min_ptr = arg; } /* Change the pointers to a integer */ char *test; sec = strtol(sec_ptr, &test, 10); if (*test != '\0' || (rel == 0 && sec < 0)) DIE("\"%s\" is not a positive number\n", sec_ptr); min = strtol( min_ptr, &test, 10 ); if( *test != '\0' || (rel == 0 && min < 0 )) DIE("\"%s\" is not a positive number\n", min_ptr); /* If mins exist, check secs. If hrs exist, check mins */ if (min && strlen(sec_ptr) != 2) DIE("\"%s\" is not two digits\n", sec_ptr); else if (hr && strlen(min_ptr) != 2) DIE("\"%s\" is not two digits\n", min_ptr); /* Finally, make sure they're not above 60 if higher unit exists */ if (min && sec > 60) DIE("\"%s\" is greater than 60\n", sec_ptr); else if (hr && min > 60 ) DIE("\"%s\" is greater than 60\n", min_ptr); total_secs = (hr * 3600) + (min * 60) + sec; } else { /* absolute seek (in seconds) */ char *test; total_secs = strtol(arg, &test, 10); /* get the # of seconds */ if (*test != '\0' || (rel == 0 && total_secs < 0)) DIE("\"%s\" is not a positive number\n", arg); } seekchange = total_secs; } /* This detects +/- and is necessary due to the parsing of HH:MM:SS numbers*/ int seekto; if (rel == 1) seekto = mpd_status_get_elapsed_time(status) + seekchange; else if (rel == -1) seekto = mpd_status_get_elapsed_time(status) - seekchange; else seekto = seekchange; if (seekto > (int)mpd_status_get_total_time(status)) DIE("Seek amount would seek past the end of the song\n"); if (!mpd_run_seek_id(conn, mpd_status_get_song_id(status), seekto)) printErrorAndExit(conn); mpd_status_free(status); return 1; }
static int lmpdstatus_index(lua_State *L) { const char *key; const struct mpd_audio_format *audio_format; struct mpd_status **status; status = luaL_checkudata(L, 1, MPD_STATUS_T); key = luaL_checkstring(L, 2); assert(*status != NULL); if (strncmp(key, "volume", 7) == 0) { lua_pushinteger(L, mpd_status_get_volume(*status)); return 1; } else if (strncmp(key, "repeat", 7) == 0) { lua_pushinteger(L, mpd_status_get_repeat(*status)); return 1; } else if (strncmp(key, "random", 7) == 0) { lua_pushinteger(L, mpd_status_get_random(*status)); return 1; } else if (strncmp(key, "single", 7) == 0) { lua_pushinteger(L, mpd_status_get_single(*status)); return 1; } else if (strncmp(key, "consume", 8) == 0) { lua_pushinteger(L, mpd_status_get_consume(*status)); return 1; } else if (strncmp(key, "queue_length", 16) == 0) { lua_pushnumber(L, mpd_status_get_queue_length(*status)); return 1; } else if (strncmp(key, "queue_version", 17) == 0) { lua_pushnumber(L, mpd_status_get_queue_version(*status)); return 1; } else if (strncmp(key, "state", 6) == 0) { lua_pushinteger(L, mpd_status_get_state(*status)); return 1; } else if (strncmp(key, "crossfade", 10) == 0) { lua_pushinteger(L, mpd_status_get_crossfade(*status)); return 1; } else if (strncmp(key, "song_pos", 5) == 0) { lua_pushinteger(L, mpd_status_get_song_pos(*status)); return 1; } else if (strncmp(key, "song_id", 7) == 0) { lua_pushinteger(L, mpd_status_get_song_id(*status)); return 1; } else if (strncmp(key, "elapsed_time", 13) == 0) { lua_pushinteger(L, mpd_status_get_elapsed_time(*status)); return 1; } else if (strncmp(key, "total_time", 11) == 0) { lua_pushinteger(L, mpd_status_get_total_time(*status)); return 1; } else if (strncmp(key, "kbit_rate", 10) == 0) { lua_pushinteger(L, mpd_status_get_kbit_rate(*status)); return 1; } else if (strncmp(key, "audio_format", 13) == 0) { audio_format = mpd_status_get_audio_format(*status); lua_newtable(L); lua_pushinteger(L, audio_format->sample_rate); lua_setfield(L, -2, "sample_rate"); lua_pushinteger(L, audio_format->bits); lua_setfield(L, -2, "bits"); lua_pushinteger(L, audio_format->channels); lua_setfield(L, -2, "channels"); return 1; } else if (strncmp(key, "update_id", 11) == 0) { lua_pushinteger(L, mpd_status_get_update_id(*status)); return 1; } else if (strncmp(key, "error", 6) == 0) { lua_pushstring(L, mpd_status_get_error(*status)); return 1; } else return luaL_error(L, "Invalid key `%s'", key); }
void basic_state_checking(void) { int rep, ran, sgl, len, crt, vol, ply, btr; struct mpd_status *status; status = getStatus(conn); rep = mpd_status_get_repeat(status); ran = mpd_status_get_random(status); sgl = mpd_status_get_single(status); len = mpd_status_get_queue_length(status); crt = mpd_status_get_song_id(status); vol = mpd_status_get_volume(status); ply = mpd_status_get_state(status); btr = mpd_status_get_kbit_rate(status); basic_info->crt_time = mpd_status_get_elapsed_time(status); basic_info->total_time = mpd_status_get_total_time(status); mpd_status_free(status); if(rep != basic_info->repeat || ran != basic_info->random || sgl != basic_info->single || len != basic_info->total || crt != basic_info->current || vol != basic_info->volume || ply != basic_info->state) { basic_info->repeat = rep; basic_info->random = ran; basic_info->single = sgl; basic_info->total = len; basic_info->current = crt; basic_info->volume = vol; basic_info->state = ply; signal_all_wins(); } /* as many songs's bit rate varies while playing we refresh the bit rate display only when the relevant change greater than 0.2 */ if(abs(basic_info->bit_rate - btr) / (float)(btr + 1) > 0.2) { basic_info->bit_rate = btr; signal_win(BASIC_INFO); } /* get current song's name */ status = init_mpd_status(conn); strncpy(basic_info->format, "null", 16); *basic_info->crt_name = '\0'; if (basic_info->state == MPD_STATE_PLAY || basic_info->state == MPD_STATE_PAUSE) { struct mpd_song *song; if (!mpd_response_next(conn)) printErrorAndExit(conn); song = mpd_recv_song(conn); if (song != NULL) { strncpy(basic_info->crt_name, get_song_tag(song, MPD_TAG_TITLE), 512); strncpy(basic_info->format, get_song_format(song), 16); } mpd_song_free(song); } mpd_status_free(status); my_finishCommand(conn); }
void CMPD::Update() { if(!_connected) { iprintf("Reconnecting in 10 seconds."); sleep(10); if(Connect()) iprintf("%s", "Reconnected!"); else { eprintf("%s", "Could not reconnect."); return; } } mpd_status *status = mpd_run_status(_conn); mpd_stats *stats = mpd_run_stats(_conn); if(status && stats) { int newsongid = mpd_status_get_song_id(status); int newsongpos = mpd_status_get_elapsed_time(status); int curplaytime = mpd_stats_get_play_time(stats); // new song if(newsongid != _songid) { _songid = newsongid; _songpos = newsongpos; _start = curplaytime; mpd_song *song = mpd_run_current_song(_conn); if(song) { GotNewSong(song); mpd_song_free(song); } } // song playing if(newsongpos != _songpos) { _songpos = newsongpos; CheckSubmit(curplaytime); } // check for client-to-client messages if(mpd_send_read_messages(_conn)) { mpd_message *msg; while((msg = mpd_recv_message(_conn)) != NULL) { const char *text = mpd_message_get_text(msg); if(_gotsong && text && !strncmp(text, "love", 4)) AudioScrobbler->LoveTrack(_song); mpd_message_free(msg); } mpd_response_finish(_conn); } mpd_status_free(status); mpd_stats_free(stats); } else { // we have most likely lost our connection eprintf("Could not query MPD server: %s", mpd_connection_get_error_message(_conn)); _connected = false; } }