X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Faudacious.c;h=49342e8afb79edbca257d13b8c47550083fa1bf4;hb=812107391272943d7a9823d9203f32ae8db5a64d;hp=4f2cdfb43afe0971b1b0baa36e8d8dffbec1b29a;hpb=dd3b471f2d454328689583e3a1c1e85dff9b45e4;p=monky diff --git a/src/audacious.c b/src/audacious.c index 4f2cdfb..49342e8 100644 --- a/src/audacious.c +++ b/src/audacious.c @@ -1,6 +1,7 @@ -/* $Id$ */ - -/* audacious.c: conky support for audacious music player +/* -*- mode: c; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: t -*- + * vim: ts=4 sw=4 noet ai cindent syntax=c + * + * audacious.c: conky support for audacious music player * * Copyright (C) 2005-2007 Philip Kovacs pkovacs@users.sourceforge.net * @@ -17,14 +18,14 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 - * USA. */ - -#ifdef HAVE_CONFIG_H -#include -#endif + * USA. + * + */ -#include -#include +#include "config.h" +#include "conky.h" +#include "logging.h" +#include "audacious.h" #include #ifndef AUDACIOUS_LEGACY @@ -55,18 +56,13 @@ xmms_remote_get_playlist_length(x) #endif -#include "config.h" -#include "conky.h" -#include "audacious.h" -#include "timed_thread.h" - /* access to this item array is synchronized */ static audacious_t audacious_items; /* ----------------------------------------- * Conky update function for audacious data. * ----------------------------------------- */ -void update_audacious(void) +int update_audacious(void) { /* The worker thread is updating audacious_items array asynchronously * to the main conky thread. @@ -74,7 +70,7 @@ void update_audacious(void) * structure when the main thread's update cycle fires. */ if (!info.audacious.p_timed_thread) { if (create_audacious_thread() != 0) { - CRIT_ERR("unable to create audacious thread!"); + CRIT_ERR(NULL, NULL, "unable to create audacious thread!"); } timed_thread_register(info.audacious.p_timed_thread, &info.audacious.p_timed_thread); @@ -83,6 +79,7 @@ void update_audacious(void) timed_thread_lock(info.audacious.p_timed_thread); memcpy(&info.audacious.items, audacious_items, sizeof(audacious_items)); timed_thread_unlock(info.audacious.p_timed_thread); + return 0; } /* --------------------------------------------------------- @@ -114,24 +111,23 @@ int create_audacious_thread(void) int destroy_audacious_thread(void) { /* Is a worker is thread running? If not, no error. */ - if (!info.audacious.p_timed_thread) { - return 0; + if (info.audacious.p_timed_thread) { + timed_thread_destroy(info.audacious.p_timed_thread, + &info.audacious.p_timed_thread); } - timed_thread_destroy(info.audacious.p_timed_thread, - &info.audacious.p_timed_thread); - return 0; } /* --------------------------------------------------- * Worker thread function for audacious data sampling. * --------------------------------------------------- */ +__attribute((noreturn)) void *audacious_thread_func(void *pvoid) { static audacious_t items; gint playpos, frames, length; - gint rate, freq, chans; + gint rate, freq, chans, vol; gchar *psong, *pfilename; #ifndef AUDACIOUS_LEGACY @@ -150,103 +146,107 @@ void *audacious_thread_func(void *pvoid) g_type_init(); connection = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); if (!connection) { - CRIT_ERR("unable to establish dbus connection"); + CRIT_ERR(NULL, NULL, "unable to establish dbus connection"); } session = dbus_g_proxy_new_for_name(connection, AUDACIOUS_DBUS_SERVICE, - AUDACIOUS_DBUS_PATH, AUDACIOUS_DBUS_INTERFACE); + AUDACIOUS_DBUS_PATH, AUDACIOUS_DBUS_INTERFACE); if (!session) { - CRIT_ERR("unable to create dbus proxy"); + CRIT_ERR(NULL, NULL, "unable to create dbus proxy"); } #endif /* AUDACIOUS_LEGACY */ /* Loop until the main thread resets the runnable signal. */ while (1) { - if (!audacious_remote_is_running(session)) { - memset(&items, 0, sizeof(items)); - strcpy(items[AUDACIOUS_STATUS], "Not running"); - goto bottom; - } - - /* Player status */ - if (audacious_remote_is_paused(session)) { - strcpy(items[AUDACIOUS_STATUS], "Paused"); - } else if (audacious_remote_is_playing(session)) { - strcpy(items[AUDACIOUS_STATUS], "Playing"); - } else { - strcpy(items[AUDACIOUS_STATUS], "Stopped"); - } - - /* Current song title */ - playpos = audacious_remote_get_playlist_pos(session); - psong = audacious_remote_get_playlist_title(session, playpos); - if (psong) { - strncpy(items[AUDACIOUS_TITLE], psong, - sizeof(items[AUDACIOUS_TITLE]) - 1); - g_free(psong); - psong = NULL; - } - - /* Current song length as MM:SS */ - frames = audacious_remote_get_playlist_time(session, playpos); - length = frames / 1000; - snprintf(items[AUDACIOUS_LENGTH], sizeof(items[AUDACIOUS_LENGTH]) - 1, - "%d:%.2d", length / 60, length % 60); - - /* Current song length in seconds */ - snprintf(items[AUDACIOUS_LENGTH_SECONDS], - sizeof(items[AUDACIOUS_LENGTH_SECONDS]) - 1, "%d", length); - - /* Current song position as MM:SS */ - frames = audacious_remote_get_output_time(session); - length = frames / 1000; - snprintf(items[AUDACIOUS_POSITION], - sizeof(items[AUDACIOUS_POSITION]) - 1, "%d:%.2d", length / 60, - length % 60); - - /* Current song position in seconds */ - snprintf(items[AUDACIOUS_POSITION_SECONDS], - sizeof(items[AUDACIOUS_POSITION_SECONDS]) - 1, "%d", length); - - /* Current song bitrate */ - audacious_remote_get_info(session, &rate, &freq, &chans); - snprintf(items[AUDACIOUS_BITRATE], sizeof(items[AUDACIOUS_BITRATE]) - 1, - "%d", rate); - - /* Current song frequency */ - snprintf(items[AUDACIOUS_FREQUENCY], - sizeof(items[AUDACIOUS_FREQUENCY]) - 1, "%d", freq); - - /* Current song channels */ - snprintf(items[AUDACIOUS_CHANNELS], - sizeof(items[AUDACIOUS_CHANNELS]) - 1, "%d", chans); - - /* Current song filename */ - pfilename = audacious_remote_get_playlist_file(session, playpos); - if (pfilename) { - strncpy(items[AUDACIOUS_FILENAME], pfilename, - sizeof(items[AUDACIOUS_FILENAME]) - 1); - g_free(pfilename); - pfilename = NULL; - } - - /* Length of the Playlist (number of songs) */ - length = audacious_remote_get_playlist_length(session); - snprintf(items[AUDACIOUS_PLAYLIST_LENGTH], - sizeof(items[AUDACIOUS_PLAYLIST_LENGTH]) - 1, "%d", length); - - /* Playlist position (index of song) */ - snprintf(items[AUDACIOUS_PLAYLIST_POSITION], - sizeof(items[AUDACIOUS_PLAYLIST_POSITION]) - 1, "%d", playpos + 1); - -bottom: - + do { + if (!audacious_remote_is_running(session)) { + memset(&items, 0, sizeof(items)); + strcpy(items[AUDACIOUS_STATUS], "Not running"); + break; + } + + /* Player status */ + if (audacious_remote_is_paused(session)) { + strcpy(items[AUDACIOUS_STATUS], "Paused"); + } else if (audacious_remote_is_playing(session)) { + strcpy(items[AUDACIOUS_STATUS], "Playing"); + } else { + strcpy(items[AUDACIOUS_STATUS], "Stopped"); + } + + /* Current song title */ + playpos = audacious_remote_get_playlist_pos(session); + psong = audacious_remote_get_playlist_title(session, playpos); + if (psong) { + strncpy(items[AUDACIOUS_TITLE], psong, + sizeof(items[AUDACIOUS_TITLE]) - 1); + g_free(psong); + psong = NULL; + } + + /* Current song length as MM:SS */ + frames = audacious_remote_get_playlist_time(session, playpos); + length = frames / 1000; + snprintf(items[AUDACIOUS_LENGTH], sizeof(items[AUDACIOUS_LENGTH]) - 1, + "%d:%.2d", length / 60, length % 60); + + /* Current song length in seconds */ + snprintf(items[AUDACIOUS_LENGTH_SECONDS], + sizeof(items[AUDACIOUS_LENGTH_SECONDS]) - 1, "%d", length); + + /* Current song position as MM:SS */ + frames = audacious_remote_get_output_time(session); + length = frames / 1000; + snprintf(items[AUDACIOUS_POSITION], + sizeof(items[AUDACIOUS_POSITION]) - 1, "%d:%.2d", length / 60, + length % 60); + + /* Current song position in seconds */ + snprintf(items[AUDACIOUS_POSITION_SECONDS], + sizeof(items[AUDACIOUS_POSITION_SECONDS]) - 1, "%d", length); + + /* Current song bitrate */ + audacious_remote_get_info(session, &rate, &freq, &chans); + snprintf(items[AUDACIOUS_BITRATE], sizeof(items[AUDACIOUS_BITRATE]) - 1, + "%d", rate); + + /* Current song frequency */ + snprintf(items[AUDACIOUS_FREQUENCY], + sizeof(items[AUDACIOUS_FREQUENCY]) - 1, "%d", freq); + + /* Current song channels */ + snprintf(items[AUDACIOUS_CHANNELS], + sizeof(items[AUDACIOUS_CHANNELS]) - 1, "%d", chans); + + /* Current song filename */ + pfilename = audacious_remote_get_playlist_file(session, playpos); + if (pfilename) { + strncpy(items[AUDACIOUS_FILENAME], pfilename, + sizeof(items[AUDACIOUS_FILENAME]) - 1); + g_free(pfilename); + pfilename = NULL; + } + + /* Length of the Playlist (number of songs) */ + length = audacious_remote_get_playlist_length(session); + snprintf(items[AUDACIOUS_PLAYLIST_LENGTH], + sizeof(items[AUDACIOUS_PLAYLIST_LENGTH]) - 1, "%d", length); + + /* Playlist position (index of song) */ + snprintf(items[AUDACIOUS_PLAYLIST_POSITION], + sizeof(items[AUDACIOUS_PLAYLIST_POSITION]) - 1, "%d", playpos + 1); + /* Main volume */ + vol = audacious_remote_get_main_volume(session); + snprintf(items[AUDACIOUS_MAIN_VOLUME], + sizeof(items[AUDACIOUS_MAIN_VOLUME]) - 1, "%d", vol); + + } while (0); /* Deliver the refreshed items array to audacious_items. */ timed_thread_lock(info.audacious.p_timed_thread); memcpy(&audacious_items, items, sizeof(items)); timed_thread_unlock(info.audacious.p_timed_thread); - if (timed_thread_test(info.audacious.p_timed_thread)) { + if (timed_thread_test(info.audacious.p_timed_thread, 0)) { #ifndef AUDACIOUS_LEGACY /* release reference to dbus proxy */ g_object_unref(session);