June 10, 2010

questions about real-time programming

I write a music composition application in my free time. It's called ags. I didn't work on it for months and now I don't know if there is a bug in it, which I don't know about or something changed recently in real-time programming with GNU/Linux.
I use debian GNU/Linux unstable with up-to-date software and a self compiled RT Kernel.
`ags` has three threads one for the gui, one for playing 4 buffers and one for processing the audio network. I posted some of the code below, which should run in real-time! I believe that the synchronization is the problem.

void*
ags_devout_play_functions(void *devout0)
{
AgsDevout *devout;
GStaticMutex mutex = G_STATIC_MUTEX_INIT;
void ags_devout_play_functions_timing(){
while((AGS_DEVOUT_WAIT_DEVICE & (devout->flags)) != 0){
g_cond_wait(devout->play_functions_cond,
g_static_mutex_get_mutex(&mutex));
}

devout->flags |= AGS_DEVOUT_WAIT_RECALL;
devout->flags |= AGS_DEVOUT_WAIT_DEVICE;
g_static_mutex_unlock(&mutex);
}

/* ... */

g_static_mutex_lock(&mutex);
devout->flags &= (~AGS_DEVOUT_WAIT_RECALL);

if((AGS_DEVOUT_WAIT_DEVICE & devout->flags) != 0){
ags_devout_play_functions_timing();
}else{
g_cond_broadcast(devout->play_cond);
g_static_mutex_unlock(&mutex);
}
}

return(NULL);
}
void*
ags_devout_alsa_play(void *devout0)
{
AgsDevout *devout;
GStaticMutex mutex = G_STATIC_MUTEX_INIT;
void ags_devout_play_timing(){
while((AGS_DEVOUT_WAIT_RECALL & (devout->flags)) != 0){
g_cond_wait(devout->play_cond,
g_static_mutex_get_mutex(&mutex));
}

devout->flags |= AGS_DEVOUT_WAIT_RECALL;
devout->flags |= AGS_DEVOUT_WAIT_DEVICE;
g_static_mutex_unlock(&mutex);
}

/*...*/

g_static_mutex_lock(&mutex);
devout->flags &= (~AGS_DEVOUT_WAIT_DEVICE);

if((AGS_DEVOUT_WAIT_RECALL & (devout->flags)) != 0){
ags_devout_play_timing();
}else{
g_cond_broadcast(devout->play_functions_cond);
g_static_mutex_unlock(&mutex);
}

/* ... */

}

Click Here!