summaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@pengaru.com>2023-11-14 19:31:36 -0800
committerVito Caputo <vcaputo@pengaru.com>2023-11-14 19:31:36 -0800
commita44c71ba3dcd57765b112c039b48513646c9e244 (patch)
tree03febc52aeed244f4f9a2085e91f8c7c6d662155 /src/main.c
parentb7f773ae87ab037b94582005729fc15a22340f97 (diff)
til_stream,rkt,main: add stream audio control
Until now everything interested in audio just used a plain getter on the stream to get at the context. But with how things work currently, audio is always left in a paused state until explicitly unpaused. This works fine with modules/rkt, which manages pause/unpause explicitly. When there's nothing like modules/rkt in charge though, the audio just sits stuck paused. Meaning if you do some simple thing like --module=playit, it won't ever get unpaused. With this commit, something like modules/rkt takes control of the stream's audio context, in a way that prevents anything else from taking control of the same context on the same stream. That enables having main try take control of the audio context after creating the module contexts, then in the rendering thread ensure the audio is unpaused if main is in control of the audio context and something's queueing audio frames. For now there's no mechanism for releasing control of the audio context. It doesn't seem appropriate to make this more elaborate than necessary. There's basically just two use cases WRT audio: 1. Something like rkt, which takes control once for the process and stays in control until process exit. 2. Something far simpler where nothing's taking control like rkt, and main just needs to get things unpaused when needed because something's generating audio frames.
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/main.c b/src/main.c
index daf1b24..f350a1f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -73,7 +73,7 @@ typedef struct rototiller_t {
til_fb_fragment_t *fragment;
pthread_t thread;
til_fb_t *fb;
- til_audio_context_t *audio;
+ til_audio_context_t *audio, *audio_control;
} rototiller_t;
static rototiller_t rototiller;
@@ -430,6 +430,10 @@ static void * rototiller_thread(void *_rt)
til_fb_fragment_submit(rt->fragment);
last_ticks = ticks;
+ /* if we're in audio control, ensure it's unpaused if something's queueing audio */
+ if (rt->audio_control && til_audio_n_queued(rt->audio_control))
+ til_audio_unpause(rt->audio_control);
+
if (rt->args.print_module_contexts || rt->args.print_pipes) {
/* render threads are idle at this point */
printf("\x1b[2J\x1b[;H"); /* ANSI codes for clear screen and move cursor to top left */
@@ -502,6 +506,9 @@ int main(int argc, const char *argv[])
&rototiller.module_context)) < 0,
"unable to create module context: %s", strerror(-r));
+ /* this determines if we need to "control" the audio (unpause it, really) */
+ rototiller.audio_control = til_stream_get_audio_context_control(rototiller.stream);
+
pexit_if(pthread_create(&rototiller.thread, NULL, rototiller_thread, &rototiller) != 0,
"unable to create dispatch thread");
© All Rights Reserved