summaryrefslogtreecommitdiff
path: root/plat.c
diff options
context:
space:
mode:
authorquou <quou@disroot.org>2024-06-04 21:42:04 +1000
committerquou <quou@disroot.org>2024-06-04 21:42:04 +1000
commit557e07876de0086b70e301b104547bf35ec57959 (patch)
treeb2c9923ef989ea38d185d4598764a060c18f298e /plat.c
parent6589107006fd4fc06bdb7d02cb4b1eef45395458 (diff)
Loading album art, seeking, pause/play.
Diffstat (limited to 'plat.c')
-rw-r--r--plat.c28
1 files changed, 22 insertions, 6 deletions
diff --git a/plat.c b/plat.c
index 66dc50b..a70fe52 100644
--- a/plat.c
+++ b/plat.c
@@ -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;
}