From f1845c0f411b5de1bd76bdf3ba1c966b7640aad1 Mon Sep 17 00:00:00 2001 From: alichraghi Date: Fri, 8 Jul 2022 00:41:56 +0430 Subject: [PATCH] audio: add `InStream` and more functiosn coverage to soundio binding --- audio/soundio/Device.zig | 14 ++++++++++ audio/soundio/InStream.zig | 55 ++++++++++++++++++++++++++++++++++++++ audio/soundio/SoundIo.zig | 27 +++++++++++++++++++ audio/soundio/main.zig | 1 + 4 files changed, 97 insertions(+) create mode 100644 audio/soundio/InStream.zig diff --git a/audio/soundio/Device.zig b/audio/soundio/Device.zig index eab96502..c619d1d1 100644 --- a/audio/soundio/Device.zig +++ b/audio/soundio/Device.zig @@ -1,6 +1,8 @@ const std = @import("std"); const c = @import("c.zig"); +const InStream = @import("InStream.zig"); const OutStream = @import("OutStream.zig"); +const Format = @import("enums.zig").Format; const Device = @This(); @@ -10,10 +12,22 @@ pub fn unref(self: Device) void { c.soundio_device_unref(self.handle); } +pub fn id(self: Device) [:0]const u8 { + return std.mem.span(self.handle.*.id); +} + pub fn name(self: Device) [:0]const u8 { return std.mem.span(self.handle.*.name); } +pub fn createInStream(self: Device) error{OutOfMemory}!InStream { + return InStream{ .handle = c.soundio_instream_create(self.handle) orelse return error.OutOfMemory }; +} + pub fn createOutStream(self: Device) error{OutOfMemory}!OutStream { return OutStream{ .handle = c.soundio_outstream_create(self.handle) orelse return error.OutOfMemory }; } + +pub fn supportsFormat(self: Device, format: Format) bool { + return c.soundio_device_supports_format(self.handle, @enumToInt(format)); +} diff --git a/audio/soundio/InStream.zig b/audio/soundio/InStream.zig new file mode 100644 index 00000000..f322068f --- /dev/null +++ b/audio/soundio/InStream.zig @@ -0,0 +1,55 @@ +const c = @import("c.zig"); +const intToError = @import("error.zig").intToError; +const Error = @import("error.zig").Error; +const Format = @import("enums.zig").Format; +const ChannelLayout = @import("ChannelLayout.zig"); + +const InStream = @This(); + +pub const WriteCallback = fn (stream: ?[*]c.SoundIoInStream, frame_count_min: c_int, frame_count_max: c_int) callconv(.C) void; + +handle: *c.SoundIoInStream, + +pub fn deinit(self: InStream) void { + c.soundio_instream_destroy(self.handle); +} + +pub fn open(self: InStream) Error!void { + try intToError(c.soundio_instream_open(self.handle)); +} + +pub fn start(self: InStream) Error!void { + try intToError(c.soundio_instream_start(self.handle)); +} + +pub fn beginWrite(self: InStream, areas: [*]?[*]c.SoundIoChannelArea, frame_count: *i32) Error!void { + try intToError(c.soundio_instream_begin_write( + self.handle, + areas, + frame_count, + )); +} + +pub fn endWrite(self: InStream) Error!void { + try intToError(c.soundio_instream_end_write(self.handle)); +} + +pub fn setFormat(self: InStream, format: Format) void { + self.handle.*.format = @enumToInt(format); +} + +pub fn setWriteCallback(self: InStream, callback: WriteCallback) void { + self.handle.*.write_callback = callback; +} + +pub fn layout(self: InStream) ChannelLayout { + return ChannelLayout{ .handle = self.handle.*.layout }; +} + +pub fn sampleRate(self: InStream) i32 { + return self.handle.*.sample_rate; +} + +pub fn layoutError(self: InStream) Error!void { + try intToError(self.handle.*.layout_error); +} diff --git a/audio/soundio/SoundIo.zig b/audio/soundio/SoundIo.zig index 4ab144e0..18b60e29 100644 --- a/audio/soundio/SoundIo.zig +++ b/audio/soundio/SoundIo.zig @@ -1,6 +1,7 @@ const c = @import("c.zig"); const intToError = @import("error.zig").intToError; const Error = @import("error.zig").Error; +const Aim = @import("enums.zig").Aim; const Backend = @import("enums.zig").Backend; const Device = @import("Device.zig"); @@ -36,6 +37,10 @@ pub fn waitEvents(self: SoundIo) void { c.soundio_wait_events(self.handle); } +pub fn wakeup(self: SoundIo) void { + c.soundio_wakeup(self.handle); +} + pub fn defaultInputDeviceIndex(self: SoundIo) ?u16 { const index = c.soundio_default_input_device_index(self.handle); return if (index < 0) null else @intCast(u16, index); @@ -46,6 +51,16 @@ pub fn defaultOutputDeviceIndex(self: SoundIo) ?u16 { return if (index < 0) null else @intCast(u16, index); } +pub fn inputDeviceCount(self: SoundIo) ?u16 { + const count = c.soundio_input_device_count(self.handle); + return if (count < 0) null else @intCast(u16, count); +} + +pub fn outputDeviceCount(self: SoundIo) ?u16 { + const count = c.soundio_output_device_count(self.handle); + return if (count < 0) null else @intCast(u16, count); +} + pub fn getInputDevice(self: SoundIo, index: u16) ?Device { return Device{ .handle = c.soundio_get_input_device(self.handle, index) orelse return null, @@ -57,3 +72,15 @@ pub fn getOutputDevice(self: SoundIo, index: u16) ?Device { .handle = c.soundio_get_output_device(self.handle, index) orelse return null, }; } + +pub fn getInputDeviceFromID(self: SoundIo, id: [:0]const u8, is_raw: bool) ?Device { + return Device{ + .handle = c.soundio_get_input_device_from_id(self.handle, id.ptr, is_raw) orelse return null, + }; +} + +pub fn getOutputDeviceFromID(self: SoundIo, id: [:0]const u8, is_raw: bool) ?Device { + return Device{ + .handle = c.soundio_get_output_device_from_id(self.handle, id.ptr, is_raw) orelse return null, + }; +} diff --git a/audio/soundio/main.zig b/audio/soundio/main.zig index 1c1d660a..8f391555 100644 --- a/audio/soundio/main.zig +++ b/audio/soundio/main.zig @@ -2,6 +2,7 @@ pub usingnamespace @import("enums.zig"); pub const c = @import("c.zig"); pub const SoundIo = @import("SoundIo.zig"); pub const Device = @import("Device.zig"); +pub const InStream = @import("InStream.zig"); pub const OutStream = @import("OutStream.zig"); pub const Error = @import("error.zig").Error;