summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/liana/client.c1
-rw-r--r--src/liana/handlers/codec_client.c4
-rw-r--r--src/libsink/sink.c2
-rw-r--r--src/mixer/mixer.c2
-rw-r--r--src/screen/screen.c17
-rw-r--r--src/screen/screen.h6
-rw-r--r--src/sink/desktop.c10
-rw-r--r--src/sink/input_simulator.c3
-rw-r--r--src/sink/input_simulator.h3
-rw-r--r--src/sink/meson.build5
10 files changed, 32 insertions, 21 deletions
diff --git a/src/liana/client.c b/src/liana/client.c
index 59de366..1454ba0 100644
--- a/src/liana/client.c
+++ b/src/liana/client.c
@@ -95,6 +95,7 @@ static void parse_info_packet(struct lia_client *client, struct aki_packet *pack
}
#endif
}
+ al_assert(track);
track->index = index;
track->stream.mode = mode;
track->stream.type = type;
diff --git a/src/liana/handlers/codec_client.c b/src/liana/handlers/codec_client.c
index f15b3f8..dc53129 100644
--- a/src/liana/handlers/codec_client.c
+++ b/src/liana/handlers/codec_client.c
@@ -59,10 +59,10 @@ static bool codec_client_handle_packet(struct lia_client_handler *handler, struc
// NULL packet = flush.
if (!packet) {
if (codec->dec) {
- s32 ret = codec->dec->push(codec->dec, NULL);
// Flush always returns success.
- ret = codec->dec->process(codec->dec);
+ codec->dec->push(codec->dec, NULL);
// process() could still error.
+ s32 ret = codec->dec->process(codec->dec);
codec->handler.callback(codec->handler.userdata, LIANA_CLIENT_EOF, codec->handler.stream, NULL);
return ret == CAMU_ERR_EOF;
} else {
diff --git a/src/libsink/sink.c b/src/libsink/sink.c
index fe56221..d6d54fd 100644
--- a/src/libsink/sink.c
+++ b/src/libsink/sink.c
@@ -50,7 +50,7 @@ enum {
};
// Number of entries to keep buffered at one time.
-#define ENTRY_MAX_AGE 5
+#define ENTRY_MAX_AGE 6
// If a buffer is still INIT or QUEUED after an entry is configured, it's "empty".
#define BUFFER_EMPTY(buf) ((buf)->state == BUFFER_INIT || (buf)->state == BUFFER_QUEUED)
diff --git a/src/mixer/mixer.c b/src/mixer/mixer.c
index 46df146..49a04c2 100644
--- a/src/mixer/mixer.c
+++ b/src/mixer/mixer.c
@@ -281,13 +281,11 @@ void camu_mixer_resume(struct camu_mixer *mixer)
void camu_mixer_clear(struct camu_mixer *mixer)
{
#ifdef CAMU_MIXER_THREADED
- run_queue_internal(mixer);
struct camu_audio_buffer *buf;
al_array_foreach(mixer->buffers, i, buf) {
al_atomic_store(u8)(&buf->ref, 0, AL_ATOMIC_RELAXED);
}
#endif
- mixer->buffers.size = 0;
}
void camu_mixer_close(struct camu_mixer *mixer)
diff --git a/src/screen/screen.c b/src/screen/screen.c
index 30d6860..d5f6c78 100644
--- a/src/screen/screen.c
+++ b/src/screen/screen.c
@@ -184,9 +184,11 @@ static bool key_callback(void *userdata, u8 state, u8 button)
case 0x12: // e
scr->callback(scr->userdata, CAMU_SCREEN_RESEEK, NULL);
break;
+#ifdef CAMU_SCREEN_DEBUG_KEY
case 0x19: // p
scr->callback(scr->userdata, CAMU_SCREEN_DEBUG, NULL);
break;
+#endif
case 0x13: { // r
struct camu_view *view = get_view_from_mouse_pos(scr);
if (view) {
@@ -293,7 +295,7 @@ bool camu_screen_init(struct camu_screen *scr, void *context)
static aki_thread_result AKI_THREADCALL event_thread(void *userdata)
{
struct camu_screen *scr = (struct camu_screen *)userdata;
- while (scr->window->poll(scr->window, true) && al_atomic_load(s32)(&scr->state, AL_ATOMIC_RELAXED) != CAMU_SCREEN_CLOSED ) {
+ while (scr->window->poll(scr->window, true) && al_atomic_load(s32)(&scr->state, AL_ATOMIC_RELAXED) != CAMU_SCREEN_STOPPED) {
scr->window->process_events(scr->window);
}
return 0;
@@ -499,7 +501,9 @@ bool camu_screen_poll(struct camu_screen *scr, bool block)
bool camu_screen_tick(struct camu_screen *scr)
{
- bool paused = al_atomic_load(s32)(&scr->state, AL_ATOMIC_RELAXED) == CAMU_SCREEN_PAUSED;
+ s32 state = al_atomic_load(s32)(&scr->state, AL_ATOMIC_RELAXED);
+ al_assert(state != CAMU_SCREEN_STOPPED);
+ bool paused = state == CAMU_SCREEN_PAUSED;
return camu_screen_poll(scr, paused) || !paused;
}
@@ -515,13 +519,14 @@ void camu_screen_wake(struct camu_screen *scr)
void camu_screen_clear(struct camu_screen *scr)
{
#ifdef CAMU_SCREEN_THREADED
- run_queue_internal(scr);
+ aki_mutex_lock(&scr->mutex);
struct camu_screen_video *video;
al_array_foreach_ptr(scr->videos, i, video) {
- al_atomic_store(u8)(&video->buf->ref, 0, AL_ATOMIC_RELAXED);
+ struct camu_video_buffer *buf = video->buf;
+ al_atomic_store(u8)(&buf->ref, 0, AL_ATOMIC_RELAXED);
}
+ aki_mutex_unlock(&scr->mutex);
#endif
- scr->videos.size = 0;
}
void camu_screen_close(struct camu_screen *scr)
@@ -532,7 +537,7 @@ void camu_screen_close(struct camu_screen *scr)
aki_mutex_destroy(&scr->mutex);
#endif
al_array_free(scr->videos);
- al_atomic_store(s32)(&scr->state, CAMU_SCREEN_CLOSED, AL_ATOMIC_RELAXED);
+ al_atomic_store(s32)(&scr->state, CAMU_SCREEN_STOPPED, AL_ATOMIC_RELAXED);
#ifdef STELA_EVENT_BUFFER
aki_thread_join(&scr->thread);
#endif
diff --git a/src/screen/screen.h b/src/screen/screen.h
index 9467d35..36d9075 100644
--- a/src/screen/screen.h
+++ b/src/screen/screen.h
@@ -12,6 +12,8 @@
#include "view.h"
+#define CAMU_SCREEN_DEBUG_KEY
+
#define CAMU_SCREEN_WIDTH 700
#define CAMU_SCREEN_HEIGHT 700
@@ -24,7 +26,7 @@ enum {
enum {
CAMU_SCREEN_PAUSED = 0,
CAMU_SCREEN_PLAYING,
- CAMU_SCREEN_CLOSED
+ CAMU_SCREEN_STOPPED
};
enum {
@@ -35,7 +37,9 @@ enum {
CAMU_SCREEN_SEEK,
CAMU_SCREEN_RESEEK,
CAMU_SCREEN_VOLUME,
+#ifdef CAMU_SCREEN_DEBUG_KEY
CAMU_SCREEN_DEBUG,
+#endif
CAMU_SCREEN_CLOSE
};
diff --git a/src/sink/desktop.c b/src/sink/desktop.c
index 85080ba..ccd2e11 100644
--- a/src/sink/desktop.c
+++ b/src/sink/desktop.c
@@ -10,7 +10,7 @@
#include "desktop.h"
#include "common.h"
-#ifdef _DEBUG_
+#ifdef CAMU_SCREEN_DEBUG_KEY
#include "input_simulator.h"
#endif
@@ -50,16 +50,16 @@ static void screen_callback(void *userdata, u8 op, void *opaque)
case CAMU_SCREEN_RESEEK:
camu_sink_reseek(&c->sink);
break;
+#ifdef CAMU_SCREEN_DEBUG_KEY
case CAMU_SCREEN_DEBUG:
-#ifdef _DEBUG_
if (camu_input_simulator_running()) {
camu_input_simulator_stop();
} else {
camu_input_simulator_run(&c->sink);
}
//camu_sink_unset(&c->sink);
-#endif
break;
+#endif
case CAMU_SCREEN_VOLUME: {
f64 amount = *(f64 *)opaque;
camu_sink_offset_volume(&c->sink, (f32)amount);
@@ -121,14 +121,14 @@ bool camu_desktop_tick(struct camu_desktop *c)
void camu_desktop_stop(struct camu_desktop *c)
{
-#ifdef _DEBUG_
+#ifdef CAMU_SCREEN_DEBUG_KEY
if (camu_input_simulator_running()) {
camu_input_simulator_stop();
}
#endif
camu_mixer_pause(&c->mixer);
camu_mixer_clear(&c->mixer);
- camu_screen_set_state(&c->scr, CAMU_SCREEN_CLOSED);
+ // We have already stopped ticking the screen at this point.
camu_screen_clear(&c->scr);
camu_sink_stop(&c->sink);
}
diff --git a/src/sink/input_simulator.c b/src/sink/input_simulator.c
index b9c92ca..92e3936 100644
--- a/src/sink/input_simulator.c
+++ b/src/sink/input_simulator.c
@@ -1,3 +1,5 @@
+#include "../screen/screen.h"
+#ifdef CAMU_SCREEN_DEBUG_KEY
#include <aki/thread.h>
#include <al/random.h>
@@ -58,3 +60,4 @@ void camu_input_simulator_stop(void)
quit = 1;
aki_thread_join(&thread);
}
+#endif
diff --git a/src/sink/input_simulator.h b/src/sink/input_simulator.h
index 40253d0..e05b03e 100644
--- a/src/sink/input_simulator.h
+++ b/src/sink/input_simulator.h
@@ -1,7 +1,10 @@
#pragma once
+#include "../screen/screen.h"
+#ifdef CAMU_SCREEN_DEBUG_KEY
#include "../libsink/sink.h"
void camu_input_simulator_run(struct camu_sink *sink);
bool camu_input_simulator_running(void);
void camu_input_simulator_stop(void);
+#endif
diff --git a/src/sink/meson.build b/src/sink/meson.build
index 067b045..30a5f39 100644
--- a/src/sink/meson.build
+++ b/src/sink/meson.build
@@ -1,7 +1,4 @@
-desktop_src = ['desktop.c']
-if is_debug
- desktop_src += ['input_simulator.c']
-endif
+desktop_src = ['desktop.c', 'input_simulator.c']
desktop_deps = [libsink]
desktop_args = ['-DCAMU_MIXER_THREADED', '-DCAMU_SCREEN_THREADED']
desktop = declare_dependency(sources: desktop_src, dependencies: desktop_deps,