1
0
mirror of https://github.com/Llewellynvdm/conky.git synced 2024-12-26 04:17:33 +00:00

audacious thread timing the correct way -- texeci's to follow

git-svn-id: https://conky.svn.sourceforge.net/svnroot/conky/trunk/conky1@766 7f574dfc-610e-0410-a909-a81674777703
This commit is contained in:
Philip Kovacs 2006-11-14 02:04:27 +00:00
parent 428526ba48
commit e6af47a76f
2 changed files with 25 additions and 20 deletions

View File

@ -21,6 +21,7 @@
* --------------------------------------------------------------------------- */
#include <pthread.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
@ -69,9 +70,7 @@ int create_audacious_thread(void)
pthread_mutex_init(&info.audacious.item_mutex, NULL);
pthread_mutex_init(&info.audacious.runnable_mutex, NULL);
/* Init runnable condition for worker thread */
pthread_mutex_lock(&info.audacious.runnable_mutex);
info.audacious.runnable=1;
pthread_mutex_unlock(&info.audacious.runnable_mutex);
pthread_cond_init(&info.audacious.runnable_cond, NULL);
if (pthread_create(&info.audacious.thread, &info.audacious.thread_attr, audacious_thread_func, NULL))
return(-1);
@ -90,16 +89,19 @@ int destroy_audacious_thread(void)
return(0);
/* Signal audacious thread to terminate */
pthread_mutex_lock(&info.audacious.runnable_mutex);
info.audacious.runnable=0;
pthread_mutex_unlock(&info.audacious.runnable_mutex);
pthread_mutex_lock (&info.audacious.runnable_mutex);
pthread_cond_signal (&info.audacious.runnable_cond);
pthread_mutex_unlock (&info.audacious.runnable_mutex);
/* Destroy thread attribute and wait for thread */
pthread_attr_destroy(&info.audacious.thread_attr);
if (pthread_join(info.audacious.thread, NULL))
return(-1);
/* Destroy mutexes */
/* Destroy mutexes and cond */
pthread_mutex_destroy(&info.audacious.item_mutex);
pthread_mutex_destroy(&info.audacious.runnable_mutex);
pthread_cond_destroy(&info.audacious.runnable_cond);
info.audacious.thread=(pthread_t)0;
return 0;
@ -110,22 +112,18 @@ int destroy_audacious_thread(void)
* --------------------------------------------------- */
void *audacious_thread_func(void *pvoid)
{
int runnable;
int runnable=1;
static audacious_t items;
gint session,playpos,frames,length;
gint rate,freq,chans;
gchar *psong,*pfilename;
struct timespec abstime;
pvoid=(void *)pvoid; /* avoid warning */
session=0;
psong=NULL;
pfilename=NULL;
/* Grab the runnable signal. Should be non-zero here or we do nothing. */
pthread_mutex_lock(&info.audacious.runnable_mutex);
runnable=info.audacious.runnable;
pthread_mutex_unlock(&info.audacious.runnable_mutex );
/* Loop until the main thread sets the runnable signal to 0. */
while(runnable) {
@ -207,12 +205,19 @@ void *audacious_thread_func(void *pvoid)
memcpy(&audacious_items,items,sizeof(items));
pthread_mutex_unlock(&info.audacious.item_mutex);
/* Grab the runnable signal for next loop. */
pthread_mutex_lock(&info.audacious.runnable_mutex);
runnable=info.audacious.runnable;
pthread_mutex_unlock(&info.audacious.runnable_mutex);
/* Get absolute time 1 sec in the future. */
clock_gettime (CLOCK_REALTIME, &abstime);
abstime.tv_sec += 1;
/* Wait for a second before looping or until signalled to stop. */
if (pthread_cond_timedwait (&info.audacious.runnable_cond,
&info.audacious.runnable_mutex,
&abstime) != ETIMEDOUT)
{
runnable=0;
(void) pthread_mutex_unlock (&info.audacious.runnable_mutex);
}
sleep(1);
}
pthread_exit(NULL);

View File

@ -172,11 +172,11 @@ struct xmms2_s {
#ifdef AUDACIOUS
struct audacious_s {
audacious_t items; /* e.g. items[AUDACIOUS_STATUS] */
int runnable; /* used to signal worker thread to stop */
pthread_t thread; /* worker thread */
pthread_attr_t thread_attr; /* thread attributes */
pthread_mutex_t item_mutex; /* mutex for item array */
pthread_mutex_t runnable_mutex; /* mutex for runnable flag */
pthread_mutex_t runnable_mutex; /* mutex for runnable */
pthread_cond_t runnable_cond; /* cond for runnable */
};
#endif