X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fmpd.c;h=6c7cebe6a9df1c0d08a4996201ad2803339f1903;hb=d744f9bfbb192067187d928eeec0d61f7a78e528;hp=4ac578ae74870a4054885f90f57b959e2a6884a7;hpb=da182541fbb589a162c7b30e147c36733c0e7def;p=monky
diff --git a/src/mpd.c b/src/mpd.c
index 4ac578a..6c7cebe 100644
--- a/src/mpd.c
+++ b/src/mpd.c
@@ -1,5 +1,4 @@
-/*
- * Conky, a system monitor, based on torsmo
+/* Conky, a system monitor, based on torsmo
*
* Any original torsmo code is licensed under the BSD license
*
@@ -7,7 +6,8 @@
*
* Please see COPYING for details
*
- * Copyright (c) 2005-2007 Brenden Matthews, Philip Kovacs, et. al. (see AUTHORS)
+ * Copyright (c) 2005-2008 Brenden Matthews, Philip Kovacs, et. al.
+ * (see AUTHORS)
* All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
@@ -20,207 +20,273 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
+ * along with this program. If not, see .
*
- * $Id$
*/
#include "conky.h"
-#include
-#include
-#include
-#include "libmpdclient.h"
+#include "logging.h"
-timed_thread *mpd_timed_thread = NULL;
-void clear_mpd_stats(struct information *current_info);
+void init_mpd_stats(struct mpd_s *mpd)
+{
+ if (mpd->artist == NULL) {
+ mpd->artist = malloc(text_buffer_size);
+ }
+ if (mpd->album == NULL) {
+ mpd->album = malloc(text_buffer_size);
+ }
+ if (mpd->title == NULL) {
+ mpd->title = malloc(text_buffer_size);
+ }
+ if (mpd->random == NULL) {
+ mpd->random = malloc(text_buffer_size);
+ }
+ if (mpd->repeat == NULL) {
+ mpd->repeat = malloc(text_buffer_size);
+ }
+ if (mpd->track == NULL) {
+ mpd->track = malloc(text_buffer_size);
+ }
+ if (mpd->status == NULL) {
+ mpd->status = malloc(text_buffer_size);
+ }
+ if (mpd->name == NULL) {
+ mpd->name = malloc(text_buffer_size);
+ }
+ if (mpd->file == NULL) {
+ mpd->file = malloc(text_buffer_size);
+ }
+ clear_mpd_stats(mpd);
+}
-void init_mpd_stats(struct information *current_info)
+void free_mpd_vars(struct mpd_s *mpd)
{
- if (current_info->mpd.artist == NULL)
- current_info->mpd.artist = malloc(TEXT_BUFFER_SIZE);
- if (current_info->mpd.album == NULL)
- current_info->mpd.album = malloc(TEXT_BUFFER_SIZE);
- if (current_info->mpd.title == NULL)
- current_info->mpd.title = malloc(TEXT_BUFFER_SIZE);
- if (current_info->mpd.random == NULL)
- current_info->mpd.random = malloc(TEXT_BUFFER_SIZE);
- if (current_info->mpd.repeat == NULL)
- current_info->mpd.repeat = malloc(TEXT_BUFFER_SIZE);
- if (current_info->mpd.track == NULL)
- current_info->mpd.track = malloc(TEXT_BUFFER_SIZE);
- if (current_info->mpd.status == NULL)
- current_info->mpd.status = malloc(TEXT_BUFFER_SIZE);
- if (current_info->mpd.name == NULL)
- current_info->mpd.name = malloc(TEXT_BUFFER_SIZE);
- if (current_info->mpd.file == NULL)
- current_info->mpd.file = malloc(TEXT_BUFFER_SIZE);
- clear_mpd_stats(current_info);
+ if (mpd->title) {
+ free(mpd->title);
+ mpd->title = NULL;
+ }
+ if (mpd->artist) {
+ free(mpd->artist);
+ mpd->artist = NULL;
+ }
+ if (mpd->album) {
+ free(mpd->album);
+ mpd->album = NULL;
+ }
+ if (mpd->random) {
+ free(mpd->random);
+ mpd->random = NULL;
+ }
+ if (mpd->repeat) {
+ free(mpd->repeat);
+ mpd->repeat = NULL;
+ }
+ if (mpd->track) {
+ free(mpd->track);
+ mpd->track = NULL;
+ }
+ if (mpd->name) {
+ free(mpd->name);
+ mpd->name = NULL;
+ }
+ if (mpd->file) {
+ free(mpd->file);
+ mpd->file = NULL;
+ }
+ if (mpd->status) {
+ free(mpd->status);
+ mpd->status = NULL;
+ }
+ if (mpd->conn) {
+ mpd_closeConnection(mpd->conn);
+ mpd->conn = 0;
+ }
}
-void clear_mpd_stats(struct information *current_info)
+void clear_mpd_stats(struct mpd_s *mpd)
{
- *current_info->mpd.name=0;
- *current_info->mpd.file=0;
- *current_info->mpd.artist=0;
- *current_info->mpd.album=0;
- *current_info->mpd.title=0;
- *current_info->mpd.random=0;
- *current_info->mpd.repeat=0;
- *current_info->mpd.track=0;
- *current_info->mpd.status=0;
- current_info->mpd.bitrate = 0;
- current_info->mpd.progress = 0;
- current_info->mpd.elapsed = 0;
- current_info->mpd.length = 0;
+ *mpd->name = 0;
+ *mpd->file = 0;
+ *mpd->artist = 0;
+ *mpd->album = 0;
+ *mpd->title = 0;
+ *mpd->random = 0;
+ *mpd->repeat = 0;
+ *mpd->track = 0;
+ *mpd->status = 0;
+ mpd->is_playing = 0;
+ mpd->bitrate = 0;
+ mpd->progress = 0;
+ mpd->elapsed = 0;
+ mpd->length = 0;
}
-void *update_mpd(void)
+void *update_mpd(void *arg)
{
- struct information *current_info = &info;
+ struct mpd_s *mpd;
+
+ if (arg == NULL) {
+ CRIT_ERR("update_mpd called with a null argument!");
+ }
+
+ mpd = (struct mpd_s *) arg;
+
while (1) {
- if (!current_info->conn) {
- current_info->conn = mpd_newConnection(current_info->mpd.host, current_info->mpd.port, 10);
+ mpd_Status *status;
+ mpd_InfoEntity *entity;
+
+ if (!mpd->conn) {
+ mpd->conn = mpd_newConnection(mpd->host,
+ mpd->port, 10);
}
- if (strlen(current_info->mpd.password) > 1) {
- mpd_sendPasswordCommand(current_info->conn,
- current_info->mpd.password);
- mpd_finishCommand(current_info->conn);
+ if (strlen(mpd->password) > 1) {
+ mpd_sendPasswordCommand(mpd->conn,
+ mpd->password);
+ mpd_finishCommand(mpd->conn);
}
-
- timed_thread_lock(mpd_timed_thread);
- if (current_info->conn->error || current_info->conn == NULL) {
- //ERR("%MPD error: s\n", current_info->conn->errorStr);
- mpd_closeConnection(current_info->conn);
- current_info->conn = 0;
- clear_mpd_stats(current_info);
+ timed_thread_lock(mpd->timed_thread);
- strncpy(current_info->mpd.status, "MPD not responding", TEXT_BUFFER_SIZE - 1);
- timed_thread_unlock(mpd_timed_thread);
- if (timed_thread_test(mpd_timed_thread)) timed_thread_exit(mpd_timed_thread);
+ if (mpd->conn->error || mpd->conn == NULL) {
+ ERR("MPD error: %s\n", mpd->conn->errorStr);
+ mpd_closeConnection(mpd->conn);
+ mpd->conn = 0;
+ clear_mpd_stats(mpd);
+
+ strncpy(mpd->status, "MPD not responding",
+ text_buffer_size - 1);
+ timed_thread_unlock(mpd->timed_thread);
+ if (timed_thread_test(mpd->timed_thread, 0)) {
+ timed_thread_exit(mpd->timed_thread);
+ }
continue;
}
- mpd_Status *status;
- mpd_InfoEntity *entity;
- mpd_sendStatusCommand(current_info->conn);
- if ((status = mpd_getStatus(current_info->conn)) == NULL) {
- //ERR("MPD error: %s\n", current_info->conn->errorStr);
- mpd_closeConnection(current_info->conn);
- current_info->conn = 0;
- clear_mpd_stats(current_info);
+ mpd_sendStatusCommand(mpd->conn);
+ if ((status = mpd_getStatus(mpd->conn)) == NULL) {
+ ERR("MPD error: %s\n", mpd->conn->errorStr);
+ mpd_closeConnection(mpd->conn);
+ mpd->conn = 0;
+ clear_mpd_stats(mpd);
- strncpy(current_info->mpd.status, "MPD not responding", TEXT_BUFFER_SIZE - 1);
- timed_thread_unlock(mpd_timed_thread);
- if (timed_thread_test(mpd_timed_thread)) timed_thread_exit(mpd_timed_thread);
+ strncpy(mpd->status, "MPD not responding",
+ text_buffer_size - 1);
+ timed_thread_unlock(mpd->timed_thread);
+ if (timed_thread_test(mpd->timed_thread, 0)) {
+ timed_thread_exit(mpd->timed_thread);
+ }
continue;
}
- mpd_finishCommand(current_info->conn);
- if (current_info->conn->error) {
- //fprintf(stderr, "%s\n", current_info->conn->errorStr);
- mpd_closeConnection(current_info->conn);
- current_info->conn = 0;
- timed_thread_unlock(mpd_timed_thread);
- if (timed_thread_test(mpd_timed_thread)) timed_thread_exit(mpd_timed_thread);
+ mpd_finishCommand(mpd->conn);
+ if (mpd->conn->error) {
+ // fprintf(stderr, "%s\n", mpd->conn->errorStr);
+ mpd_closeConnection(mpd->conn);
+ mpd->conn = 0;
+ timed_thread_unlock(mpd->timed_thread);
+ if (timed_thread_test(mpd->timed_thread, 0)) {
+ timed_thread_exit(mpd->timed_thread);
+ }
continue;
}
- current_info->mpd.volume = status->volume;
- //if (status->error)
- //printf("error: %s\n", status->error);
+ mpd->volume = status->volume;
+ /* if (status->error) {
+ printf("error: %s\n", status->error);
+ } */
if (status->state == MPD_STATUS_STATE_PLAY) {
- strncpy(current_info->mpd.status, "Playing",
- TEXT_BUFFER_SIZE - 1);
+ strncpy(mpd->status, "Playing", text_buffer_size - 1);
}
if (status->state == MPD_STATUS_STATE_STOP) {
- clear_mpd_stats(current_info);
- strncpy(current_info->mpd.status, "Stopped",
- TEXT_BUFFER_SIZE - 1);
+ clear_mpd_stats(mpd);
+ strncpy(mpd->status, "Stopped", text_buffer_size - 1);
}
if (status->state == MPD_STATUS_STATE_PAUSE) {
- strncpy(current_info->mpd.status, "Paused",
- TEXT_BUFFER_SIZE - 1);
+ strncpy(mpd->status, "Paused", text_buffer_size - 1);
}
if (status->state == MPD_STATUS_STATE_UNKNOWN) {
- clear_mpd_stats(current_info);
- *current_info->mpd.status=0;
+ clear_mpd_stats(mpd);
+ *mpd->status = 0;
}
- if (status->state == MPD_STATUS_STATE_PLAY ||
- status->state == MPD_STATUS_STATE_PAUSE) {
- current_info->mpd.bitrate = status->bitRate;
- current_info->mpd.progress =
- (float) status->elapsedTime / status->totalTime;
- current_info->mpd.elapsed = status->elapsedTime;
- current_info->mpd.length = status->totalTime;
+ if (status->state == MPD_STATUS_STATE_PLAY
+ || status->state == MPD_STATUS_STATE_PAUSE) {
+ mpd->is_playing = 1;
+ mpd->bitrate = status->bitRate;
+ mpd->progress = (float) status->elapsedTime /
+ status->totalTime;
+ mpd->elapsed = status->elapsedTime;
+ mpd->length = status->totalTime;
if (status->random == 0) {
- strcpy(current_info->mpd.random, "Off");
+ strcpy(mpd->random, "Off");
} else if (status->random == 1) {
- strcpy(current_info->mpd.random, "On");
+ strcpy(mpd->random, "On");
} else {
- *current_info->mpd.random=0;
+ *mpd->random = 0;
}
if (status->repeat == 0) {
- strcpy(current_info->mpd.repeat, "Off");
+ strcpy(mpd->repeat, "Off");
} else if (status->repeat == 1) {
- strcpy(current_info->mpd.repeat, "On");
+ strcpy(mpd->repeat, "On");
} else {
- *current_info->mpd.repeat=0;
+ *mpd->repeat = 0;
}
}
- if (current_info->conn->error) {
- //fprintf(stderr, "%s\n", current_info->conn->errorStr);
- mpd_closeConnection(current_info->conn);
- current_info->conn = 0;
- timed_thread_unlock(mpd_timed_thread);
- if (timed_thread_test(mpd_timed_thread)) timed_thread_exit(mpd_timed_thread);
+ if (mpd->conn->error) {
+ // fprintf(stderr, "%s\n", mpd->conn->errorStr);
+ mpd_closeConnection(mpd->conn);
+ mpd->conn = 0;
+ timed_thread_unlock(mpd->timed_thread);
+ if (timed_thread_test(mpd->timed_thread, 0)) {
+ timed_thread_exit(mpd->timed_thread);
+ }
continue;
}
- mpd_sendCurrentSongCommand(current_info->conn);
- while ((entity = mpd_getNextInfoEntity(current_info->conn))) {
+ mpd_sendCurrentSongCommand(mpd->conn);
+ while ((entity = mpd_getNextInfoEntity(mpd->conn))) {
mpd_Song *song = entity->info.song;
+
if (entity->type != MPD_INFO_ENTITY_TYPE_SONG) {
mpd_freeInfoEntity(entity);
continue;
}
if (song->artist) {
- strncpy(current_info->mpd.artist, song->artist,
- TEXT_BUFFER_SIZE - 1);
+ strncpy(mpd->artist, song->artist,
+ text_buffer_size - 1);
} else {
- *current_info->mpd.artist=0;
+ *mpd->artist = 0;
}
if (song->album) {
- strncpy(current_info->mpd.album, song->album,
- TEXT_BUFFER_SIZE - 1);
+ strncpy(mpd->album, song->album,
+ text_buffer_size - 1);
} else {
- *current_info->mpd.album=0;
+ *mpd->album = 0;
}
if (song->title) {
- strncpy(current_info->mpd.title, song->title,
- TEXT_BUFFER_SIZE - 1);
+ strncpy(mpd->title, song->title,
+ text_buffer_size - 1);
} else {
- *current_info->mpd.title=0;
+ *mpd->title = 0;
}
if (song->track) {
- strncpy(current_info->mpd.track, song->track,
- TEXT_BUFFER_SIZE - 1);
+ strncpy(mpd->track, song->track,
+ text_buffer_size - 1);
} else {
- *current_info->mpd.track=0;
+ *mpd->track = 0;
}
if (song->name) {
- strncpy(current_info->mpd.name, song->name,
- TEXT_BUFFER_SIZE - 1);
+ strncpy(mpd->name, song->name,
+ text_buffer_size - 1);
} else {
- *current_info->mpd.name=0;
+ *mpd->name = 0;
}
if (song->file) {
- strncpy(current_info->mpd.file,
- song->file, TEXT_BUFFER_SIZE - 1);
+ strncpy(mpd->file, song->file,
+ text_buffer_size - 1);
} else {
- *current_info->mpd.file=0;
+ *mpd->file = 0;
}
if (entity != NULL) {
mpd_freeInfoEntity(entity);
@@ -231,32 +297,38 @@ void *update_mpd(void)
mpd_freeInfoEntity(entity);
entity = NULL;
}
- mpd_finishCommand(current_info->conn);
- if (current_info->conn->error) {
- //fprintf(stderr, "%s\n", current_info->conn->errorStr);
- mpd_closeConnection(current_info->conn);
- current_info->conn = 0;
- timed_thread_unlock(mpd_timed_thread);
- if (timed_thread_test(mpd_timed_thread)) timed_thread_exit(mpd_timed_thread);
+ mpd_finishCommand(mpd->conn);
+ if (mpd->conn->error) {
+ // fprintf(stderr, "%s\n", mpd->conn->errorStr);
+ mpd_closeConnection(mpd->conn);
+ mpd->conn = 0;
+ timed_thread_unlock(mpd->timed_thread);
+ if (timed_thread_test(mpd->timed_thread, 0)) {
+ timed_thread_exit(mpd->timed_thread);
+ }
continue;
}
- timed_thread_unlock(mpd_timed_thread);
- if (current_info->conn->error) {
- //fprintf(stderr, "%s\n", current_info->conn->errorStr);
- mpd_closeConnection(current_info->conn);
- current_info->conn = 0;
- if (timed_thread_test(mpd_timed_thread)) timed_thread_exit(mpd_timed_thread);
+ timed_thread_unlock(mpd->timed_thread);
+ if (mpd->conn->error) {
+ // fprintf(stderr, "%s\n", mpd->conn->errorStr);
+ mpd_closeConnection(mpd->conn);
+ mpd->conn = 0;
+ if (timed_thread_test(mpd->timed_thread, 0)) {
+ timed_thread_exit(mpd->timed_thread);
+ }
continue;
}
mpd_freeStatus(status);
-/* if (current_info->conn) {
- mpd_closeConnection(current_info->conn);
- current_info->conn = 0;
- }*/
- if (timed_thread_test(mpd_timed_thread)) timed_thread_exit(mpd_timed_thread);
+ /* if (mpd->conn) {
+ mpd_closeConnection(mpd->conn);
+ mpd->conn = 0;
+ } */
+ if (timed_thread_test(mpd->timed_thread, 0)) {
+ timed_thread_exit(mpd->timed_thread);
+ }
continue;
}
- return 0;
+ /* never reached */
}