diff options
author | quou <quou@disroot.org> | 2024-06-04 21:42:04 +1000 |
---|---|---|
committer | quou <quou@disroot.org> | 2024-06-04 21:42:04 +1000 |
commit | 557e07876de0086b70e301b104547bf35ec57959 (patch) | |
tree | b2c9923ef989ea38d185d4598764a060c18f298e /plat.c | |
parent | 6589107006fd4fc06bdb7d02cb4b1eef45395458 (diff) |
Loading album art, seeking, pause/play.
Diffstat (limited to 'plat.c')
-rw-r--r-- | plat.c | 28 |
1 files changed, 22 insertions, 6 deletions
@@ -117,9 +117,11 @@ void* audio_worker(void* arg) { lock_audio(); if (!audio.r) c = 0; as = sound_mix(arg, buf, s); - if (!as) audio.r = c = 0; unlock_audio(); - pa_simple_write(dev, buf, as, 0); + if (as) + pa_simple_write(dev, buf, as, 0); + else + usleep(25000); /* avoid hammering the thread */ } return 0; } @@ -136,9 +138,9 @@ void wait_audio(void) { } void init_audio(void* uptr, int sample, int channels) { - int r; if (audio.dev) { wait_audio(); + pa_simple_free(audio.dev); gfree(audio.buf); } audio.buf = galloc(audio_buffer_size * channels); @@ -164,7 +166,7 @@ void init_audio(void* uptr, int sample, int channels) { } audio.r = 1; audio.chan = channels; - r = pthread_create( + pthread_create( &audio_thread, 0, audio_worker, @@ -173,14 +175,22 @@ void init_audio(void* uptr, int sample, int channels) { pthread_mutex_init(&audio_mutex, 0); } -void lock_audio() { +void lock_audio(void) { pthread_mutex_lock(&audio_mutex); } -void unlock_audio() { +void unlock_audio(void) { pthread_mutex_unlock(&audio_mutex); } +int audio_done(void) { + int r; + lock_audio(); + r = !audio.r; + unlock_audio(); + return r; +} + extern int prog_main(void*); int main() { @@ -189,6 +199,12 @@ int main() { audio.dev = 0; mem = malloc(memory_size); r = prog_main(mem); + if (audio.dev) { + stop_audio(); + wait_audio(); + pa_simple_free(audio.dev); + gfree(audio.buf); + } free(mem); return r; } |