87 lines
2.2 KiB
C
Executable File
87 lines
2.2 KiB
C
Executable File
|
|
#include "mpd_info.h"
|
|
#include "esp_assert.h"
|
|
#include "esp_log.h"
|
|
#include "string.h"
|
|
|
|
extern void handle_error(struct mpd_connection **c);
|
|
|
|
void free_playback_info(mpd_playback_info_t *info) {
|
|
mpd_song_free(info->current_song);
|
|
mpd_status_free(info->status);
|
|
}
|
|
|
|
mpd_playback_info_t *fetch_playback_info(struct mpd_connection *mpd_conn) {
|
|
if (mpd_connection_get_error(mpd_conn) != MPD_ERROR_SUCCESS) {
|
|
handle_error(&mpd_conn);
|
|
return NULL;
|
|
}
|
|
|
|
mpd_command_list_begin(mpd_conn, true);
|
|
mpd_send_status(mpd_conn);
|
|
mpd_send_current_song(mpd_conn);
|
|
mpd_command_list_end(mpd_conn);
|
|
|
|
struct mpd_status *status = mpd_recv_status(mpd_conn);
|
|
handle_error(&mpd_conn);
|
|
if (status == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
if (mpd_status_get_error(status) != NULL) {
|
|
ESP_LOGW("mpd_info", "error: %s\n", mpd_status_get_error(status));
|
|
mpd_status_free(status);
|
|
return NULL;
|
|
}
|
|
|
|
if (mpd_connection_get_error(mpd_conn) != MPD_ERROR_SUCCESS) {
|
|
mpd_status_free(status);
|
|
handle_error(&mpd_conn);
|
|
return NULL;
|
|
}
|
|
|
|
mpd_response_next(mpd_conn);
|
|
|
|
struct mpd_song *song = mpd_recv_song(mpd_conn);
|
|
if (mpd_connection_get_error(mpd_conn) != MPD_ERROR_SUCCESS ||
|
|
!mpd_response_finish(mpd_conn)) {
|
|
|
|
mpd_status_free(status);
|
|
mpd_song_free(song);
|
|
handle_error(&mpd_conn);
|
|
return NULL;
|
|
}
|
|
|
|
handle_error(&mpd_conn);
|
|
if (song == NULL) {
|
|
mpd_status_free(status);
|
|
return NULL;
|
|
}
|
|
|
|
mpd_playback_info_t *info = malloc(sizeof(mpd_playback_info_t));
|
|
if (info == NULL) {
|
|
mpd_status_free(status);
|
|
mpd_song_free(song);
|
|
ESP_LOGW("mpd_info", "could not allocate info.");
|
|
return NULL;
|
|
}
|
|
|
|
char str[12];
|
|
crypto_generichash_state state;
|
|
crypto_generichash_init(&state, NULL, 0, crypto_generichash_BYTES);
|
|
|
|
sprintf(str, "%d", mpd_status_get_song_id(status));
|
|
crypto_generichash_update(&state, (uint8_t*)str, strlen(str));
|
|
|
|
//sprintf(str, "%d", mpd_status_get_volume(status));
|
|
//crypto_generichash_update(&state, (uint8_t*)str, strlen(str));
|
|
|
|
sprintf(str, "%d", mpd_status_get_queue_version(status));
|
|
crypto_generichash_update(&state, (uint8_t*)str, strlen(str));
|
|
|
|
crypto_generichash_final(&state, (uint8_t*)info->hash, crypto_generichash_BYTES);
|
|
info->status = status;
|
|
info->current_song = song;
|
|
return info;
|
|
}
|