Changes
5 changed files (+127/-3)
-
-
@@ -738,12 +738,72 @@self.internal.zone_subscription_request_id = req_id; } pub fn control(ptr: ?*Connection, zone_ptr: ?*transport.Zone, action: transport.Action) callconv(.C) void { var self = ptr orelse @panic( std.fmt.comptimePrint("Received null pointer on {s}_{s}", .{ cname, @src().fn_name }), ); var zone = zone_ptr orelse @panic( std.fmt.comptimePrint("Received null pointer on {s}_{s}", .{ cname, @src().fn_name }), ); _ = zone.retain(); defer zone.release(); var ws = self.internal.ws orelse { std.log.err("{s}_{s} called, but WebSocket connection is not ready", .{ cname, @src().fn_name }); return; }; const req_id = self.internal.request_id; self.internal.request_id += 1; std.log.debug("Sending control request...", .{}); const kind = control: { if (action.next) { break :control TransportService.Control.next; } if (action.prev) { break :control TransportService.Control.previous; } if (action.pause) { break :control TransportService.Control.pause; } if (action.play) { break :control TransportService.Control.play; } const action_num: u16 = @bitCast(action); std.log.err( "action parameter has no effective bit turned on at {s}_{s}: {b}", .{ cname, @src().fn_name, action_num }, ); return; }; const req = kind.request(allocator, req_id, zone.internal.id) catch |err| { std.log.err("Unable to compose zone subscription request: {s}", .{@errorName(err)}); return; }; defer allocator.free(req); ws.writeBin(req) catch |err| { std.log.err("Unable to write control request: {s}", .{@errorName(err)}); return; }; } pub fn export_capi() void { @export(&make, .{ .name = std.fmt.comptimePrint("{s}_make", .{cname}) }); @export(&retain, .{ .name = std.fmt.comptimePrint("{s}_retain", .{cname}) }); @export(&release, .{ .name = std.fmt.comptimePrint("{s}_release", .{cname}) }); @export(&getEvent, .{ .name = std.fmt.comptimePrint("{s}_get_event", .{cname}) }); @export(&subscribeZones, .{ .name = std.fmt.comptimePrint("{s}_subscribe_zones", .{cname}) }); @export(&control, .{ .name = std.fmt.comptimePrint("{s}_control", .{cname}) }); } };
-
-
-
@@ -71,7 +71,7 @@ PLAC_TRANSPORT_PLAYBACK_PAUSED = 2,PLAC_TRANSPORT_PLAYBACK_PLAYING = 3, } plac_transport_playback_state; // transport.Zone.allowed_action // transport.Action #define PLAC_TRANSPORT_ACTION_NEXT (1 << 0) #define PLAC_TRANSPORT_ACTION_PREV (1 << 1) #define PLAC_TRANSPORT_ACTION_PAUSE (1 << 2)
-
@@ -153,5 +153,6 @@ plac_connection *plac_connection_retain(plac_connection*);void plac_connection_release(plac_connection*); plac_connection_event *plac_connection_get_event(plac_connection*); void plac_connection_subscribe_zones(plac_connection*); void plac_connection_control(plac_connection*, plac_transport_zone*, uint16_t action); #endif
-
-
-
@@ -265,5 +265,8 @@ public ConnectionEvent get_event();[CCode (cname = "plac_connection_subscribe_zones")] public void subscribe_zones(); [CCode (cname = "plac_connection_control")] public void control(Transport.Zone zone, uint16 action); } }
-
-
-
@@ -124,4 +124,64 @@ .allocate = .alloc_always,}); } }; pub const Control = enum { play, pause, playpause, stop, previous, next, const method = "/control"; pub const Request = struct { zone_or_output_id: []const u8, control: []const u8, }; /// Caller owns the returned memory pub fn request( self: Control, allocator: std.mem.Allocator, request_id: i64, zone_id: []const u8, ) ![]u8 { const meta = moo.Metadata{ .service = id ++ method, .verb = "REQUEST", }; const body = moo.JsonBody(Request).init(&Request{ .zone_or_output_id = zone_id, .control = @tagName(self), }); const header = body.getHeader(request_id); const buf = try allocator.alloc( u8, meta.getEncodeSize() + header.getEncodeSize() + body.getEncodeSize(), ); errdefer allocator.free(buf); var fbs = std.io.fixedBufferStream(buf); try moo.encode(fbs.writer(), meta, header, body); return buf; } pub const ResponseError = error{ NonSuccessResponse, }; pub fn response( meta: *const moo.Metadata, ) ResponseError!void { if (!std.mem.eql(u8, meta.service, "Success")) { std.log.err("Expected \"Success\" for {s} endpoint, got \"{s}\"", .{ method, meta.service }); return ResponseError.NonSuccessResponse; } } }; };
-
-
-
@@ -26,7 +26,7 @@ paused = 2,playing = 3, }; const AllowedAction = packed struct(u16) { pub const Action = packed struct(u16) { next: bool, prev: bool, pause: bool,
-
@@ -43,7 +43,7 @@ internal: *Internal,id: [*:0]const u8, name: [*:0]const u8, playback: PlaybackState, allowed_action: AllowedAction, allowed_action: Action, pub const Internal = struct { id: [:0]const u8,
-