summaryrefslogtreecommitdiff
path: root/src/liana
diff options
context:
space:
mode:
Diffstat (limited to 'src/liana')
-rw-r--r--src/liana/handlers.c4
-rw-r--r--src/liana/handlers.h2
-rw-r--r--src/liana/handlers/codec_server.c2
-rw-r--r--src/liana/list.c33
-rw-r--r--src/liana/list_cmp.h51
-rw-r--r--src/liana/vcr.c27
-rw-r--r--src/liana/vcr.h2
7 files changed, 64 insertions, 57 deletions
diff --git a/src/liana/handlers.c b/src/liana/handlers.c
index 1a28024..e52d8bb 100644
--- a/src/liana/handlers.c
+++ b/src/liana/handlers.c
@@ -1,7 +1,9 @@
#include "handlers.h"
#include "handlers/codec.h"
+#ifdef CACHE_HAVE_CDIO
#include "handlers/cdio.h"
+#endif
struct lia_handler_entry liana_handlers[] = {
{
@@ -29,7 +31,7 @@ struct lia_handler_entry liana_handlers[] = {
struct lia_handler_entry *lia_handler_by_name(str *name)
{
for (u32 i = 0; i < ARRAY_SIZE(liana_handlers); i++) {
- if (al_str_eq(liana_handlers[i].name, name)) {
+ if (al_str_eq(&liana_handlers[i].name, name)) {
return &liana_handlers[i];
}
}
diff --git a/src/liana/handlers.h b/src/liana/handlers.h
index 0193f18..223ead5 100644
--- a/src/liana/handlers.h
+++ b/src/liana/handlers.h
@@ -3,7 +3,7 @@
#include "handler.h"
struct lia_handler_entry {
- str *name;
+ str name;
struct lia_server_handler *(*create_server_handler)(void);
struct lia_client_handler *(*create_client_handler)(void);
};
diff --git a/src/liana/handlers/codec_server.c b/src/liana/handlers/codec_server.c
index 24552bb..ff62d47 100644
--- a/src/liana/handlers/codec_server.c
+++ b/src/liana/handlers/codec_server.c
@@ -43,7 +43,7 @@ static void codec_server_write_info(struct lia_server_handler *handler, struct n
struct lia_codec_server *codec = (struct lia_codec_server *)handler;
u64 duration = codec->demux->get_duration(codec->demux);
nn_packet_write_u64(packet, duration);
- nn_packet_write_u32(packet, codec->demux->streams.size);
+ nn_packet_write_u32(packet, codec->demux->streams.count);
struct camu_codec_stream *stream;
al_array_foreach_ptr(codec->demux->streams, i, stream) {
nn_packet_write_u8(packet, stream->mode);
diff --git a/src/liana/list.c b/src/liana/list.c
index 3c8a9c0..fa21fe6 100644
--- a/src/liana/list.c
+++ b/src/liana/list.c
@@ -9,7 +9,7 @@
/*
static void buffer_ahead(struct lia_list *list)
{
- s32 size = (s32)list->entries.size;
+ s32 size = (s32)list->entries.count;
if (list->current >= 0 && list->current + 1 < size) {
s32 ahead = list->current + 1;
for (s32 i = ahead; i < MIN(ahead + LIANA_BUFFER_AHEAD, size); i++) {
@@ -89,7 +89,7 @@ static bool entry_load_and_get_duration(struct lia_list *list, struct lia_list_e
if (status == LIANA_ENTRY_ERRORED) {
if (sequence >= 0) {
al_array_remove_at(list->entries, (u32)sequence);
- if (sequence == list->current && (u32)list->current == list->entries.size) {
+ if (sequence == list->current && (u32)list->current == list->entries.count) {
// This maps to the behavior of only skipping ahead on errors.
list->current--;
list->idle = true;
@@ -139,7 +139,7 @@ static void set_queued(struct lia_list *list)
static void evaluate_queued(struct lia_list *list)
{
- s32 size = (s32)list->entries.size;
+ s32 size = (s32)list->entries.count;
s32 next = list->current + 1;
if (next >= size || next == list->queued)
return;
@@ -226,7 +226,7 @@ static bool handle_add(struct lia_list *list, struct lia_list_entry *entry)
};
struct lia_list_sink *sink;
al_array_foreach(list->sinks, i, sink) {
- al_assert(sink->set == -1);
+ //al_assert(sink->set == -1);
sink->set = list->current;
sink->callback(sink->userdata, LIANA_SINK_SET, entry, list->current, &time);
}
@@ -276,7 +276,7 @@ static void unset_all(struct lia_list *list)
static void handle_unset(struct lia_list *list)
{
unset_all(list);
- list->current = list->entries.size - 1;
+ list->current = list->entries.count - 1;
list->idle = true;
struct lia_list_sink *sink;
al_array_foreach(list->sinks, i, sink) {
@@ -286,7 +286,7 @@ static void handle_unset(struct lia_list *list)
static struct lia_list_entry *get_entry_from_sequence(struct lia_list *list, s32 sequence)
{
- s32 size = (s32)list->entries.size;
+ s32 size = (s32)list->entries.count;
if (sequence < 0 || sequence >= size) return NULL;
return al_array_at(list->entries, sequence);
}
@@ -555,7 +555,7 @@ static bool handle_end(struct lia_list *list, u32 id, u32 reset_id)
return false;
#endif
- s32 size = (s32)list->entries.size;
+ s32 size = (s32)list->entries.count;
if (sequence == list->current) {
s32 next = sequence + 1;
if (list->queued >= 0) {
@@ -588,7 +588,7 @@ static void handle_reverse(struct lia_list *list)
{
if (list->current == -1) return;
struct lia_list_entry *previous = al_array_at(list->entries, list->current);
- u32 size = list->entries.size;
+ u32 size = list->entries.count;
for (u32 i = 0; i < size; i++) {
u32 tail = size - (i + 1);
if (tail <= i) break;
@@ -609,10 +609,15 @@ static void handle_shuffle(struct lia_list *list)
{
if (list->current == -1) return;
struct lia_list_entry *previous = al_array_at(list->entries, list->current);
- u32 size = list->entries.size;
- if (size == 0) return;
- for (u32 i = 0; i < size - 1; i++) {
- u32 j = i + al_rand() / (AL_RAND_MAX / (size - i) + 1);
+ u32 size = list->entries.count;
+ if (size <= 1) return;
+ /* https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
+ for i from 0 to nāˆ’2 do
+ j ← random integer such that i ≤ j ≤ n-1
+ exchange a[i] and a[j]
+ */
+ for (u32 i = 0; i < size - 2; i++) {
+ u32 j = i + (al_rand() % (size - i));
SWAP(al_array_at(list->entries, i), al_array_at(list->entries, j));
}
adjust_current(list, previous);
@@ -627,13 +632,13 @@ static void handle_clear(struct lia_list *list)
al_wstr_free(&entry->name);
al_free(entry);
}
- list->entries.size = 0;
+ list->entries.count = 0;
}
static void run_queue(struct lia_list *list)
{
if (!list->cmd) {
- if (al_array_is_empty(list->queue)) return;
+ if (!list->queue.count) return;
al_array_pop_at(list->queue, 0, list->cmd);
}
struct lia_list_cmd *cmd = list->cmd;
diff --git a/src/liana/list_cmp.h b/src/liana/list_cmp.h
index ef923fb..c9c0812 100644
--- a/src/liana/list_cmp.h
+++ b/src/liana/list_cmp.h
@@ -8,36 +8,37 @@ AL_UNUSED_FUNCTION_PUSH
static void camu_db_num_from_path(wstr *path, s64 *id, s64 *index)
{
- s32 index0 = al_wstr_rfind(path, L'/');
- if (index0 < 0) return;
+ u32 last_slash = al_wstr_rfind(path, L'/');
+ if (last_slash == al_wstr_npos) {
+ return;
+ }
+ wstr temp = al_wstr_substr(path, last_slash + 1, path->length);
- wstr w = *al_wstr_substr(path, index0 + 1, path->len);
- index0 = al_wstr_find(&w, L'_');
- if (index0 < 0) return;
- w = *al_wstr_substr(&w, index0 + 1, w.len);
- index0 = al_wstr_find(&w, L'_');
- if (index0 < 0) return;
- w = *al_wstr_substr(&w, index0 + 1, w.len);
- index0 = al_wstr_find(&w, L'_');
- if (index0 < 0) return;
- w = *al_wstr_substr(&w, 0, index0);
+ // Skip 2 '_' characters.
+ if (!(al_wstr_tok(&temp, L'_') && al_wstr_tok(&temp, L'_'))) {
+ return;
+ }
- str s;
- al_wstr_to_str(&w, &s);
- s64 num = al_str_to_long(&s, 10);
- al_str_free(&s);
- if (num == INT64_MIN || num == INT64_MAX) return;
+ u32 target = al_wstr_find(&temp, L'_');
+ if (target == al_wstr_npos) {
+ return;
+ }
+ temp = al_wstr_substr(&temp, 0, target);
+
+ bool error;
+ s64 num = al_wstr_to_long(&temp, 10, &error);
+ if (error) return;
*id = num;
- index0 = al_wstr_rfind(path, L'.');
- s32 index1 = al_wstr_rfind(path, 'a');
- if (index0 < 0 || index1 < 0) return;
- w = *al_wstr_substr(path, index1 + 1, index0);
+ u32 ext_dot = al_wstr_rfind(path, L'.');
+ u32 media_a = al_wstr_rfind(path, 'a');
+ if (ext_dot == al_wstr_npos || media_a == al_wstr_npos) {
+ return;
+ }
+ temp = al_wstr_substr(path, media_a + 1, ext_dot);
- al_wstr_to_str(&w, &s);
- num = al_str_to_long(&s, 10);
- al_str_free(&s);
- if (num == INT64_MIN || num == INT64_MAX) return;
+ num = al_wstr_to_long(&temp, 10, &error);
+ if (error) return;
*index = num;
}
diff --git a/src/liana/vcr.c b/src/liana/vcr.c
index 06f0fe4..c5b704e 100644
--- a/src/liana/vcr.c
+++ b/src/liana/vcr.c
@@ -53,9 +53,9 @@ void lia_vcr_init(struct lia_vcr *vcr, struct nn_event_loop *loop, struct nn_pac
static void return_entire_cache(struct lia_vcr_track *track)
{
struct lia_vcr *vcr = track->vcr;
- u32 size = track->cache.cache.size;
- nn_packet_stream_return_packets(vcr->data, al_array_offset(track->cache.cache, 0), size);
- track->cache.cache.size = 0;
+ u32 count = track->cache.cache.count;
+ nn_packet_stream_return_packets(vcr->data, al_array_offset(track->cache.cache, 0), count);
+ track->cache.cache.count = 0;
}
static nn_thread_result NNWT_THREADCALL vcr_track_thread(void *userdata)
@@ -88,7 +88,7 @@ static nn_thread_result NNWT_THREADCALL vcr_track_thread(void *userdata)
u32 size = nn_packet_get_size(packet);
u64 buffer = al_atomic_sub(u64)(&vcr->count, size, AL_ATOMIC_RELAXED);
#ifndef CAMU_DIRECT_MODE
- u8 buffered = al_atomic_load(u8)(&track->buffered, AL_ATOMIC_RELAXED);
+ bool buffered = al_atomic_load(bool)(&track->buffered, AL_ATOMIC_RELAXED);
if (buffered && buffer <= vcr->mark.low) {
nn_signal_send(&vcr->signal);
}
@@ -180,7 +180,7 @@ void lia_vcr_add_track(struct lia_vcr *vcr, struct lia_vcr_track *track)
track->vcr = vcr;
nn_cond_init(&track->cond);
nn_mutex_init(&track->mutex);
- al_atomic_store(u8)(&track->buffered, !VCR_TRACK_THREADED(track), AL_ATOMIC_RELAXED);
+ al_atomic_store(bool)(&track->buffered, !VCR_TRACK_THREADED(track), AL_ATOMIC_RELAXED);
nn_packet_cache_init(&track->cache, 256);
al_array_push(vcr->tracks, track);
al_atomic_store(s32)(&track->state, VCR_TRACK_RUNNING, AL_ATOMIC_RELAXED);
@@ -188,7 +188,7 @@ void lia_vcr_add_track(struct lia_vcr *vcr, struct lia_vcr_track *track)
bool lia_vcr_is_empty(struct lia_vcr *vcr)
{
- return al_array_is_empty(vcr->tracks);
+ return !vcr->tracks.count;
}
static struct lia_vcr_track *get_track_from_index(struct lia_vcr *vcr, s32 index)
@@ -203,10 +203,10 @@ static struct lia_vcr_track *get_track_from_index(struct lia_vcr *vcr, s32 index
#ifndef CAMU_DIRECT_MODE
static void cork_if_buffered(struct lia_vcr *vcr, u64 buffer)
{
- u8 buffered = 1;
+ bool buffered = true;
struct lia_vcr_track *track;
al_array_foreach(vcr->tracks, i, track) {
- buffered &= al_atomic_load(u8)(&track->buffered, AL_ATOMIC_RELAXED);
+ buffered &= al_atomic_load(bool)(&track->buffered, AL_ATOMIC_RELAXED);
}
if (buffered) {
if (vcr->expand == VCR_EXPAND_UNTOUCHED) {
@@ -263,15 +263,15 @@ void lia_vcr_push_packet(struct lia_vcr *vcr, struct nn_packet *packet)
break;
}
if (VCR_TRACK_THREADED(track)) {
- if (!nn_packet_cache_send_packet(&track->cache, packet)) {
- break;
- }
u64 buffer;
if ((buffer = al_atomic_add(u64)(&vcr->count, size, AL_ATOMIC_RELAXED)) >= vcr->mark.buffered) {
#ifndef CAMU_DIRECT_MODE
cork_if_buffered(vcr, buffer);
#endif
}
+ if (!nn_packet_cache_send_packet(&track->cache, packet)) {
+ break;
+ }
// Keep packet.
return;
} else {
@@ -301,13 +301,12 @@ void lia_vcr_push_packet(struct lia_vcr *vcr, struct nn_packet *packet)
void lia_vcr_set_buffered(struct lia_vcr_track *track)
{
- al_atomic_store(u8)(&track->buffered, 1, AL_ATOMIC_RELAXED);
+ al_atomic_store(bool)(&track->buffered, true, AL_ATOMIC_RELAXED);
}
void lia_vcr_cork(struct lia_vcr_track *track)
{
al_atomic_store(s32)(&track->state, VCR_TRACK_STOPPED, AL_ATOMIC_RELAXED);
- al_atomic_store(u8)(&track->buffered, 1, AL_ATOMIC_RELAXED);
}
void lia_vcr_uncork(struct lia_vcr_track *track)
@@ -350,7 +349,7 @@ void lia_vcr_flush(struct lia_vcr *vcr)
if (VCR_TRACK_THREADED(track)) {
vcr_track_close_internal(track);
return_entire_cache(track);
- al_atomic_store(u8)(&track->buffered, 0, AL_ATOMIC_RELAXED);
+ al_atomic_store(bool)(&track->buffered, false, AL_ATOMIC_RELAXED);
track->client->flush(track->client);
nn_packet_cache_enable(&track->cache);
al_atomic_store(s32)(&track->state, VCR_TRACK_RUNNING, AL_ATOMIC_RELAXED);
diff --git a/src/liana/vcr.h b/src/liana/vcr.h
index 8aefaa2..bd4f0f9 100644
--- a/src/liana/vcr.h
+++ b/src/liana/vcr.h
@@ -15,7 +15,7 @@ struct lia_vcr_track {
struct camu_codec_stream stream;
struct lia_client_handler *client;
atomic(s32) state;
- atomic(u8) buffered;
+ atomic(bool) buffered;
struct nn_packet_cache cache;
struct nn_cond cond;
struct nn_mutex mutex;