diff options
| author | 2025-04-16 15:12:41 -0400 | |
|---|---|---|
| committer | 2025-04-16 15:15:01 -0400 | |
| commit | ae8822ec0327c4d5674f1dc79de926b230f27f1f (patch) | |
| tree | e57027812d73baf7ab617222aa55ad2fe4c33a55 /src/server | |
| parent | 832b3ab11fd6457c59aed9d5bf12ba40c117f15d (diff) | |
| download | camu-ae8822ec0327c4d5674f1dc79de926b230f27f1f.tar.gz camu-ae8822ec0327c4d5674f1dc79de926b230f27f1f.tar.bz2 camu-ae8822ec0327c4d5674f1dc79de926b230f27f1f.zip | |
Highly wip waveform view
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/common.h | 3 | ||||
| -rw-r--r-- | src/server/resource.h | 4 | ||||
| -rw-r--r-- | src/server/server.c | 53 |
3 files changed, 55 insertions, 5 deletions
diff --git a/src/server/common.h b/src/server/common.h index 4232de8..9cb9501 100644 --- a/src/server/common.h +++ b/src/server/common.h @@ -24,7 +24,8 @@ enum { CAMU_CLIENT_CREATE_LIST = 0, CAMU_CLIENT_TOGGLE_SINK, CAMU_CLIENT_CREATE_SEARCH, - CAMU_CLIENT_GET_PAGE + CAMU_CLIENT_GET_PAGE, + CAMU_CLIENT_REQUEST_VISUAL_DATA }; enum { diff --git a/src/server/resource.h b/src/server/resource.h index 2999523..3158479 100644 --- a/src/server/resource.h +++ b/src/server/resource.h @@ -1,7 +1,7 @@ #pragma once -#include "../cache/entry.h" #include "../liana/server.h" +#include "../liana/process.h" struct camu_resource { u8 type; @@ -11,6 +11,8 @@ struct camu_resource { u64 duration; u32 ref; array(struct lia_list_entry *) pending; + struct lia_visual_data visual_data; + struct camu_server *server; }; struct camu_resource_file { diff --git a/src/server/server.c b/src/server/server.c index 47f9995..dfeee78 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -12,6 +12,7 @@ #ifdef CAMU_HAVE_PORTAL #include "../portal/src/packet_ext.h" #endif +#include "../codec/packet_ext.h" #include "server.h" #include "common.h" @@ -55,9 +56,25 @@ static struct camu_server_client *get_client_by_connection(struct camu_server *s return NULL; } +static struct camu_resource *get_resource_by_node_id(struct camu_server *server, u32 node_id) +{ + struct camu_resource *resource; + al_array_foreach(server->data.resources, i, resource) { + if (resource->node && resource->node->id == node_id) return resource; + } + return NULL; +} + static void write_list_entry(struct lia_list_entry *entry, struct nn_packet *packet) { + struct camu_resource *resource = (struct camu_resource *)entry->opaque; nn_packet_write_u32(packet, entry->id); + // For now this will get implicitly synced, probably on CURRENT_CHANGED. + if (resource->node) { + nn_packet_write_u32(packet, resource->node->id); + } else { + nn_packet_write_u32(packet, 0); + } nn_packet_write_u64(packet, entry->duration); nn_packet_write_u64(packet, entry->start); nn_packet_write_u64(packet, entry->paused_at); @@ -219,14 +236,34 @@ static void process_pending(struct camu_resource *resource) al_array_free(pending); } -static void node_callback(void *userdata, u8 op, u64 duration) +static void send_clients_visual_data(struct camu_server *server, u32 node_id, struct lia_visual_data *visual_data) +{ + struct camu_server_client *client; + al_array_foreach(server->clients, i, client) { + struct nn_packet *packet = nn_rpc_get_packet(client->conn->rpc, CAMU_CLIENT_VISUAL_DATA); + nn_packet_write_u32(packet, node_id); + nn_packet_write_audio_format(packet, &visual_data->fmt); + nn_packet_write_u32(packet, visual_data->size); + NNWT_PACKET_WRITE_DATA(packet, visual_data->samples, visual_data->size); + nn_packet_write_u32(packet, visual_data->count); + nn_rpc_connection_command(client->conn, packet, NULL, NULL); + } +} + +static void node_callback(void *userdata, u8 op, void *opaque) { struct camu_resource *resource = (struct camu_resource *)userdata; switch (op) { - case LIANA_NODE_DURATION: + case LIANA_NODE_DURATION: { + u64 duration = *(u64 *)opaque; resource->load = LIANA_ENTRY_LOADED; resource->duration = duration; break; + } + case LIANA_NODE_VISUAL_DATA: { + resource->visual_data = *(struct lia_visual_data *)opaque; + break; + } case LIANA_NODE_ERRORED: resource->load = LIANA_ENTRY_ERRORED; break; @@ -554,6 +591,14 @@ static bool client_command_callback(void *userdata, struct nn_rpc_connection *co break; } #endif + case CAMU_CLIENT_REQUEST_VISUAL_DATA: { + u32 node_id = nn_packet_read_u32(packet); + struct camu_resource *resource = get_resource_by_node_id(server, node_id); + if (resource) { + send_clients_visual_data(resource->server, resource->node->id, &resource->visual_data); + } + break; + } } out: @@ -667,7 +712,9 @@ static void handle_add_command(struct camu_server *server, struct lia_list *list #endif } al_assert(resource); + resource->server = server; al_array_push(server->data.resources, resource); + resource->entry = NULL; resource->node = NULL; resource->duration = LIANA_TIMESTAMP_INVALID; al_array_init(resource->pending); @@ -847,8 +894,8 @@ void camu_server_init(struct camu_server *server, struct nn_event_loop *loop) nn_rpc_add_command(&server->server, &commands[i]); } - al_array_init(server->data.resources); lia_server_init(&server->data.server, server->loop); + al_array_init(server->data.resources); #ifdef CAMU_HAVE_PORTAL camu_post_cache_init(&server->cache); |