4 * audacious.c: conky support for audacious music player
6 * Copyright (C) 2005 Philip Kovacs pkovacs@users.sourceforge.net
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
29 #include <audacious/beepctrl.h>
33 #include "audacious.h"
34 #include "timed_thread.h"
36 /* access to this item array is synchronized */
37 static audacious_t audacious_items;
39 /* -----------------------------------------
40 * Conky update function for audacious data.
41 * ----------------------------------------- */
42 void update_audacious(void)
45 The worker thread is updating audacious_items array asynchronously to the main
46 conky thread. We merely copy the audacious_items array into the main thread's
47 info structure when the main thread's update cycle fires.
49 if (!info.audacious.p_timed_thread)
52 timed_thread_lock (info.audacious.p_timed_thread);
53 memcpy(&info.audacious.items,audacious_items,sizeof(audacious_items));
54 timed_thread_unlock (info.audacious.p_timed_thread);
58 /* ------------------------------------------------------------
59 * Create a worker thread for audacious media player status.
61 * Returns 0 on success, -1 on error.
62 * ------------------------------------------------------------*/
63 int create_audacious_thread(void)
65 if (!info.audacious.p_timed_thread)
66 info.audacious.p_timed_thread = timed_thread_create (audacious_thread_func, NULL, 1000000);
68 if (!info.audacious.p_timed_thread)
74 /* ------------------------------------------------
75 * Destroy audacious player status thread.
77 * Returns 0 on success, -1 on error.
78 * ------------------------------------------------ */
79 int destroy_audacious_thread(void)
81 /* Is a worker is thread running? If not, no error. */
82 if (!info.audacious.p_timed_thread)
85 timed_thread_destroy (info.audacious.p_timed_thread, &info.audacious.p_timed_thread);
90 /* ---------------------------------------------------
91 * Worker thread function for audacious data sampling.
92 * --------------------------------------------------- */
93 void *audacious_thread_func(void *pvoid)
95 static audacious_t items;
96 gint session,playpos,frames,length;
98 gchar *psong,*pfilename;
100 pvoid=(void *)pvoid; /* avoid warning */
105 /* Loop until the main thread sets the runnable signal to 0i via timed_thread_destroy. */
108 if (!xmms_remote_is_running (session)) {
109 memset(&items,0,sizeof(items));
110 strcpy(items[AUDACIOUS_STATUS],"Not running");
115 if (xmms_remote_is_paused (session))
116 strcpy(items[AUDACIOUS_STATUS],"Paused");
117 else if (xmms_remote_is_playing (session))
118 strcpy(items[AUDACIOUS_STATUS],"Playing");
120 strcpy(items[AUDACIOUS_STATUS],"Stopped");
122 /* Current song title */
123 playpos = xmms_remote_get_playlist_pos (session);
124 psong = xmms_remote_get_playlist_title (session, playpos);
126 strncpy(items[AUDACIOUS_TITLE],psong,sizeof(items[AUDACIOUS_TITLE])-1);
131 /* Current song length as MM:SS */
132 frames = xmms_remote_get_playlist_time (session,playpos);
133 length = frames / 1000;
134 snprintf(items[AUDACIOUS_LENGTH],sizeof(items[AUDACIOUS_LENGTH])-1,
135 "%d:%.2d", length / 60, length % 60);
137 /* Current song length in seconds */
138 snprintf(items[AUDACIOUS_LENGTH_SECONDS],sizeof(items[AUDACIOUS_LENGTH_SECONDS])-1,
141 /* Current song position as MM:SS */
142 frames = xmms_remote_get_output_time (session);
143 length = frames / 1000;
144 snprintf(items[AUDACIOUS_POSITION],sizeof(items[AUDACIOUS_POSITION])-1,
145 "%d:%.2d", length / 60, length % 60);
147 /* Current song position in seconds */
148 snprintf(items[AUDACIOUS_POSITION_SECONDS],sizeof(items[AUDACIOUS_POSITION_SECONDS])-1,
151 /* Current song bitrate */
152 xmms_remote_get_info (session, &rate, &freq, &chans);
153 snprintf(items[AUDACIOUS_BITRATE],sizeof(items[AUDACIOUS_BITRATE])-1, "%d", rate);
155 /* Current song frequency */
156 snprintf(items[AUDACIOUS_FREQUENCY],sizeof(items[AUDACIOUS_FREQUENCY])-1, "%d", freq);
158 /* Current song channels */
159 snprintf(items[AUDACIOUS_CHANNELS],sizeof(items[AUDACIOUS_CHANNELS])-1, "%d", chans);
161 /* Current song filename */
162 pfilename = xmms_remote_get_playlist_file (session,playpos);
164 strncpy(items[AUDACIOUS_FILENAME],pfilename,sizeof(items[AUDACIOUS_FILENAME])-1);
169 /* Length of the Playlist (number of songs) */
170 length = xmms_remote_get_playlist_length (session);
171 snprintf(items[AUDACIOUS_PLAYLIST_LENGTH],sizeof(items[AUDACIOUS_PLAYLIST_LENGTH])-1, "%d", length);
173 /* Playlist position (index of song) */
174 snprintf(items[AUDACIOUS_PLAYLIST_POSITION],sizeof(items[AUDACIOUS_PLAYLIST_POSITION])-1,
179 /* Deliver the refreshed items array to audacious_items. */
180 timed_thread_lock (info.audacious.p_timed_thread);
181 memcpy(&audacious_items,items,sizeof(items));
182 timed_thread_unlock (info.audacious.p_timed_thread);
184 if (timed_thread_test (info.audacious.p_timed_thread))
185 timed_thread_exit (info.audacious.p_timed_thread);