summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/common.h3
-rw-r--r--src/server/resource.h4
-rw-r--r--src/server/server.c53
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);