summaryrefslogtreecommitdiff
path: root/src/liana
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2024-11-12 12:12:31 -0500
committerAndrew Opalach <andrew@akon.city> 2024-11-12 12:12:31 -0500
commit29fa4f8d667d543595e652e7402d395d507ba464 (patch)
treeeaa2adf9f687c499b31eeddef42493c4bfda9b1c /src/liana
parentb4bcfa1da5c1be9f7999d4d4df4e8d1b73c3061a (diff)
downloadcamu-29fa4f8d667d543595e652e7402d395d507ba464.tar.gz
camu-29fa4f8d667d543595e652e7402d395d507ba464.tar.bz2
camu-29fa4f8d667d543595e652e7402d395d507ba464.zip
Add user volume, simple client add cli
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/liana')
-rw-r--r--src/liana/list.c41
-rw-r--r--src/liana/list.h2
-rw-r--r--src/liana/vcr.c7
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;