Update of /cvsroot/pure-data/pd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4376
Modified Files: Tag: devel_0_39 s_audio_jack.c m_sched.c Log Message: running idle callbacks in audio api callback
Index: m_sched.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/m_sched.c,v retrieving revision 1.5.4.35.2.10 retrieving revision 1.5.4.35.2.11 diff -C2 -d -r1.5.4.35.2.10 -r1.5.4.35.2.11 *** m_sched.c 9 Apr 2006 01:01:10 -0000 1.5.4.35.2.10 --- m_sched.c 13 Apr 2006 18:50:23 -0000 1.5.4.35.2.11 *************** *** 506,513 **** while(sys_keepsched) { ! int didsomething = 0; ! ! /* tb: allow the audio callback to run */ ! sys_unlock(); sys_lock();
--- 506,512 ---- while(sys_keepsched) { ! /* tb: allow the audio callback to run */ ! sys_unlock(); ! sys_microsleep(sys_sleepgrain); sys_lock();
*************** *** 519,524 **** /* do graphics updates and run idle callbacks */ ! sched_pollformeters(); ! run_idle_callbacks(sys_sleepgrain); } sys_keepsched = 1; --- 518,523 ---- /* do graphics updates and run idle callbacks */ ! sched_pollformeters(); ! } sys_keepsched = 1; *************** *** 701,704 **** --- 700,767 ---- static t_sched_callback *ringbuffer_head;
+ void run_all_idle_callbacks(void) + { + t_sched_callback * new_callback; + /* append idle callback to ringbuffer */ + while (new_callback = (t_sched_callback*) fifo_get(callback_fifo)) + { + t_sched_callback * next; + + /* set the next field to NULL ... it might be set in the fifo */ + new_callback->next = NULL; + if (ringbuffer_head == NULL) + { + ringbuffer_head = new_callback; + } + else + { + next = ringbuffer_head; + while (next->next != 0) + next = next->next; + next->next = new_callback; + } + } + + if (ringbuffer_head != NULL) + { + t_sched_callback * idle_callback = ringbuffer_head; + t_sched_callback * last = NULL; + t_sched_callback * next; + + do + { + int status; + status = (idle_callback->function)(idle_callback->argv); + + switch (status) + { + /* callbacks returning 0 will be deleted */ + case 0: + next = idle_callback->next; + freebytes (idle_callback->argv, idle_callback->argc); + freebytes ((void*)idle_callback, sizeof(t_sched_callback)); + + if (last == NULL) + ringbuffer_head = next; + else + last->next = next; + + idle_callback = next; + + /* callbacks returning 1 will be run again */ + case 1: + break; + + /* callbacks returning 2 will be run during the next idle callback */ + case 2: + last = idle_callback; + idle_callback = idle_callback->next; + } + + } + while ((idle_callback != NULL)); + } + } + static void run_idle_callbacks(int microsec) {
Index: s_audio_jack.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/s_audio_jack.c,v retrieving revision 1.5.4.8.2.6 retrieving revision 1.5.4.8.2.7 diff -C2 -d -r1.5.4.8.2.6 -r1.5.4.8.2.7 *** s_audio_jack.c 30 Nov 2005 13:36:58 -0000 1.5.4.8.2.6 --- s_audio_jack.c 13 Apr 2006 18:50:23 -0000 1.5.4.8.2.7 *************** *** 39,42 **** --- 39,45 ---- static void jack_restore_connection_state(void);
+ void run_all_idle_callbacks(void); + + static int process (jack_nframes_t nframes, void *arg) *************** *** 69,74 **** jack_filled = 0; } ! /* tb: wait in the scheduler */ ! /* pthread_cond_broadcast(&jack_sem); */ return 0; } --- 72,78 ---- jack_filled = 0; } ! ! /* tb: wait in the scheduler */ ! /* pthread_cond_broadcast(&jack_sem); */ return 0; } *************** *** 151,154 **** --- 155,160 ---- } + run_all_idle_callbacks(); + sys_unlock();