summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--flake.lock36
-rw-r--r--flake.nix1
-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
-rw-r--r--subprojects/BLAKE3.wrap2
-rw-r--r--subprojects/libakiyo.wrap2
-rw-r--r--subprojects/libalabaster.wrap2
15 files changed, 54 insertions, 42 deletions
diff --git a/flake.lock b/flake.lock
index cec783a..5111b7d 100644
--- a/flake.lock
+++ b/flake.lock
@@ -3,11 +3,11 @@
"flake-compat": {
"flake": false,
"locked": {
- "lastModified": 1696426674,
- "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
+ "lastModified": 1733328505,
+ "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=",
"owner": "edolstra",
"repo": "flake-compat",
- "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
+ "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
"type": "github"
},
"original": {
@@ -21,11 +21,11 @@
"systems": "systems"
},
"locked": {
- "lastModified": 1726560853,
- "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=",
+ "lastModified": 1731533236,
+ "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
- "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a",
+ "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
@@ -41,11 +41,11 @@
]
},
"locked": {
- "lastModified": 1733754861,
- "narHash": "sha256-3JKzIou54yjiMVmvgdJwopekEvZxX3JDT8DpKZs4oXY=",
+ "lastModified": 1733769654,
+ "narHash": "sha256-aVvYDt8eitZVF6fdOrSoIzYRkQ5Gh6kfRvqkiaDRLL0=",
"owner": "nix-community",
"repo": "home-manager",
- "rev": "9ebaa80a227eaca9c87c53ed515ade013bc2bca9",
+ "rev": "e952e94955dcc6fa2120c1430789fc41363f5237",
"type": "github"
},
"original": {
@@ -78,11 +78,11 @@
"nixpkgs": "nixpkgs"
},
"locked": {
- "lastModified": 1733754474,
- "narHash": "sha256-+Fd2VIEFgLJAYIzRkCCSvbYXovoZj9k7K04cmUUzlHI=",
+ "lastModified": 1733854371,
+ "narHash": "sha256-K9qGHniYBbjqVcEiwXyiofj/IFf78L5F0/FCf+CKyr0=",
"owner": "nix-community",
"repo": "NixOS-WSL",
- "rev": "7c85eb172eef3a8814e6c1127f0e64b6e8ffc3b7",
+ "rev": "dee4425dcee3149475ead0cb6a616b8a028c5888",
"type": "github"
},
"original": {
@@ -94,11 +94,11 @@
},
"nixpkgs": {
"locked": {
- "lastModified": 1729973466,
- "narHash": "sha256-knnVBGfTCZlQgxY1SgH0vn2OyehH9ykfF8geZgS95bk=",
+ "lastModified": 1733384649,
+ "narHash": "sha256-K5DJ2LpPqht7K76bsxetI+YHhGGRyVteTPRQaIIKJpw=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "cd3e8833d70618c4eea8df06f95b364b016d4950",
+ "rev": "190c31a89e5eec80dd6604d7f9e5af3802a58a13",
"type": "github"
},
"original": {
@@ -110,11 +110,11 @@
},
"nixpkgs_2": {
"locked": {
- "lastModified": 1733581040,
- "narHash": "sha256-Qn3nPMSopRQJgmvHzVqPcE3I03zJyl8cSbgnnltfFDY=",
+ "lastModified": 1733759999,
+ "narHash": "sha256-463SNPWmz46iLzJKRzO3Q2b0Aurff3U1n0nYItxq7jU=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "22c3f2cf41a0e70184334a958e6b124fb0ce3e01",
+ "rev": "a73246e2eef4c6ed172979932bc80e1404ba2d56",
"type": "github"
},
"original": {
diff --git a/flake.nix b/flake.nix
index d57fb3c..499bb02 100644
--- a/flake.nix
+++ b/flake.nix
@@ -137,6 +137,7 @@
nativeBuildInputs = packages.${system}.default.nativeBuildInputs ++ [
gdb
clang-tools
+ clang-analyzer
ruff
ruff-lsp
perf-tools
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,
diff --git a/subprojects/BLAKE3.wrap b/subprojects/BLAKE3.wrap
index 92a75d0..ebccf0d 100644
--- a/subprojects/BLAKE3.wrap
+++ b/subprojects/BLAKE3.wrap
@@ -1,6 +1,6 @@
[wrap-git]
url = https://github.com/BLAKE3-team/BLAKE3.git
-revision = 1.5.4
+revision = 5c8b350b3531102359b89e9f0a3367e6de4a43f4
depth = 1
patch_directory = BLAKE3
method = cmake
diff --git a/subprojects/libakiyo.wrap b/subprojects/libakiyo.wrap
index 8df0163..38cd4f7 100644
--- a/subprojects/libakiyo.wrap
+++ b/subprojects/libakiyo.wrap
@@ -1,4 +1,4 @@
[wrap-git]
url = https://git.akon.city/libakiyo
-revision = 54b720762349fb71b73914d52bc7ddf49c0b60af
+revision = dcc43df0a40cbb2126505396cac4db26008d49b1
depth = 1
diff --git a/subprojects/libalabaster.wrap b/subprojects/libalabaster.wrap
index 3c1d0b1..c5e3d54 100644
--- a/subprojects/libalabaster.wrap
+++ b/subprojects/libalabaster.wrap
@@ -1,4 +1,4 @@
[wrap-git]
url = https://git.akon.city/libalabaster
-revision = 27cbe448f08a783196e49aa58d9af57240a20d43
+revision = ec924efb4168f906efe8978a6c083d63e550ae3f
depth = 1