From ebd9c3c4ec2cfe2f08b4f700dcc5bcb2a8b4b847 Mon Sep 17 00:00:00 2001 From: Robin Haberkorn Date: Thu, 16 Nov 2023 17:50:24 +0300 Subject: improved interruption (SIGINT, CTRL+C) support * Just like the original LuaJIT interpreter, this will use a hook to automatically raise an error from Lua code. * Unfortunately, as long as Jit compilation is enabled, this cannot reliably work. Therefore we still set an `interrupted` flag that must be polled from tight loops. * Instead of polling via applause_push_sample() which gave interruption-support only to Stream:play(), we now have a separate checkint() function. * checkint() should be manually added to all tight loops. * Stream:foreach() and everthing based on it is now also supporting interruptions (via checkint()). * This internally works via applause_is_interrupted(). A C function was exposed only because LuaJIT does not support volatile-qualifiers and would optimize away reads to the interrupted-flag. As a side effect, we can also reset the hook. * Flags set in signal handlers should be `volatile`. * Added likely() and unlikely() macros to C code. * Updated sample.ipynb Jupyter notebook: Everything important is now supported, albeit requiring custom ILua patches. --- applause.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'applause.h') diff --git a/applause.h b/applause.h index c4d9d87..fc01d49 100644 --- a/applause.h +++ b/applause.h @@ -2,10 +2,11 @@ enum applause_audio_state { APPLAUSE_AUDIO_OK = 0, - APPLAUSE_AUDIO_INTERRUPTED, APPLAUSE_AUDIO_XRUN, APPLAUSE_AUDIO_INVALID_PORT }; enum applause_audio_state applause_push_sample(int output_port_id, double sample_double); + +int applause_is_interrupted(void); -- cgit v1.2.3