diff options
Diffstat (limited to 'src/liana')
| -rw-r--r-- | src/liana/list.c | 41 | ||||
| -rw-r--r-- | src/liana/list.h | 2 | ||||
| -rw-r--r-- | src/liana/vcr.c | 7 |
3 files changed, 35 insertions, 15 deletions
diff --git a/src/liana/list.c b/src/liana/list.c index df91140..65efc9d 100644 --- a/src/liana/list.c +++ b/src/liana/list.c @@ -52,6 +52,8 @@ void lia_list_init(struct lia_list *list, str *name) list->cmd = NULL; } +static void pump_queue(struct lia_list *list); + static bool assume_ended(struct lia_list_entry *entry, u64 at) { if (entry->duration == 0) return true; @@ -177,18 +179,32 @@ static bool handle_add(struct lia_list *list, struct lia_list_entry *entry) return true; } -static void unset_all(struct lia_list *list) + +static void unset_all(struct lia_list *list, struct lia_list_entry *previous) { struct lia_list_sink *sink; al_array_foreach(list->sinks, i, sink) { sink->set = -1; sink->queued = -1; } + if (previous) { + list->cmd->op = SKIPTO; + struct lia_list_entry *entry; + al_array_foreach(list->entries, i, entry) { + if (entry->opaque == previous->opaque) { + list->cmd->i = list->current; + list->current = i; + list->cmd->sequence = i; + break; + } + } + pump_queue(list); + } } static void handle_unset(struct lia_list *list) { - unset_all(list); + unset_all(list, NULL); list->current = list->entries.size - 1; list->previous = -1; list->queued = -1; @@ -405,30 +421,33 @@ static void handle_end(struct lia_list *list, s32 sequence) static void handle_reverse(struct lia_list *list) { + struct lia_list_entry *previous = al_array_at(list->entries, list->current); u32 size = list->entries.size; for (u32 i = 0; i < size; i++) { u32 tail = size - (i + 1); if (tail <= i) break; AL_SWAP(al_array_at(list->entries, i), al_array_at(list->entries, tail), struct lia_list_entry *); } - unset_all(list); + unset_all(list, previous); } static void handle_sort(struct lia_list *list) { + struct lia_list_entry *previous = al_array_at(list->entries, list->current); al_array_sort(list->entries, struct lia_list_entry *, camu_db_compare); - unset_all(list); + unset_all(list, previous); } static void handle_shuffle(struct lia_list *list) { + 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); AL_SWAP(al_array_at(list->entries, i), al_array_at(list->entries, j), struct lia_list_entry *); } - unset_all(list); + unset_all(list, previous); } static void handle_clear(struct lia_list *list) @@ -439,13 +458,13 @@ static void handle_clear(struct lia_list *list) al_free(entry); } list->entries.size = 0; - unset_all(list); + unset_all(list, NULL); list->current = -1; list->previous = -1; list->idle = true; } -static void pump_queue(struct lia_list *list) +void pump_queue(struct lia_list *list) { if (!list->cmd) { if (list->queue.size == 0) return; @@ -490,16 +509,16 @@ static void pump_queue(struct lia_list *list) break; case REVERSE: handle_reverse(list); - break; + return; case SORT: handle_sort(list); - break; + return; case SHUFFLE: handle_shuffle(list); - break; + return; case CLEAR: handle_clear(list); - break; + return; } al_free(cmd); list->cmd = NULL; diff --git a/src/liana/list.h b/src/liana/list.h index 4f56641..7a24104 100644 --- a/src/liana/list.h +++ b/src/liana/list.h @@ -7,7 +7,7 @@ #define LIANA_SEQUENCE_ANY -1 #define LIANA_TIMESTAMP_INVALID UINT64_MAX -#define LIANA_BASE_DELAY 475000Lu // 475ms +#define LIANA_BASE_DELAY 575000Lu // 575ms #define LIANA_BASE_PING 150000Lu // 150ms #define LIANA_PAUSE_DELAY LIANA_BASE_PING #define LIANA_DELAY_IGNORE 0Lu diff --git a/src/liana/vcr.c b/src/liana/vcr.c index 0f3eac4..213d5cb 100644 --- a/src/liana/vcr.c +++ b/src/liana/vcr.c @@ -109,9 +109,9 @@ static void cork_if_buffered(struct lia_vcr *vcr) { u8 buffered = 1; struct lia_vcr_track *track; - //al_array_foreach(vcr->tracks, i, track) { - // buffered &= al_atomic_load(u8)(&track->buffered, AL_ATOMIC_RELAXED); - //} + al_array_foreach(vcr->tracks, i, track) { + buffered &= al_atomic_load(u8)(&track->buffered, AL_ATOMIC_RELAXED); + } if (buffered) { aki_packet_stream_cork(vcr->data, true); al_array_foreach(vcr->tracks, i, track) { @@ -140,6 +140,7 @@ bool lia_vcr_push_packet(struct lia_vcr *vcr, struct aki_packet *packet) if (!aki_packet_cache_send_packet(&track->cache, packet)) { aki_packet_free(packet); } else if ((count = al_atomic_add(s32)(&vcr->count, 1, AL_ATOMIC_RELAXED)) > vcr->mark.buffered) { + vcr->mark.buffered = count; cork_if_buffered(vcr); } break; |