aboutsummaryrefslogtreecommitdiff
path: root/pd/src/m_sched.c
diff options
context:
space:
mode:
Diffstat (limited to 'pd/src/m_sched.c')
-rw-r--r--pd/src/m_sched.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/pd/src/m_sched.c b/pd/src/m_sched.c
index ae9f3664..634db357 100644
--- a/pd/src/m_sched.c
+++ b/pd/src/m_sched.c
@@ -272,7 +272,7 @@ static void sched_pollformeters( void)
/* if there's no GUI but we're running in "realtime", here is
where we arrange to ping the watchdog every 2 seconds. */
-#ifdef __linux__
+#if defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__GNU__)
if (sys_nogui && sys_hipriority && (sched_diddsp - sched_nextpingtime > 0))
{
glob_watchdog(0);
@@ -439,7 +439,7 @@ static void m_pollingscheduler( void)
timeforward = sys_send_dacs();
#ifdef THREAD_LOCKING
/* T.Grill - done */
- sys_unlock();
+ sys_lock();
#endif
/* if dacs remain "idle" for 1 sec, they're hung up. */
if (timeforward != 0)
@@ -461,7 +461,7 @@ static void m_pollingscheduler( void)
idletime = sys_getrealtime();
else if (sys_getrealtime() - idletime > 1.)
{
- post("audio I/O stuck... closing audio\n");
+ error("audio I/O stuck... closing audio\n");
sys_close_audio();
sched_set_using_audio(SCHED_AUDIO_NONE);
goto waitfortick;
@@ -522,6 +522,7 @@ static void m_pollingscheduler( void)
void sched_audio_callbackfn(void)
{
+ sys_lock();
sys_setmiditimediff(0, 1e-6 * sys_schedadvance);
sys_addhist(1);
sched_tick(sys_time + sys_time_per_dsp_tick);
@@ -532,6 +533,7 @@ void sched_audio_callbackfn(void)
sys_addhist(5);
sched_pollformeters();
sys_addhist(0);
+ sys_unlock();
}
static void m_callbackscheduler(void)
@@ -539,11 +541,19 @@ static void m_callbackscheduler(void)
sys_initmidiqueue();
while (!sys_quit)
{
+ double timewas = sys_time;
#ifdef MSW
- Sleep(1000);
+ Sleep(1000);
#else
sleep(1);
#endif
+ if (sys_time == timewas)
+ {
+ sys_lock();
+ sys_pollgui();
+ sched_tick(sys_time + sys_time_per_dsp_tick);
+ sys_unlock();
+ }
if (sys_idlehook)
sys_idlehook();
}