diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/common.h | 32 | ||||
| -rw-r--r-- | src/server/server.c | 140 | ||||
| -rw-r--r-- | src/server/server.h | 2 |
3 files changed, 107 insertions, 67 deletions
diff --git a/src/server/common.h b/src/server/common.h index 4d3a0ae..26d0edf 100644 --- a/src/server/common.h +++ b/src/server/common.h @@ -6,12 +6,12 @@ //#define CAMU_DB_PATH al_str_c("/home/andrew/c/camu/data/camu_db_test") #define CAMU_PORT 14356 -#define CAMU_RESOURCE_PORT 14357 +#define CAMU_MULTIPLEX_RPC 0x53 +#define CAMU_MULTIPLEX_SHRUB 0x85 -#define CAMU_SERVER_IP al_str_c("127.0.0.1") +//#define CAMU_SERVER_IP al_str_c("127.0.0.1") //#define CAMU_SERVER_IP al_str_c("192.168.1.192") -//#define CAMU_SERVER_IP al_str_c("108.52.160.112") - +#define CAMU_SERVER_IP al_str_c("108.52.160.112") enum { CAMU_NODE = 0, @@ -20,23 +20,15 @@ enum { }; enum { - CAMU_SRV_IDENTIFY = 0, - CAMU_SRV_LIST_ACTION, - CAMU_SRV_CREATE_SEARCH, - CAMU_SRV_GET_PAGE, - CAMU_SRV_CREATE_BROWSE, - CAMU_SRV_GET_PATH -}; - -enum { - CAMU_CONN_STATE + CAMU_SERVER_IDENTIFY = 0, + CAMU_SERVER_LIST_ACTION }; enum { - CAMU_LIST_ADD = 0, - CAMU_LIST_SKIP, - CAMU_LIST_SKIPTO, - CAMU_LIST_TOGGLE_PAUSE, - CAMU_LIST_SEEK, - CAMU_LIST_FINISHED + CAMU_ADD = 0, + CAMU_SKIP, + CAMU_SKIPTO, + CAMU_TOGGLE_PAUSE, + CAMU_SEEK, + CAMU_FINISHED }; diff --git a/src/server/server.c b/src/server/server.c index 0fd1d71..4e11d3e 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -1,7 +1,6 @@ #include <al/log.h> #include "../libsink/common.h" -#include "../shrub/common.h" #include "server.h" #include "common.h" @@ -21,16 +20,23 @@ static struct camu_user *get_user_by_username(struct camu_server *tree, str *use return NULL; } -static void list_callback(void *userdata, u8 op, void *opaque, s32 sequence) +static void list_callback(void *userdata, u8 op, void *opaque, void *prev_opaque, s32 sequence) { struct camu_srv_sink *sink = (struct camu_srv_sink *)userdata; struct camu_srv_resource *resource = (struct camu_srv_resource *)opaque; + struct camu_srv_resource *prev = (struct camu_srv_resource *)prev_opaque; struct aki_packet *packet = aki_rpc_get_packet(sink->conn->rpc, op); aki_packet_write_str(packet, CAMU_SERVER_IP); - aki_packet_write_s32(packet, CAMU_RESOURCE_PORT); + aki_packet_write_s32(packet, CAMU_PORT); aki_packet_write_u16(packet, resource->node->id); aki_packet_write_s32(packet, sequence); aki_packet_write_u64(packet, resource->node->start); + aki_packet_write_u8(packet, resource->node->paused != SHRUB_NOT_PAUSED); + if (prev) { + aki_packet_write_u64(packet, prev->node->paused_at); + } else { + aki_packet_write_u64(packet, 0); + } aki_rpc_connection_command(sink->conn, packet, NULL, NULL); if (op == CAMU_SINK_SET) { al_printf("Now Playing: %.*s\n", AL_STR_PRINTF(&resource->unique_id)); @@ -81,7 +87,52 @@ static bool identify_command_callback(void *userdata, struct aki_rpc_connection return true; } -static bool list_command_callback(void *userdata, struct aki_rpc_connection *conn, +static void list_entry_callback(void *entry, u8 op, void *opaque) +{ + struct camu_srv_resource *resource = (struct camu_srv_resource *)entry; + switch (op) { + case CAMU_LIST_ENTRY_ID: + *(str **)opaque = &resource->unique_id; + break; + case CAMU_LIST_IMPULSE: + shrb_node_set_start(resource->node, *(u64 *)opaque); + break; + case CAMU_LIST_USER_PAUSE: + shrb_node_user_pause(resource->node, *(u64 *)opaque); + break; + case CAMU_LIST_USER_RESUME: { + struct shrb_resume_req *req = (struct shrb_resume_req *)opaque; + shrb_node_user_resume(resource->node, req); + break; + } + case CAMU_LIST_PAUSE: + shrb_node_pause(resource->node); + break; + case CAMU_LIST_SEEK: + shrb_node_seek(resource->node, *(u64 *)opaque); + break; + } +} + +#ifdef CAMU_LOCAL_SOCKET +static void list_add_local(struct camu_server *srv, struct camu_list *list, str *line) +{ + struct cch_entry *entry = entry_for_external_path(&srv->portal, line); + if (entry) { + struct shrb_node *node = shrb_server_create_node(&srv->resource, 0, entry); + if (node) { + struct camu_srv_resource *resource = al_alloc_object(struct camu_srv_resource); + al_array_push(srv->resources, resource); + al_str_clone(&resource->unique_id, line); + resource->entry = entry; + resource->node = node; + camu_list_add(list, resource, list_entry_callback, resource->node->duration, false); + } + } +} +#endif + +static bool list_action_command_callback(void *userdata, struct aki_rpc_connection *conn, struct aki_packet *packet, struct aki_packet *rpacket) { struct camu_server *srv = (struct camu_server *)userdata; @@ -92,33 +143,38 @@ static bool list_command_callback(void *userdata, struct aki_rpc_connection *con struct camu_list *list = al_array_at(user->lists, 0); switch (aki_packet_read_u8(packet)) { - case CAMU_LIST_ADD: { + case CAMU_ADD: { + str line; + aki_packet_read_str(packet, &line); +#ifdef CAMU_LOCAL_SOCKET + list_add_local(srv, list, &line); +#endif break; } - case CAMU_LIST_SKIP: { + case CAMU_SKIP: { s32 sequence = aki_packet_read_s32(packet); s32 n = aki_packet_read_s32(packet); camu_list_skip(list, sequence, n); break; } - case CAMU_LIST_SKIPTO: { + case CAMU_SKIPTO: { s32 i = aki_packet_read_s32(packet); camu_list_skipto(list, i); break; } - case CAMU_LIST_TOGGLE_PAUSE: { + case CAMU_TOGGLE_PAUSE: { s32 sequence = aki_packet_read_s32(packet); u64 pos = aki_packet_read_u64(packet); camu_list_toggle_pause(list, sequence, pos); break; } - case CAMU_LIST_SEEK: { + case CAMU_SEEK: { s32 sequence = aki_packet_read_s32(packet); f64 percent = aki_packet_read_f64(packet); camu_list_seek(list, sequence, percent); break; } - case CAMU_LIST_FINISHED: { + case CAMU_FINISHED: { s32 sequence = aki_packet_read_s32(packet); camu_list_finished(list, sequence); break; @@ -130,10 +186,8 @@ static bool list_command_callback(void *userdata, struct aki_rpc_connection *con } static struct aki_rpc_command commands[] = { - { .op = CAMU_SRV_IDENTIFY, .callback = identify_command_callback, .userdata = NULL }, - { .op = CAMU_SRV_LIST_ACTION, .callback = list_command_callback, .userdata = NULL }, - //{ .op = CAMU_SRV_CREATE_SEARCH, .callback = create_search_command_callback, .userdata = NULL }, - //{ .op = CAMU_SRV_GET_PAGE, .callback = get_page_command_callback, .userdata = NULL }, + { .op = CAMU_SERVER_IDENTIFY, .callback = identify_command_callback, .userdata = NULL }, + { .op = CAMU_SERVER_LIST_ACTION, .callback = list_action_command_callback, .userdata = NULL } }; static void connection_callback(void *userdata, struct aki_rpc_connection *conn) @@ -195,23 +249,6 @@ static void connection_closed_callback(void *userdata, struct aki_rpc_connection } } -static void list_entry_callback(void *entry, u8 op, void *opaque) -{ - struct camu_srv_resource *resource = (struct camu_srv_resource *)entry; - switch (op) { - case CAMU_LIST_ENTRY_IMPULSE: { - struct camu_list_timing *timing = (struct camu_list_timing *)opaque; - shrb_node_set_start(resource->node, timing->start); - break; - } - case CAMU_LIST_ENTRY_TOGGLE_PAUSE: - shrb_node_toggle_pause(resource->node, *(u64 *)opaque); - break; - case CAMU_LIST_ENTRY_SEEK: - shrb_node_seek(resource->node, *(u64 *)opaque); - break; - } -} #ifdef CAMU_LOCAL_SOCKET static u8 server_line_callback(void *userdata, str *line) @@ -226,20 +263,12 @@ static u8 server_line_callback(void *userdata, str *line) } else if (al_str_eq(line, al_str_c(";SHUFFLE"))) { camu_list_shuffle(list); } else if (al_str_eq(line, al_str_c(";SORT"))) { + camu_list_sort(list); + } else if (al_str_eq(line, al_str_c(";REVERSE"))) { + camu_list_reverse(list); } else if (al_str_eq(line, al_str_c(";CLEAR"))) { } else { - struct cch_entry *entry = entry_for_external_path(&srv->portal, line); - if (entry) { - struct shrb_node *node = shrb_server_create_node(&srv->resource, 0, entry); - if (node) { - struct camu_srv_resource *resource = al_alloc_object(struct camu_srv_resource); - al_array_push(srv->resources, resource); - al_str_clone(&resource->unique_id, line); - resource->entry = entry; - resource->node = node; - camu_list_add(list, resource, list_entry_callback, resource->node->duration, false); - } - } + list_add_local(srv, list, line); } return AKI_LINE_PROCESSOR_CONTINUE; } @@ -254,6 +283,22 @@ static void sigint_handler(s32 signum) static struct camu_server srv = { 0 }; +static bool multiplex_callback(void *userdata, u8 id, struct aki_socket *s) +{ + struct camu_server *srv = (struct camu_server *)userdata; + switch (id) { + case CAMU_MULTIPLEX_RPC: + aki_rpc_add_socket(&srv->server, s); + return true; + case CAMU_MULTIPLEX_SHRUB: + shrb_server_add_socket(&srv->resource, s); + return true; + default: + break; + } + return false; +} + s32 main(void) { aki_common_init(); @@ -275,15 +320,16 @@ s32 main(void) aki_event_loop_init(&srv.loop); - aki_rpc_init(&srv.server, AKI_SOCKET_TCP, connection_callback, connection_closed_callback, &srv); + aki_rpc_init(&srv.server, &srv.loop, connection_callback, connection_closed_callback, &srv); for (u32 i = 0; i < AL_ARRAY_SIZE(commands); i++) { commands[i].userdata = &srv; aki_rpc_add_command(&srv.server, &commands[i]); } - aki_rpc_listen(&srv.server, &srv.loop, al_str_c("0.0.0.0"), CAMU_PORT); - shrb_server_init(&srv.resource); - shrb_server_listen(&srv.resource, &srv.loop, al_str_c("0.0.0.0"), CAMU_RESOURCE_PORT); + shrb_server_init(&srv.resource, &srv.loop); + + aki_multiplex_socket_init(&srv.multi, AKI_SOCKET_TCP, multiplex_callback, &srv); + aki_multiplex_socket_listen(&srv.multi, &srv.loop, al_str_c("0.0.0.0"), CAMU_PORT); #ifdef CAMU_LOCAL_SOCKET srv.socket.type = AKI_SOCKET_UNIX; diff --git a/src/server/server.h b/src/server/server.h index 83e8523..9565bf6 100644 --- a/src/server/server.h +++ b/src/server/server.h @@ -2,6 +2,7 @@ #define CAMU_LOCAL_SOCKET +#include <aki/multiplex.h> #include <aki/rpc2.h> #ifdef CAMU_LOCAL_SOCKET #include <aki/line_processor.h> @@ -38,6 +39,7 @@ struct camu_srv_resource { struct camu_server { struct aki_event_loop loop; + struct aki_multiplex_socket multi; struct aki_rpc server; array(struct camu_srv_node *) nodes; array(struct camu_srv_client *) clients; |