diff options
Diffstat (limited to 'src/liana')
| -rw-r--r-- | src/liana/handlers.c | 4 | ||||
| -rw-r--r-- | src/liana/handlers.h | 2 | ||||
| -rw-r--r-- | src/liana/handlers/codec_server.c | 2 | ||||
| -rw-r--r-- | src/liana/list.c | 33 | ||||
| -rw-r--r-- | src/liana/list_cmp.h | 51 | ||||
| -rw-r--r-- | src/liana/vcr.c | 27 | ||||
| -rw-r--r-- | src/liana/vcr.h | 2 |
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; |