Changes
3 changed files (+188/-0)
-
-
@@ -92,6 +92,35 @@ } plac_transport_seek_change;plac_transport_seek_change *plac_transport_seek_change_retain(plac_transport_seek_change*); void plac_transport_seek_change_release(plac_transport_seek_change*); // transport.OutputVolumeUnit typedef enum { PLAC_TRANSPORT_OUTPUT_VOLUME_UNKNOWN = 0, PLAC_TRANSPORT_OUTPUT_VOLUME_NUMBER = 1, PLAC_TRANSPORT_OUTPUT_VOLUME_DECIBEL = 2, } plac_transport_output_volume_unit; // transport.OutputVolume typedef struct { plac_transport_output_volume_unit unit; int64_t min; int64_t max; int64_t value; double step; bool muted; } plac_transport_output_volume; // transport.Output typedef struct { void *__pri; const char *id; const char *display_name; bool is_incremental_volume; // This field is useless if "is_incremental_volume" is true plac_transport_output_volume volume; } plac_transport_output; plac_transport_output *plac_transport_output_retain(plac_transport_output*); void plac_transport_output_release(plac_transport_output*); // transport.PlaybackState typedef enum { PLAC_TRANSPORT_PLAYBACK_LOADING = 0,
-
@@ -112,6 +141,8 @@ typedef struct {void *__pri; char *id; char *name; plac_transport_output **outputs; size_t outputs_len; plac_transport_now_playing *now_playing; plac_transport_playback_state playback; uint16_t allowed_action;
-
-
-
@@ -113,6 +113,40 @@ public bool has_seek_position;} [CCode ( cname = "plac_transport_output_volume_unit", cprefix = "PLAC_TRANSPORT_OUTPUT_VOLUME_", has_type_id = false )] public enum OutputVolumeUnit { UNKNOWN = 0, NUMBER = 1, DECIBEL = 2, } [CCode (cname = "plac_transport_output_volume", has_type_id = false)] public struct OutputVolume { public OutputVolumeUnit unit; public int64 min; public int64 max; public int64 value; public double step; public bool muted; } [CCode ( cname = "plac_transport_output", ref_function = "plac_transport_output_retain", unref_function = "plac_transport_output_release" )] [Compact] public class Output { public string id; public string display_name; public bool is_incremental_volume; public OutputVolume volume; } [CCode ( cname = "plac_transport_playback_state", cprefix = "PLAC_TRANSPORT_PLAYBACK_", has_type_id = false
-
@@ -133,6 +167,13 @@ [Compact]public class Zone { public string id; public string name; [CCode ( cname = "outputs", array_length_cname = "outputs_len", array_length_type = "size_t" )] public Output[] outputs; public PlaybackState playback; public uint16 allowed_action; public NowPlaying? now_playing;
-
-
-
@@ -204,6 +204,98 @@ @export(&release, .{ .name = std.fmt.comptimePrint("{s}_release", .{cname}) });} }; pub const OutputVolumeUnit = enum(c_int) { unknown = 0, number = 1, decibel = 2, }; pub const OutputVolume = extern struct { unit: OutputVolumeUnit = .unknown, min: i64 = 0, max: i64 = 0, value: i64 = 0, step: f64 = 0.0, muted: bool = false, }; pub const Output = extern struct { const cname = "plac_transport_output"; const allocator = std.heap.c_allocator; internal: *Internal, id: [*:0]const u8, display_name: [*:0]const u8, is_incremental_volume: bool, volume: OutputVolume, const Internal = struct { arc: Arc = .{}, }; pub fn make(src: *const TransportService.Output) std.mem.Allocator.Error!*@This() { const id = try allocator.dupeZ(u8, src.output_id); errdefer allocator.free(id); const display_name = try allocator.dupeZ(u8, src.display_name); errdefer allocator.free(display_name); const internal = try allocator.create(Internal); errdefer allocator.destroy(internal); internal.* = .{}; const self = try allocator.create(@This()); errdefer allocator.destroy(self); const volume: OutputVolume = if (src.volume) |v| .{ .unit = if (std.mem.eql(u8, "number", v.type)) .number else if (std.mem.eql(u8, "db", v.type)) .decibel else .unknown, .min = v.min orelse 0, .max = v.max orelse 0, .value = v.value orelse 0, .step = v.step orelse 0, .muted = v.is_muted orelse false, } else .{}; self.* = .{ .internal = internal, .id = id.ptr, .display_name = display_name.ptr, .is_incremental_volume = if (src.volume) |v| std.mem.eql(u8, "incremental", v.type) else false, .volume = volume, }; return self; } pub fn retain(ptr: ?*@This()) callconv(.C) *@This() { var self = ptr orelse @panic( std.fmt.comptimePrint("Received null pointer on {s}_{s}", .{ cname, @src().fn_name }), ); self.internal.arc.ref(); return self; } pub fn release(ptr: ?*@This()) callconv(.C) void { var self = ptr orelse @panic( std.fmt.comptimePrint("Received null pointer on {s}_{s}", .{ cname, @src().fn_name }), ); if (self.internal.arc.unref()) { freelog(self); allocator.free(std.mem.span(self.id)); allocator.free(std.mem.span(self.display_name)); allocator.destroy(self.internal); allocator.destroy(self); } } pub fn export_capi() void { @export(&retain, .{ .name = std.fmt.comptimePrint("{s}_retain", .{cname}) }); @export(&release, .{ .name = std.fmt.comptimePrint("{s}_release", .{cname}) }); } }; pub const PlaybackState = enum(c_int) { loading = 0, stopped = 1,
-
@@ -227,6 +319,8 @@internal: *Internal, id: [*:0]const u8, name: [*:0]const u8, outputs: [*]const *Output, outputs_len: usize, now_playing: ?*NowPlaying, playback: PlaybackState, allowed_action: Action,
-
@@ -249,6 +343,20 @@ break :now_playing n.retain();} else null; errdefer if (now_playing) |n| n.release(); const outputs = try allocator.alloc(*Output, src.outputs.len); errdefer allocator.free(outputs); var i: usize = 0; errdefer for (0..i) |x| { outputs[x].release(); }; for (src.outputs) |*output| { outputs[i] = try Output.make(output); _ = outputs[i].retain(); i += 1; } const internal = try allocator.create(Internal); errdefer allocator.destroy(internal);
-
@@ -261,6 +369,8 @@ self.* = .{.internal = internal, .id = id.ptr, .name = name.ptr, .outputs = outputs.ptr, .outputs_len = outputs.len, .playback = switch (src.state) { .loading => .loading, .stopped => .stopped,
-
@@ -294,6 +404,11 @@ std.fmt.comptimePrint("Received null pointer on {s}_{s}", .{ cname, @src().fn_name }),); if (self.internal.arc.unref()) { freelog(self); for (self.outputs[0..self.outputs_len]) |output| { output.release(); } allocator.free(self.outputs[0..self.outputs_len]); if (self.now_playing) |now_playing| { now_playing.release();
-
@@ -523,6 +638,7 @@pub fn export_capi() void { SeekChange.export_capi(); NowPlaying.export_capi(); Output.export_capi(); Zone.export_capi(); ZoneListEvent.export_capi(); }
-