Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const midi = @import("midi.zig");
- const builtin = @import("builtin");
- const std = @import("std");
- const windows = std.os.windows;
- const INT32 = windows.INT32;
- const INT64 = c_longlong;
- const UINT16 = windows.UINT16;
- const UINT32 = c_ulonglong;
- const UINT64 = windows.UINT64;
- const BYTE = windows.BYTE;
- const PVOID = windows.PVOID;
- const boolean = u8;
- const BOOLEAN = windows.BOOLEAN;
- const DOUBLE = windows.DOUBLE;
- const WINBOOL = c_int;
- const FLOAT = windows.FLOAT;
- const LPVOID = windows.LPVOID;
- const LONG = windows.LONG;
- const ULONG = windows.ULONG;
- const ULONG_PTR = windows.ULONG_PTR;
- const HRESULT = windows.HRESULT;
- const HSTRING = *opaque {
- pub fn format(value: HSTRING, comptime _: []const u8, _: std.fmt.FormatOptions, writer: anytype) !void {
- var buf: [1024]u8 = undefined;
- var fba = std.heap.FixedBufferAllocator.init(&buf);
- const allocator = fba.allocator();
- var len: u32 = undefined;
- const raw = Library.winrt_procs.?.WindowsGetStringRawBuffer(value, &len).?;
- const utf8string = try std.unicode.utf16LeToUtf8Alloc(allocator, raw[0..len]);
- defer allocator.free(utf8string);
- try writer.print("{s}", .{utf8string});
- }
- };
- const HSTRING_HEADER = extern struct {
- Reserved: extern union {
- Reserved1: ?*anyopaque,
- Reserved2: [24]u8,
- },
- };
- const E_NOINTERFACE = windows.E_NOINTERFACE;
- const S_OK = windows.S_OK;
- //An unparameterized WinRT interface or delegate is assigned a GUID to uniquely
- //identify the underlying interface as distinct from other interfaces on the
- //same object. A parameterized interface (for example, IVector<T>) or
- //delegate (for example, EventHandler<T>) is instead assigned a
- //parameterized interface ID (PIID), which is a GUID uniquely identifying this
- //parameterized type. This is not an IID.
- //This GUID is used in generating IIDs for parameterized type instances (for example, IVector<int>).
- //
- //An interface is a contract that consists of a group of related type members whose usage is defined,
- //but whose implementation is not.
- //An interface definition specifies the interface's members—methods, properties, and events.
- //There is no implementation associated with an interface.
- //Non-parameterized interfaces must have a unique interface ID (aka IID) specified via a GuidAttribute.
- //A parameterized interface must have a unique parameterized interface ID (also known as a PIID) specified via a GuidAttribute.
- //The PIID is used to generate an IID for a specific parameterized interface instance via the algorithm specified above.
- //An interface may have public or private visibility.
- //This reflects the fact that some interfaces represent shared contracts implemented by multiple WinRT classes,
- //while other interfaces represent members implemented by a single WinRT class.
- //A private-visibility interface must specify the WinRT class it is exclusive to via the ExclusiveToAttribute.
- //Private interfaces may only be implemented by the WinRT class specified in the ExclusiveToAttribute.
- // WinRT allows you to define a class.
- // A class must implement one or more interfaces.
- // A class cannot implement type members directly
- // (that is, it can't define its own methods, properties, nor events).
- // A class must provide an implementation of all the members of all the interfaces it implements.
- //
- //There are several different types of interfaces, which are described in detail below.
- // Member interfaces (including protected and overridable interfaces)
- // Static interfaces
- // Activation factory interfaces
- // Composition factory interfaces
- //
- //Runtime classes cannot be parameterized.
- // interface can be exclusive to a runtime class
- //
- //
- // calling statics:
- // IWidgetStatics* statics;
- // RoGetActivationFactory(L"Widget", IID_PPV_ARGS(&statics));
- // statics->StaticMethod();
- //#define IID_PPV_ARGS(ppType) __uuidof(**(ppType)), IID_PPV_ARGS_Helper(ppType)
- //
- //
- //
- // [uuid(C17F100E-3A46-4A78-8013-769DC9B97390)]
- // interface IDeviceInformationStatics : IInspectable
- // signature_octets => guid_to_octets(wrt_pinterface_namespace) string_to_utf8_octets(ptype_instance_signature)
- //
- // wrt_pinterface_namespace => "11f47ad5-7b73-42c0-abae-878b1e16adee"
- //
- // ptype_instance_signature => pinterface_instance_signature | pdelegate_instance_ signature
- //
- // pinterface_instance _signature => "pinterface(" piid_guid ";" args ")"
- //
- // pdelegate_instance _signature => "pinterface(" piid_guid ";" args ")"
- //
- // piid_guid => guid
- //
- // args => arg | arg ";" args
- //
- // arg => type_signature
- //
- // type_signature => base_type_identifer | com_interface_signature | interface _signature | delegate_signature | interface_group_signature | runtime_class_signature | struct_signature | enum_signature | pinterface_instance_signature | pdelegate_instance_signature
- // com_interface_signature => "cinterface(IInspectable)"
- //
- // base_type_identifier is defined below
- //
- // interface_signature => guid
- //
- // interface_group_signature => "ig(" interface_group_name ";" default_interface ")"
- //
- // runtime_class_signature => "rc(" runtime_class_name ";" default_interface ")"
- //
- // default_interface => type_signature
- //
- // struct_signature => "struct(" struct_name ";" args ")"
- //
- // enum_signature => "enum(" enum_name ";" enum_underlying_type ")"
- //
- // enum_underlying_type => type_signature
- //
- // delegate_signature => "delegate(" guid ")"
- //
- // guid => "{" dashed_hex "}"
- //
- // dashed_hex is the format that uuidgen writes in when passed no arguments.
- //
- // dashed_hex => hex{8} "-" hex{4} "-" hex{4} "-" hex{4} "-" hex{12}
- //
- // hex => [0-9a-f]
- //
- //
- // A parameterized interface (for example, IVector<T>)
- // or delegate (for example, EventHandler<T>) is instead assigned a parameterized interface ID (PIID),
- // which is a GUID uniquely identifying this parameterized type.
- // This is not an IID.
- // This GUID is used in generating IIDs for parameterized type instances (for example, IVector<int>).
- const TrustLevel = enum(c_int) {
- Base = 0,
- Partial = 1,
- Full = 2,
- };
- const IUnknown = extern union {
- const IID_Value = Guid_parse("00000000-0000-0000-c000-000000000046");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- pub const VTable = extern struct {
- QueryInterface: *const fn (*const This, *const Guid, *?*anyopaque) callconv(.C) HRESULT,
- AddRef: *const fn (*const This) callconv(.C) ULONG,
- Release: *const fn (*const This) callconv(.C) ULONG,
- };
- pub inline fn QueryInterface(self: *const IUnknown, riid: ?*const Guid, ppvObject: ?*?*anyopaque) HRESULT {
- return self.vtable.QueryInterface(self, riid, ppvObject);
- }
- pub inline fn AddRef(self: *const IUnknown) u32 {
- return self.vtable.AddRef(self);
- }
- pub inline fn Release(self: *const IUnknown) u32 {
- return self.vtable.Release(self);
- }
- fn TryQuery(self: *const IUnknown, comptime dest_type: type) ?*dest_type {
- var dest_object: ?*dest_type = undefined;
- const hr = self.vtable.QueryInterface(self, dest_type.IID, @ptrCast(&dest_object));
- if (hr != 0) {
- return null;
- }
- return dest_object orelse null_panic();
- }
- };
- const IInspectable = extern union {
- const IID_Value = Guid_parse("af86e2e0-b12d-4c6a-9c5a-d7aa65101e90");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IUnknown.VTable,
- GetIids: *const fn (*const IInspectable, *ULONG, *[*]Guid) callconv(.C) HRESULT,
- GetRuntimeClassName: *const fn (*const IInspectable, *HSTRING) callconv(.C) HRESULT,
- GetTrustLevel: *const fn (*const IInspectable, *TrustLevel) callconv(.C) HRESULT,
- };
- pub fn GetIids(self: *const IInspectable, count: *ULONG, guids: *[*]Guid) HRESULT {
- return self.vtable.GetIids(self, count, guids);
- }
- pub fn GetRuntimeClassName(self: *const IInspectable, classname: *HSTRING) HRESULT {
- return self.vtable.GetRuntimeClassName(self, classname);
- }
- pub fn GetTrustLevel(self: *const IInspectable, trust_level: *TrustLevel) HRESULT {
- return self.vtable.GetTrustLevel(self, trust_level);
- }
- };
- const AsyncStatus = enum(c_uint) {
- Started = 0,
- Completed = 1,
- Canceled = 2,
- Error = 3,
- };
- const IAsyncInfo = extern union {
- const IID_Value = Guid_parse("00000036-0000-0000-c000-000000000046");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IUnknown: IUnknown,
- IInspectable: IInspectable,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_Id: *const fn (*This, *UINT32) callconv(.C) HRESULT,
- get_Status: *const fn (*This, *AsyncStatus) callconv(.C) HRESULT,
- get_ErrorCode: *const fn (*This, *HRESULT) callconv(.C) HRESULT,
- Cancel: *const fn (*This) callconv(.C) HRESULT,
- Close: *const fn (*This) callconv(.C) HRESULT,
- };
- pub fn getStatus(async_info: *IAsyncInfo) !AsyncStatus {
- var async_status: AsyncStatus = undefined;
- const hr = async_info.vtable.get_Status(async_info, &async_status);
- std.debug.assert(hr == 0);
- return async_status;
- }
- };
- const EventRegistrationToken = extern struct {
- value: INT64,
- };
- fn AsyncCompletedHandler(comptime AsyncOpType: type) type {
- return extern union {
- const This = @This();
- vtable: *const VTable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IUnknown.VTable,
- Invoke: *const fn (*This, [*c]AsyncOpType, AsyncStatus) callconv(.C) HRESULT,
- };
- };
- }
- fn IAsyncOperation(comptime TResult: type) type {
- return extern union {
- const This = @This();
- pub const CompletedHandler = AsyncCompletedHandler(This);
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- put_Completed: *const fn (*This, *CompletedHandler) callconv(.C) HRESULT,
- get_Completed: *const fn (*This, *?*CompletedHandler) callconv(.C) HRESULT,
- GetResults: *const fn (*This, *?*TResult) callconv(.C) HRESULT,
- };
- pub fn getInfo(async_op: *This) !*IAsyncInfo {
- var async_info: ?*IAsyncInfo = undefined;
- const hr = async_op.vtable.base.base.QueryInterface(@ptrCast(async_op), IAsyncInfo.IID, @ptrCast(&async_info));
- std.debug.assert(hr == 0);
- return async_info.?;
- }
- pub fn getResults(async_op: *This) !*TResult {
- var result: ?*TResult = undefined;
- const hr = async_op.vtable.GetResults(async_op, &result);
- std.debug.assert(hr == 0);
- return result.?;
- }
- };
- }
- fn TypedEventHandler(comptime T: type, comptime U: type) type {
- return extern union {
- const This = @This();
- vtable: *const VTable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IUnknown.VTable,
- Invoke: *const fn (*This, *T, *U) callconv(.C) HRESULT,
- };
- };
- }
- const Windows = struct {
- const Foundation = struct {
- const Collections = struct {
- pub const IPropertySet = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- };
- };
- pub const IVectorChangedEventArgs = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_CollectionChange: *const fn (*This, [*c]CollectionChange) callconv(.C) HRESULT,
- get_Index: *const fn (*This, [*c]c_uint) callconv(.C) HRESULT,
- };
- };
- pub const CollectionChange = enum(c_uint) {
- Reset = 0,
- ItemInserted = 1,
- ItemRemoved = 2,
- ItemChanged = 3,
- };
- };
- pub const IAsyncAction = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- put_Completed: *const fn (*This, [*c]IAsyncActionCompletedHandler) callconv(.C) HRESULT,
- get_Completed: *const fn (*This, [*c][*c]IAsyncActionCompletedHandler) callconv(.C) HRESULT,
- GetResults: *const fn (*This) callconv(.C) HRESULT,
- };
- };
- pub const IAsyncActionCompletedHandler = extern union {
- const This = @This();
- vtable: *const VTable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IUnknown.VTable,
- Invoke: *const fn (*This, [*c]IAsyncAction, AsyncStatus) callconv(.C) HRESULT,
- };
- };
- pub const IDeferralCompletedHandler = extern union {
- const This = @This();
- vtable: *const VTable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IUnknown.VTable,
- Invoke: *const fn (*This) callconv(.C) HRESULT,
- };
- };
- pub const IStringable = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- ToString: *const fn (*This, [*c]HSTRING) callconv(.C) HRESULT,
- };
- };
- pub const IClosable = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- Close: *const fn (*This) callconv(.C) HRESULT,
- };
- };
- pub const IDeferral = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- Complete: *const fn (*This) callconv(.C) HRESULT,
- };
- };
- pub const IDeferralFactory = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- Create: *const fn (*This, [*c]IDeferralCompletedHandler, [*c][*c]IDeferral) callconv(.C) HRESULT,
- };
- };
- pub const IMemoryBufferReference = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_Capacity: *const fn (*This, [*c]UINT32) callconv(.C) HRESULT,
- add_Closed: *const fn (*This, [*c]TypedEventHandler(IMemoryBufferReference, IInspectable), [*c]EventRegistrationToken) callconv(.C) HRESULT,
- remove_Closed: *const fn (*This, EventRegistrationToken) callconv(.C) HRESULT,
- };
- };
- pub const IMemoryBuffer = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- CreateReference: *const fn (*This, [*c][*c]IMemoryBufferReference) callconv(.C) HRESULT,
- };
- };
- pub const IMemoryBufferFactory = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- Create: *const fn (*This, UINT32, [*c][*c]IMemoryBuffer) callconv(.C) HRESULT,
- };
- };
- pub const IUriEscapeStatics = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- UnescapeComponent: *const fn (*This, HSTRING, [*c]HSTRING) callconv(.C) HRESULT,
- EscapeComponent: *const fn (*This, HSTRING, [*c]HSTRING) callconv(.C) HRESULT,
- };
- };
- pub const IWwwFormUrlDecoderRuntimeClass = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- GetFirstValueByName: *const fn (*This, HSTRING, [*c]HSTRING) callconv(.C) HRESULT,
- };
- };
- pub const IUriRuntimeClass = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_AbsoluteUri: *const fn (*This, [*c]HSTRING) callconv(.C) HRESULT,
- get_DisplayUri: *const fn (*This, [*c]HSTRING) callconv(.C) HRESULT,
- get_Domain: *const fn (*This, [*c]HSTRING) callconv(.C) HRESULT,
- get_Extension: *const fn (*This, [*c]HSTRING) callconv(.C) HRESULT,
- get_Fragment: *const fn (*This, [*c]HSTRING) callconv(.C) HRESULT,
- get_Host: *const fn (*This, [*c]HSTRING) callconv(.C) HRESULT,
- get_Password: *const fn (*This, [*c]HSTRING) callconv(.C) HRESULT,
- get_Path: *const fn (*This, [*c]HSTRING) callconv(.C) HRESULT,
- get_Query: *const fn (*This, [*c]HSTRING) callconv(.C) HRESULT,
- get_QueryparseNoBracesd: *const fn (*This, [*c][*c]IWwwFormUrlDecoderRuntimeClass) callconv(.C) HRESULT,
- get_RawUri: *const fn (*This, [*c]HSTRING) callconv(.C) HRESULT,
- get_SchemeName: *const fn (*This, [*c]HSTRING) callconv(.C) HRESULT,
- get_UserName: *const fn (*This, [*c]HSTRING) callconv(.C) HRESULT,
- get_Port: *const fn (*This, [*c]INT32) callconv(.C) HRESULT,
- get_Suspicious: *const fn (*This, [*c]boolean) callconv(.C) HRESULT,
- Equals: *const fn (*This, [*c]IUriRuntimeClass, [*c]boolean) callconv(.C) HRESULT,
- CombineUri: *const fn (*This, HSTRING, [*c][*c]IUriRuntimeClass) callconv(.C) HRESULT,
- };
- };
- pub const IUriRuntimeClassFactory = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- CreateUri: *const fn (*This, HSTRING, [*c][*c]IUriRuntimeClass) callconv(.C) HRESULT,
- CreateWithRelativeUri: *const fn (*This, HSTRING, HSTRING, [*c][*c]IUriRuntimeClass) callconv(.C) HRESULT,
- };
- };
- pub const IUriRuntimeClassWithAbsoluteCanonicalUri = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_AbsoluteCanonicalUri: *const fn (*This, [*c]HSTRING) callconv(.C) HRESULT,
- get_DisplayIri: *const fn (*This, [*c]HSTRING) callconv(.C) HRESULT,
- };
- };
- pub const IWwwFormUrlDecoderEntry = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_Name: *const fn (*This, [*c]HSTRING) callconv(.C) HRESULT,
- get_Value: *const fn (*This, [*c]HSTRING) callconv(.C) HRESULT,
- };
- };
- pub const IWwwFormUrlDecoderRuntimeClassFactory = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- CreateWwwFormUrlDecoder: *const fn (*This, HSTRING, [*c][*c]IWwwFormUrlDecoderRuntimeClass) callconv(.C) HRESULT,
- };
- };
- pub const Deferral = opaque {};
- pub const MemoryBuffer = opaque {};
- pub const Uri = opaque {};
- pub const WwwFormUrlDecoder = opaque {};
- pub const WwwFormUrlDecoderEntry = opaque {};
- pub const Point = extern struct {
- X: FLOAT,
- Y: FLOAT,
- };
- pub const Size = extern struct {
- Width: FLOAT,
- Height: FLOAT,
- };
- pub const Rect = extern struct {
- X: FLOAT,
- Y: FLOAT,
- Width: FLOAT,
- Height: FLOAT,
- };
- pub const DateTime = extern struct {
- UniversalTime: INT64,
- };
- pub const TimeSpan = extern struct {
- Duration: INT64,
- };
- };
- pub fn IKeyValuePair(comptime K: type, comptime V: type) type {
- return extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_Key: *const fn (*This, [*c]K) callconv(.C) HRESULT,
- get_Value: *const fn (*This, [*c][*c]V) callconv(.C) HRESULT,
- };
- };
- }
- pub fn IIterator(comptime T: type) type {
- return extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_Current: *const fn (*This, *?*T) callconv(.C) HRESULT, //check that's it's not *?*T
- get_HasCurrent: *const fn (*This, [*c]WINBOOL) callconv(.C) HRESULT,
- MoveNext: *const fn (*This, [*c]WINBOOL) callconv(.C) HRESULT,
- GetMany: *const fn (*This, UINT32, [*]*T, *UINT32) callconv(.C) HRESULT,
- };
- };
- }
- pub fn IIterable(comptime T: type) type {
- return extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- First: *const fn (*This, *?*IIterator(T)) callconv(.C) HRESULT,
- };
- };
- }
- pub fn IVectorView(comptime T: type) type {
- return extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- GetAt: *const fn (*This, UINT32, *?*T) callconv(.C) HRESULT,
- get_Size: *const fn (*This, [*c]UINT32) callconv(.C) HRESULT,
- IndexOf: *const fn (*This, *T, [*c]UINT32, [*c]BOOLEAN) callconv(.C) HRESULT,
- GetMany: *const fn (*This, UINT32, UINT32, [*]*T, *UINT32) callconv(.C) HRESULT,
- };
- pub const Iterator = struct {
- vector: *This,
- count: u32,
- idx: u32 = 0,
- pub fn next(iter: *Iterator) !?*T {
- if (iter.idx < iter.count) {
- var element: ?*T = undefined;
- const hr = iter.vector.vtable.GetAt(iter.vector, iter.idx, &element);
- std.debug.assert(hr == 0);
- iter.idx += 1;
- return element.?;
- } else {
- return null;
- }
- }
- };
- pub fn iterator(vector: *This) !Iterator {
- var count: u32 = undefined;
- const hr = vector.vtable.get_Size(vector, &count);
- std.debug.assert(hr == 0);
- return .{ .vector = vector, .count = count };
- }
- };
- }
- pub fn IVector(comptime T: type) type {
- return extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- GetAt: *const fn (*This, UINT32, [*c]T) callconv(.C) HRESULT,
- get_Size: *const fn (*This, [*c]UINT32) callconv(.C) HRESULT,
- GetView: *const fn (*This, [*c][*c]IVectorView(T)) callconv(.C) HRESULT,
- IndexOf: *const fn (*This, T, [*c]UINT32, [*c]BOOLEAN) callconv(.C) HRESULT,
- SetAt: *const fn (*This, UINT32, T) callconv(.C) HRESULT,
- InsertAt: *const fn (*This, UINT32, T) callconv(.C) HRESULT,
- RemoveAt: *const fn (*This, UINT32) callconv(.C) HRESULT,
- Append: *const fn (*This, T) callconv(.C) HRESULT,
- RemoveAtEnd: *const fn (*This) callconv(.C) HRESULT,
- Clear: *const fn (*This) callconv(.C) HRESULT,
- GetMany: *const fn (*This, UINT32, UINT32, [*c]T, [*c]UINT32) callconv(.C) HRESULT,
- ReplaceAll: *const fn (*This, UINT32, [*c]T) callconv(.C) HRESULT,
- };
- };
- }
- pub fn IMapView(comptime K: type, comptime V: type) type {
- return extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- Lookup: *const fn (*This, K, [*c][*c]V) callconv(.C) HRESULT,
- get_Size: *const fn (*This, [*c]c_uint) callconv(.C) HRESULT,
- HasKey: *const fn (*This, K, [*c]boolean) callconv(.C) HRESULT,
- Split: *const fn (*This, [*c][*c]This, [*c][*c]This) callconv(.C) HRESULT,
- };
- };
- }
- pub fn IReference(comptime T: type) type {
- return extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_Value: *const fn (*This, [*c]T) callconv(.C) HRESULT,
- };
- };
- }
- pub const PropertyType = enum(c_uint) {
- Empty = 0,
- UInt8 = 1,
- Int16 = 2,
- UInt16 = 3,
- Int32 = 4,
- UInt32 = 5,
- Int64 = 6,
- UInt64 = 7,
- Single = 8,
- Double = 9,
- Char16 = 10,
- Boolean = 11,
- String = 12,
- Inspectable = 13,
- DateTime = 14,
- TimeSpan = 15,
- Guid = 16,
- Point = 17,
- Size = 18,
- Rect = 19,
- OtherType = 20,
- UInt8Array = 1025,
- Int16Array = 1026,
- UInt16Array = 1027,
- Int32Array = 1028,
- UInt32Array = 1029,
- Int64Array = 1030,
- UInt64Array = 1031,
- SingleArray = 1032,
- DoubleArray = 1033,
- Char16Array = 1034,
- BooleanArray = 1035,
- StringArray = 1036,
- InspectableArray = 1037,
- DateTimeArray = 1038,
- TimeSpanArray = 1039,
- GuidArray = 1040,
- PointArray = 1041,
- SizeArray = 1042,
- RectArray = 1043,
- OtherTypeArray = 1044,
- };
- const Devices = struct {
- const Enumeration = struct {
- pub const Panel = enum(c_uint) {
- Unknown = 0,
- Front = 1,
- Back = 2,
- Top = 3,
- Bottom = 4,
- Left = 5,
- Right = 6,
- };
- pub const IEnclosureLocation = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_InDock: *const fn (*This, [*c]boolean) callconv(.C) HRESULT,
- get_InLid: *const fn (*This, [*c]boolean) callconv(.C) HRESULT,
- get_Panel: *const fn (*This, [*c]Panel) callconv(.C) HRESULT,
- };
- };
- pub const IDeviceInformationUpdate = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_Id: *const fn (*This, [*c]HSTRING) callconv(.C) HRESULT,
- get_Properties: *const fn (*This, [*c][*c]IMapView(HSTRING, IInspectable)) callconv(.C) HRESULT,
- };
- };
- pub const IDeviceInformation = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_Id: *const fn (*This, *HSTRING) callconv(.C) HRESULT,
- get_Name: *const fn (*This, *HSTRING) callconv(.C) HRESULT,
- get_IsEnabled: *const fn (*This, *boolean) callconv(.C) HRESULT,
- get_IsDefault: *const fn (*This, *boolean) callconv(.C) HRESULT,
- get_EnclosureLocation: *const fn (*This, *?*IEnclosureLocation) callconv(.C) HRESULT,
- get_Properties: *const fn (*This, *?*IMapView(HSTRING, IInspectable)) callconv(.C) HRESULT,
- Update: *const fn (*This, *IDeviceInformationUpdate) callconv(.C) HRESULT,
- GetThumbnailAsync: *const fn (*This, *?*IAsyncOperation(Storage.Streams.IRandomAccessStreamWithContentType)) callconv(.C) HRESULT,
- GetGlyphThumbnailAsync: *const fn (*This, *?*IAsyncOperation(Storage.Streams.IRandomAccessStreamWithContentType)) callconv(.C) HRESULT,
- };
- };
- pub const DeviceWatcherStatus = enum(c_uint) {
- Created = 0,
- Started = 1,
- EnumerationCompleted = 2,
- Stopping = 3,
- Stopped = 4,
- Aborted = 5,
- };
- pub const IDeviceWatcher = extern union {
- pub const Added_EventHandler = struct {
- const IID_Value = Guid_parse("03C5A07B-990C-5D09-B0B8-5734EAA38222");
- pub const IID = &IID_Value;
- pub const Arg = IDeviceInformation;
- pub const Caller = IDeviceWatcher;
- };
- pub const Updated_EventHandler = struct {
- const IID_Value = Guid_parse("906F1254-79AD-54FC-93C4-CDB99B437899");
- pub const IID = &IID_Value;
- pub const Arg = IDeviceInformationUpdate;
- pub const Caller = IDeviceWatcher;
- };
- pub const Removed_EventHandler = Updated_EventHandler;
- pub const EnumerationCompleted_Handler = struct {
- const IID_Value = Guid_parse("9234630F-1FF4-54F6-9E3F-AC20369B7725");
- pub const IID = &IID_Value;
- pub const Arg = IInspectable;
- pub const Caller = IDeviceWatcher;
- };
- pub const Stopped_Handler = struct {
- const IID_Value = Guid_parse("9234630F-1FF4-54F6-9E3F-AC20369B7725");
- pub const IID = &IID_Value;
- pub const Arg = IInspectable;
- pub const Caller = IDeviceWatcher;
- };
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- add_Added: *const fn (*const This, *TypedEventHandler(This, IDeviceInformation), *EventRegistrationToken) callconv(.C) HRESULT,
- remove_Added: *const fn (*const This, EventRegistrationToken) callconv(.C) HRESULT,
- add_Updated: *const fn (*const This, *TypedEventHandler(This, IDeviceInformationUpdate), *EventRegistrationToken) callconv(.C) HRESULT,
- remove_Updated: *const fn (*const This, EventRegistrationToken) callconv(.C) HRESULT,
- add_Removed: *const fn (*const This, *TypedEventHandler(This, IDeviceInformationUpdate), *EventRegistrationToken) callconv(.C) HRESULT,
- remove_Removed: *const fn (*const This, EventRegistrationToken) callconv(.C) HRESULT,
- add_EnumerationCompleted: *const fn (*const This, *TypedEventHandler(This, IInspectable), *EventRegistrationToken) callconv(.C) HRESULT,
- remove_EnumerationCompleted: *const fn (*const This, EventRegistrationToken) callconv(.C) HRESULT,
- add_Stopped: *const fn (*const This, *TypedEventHandler(This, IInspectable), *EventRegistrationToken) callconv(.C) HRESULT,
- remove_Stopped: *const fn (*const This, EventRegistrationToken) callconv(.C) HRESULT,
- get_Status: *const fn (*const This, *DeviceWatcherStatus) callconv(.C) HRESULT,
- Start: *const fn (*const This) callconv(.C) HRESULT,
- Stop: *const fn (*const This) callconv(.C) HRESULT,
- };
- };
- pub const DeviceClass = enum(c_uint) {
- All = 0,
- AudioCapture = 1,
- AudioRender = 2,
- PortableStorageDevice = 3,
- VideoCapture = 4,
- ImageScanner = 5,
- Location = 6,
- };
- pub const IDeviceInformationStatics = extern union {
- pub const Name = "Windows.Devices.Enumeration.DeviceInformation";
- const IID_Value = Guid_parse("c17f100e-3a46-4a78-8013-769dc9b97390");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- CreateFromIdAsync: *const fn (*This, HSTRING, [*c][*c]IAsyncOperation(IDeviceInformation)) callconv(.C) HRESULT,
- CreateFromIdAsyncAdditionalProperties: *const fn (*This, HSTRING, [*c]IIterable(HSTRING), [*c][*c]IAsyncOperation(IDeviceInformation)) callconv(.C) HRESULT,
- FindAllAsync: *const fn (*This, [*c][*c]IAsyncOperation(DeviceInformationCollection)) callconv(.C) HRESULT,
- FindAllAsyncDeviceClass: *const fn (*This, DeviceClass, [*c][*c]IAsyncOperation(DeviceInformationCollection)) callconv(.C) HRESULT,
- FindAllAsyncAqsFilter: *const fn (*This, HSTRING, [*c][*c]IAsyncOperation(DeviceInformationCollection)) callconv(.C) HRESULT,
- FindAllAsyncAqsFilterAndAdditionalProperties: *const fn (*This, HSTRING, [*c]IIterable(HSTRING), [*c][*c]IAsyncOperation(DeviceInformationCollection)) callconv(.C) HRESULT,
- CreateWatcher: *const fn (*This, *?*IDeviceWatcher) callconv(.C) HRESULT,
- CreateWatcherDeviceClass: *const fn (*This, DeviceClass, [*c]IDeviceWatcher) callconv(.C) HRESULT,
- CreateWatcherAqsFilter: *const fn (*This, HSTRING, [*c][*c]IDeviceWatcher) callconv(.C) HRESULT,
- CreateWatcherAqsFilterAndAdditionalProperties: *const fn (*This, HSTRING, [*c]IIterable(HSTRING), [*c][*c]IDeviceWatcher) callconv(.C) HRESULT,
- };
- };
- pub const DeviceInformationKind = enum(c_uint) {
- Unknown = 0,
- DeviceInterface = 1,
- DeviceContainer = 2,
- Device = 3,
- DeviceInterfaceClass = 4,
- AssociationEndpoint = 5,
- AssociationEndpointContainer = 6,
- AssociationEndpointService = 7,
- DevicePanel = 8,
- };
- pub const IDeviceInformationStatics2 = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- GetAqsFilterFromDeviceClass: *const fn (*This, DeviceClass, [*c]HSTRING) callconv(.C) HRESULT,
- CreateFromIdAsyncWithKindAndAdditionalProperties: *const fn (*This, HSTRING, [*c]IIterable(HSTRING), DeviceInformationKind, [*c][*c]IAsyncOperation(IDeviceInformation)) callconv(.C) HRESULT,
- FindAllAsyncWithKindAqsFilterAndAdditionalProperties: *const fn (*This, HSTRING, [*c]IIterable(HSTRING), DeviceInformationKind, [*c][*c]IAsyncOperation(DeviceInformationCollection)) callconv(.C) HRESULT,
- CreateWatcherWithKindAqsFilterAndAdditionalProperties: *const fn (*This, HSTRING, [*c]IIterable(HSTRING), DeviceInformationKind, [*c][*c]IDeviceWatcher) callconv(.C) HRESULT,
- };
- };
- pub const DeviceAccessStatus = enum(c_uint) {
- Unspecified = 0,
- Allowed = 1,
- DeniedByUser = 2,
- DeniedBySystem = 3,
- };
- pub const IDeviceAccessChangedEventArgs = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_Status: *const fn (*This, *DeviceAccessStatus) callconv(.C) HRESULT,
- };
- };
- pub const IDeviceAccessChangedEventArgs2 = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_Id: *const fn (*This, *HSTRING) callconv(.C) HRESULT,
- };
- };
- pub const IDeviceAccessInformation = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- add_AccessChanged: *const fn (*This, *TypedEventHandler(This, IDeviceAccessChangedEventArgs), *EventRegistrationToken) callconv(.C) HRESULT,
- remove_AccessChanged: *const fn (*This, EventRegistrationToken) callconv(.C) HRESULT,
- get_CurrentStatus: *const fn (*This, *DeviceAccessStatus) callconv(.C) HRESULT,
- };
- };
- pub const IDeviceAccessInformationStatics = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- CreateFromId: *const fn (*This, HSTRING, [*c][*c]IDeviceAccessInformation) callconv(.C) HRESULT,
- CreateFromDeviceClassId: *const fn (*This, Guid, [*c][*c]IDeviceAccessInformation) callconv(.C) HRESULT,
- CreateFromDeviceClass: *const fn (*This, DeviceClass, [*c]IDeviceAccessInformation) callconv(.C) HRESULT,
- };
- };
- pub const DeviceInformation = opaque {};
- pub const DeviceInformationCollection = opaque {};
- pub const DeviceInformationUpdate = opaque {};
- pub const DeviceThumbnail = opaque {};
- pub const DeviceWatcher = opaque {};
- pub const EnclosureLocation = opaque {};
- pub const DeviceAccessChangedEventArgs = opaque {};
- pub const DeviceAccessInformation = opaque {};
- };
- const Midi = struct {
- pub const IMidiChannelPressureMessage = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_Channel: *const fn (*This, *BYTE) callconv(.C) HRESULT,
- get_Pressure: *const fn (*This, *BYTE) callconv(.C) HRESULT,
- };
- };
- pub const IMidiChannelPressureMessageFactory = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- CreateMidiChannelPressureMessage: *const fn (*This, BYTE, BYTE, *?*IMidiChannelPressureMessage) callconv(.C) HRESULT,
- };
- };
- pub const IMidiControlChangeMessage = extern union {
- const IID_Value = Guid_parse("B7E15F83-780D-405F-B781-3E1598C97F40");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_Channel: *const fn (*This, *BYTE) callconv(.C) HRESULT,
- get_Controller: *const fn (*This, *BYTE) callconv(.C) HRESULT,
- get_ControlValue: *const fn (*This, *BYTE) callconv(.C) HRESULT,
- };
- };
- pub const IMidiControlChangeMessageFactory = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- CreateMidiControlChangeMessage: *const fn (*This, BYTE, BYTE, BYTE, *?*IMidiControlChangeMessage) callconv(.C) HRESULT,
- };
- };
- pub const IMidiInPort = extern union {
- const EventHandler_IID_Value = Guid_parse("50017240-cc39-5775-8a6b-f6f22386bfca");
- pub const EventHandler_IID = &EventHandler_IID_Value;
- pub const EventHandler = TypedEventHandler(This, IMidiMessageReceivedEventArgs);
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- add_MessageReceived: *const fn (*This, *EventHandler, *EventRegistrationToken) callconv(.C) HRESULT,
- remove_MessageReceived: *const fn (*This, EventRegistrationToken) callconv(.C) HRESULT,
- get_DeviceId: *const fn (*This, *HSTRING) callconv(.C) HRESULT,
- };
- };
- pub const IMidiInPortStatics = extern union {
- pub const Name = "Windows.Devices.Midi.MidiInPort";
- const IID_Value = Guid_parse("44c439dc-67ff-4a6e-8bac-fdb6610cf296");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- FromIdAsync: *const fn (*This, HSTRING, *?*IAsyncOperation(IMidiInPort)) callconv(.C) HRESULT,
- GetDeviceSelector: *const fn (*This, *HSTRING) callconv(.C) HRESULT,
- };
- pub fn fromIdAsync(this: *This, hstring: HSTRING) !*IAsyncOperation(IMidiInPort) {
- var c: ?*IAsyncOperation(IMidiInPort) = undefined;
- const hr = this.vtable.FromIdAsync(this, hstring, &c);
- try Success(hr);
- return c orelse null_panic();
- }
- };
- pub const MidiMessageType = enum(c_uint) {
- None = 0,
- NoteOff = 128,
- NoteOn = 144,
- PolyphonicKeyPressure = 160,
- ControlChange = 176,
- ProgramChange = 192,
- ChannelPressure = 208,
- PitchBendChange = 224,
- SystemExclusive = 240,
- MidiTimeCode = 241,
- SongPositionPointer = 242,
- SongSelect = 243,
- TuneRequest = 246,
- EndSystemExclusive = 247,
- TimingClock = 248,
- Start = 250,
- Continue = 251,
- Stop = 252,
- ActiveSensing = 254,
- SystemReset = 255,
- };
- pub const IMidiMessage = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_Timestamp: *const fn (*This, *Foundation.TimeSpan) callconv(.C) HRESULT,
- get_RawData: *const fn (*This, *?*Storage.Streams.IBuffer) callconv(.C) HRESULT,
- get_Type: *const fn (*This, *MidiMessageType) callconv(.C) HRESULT,
- };
- };
- pub const IMidiMessageReceivedEventArgs = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_Message: *const fn (*This, *?*IMidiMessage) callconv(.C) HRESULT,
- };
- };
- pub const IMidiNoteOffMessage = extern union {
- const IID_Value = Guid_parse("16FD8AF4-198E-4D8F-A654-D305A293548F");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_Channel: *const fn (*This, *BYTE) callconv(.C) HRESULT,
- get_Note: *const fn (*This, *BYTE) callconv(.C) HRESULT,
- get_Velocity: *const fn (*This, *BYTE) callconv(.C) HRESULT,
- };
- };
- pub const IMidiNoteOffMessageFactory = extern union {
- const IID_Value = Guid_parse("A6B240E0-A749-425F-8AF4-A4D979CC15B5");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- CreateMidiNoteOffMessage: *const fn (*This, BYTE, BYTE, BYTE, [*c][*c]IMidiNoteOffMessage) callconv(.C) HRESULT,
- };
- };
- pub const IMidiNoteOnMessage = extern union {
- const IID_Value = Guid_parse("E0224AF5-6181-46DD-AFA2-410004C057AA");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_Channel: *const fn (*This, *BYTE) callconv(.C) HRESULT,
- get_Note: *const fn (*This, *BYTE) callconv(.C) HRESULT,
- get_Velocity: *const fn (*This, *BYTE) callconv(.C) HRESULT,
- };
- };
- pub const IMidiNoteOnMessageFactory = extern union {
- const IID_Value = Guid_parse("9B4280A0-59C1-420E-B517-15A10AA9606B");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- CreateMidiNoteOnMessage: *const fn (*This, BYTE, BYTE, BYTE, [*c][*c]IMidiNoteOnMessage) callconv(.C) HRESULT,
- };
- };
- pub const IMidiOutPort = extern union {
- const IID_Value = Guid_parse("931D6D9F-57A2-4A3A-ADB8-4640886F6693");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- SendMessageA: *const fn (*This, [*c]IMidiMessage) callconv(.C) HRESULT,
- SendBuffer: *const fn (*This, [*c]Storage.Streams.IBuffer) callconv(.C) HRESULT,
- get_DeviceId: *const fn (*This, [*c]HSTRING) callconv(.C) HRESULT,
- };
- };
- pub const IMidiOutPortStatics = extern union {
- const IID_Value = Guid_parse("065CC3E9-0F88-448B-9B64-A95826C65B8F");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- FromIdAsync: *const fn (*This, HSTRING, [*c][*c]IAsyncOperation(IMidiOutPort)) callconv(.C) HRESULT,
- GetDeviceSelector: *const fn (*This, [*c]HSTRING) callconv(.C) HRESULT,
- };
- };
- pub const IMidiPitchBendChangeMessage = extern union {
- const IID_Value = Guid_parse("29DF4CB1-2E9F-4FAF-8C2B-9CB82A9079CA");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_Channel: *const fn (*This, [*c]BYTE) callconv(.C) HRESULT,
- get_Bend: *const fn (*This, [*c]UINT16) callconv(.C) HRESULT,
- };
- };
- pub const IMidiPitchBendChangeMessageFactory = extern union {
- const IID_Value = Guid_parse("F5EEDF55-CFC8-4926-B30E-A3622393306C");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- CreateMidiPitchBendChangeMessage: *const fn (*This, BYTE, UINT16, [*c][*c]IMidiPitchBendChangeMessage) callconv(.C) HRESULT,
- };
- };
- pub const IMidiPolyphonicKeyPressureMessage = extern union {
- const IID_Value = Guid_parse("1F7337FE-ACE8-48A0-868E-7CDBF20F04D6");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_Channel: *const fn (*This, [*c]BYTE) callconv(.C) HRESULT,
- get_Note: *const fn (*This, [*c]BYTE) callconv(.C) HRESULT,
- get_Pressure: *const fn (*This, [*c]BYTE) callconv(.C) HRESULT,
- };
- };
- pub const IMidiPolyphonicKeyPressureMessageFactory = extern union {
- const IID_Value = Guid_parse("E98F483E-C4B3-4DD2-917C-E349815A1B3B");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- CreateMidiPolyphonicKeyPressureMessage: *const fn (*This, BYTE, BYTE, BYTE, [*c][*c]IMidiPolyphonicKeyPressureMessage) callconv(.C) HRESULT,
- };
- };
- pub const IMidiProgramChangeMessage = extern union {
- const IID_Value = Guid_parse("9CBB3C78-7A3E-4327-AA98-20B8E4485AF8");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_Channel: *const fn (*This, [*c]BYTE) callconv(.C) HRESULT,
- get_Program: *const fn (*This, [*c]BYTE) callconv(.C) HRESULT,
- };
- };
- pub const IMidiProgramChangeMessageFactory = extern union {
- const IID_Value = Guid_parse("D6B04387-524B-4104-9C99-6572BFD2E261");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- CreateMidiProgramChangeMessage: *const fn (*This, BYTE, BYTE, [*c][*c]IMidiProgramChangeMessage) callconv(.C) HRESULT,
- };
- };
- pub const IMidiSongPositionPointerMessage = extern union {
- const IID_Value = Guid_parse("4CA50C56-EC5E-4AE4-A115-88DC57CC2B79");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_Beats: *const fn (*This, [*c]UINT16) callconv(.C) HRESULT,
- };
- };
- pub const IMidiSongPositionPointerMessageFactory = extern union {
- const IID_Value = Guid_parse("9C00E996-F10B-4FEA-B395-F5D6CF80F64E");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- CreateMidiSongPositionPointerMessage: *const fn (*This, UINT16, [*c][*c]IMidiSongPositionPointerMessage) callconv(.C) HRESULT,
- };
- };
- pub const IMidiSongSelectMessage = extern union {
- const IID_Value = Guid_parse("49F0F27F-6D83-4741-A5BF-4629F6BE974F");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_Song: *const fn (*This, [*c]BYTE) callconv(.C) HRESULT,
- };
- };
- pub const IMidiSongSelectMessageFactory = extern union {
- const IID_Value = Guid_parse("848878E4-8748-4129-A66C-A05493F75DAA");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- CreateMidiSongSelectMessage: *const fn (*This, BYTE, [*c][*c]IMidiSongSelectMessage) callconv(.C) HRESULT,
- };
- };
- pub const IMidiSynthesizer = extern union {
- const IID_Value = Guid_parse("F0DA155E-DB90-405F-B8AE-21D2E17F2E45");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_AudioDevice: *const fn (*This, [*c][*c]Devices.Enumeration.IDeviceInformation) callconv(.C) HRESULT,
- get_Volume: *const fn (*This, [*c]DOUBLE) callconv(.C) HRESULT,
- put_Volume: *const fn (*This, DOUBLE) callconv(.C) HRESULT,
- };
- };
- pub const IMidiSynthesizerStatics = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- CreateAsync: *const fn (*This, [*c][*c]IAsyncOperation(IMidiSynthesizer)) callconv(.C) HRESULT,
- CreateFromAudioDeviceAsync: *const fn (*This, [*c]Devices.Enumeration.IDeviceInformation, [*c][*c]IAsyncOperation(IMidiSynthesizer)) callconv(.C) HRESULT,
- IsSynthesizer: *const fn (*This, [*c]Devices.Enumeration.IDeviceInformation, [*c]boolean) callconv(.C) HRESULT,
- };
- };
- pub const IMidiSystemExclusiveMessageFactory = extern union {
- const IID_Value = Guid_parse("083DE222-3B74-4320-9B42-0CA8545F8A24");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- CreateMidiSystemExclusiveMessage: *const fn (*This, [*c]Storage.Streams.IBuffer, [*c][*c]IMidiMessage) callconv(.C) HRESULT,
- };
- };
- pub const IMidiTimeCodeMessage = extern union {
- const IID_Value = Guid_parse("0BF7087D-FA63-4A1C-8DEB-C0E87796A6D7");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_FrameType: *const fn (*This, [*c]BYTE) callconv(.C) HRESULT,
- get_Values: *const fn (*This, [*c]BYTE) callconv(.C) HRESULT,
- };
- };
- pub const IMidiTimeCodeMessageFactory = extern union {
- const IID_Value = Guid_parse("EB3099C5-771C-40DE-B961-175A7489A85E");
- pub const IID = &IID_Value;
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- CreateMidiTimeCodeMessage: *const fn (*This, BYTE, BYTE, [*c][*c]IMidiTimeCodeMessage) callconv(.C) HRESULT,
- };
- };
- };
- };
- const Storage = struct {
- const Streams = struct {
- pub const IRandomAccessStreamWithContentType = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- };
- };
- pub const IBuffer = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_Capacity: *const fn (*This, [*c]UINT32) callconv(.C) HRESULT,
- get_Length: *const fn (*This, [*c]UINT32) callconv(.C) HRESULT,
- put_Length: *const fn (*This, UINT32) callconv(.C) HRESULT,
- };
- };
- pub const IBufferFactory = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- Create: *const fn (*This, UINT32, [*c][*c]IBuffer) callconv(.C) HRESULT,
- };
- };
- pub const IBufferStatics = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- CreateCopyFromMemoryBuffer: *const fn (*This, [*c]Foundation.IMemoryBuffer, [*c][*c]IBuffer) callconv(.C) HRESULT,
- CreateMemoryBufferOverIBuffer: *const fn (*This, [*c]IBuffer, [*c][*c]Foundation.IMemoryBuffer) callconv(.C) HRESULT,
- };
- };
- pub const IInputStream = opaque {};
- pub const IOutputStream = opaque {};
- pub const IRandomAccessStream = extern union {
- const This = @This();
- vtable: *const VTable,
- IInspectable: IInspectable,
- IUnknown: IUnknown,
- pub const VTable = extern struct {
- base: IInspectable.VTable,
- get_Size: *const fn (*This, [*c]UINT64) callconv(.C) HRESULT,
- put_Size: *const fn (*This, UINT64) callconv(.C) HRESULT,
- GetInputStreamAt: *const fn (*This, UINT64, [*c]?*IInputStream) callconv(.C) HRESULT,
- GetOutputStreamAt: *const fn (*This, UINT64, [*c]?*IOutputStream) callconv(.C) HRESULT,
- get_Position: *const fn (*This, [*c]UINT64) callconv(.C) HRESULT,
- Seek: *const fn (*This, UINT64) callconv(.C) HRESULT,
- CloneStream: *const fn (*This, [*c][*c]IRandomAccessStream) callconv(.C) HRESULT,
- get_CanRead: *const fn (*This, [*c]boolean) callconv(.C) HRESULT,
- get_CanWrite: *const fn (*This, [*c]boolean) callconv(.C) HRESULT,
- };
- };
- pub const RandomAccessStream = opaque {};
- pub const Buffer = opaque {};
- pub const RandomAccessStreamReference = opaque {};
- pub const IContentTypeProvider = opaque {};
- pub const IInputStreamReference = opaque {};
- pub const IRandomAccessStreamReference = opaque {};
- pub const IRandomAccessStreamReferenceStatics = opaque {};
- pub const IRandomAccessStreamStatics = opaque {};
- };
- };
- };
- const Guid = windows.GUID;
- fn Guid_parse(comptime s: []const u8) Guid {
- return Guid.parseNoBraces(s) catch @compileError("Failed to parse as a GUID\n");
- }
- // pub fn format(value: @This(), comptime _: []const u8, _: std.fmt.FormatOptions, writer: anytype) !void {
- // return writer.print("{X:0>8}-{X:0>4}-{X:0>4}-{X:0>2}{X:0>2}-{X:0>2}{X:0>2}{X:0>2}{X:0>2}{X:0>2}{X:0>2}", .{
- // value.Ints.a,
- // value.Ints.b,
- // value.Ints.c,
- // value.Ints.d[0],
- // value.Ints.d[1],
- // value.Ints.d[2],
- // value.Ints.d[3],
- // value.Ints.d[4],
- // value.Ints.d[5],
- // value.Ints.d[6],
- // value.Ints.d[7],
- // });
- // }
- //};
- pub const Library = struct {
- pub extern fn CoInitialize(pvReserved: LPVOID) HRESULT;
- pub extern fn CoUninitialize() void;
- pub extern fn CoTaskMemFree(pv: LPVOID) void;
- pub fn load() !void {
- winrt_lib = try std.DynLib.open("api-ms-win-core-winrt-l1-1-0");
- if (winrt_lib) |*lib| {
- // zig fmt: off
- winrt_procs = .{
- .RoInitialize = lib.lookup(@TypeOf(Library.winrt_procs.?.RoInitialize), "RoInitialize") orelse return error.Unknown,
- .RoUninitialize = lib.lookup(@TypeOf(Library.winrt_procs.?.RoUninitialize), "RoUninitialize") orelse return error.Unknown,
- .RoActivateInstance = lib.lookup(@TypeOf(Library.winrt_procs.?.RoActivateInstance), "RoActivateInstance") orelse return error.Unknown,
- .RoGetActivationFactory = lib.lookup(@TypeOf(Library.winrt_procs.?.RoGetActivationFactory), "RoGetActivationFactory") orelse return error.Unknown,
- .WindowsCreateStringReference = lib.lookup(@TypeOf(Library.winrt_procs.?.WindowsCreateStringReference), "WindowsCreateStringReference") orelse return error.Unknown,
- .WindowsGetStringRawBuffer = lib.lookup(@TypeOf(Library.winrt_procs.?.WindowsGetStringRawBuffer), "WindowsGetStringRawBuffer") orelse return error.Unknown,
- .WindowsDuplicateString = lib.lookup(@TypeOf(Library.winrt_procs.?.WindowsDuplicateString), "WindowsDuplicateString") orelse return error.Unknown,
- .WindowsDeleteString = lib.lookup(@TypeOf(Library.winrt_procs.?.WindowsDeleteString), "WindowsDeleteString") orelse return error.Unknown,
- };
- // zig fmt: on
- }
- }
- pub fn close() void {
- if (winrt_lib != null) {
- winrt_lib.?.close();
- winrt_lib = null;
- }
- }
- pub fn initializeCom() !void {
- const hr = Library.winrt_procs.?.RoInitialize(.MULTITHREADED);
- if (hr < 0) {
- return error.Unknown;
- }
- }
- const RO_INIT_TYPE = enum(i32) {
- SINGLETHREADED = 0,
- MULTITHREADED = 1,
- };
- const WinRT_Procs = struct {
- RoInitialize: *fn (
- initType: RO_INIT_TYPE,
- ) callconv(@import("std").os.windows.WINAPI) HRESULT,
- RoUninitialize: *fn () callconv(@import("std").os.windows.WINAPI) void,
- RoActivateInstance: *fn (
- activatableClassId: ?HSTRING,
- instance: ?*?*IInspectable,
- ) callconv(@import("std").os.windows.WINAPI) HRESULT,
- RoGetActivationFactory: *fn (
- activatableClassId: ?HSTRING,
- iid: ?*const Guid,
- factory: ?*?*anyopaque,
- ) callconv(@import("std").os.windows.WINAPI) HRESULT,
- WindowsCreateStringReference: *fn (
- sourceString: ?[*:0]const u16,
- length: u32,
- hstringHeader: ?*HSTRING_HEADER,
- string: ?*?HSTRING,
- ) callconv(@import("std").os.windows.WINAPI) HRESULT,
- WindowsGetStringRawBuffer: *fn (
- string: ?HSTRING,
- length: ?*u32,
- ) callconv(@import("std").os.windows.WINAPI) ?[*:0]u16,
- WindowsDuplicateString: *fn (
- string: HSTRING,
- newString: ?*HSTRING,
- ) callconv(@import("std").os.windows.WINAPI) HRESULT,
- WindowsDeleteString: *fn (
- string: HSTRING,
- ) callconv(@import("std").os.windows.WINAPI) HRESULT,
- };
- var winrt_procs: ?WinRT_Procs = null;
- var winrt_lib: ?std.DynLib = null;
- };
- //DD9F8A5D-EC98-5F4B-A3EA-9C8B5AD53C4B = IIterable<DeviceInformation*>
- //00000037-0000-0000-C000-000000000046 = IWeakReference
- //E170688F-3495-5BF6-AAB5-9CAC17E0F10F = IVectorView<DeviceInformation*>
- const weak_ref_source_guid = Guid_parse("00000038-0000-0000-C000-000000000046"); // = IWeakReferenceSource
- const Helpers = struct {
- pub fn string_ref(comptime str: [:0]const u8) !struct { HSTRING_HEADER, HSTRING } {
- const L = std.unicode.utf8ToUtf16LeStringLiteral;
- const wstr = L(str);
- var hstr: ?HSTRING = undefined;
- var header: HSTRING_HEADER = undefined;
- const hr = Library.winrt_procs.?.WindowsCreateStringReference(wstr, wstr.len, &header, &hstr);
- if (hr != 0) {
- return error.OutOfMemory;
- }
- return .{
- header,
- hstr orelse null_panic(),
- };
- }
- fn hstring_to_utf8_alloc(allocator: std.mem.Allocator, string: HSTRING) ![:0]u8 {
- var len: u32 = undefined;
- const raw = Library.winrt_procs.?.WindowsGetStringRawBuffer(string, &len).?;
- const utf8string = try std.unicode.utf16LeToUtf8AllocZ(allocator, raw[0..len]);
- return utf8string;
- }
- pub fn get_statics(comptime static_type: type) !*static_type {
- const class_name = static_type.Name;
- _, const hstr = try string_ref(class_name);
- var statics: *static_type = undefined;
- const hr = Library.winrt_procs.?.RoGetActivationFactory(hstr, static_type.IID, @ptrCast(&statics));
- if (hr != 0) return error.Unkown;
- return statics;
- }
- pub fn print_iids(object: anytype) void {
- const count, const iids = blk: {
- var count: ULONG = undefined;
- var iids: [*]Guid = undefined;
- const hr = object.IInspectable.GetIids(&count, &iids);
- std.debug.assert(hr == 0);
- break :blk .{ count, iids };
- };
- for (iids[0..count]) |iid| {
- if (std.meta.eql(iid.Ints, weak_ref_source_guid.Ints)) continue;
- const interface = blk: {
- var interface: ?*IInspectable = undefined;
- const hr = object.IUnknown.QueryInterface(&iid, @ptrCast(&interface));
- std.debug.assert(hr == 0); //call must succeed according to msdn
- break :blk interface orelse null_panic();
- };
- defer interface.Release();
- std.debug.print("{any}:\n ", .{iid});
- print_class(interface) catch @panic("hmm");
- }
- Library.CallTaskMemFree(iids);
- }
- pub fn print_class(object: anytype) !void {
- var class_name: HSTRING = undefined;
- const hr = object.IInspectable.GetRuntimeClassName(&class_name);
- std.debug.assert(hr == 0);
- defer _ = Library.winrt_procs.?.WindowsDeleteString(class_name);
- std.debug.print("{any}\n", .{class_name});
- }
- pub fn createEventHandler(comptime Handler: type, comptime Callback: type, comptime CallbackArg: type) type {
- return struct {
- const Self = @This();
- pub fn init(user_arg: *CallbackArg) Self {
- return .{
- .com = .{
- .TypedEventHandler = .{
- .vtable = &.{
- .base = .{
- .QueryInterface = Self.QueryInterface,
- .AddRef = Self.AddRef,
- .Release = Self.Release,
- },
- .Invoke = Self.Invoke,
- },
- },
- },
- .ref = 1,
- .user_arg = user_arg,
- };
- }
- fn getThisFromEventHandler(this_event_handler: *const TypedEventHandler(Handler.Caller, Handler.Arg)) *@This() {
- const com_ptr: *Com = @fieldParentPtr("TypedEventHandler", @constCast(this_event_handler));
- return @fieldParentPtr("com", com_ptr);
- }
- fn getThisFromUnknown(this_unknown: *const IUnknown) *@This() {
- const com_ptr: *Com = @fieldParentPtr("IUnknown", @constCast(this_unknown));
- return @fieldParentPtr("com", com_ptr);
- }
- pub fn QueryInterface(this_unknown: *const IUnknown, guid: *const Guid, out_interface: *?*anyopaque) callconv(.C) HRESULT {
- const this = getThisFromUnknown(this_unknown);
- if (std.meta.eql(guid.*, IUnknown.IID.*) or
- std.meta.eql(guid.*, agile_guid) or
- std.meta.eql(guid.*, Handler.IID.*))
- {
- out_interface.* = this;
- _ = AddRef(this_unknown);
- return S_OK;
- } else {
- out_interface.* = null;
- return E_NOINTERFACE;
- }
- }
- pub fn AddRef(this_unknown: *const IUnknown) callconv(.C) ULONG {
- const this = getThisFromUnknown(this_unknown);
- this.ref += 1;
- return this.ref;
- }
- pub fn Release(this_unknown: *const IUnknown) callconv(.C) ULONG {
- const this = getThisFromUnknown(this_unknown);
- this.ref -= 1;
- if (this.ref == 0) {
- //dont delete, i'm heap allocated
- }
- return this.ref;
- }
- pub fn Invoke(this_event_handler: *const TypedEventHandler(Handler.Caller, Handler.Arg), caller: *Handler.Caller, arg: *Handler.Arg) callconv(.C) HRESULT {
- const this = getThisFromEventHandler(this_event_handler);
- _ = caller;
- Callback.invoke(arg, this.user_arg);
- return S_OK;
- }
- const Com = extern union {
- IUnknown: IUnknown,
- TypedEventHandler: TypedEventHandler(Handler.Caller, Handler.Arg),
- };
- com: Com,
- ref: u32,
- user_arg: *CallbackArg,
- };
- }
- test "Helpers" {
- std.testing.refAllDeclsRecursive(@This());
- }
- };
- //fn unknown_get_interface(comptime dest: type, object: *anyopaque) !*dest {
- // var async_info: ?*dest = undefined;
- //
- // const hr = object.vtable.base.base.QueryInterface(@ptrCast(async_op), IAsyncInfo.IID, @ptrCast(&async_info));
- // std.debug.assert(hr == 0);
- // return async_info.?;
- //}
- const agile_guid = Guid_parse("94EA2B94-E9CC-49E0-C0FF-EE64CA8F5B90");
- const no_marshall_guid = Guid_parse("ECC8691B-C1DB-4DC0-855E-65F6C551AF49");
- const marshall_guid = Guid_parse("00000003-0000-0000-C000-000000000046");
- const MidiInEventHandler = struct {
- pub fn init(callback_arg: *anyopaque, user_callback: *const fn (midi.Message, *anyopaque) void, allocator: *const std.mem.Allocator) @This() {
- return .{
- .com = .{
- .EventHandler = .{
- .vtable = &.{
- .base = .{
- .QueryInterface = MidiInEventHandler.QueryInterface,
- .AddRef = MidiInEventHandler.AddRef,
- .Release = MidiInEventHandler.Release,
- },
- .Invoke = MidiInEventHandler.Invoke,
- },
- },
- },
- .ref = 1,
- .allocator = allocator,
- .callback_arg = callback_arg,
- .user_callback = user_callback,
- };
- }
- fn getThisFromEventHandler(this_event_handler: *Windows.Devices.Midi.IMidiInPort.EventHandler) *@This() {
- const com_ptr: *Com = @fieldParentPtr("EventHandler", @constCast(this_event_handler));
- return @fieldParentPtr("com", com_ptr);
- }
- fn getThisFromUnknown(this_unknown: *const IUnknown) *@This() {
- const com_ptr: *Com = @fieldParentPtr("IUnknown", @constCast(this_unknown));
- return @fieldParentPtr("com", com_ptr);
- }
- pub fn QueryInterface(this_unknown: *const IUnknown, guid: *const Guid, out_interface: *?*anyopaque) callconv(.C) HRESULT {
- const this = getThisFromUnknown(this_unknown);
- std.debug.print("query: {}\n", .{std.Thread.getCurrentId()});
- //std.debug.print("query: {any}\n", .{guid.*});
- if (std.meta.eql(guid.*, IUnknown.IID.*) or
- std.meta.eql(guid.*, Windows.Devices.Midi.IMidiInPort.EventHandler_IID.*) or
- std.meta.eql(guid.*, agile_guid))
- {
- out_interface.* = this;
- _ = AddRef(this_unknown);
- return S_OK;
- } else {
- out_interface.* = null;
- return E_NOINTERFACE;
- }
- }
- pub fn AddRef(this_unknown: *const IUnknown) callconv(.C) ULONG {
- const this = getThisFromUnknown(this_unknown);
- this.ref += 1;
- return this.ref;
- }
- pub fn Release(this_unknown: *const IUnknown) callconv(.C) ULONG {
- const this = getThisFromUnknown(this_unknown);
- this.ref -= 1;
- if (this.ref == 0) {
- this.allocator.destroy(this);
- return 0;
- }
- return this.ref;
- }
- pub fn Invoke(this_event_handler: *Windows.Devices.Midi.IMidiInPort.EventHandler, port: *Windows.Devices.Midi.IMidiInPort, args: *Windows.Devices.Midi.IMidiMessageReceivedEventArgs) callconv(.C) HRESULT {
- _ = port;
- const this = getThisFromEventHandler(this_event_handler);
- const message = tryGet(?*Windows.Devices.Midi.IMidiMessage, args, "get_Message") catch @panic("") orelse null_panic();
- defer _ = message.IUnknown.Release();
- const message_type = tryGet(Windows.Devices.Midi.MidiMessageType, message, "get_Type") catch @panic("");
- switch (message_type) {
- .NoteOn => {
- const note_on = message.IUnknown.TryQuery(Windows.Devices.Midi.IMidiNoteOnMessage) orelse @panic("sould have worked");
- defer _ = note_on.IUnknown.Release();
- const channel = tryGet(BYTE, note_on, "get_Channel") catch @panic("");
- const note = tryGet(BYTE, note_on, "get_Note") catch @panic("");
- const velocity = tryGet(BYTE, note_on, "get_Velocity") catch @panic("");
- this.user_callback(.{ .Note_On = .{ .channel = @intCast(channel), .note = note, .velocity = velocity } }, this.callback_arg);
- },
- .NoteOff => {
- const note_off = message.IUnknown.TryQuery(Windows.Devices.Midi.IMidiNoteOffMessage) orelse @panic("sould have worked");
- defer _ = note_off.IUnknown.Release();
- const channel = tryGet(BYTE, note_off, "get_Channel") catch @panic("");
- const note = tryGet(BYTE, note_off, "get_Note") catch @panic("");
- const velocity = tryGet(BYTE, note_off, "get_Velocity") catch @panic("");
- this.user_callback(.{ .Note_Off = .{ .channel = @intCast(channel), .note = note, .velocity = velocity } }, this.callback_arg);
- },
- .ControlChange => {
- const cc = message.IUnknown.TryQuery(Windows.Devices.Midi.IMidiControlChangeMessage) orelse @panic("sould have worked");
- defer _ = cc.IUnknown.Release();
- const channel = tryGet(BYTE, cc, "get_Channel") catch @panic("");
- const controller = tryGet(BYTE, cc, "get_Controller") catch @panic("");
- const value = tryGet(BYTE, cc, "get_ControlValue") catch @panic("");
- this.user_callback(.{ .CC = .{ .channel = @intCast(channel), .id = controller, .value = value } }, this.callback_arg);
- },
- else => {},
- }
- return S_OK;
- }
- const Com = extern union {
- IUnknown: IUnknown,
- EventHandler: Windows.Devices.Midi.IMidiInPort.EventHandler,
- };
- com: Com,
- ref: u32,
- allocator: *const std.mem.Allocator,
- callback_arg: *anyopaque,
- user_callback: *const fn (midi.Message, *anyopaque) void,
- };
- pub const Context = struct {
- const WinMidi = Windows.Devices.Midi;
- const Enumeration = Windows.Devices.Enumeration;
- const This = @This();
- const Watcher_Procs = struct {
- const Added_ = struct {
- pub fn invoke(arg: *Enumeration.IDeviceInformation, ctx: *This) void {
- var device_name: HSTRING = undefined;
- _ = arg.vtable.get_Name(arg, &device_name);
- defer _ = Library.winrt_procs.?.WindowsDeleteString(device_name);
- var id: HSTRING = undefined;
- _ = arg.vtable.get_Id(arg, &id);
- defer _ = Library.winrt_procs.?.WindowsDeleteString(id);
- var copied_id: HSTRING = undefined;
- _ = Library.winrt_procs.?.WindowsDuplicateString(id, &copied_id);
- //errdefer _ = Library.winrt_procs.?.WindowsDeleteString(id);
- std.debug.print("added: {any} {any}\n", .{ device_name, id });
- const id_utf8 = Helpers.hstring_to_utf8_alloc(ctx.allocator, id) catch @panic("OOM");
- defer ctx.allocator.free(id_utf8);
- const id_hash: u64 = std.hash.Wyhash.hash(0, id_utf8);
- if (ctx.devices.getPtr(id_hash)) |existing_device| {
- switch (existing_device.state) {
- .Closed, .Open => {
- std.debug.print("Error: should be disconnected", .{});
- },
- .Disconnected => {
- existing_device.state = .{ .Closed = void{} };
- },
- }
- } else {
- const device_name_utf8 = Helpers.hstring_to_utf8_alloc(ctx.allocator, device_name) catch @panic("OOM");
- const new_device = InputDevice{
- .descriptor = .{ .name = device_name_utf8, .hstring_id = copied_id, .id = id_hash },
- .state = .{ .Closed = void{} },
- };
- ctx.devices.put(id_hash, new_device) catch @panic("OOM");
- }
- }
- };
- pub const Added = Helpers.createEventHandler(Enumeration.IDeviceWatcher.Added_EventHandler, Added_, This);
- const Updated_ = struct {
- pub fn invoke(arg: *Enumeration.IDeviceInformationUpdate, ctx: *This) void {
- _ = ctx;
- var id: HSTRING = undefined;
- _ = arg.vtable.get_Id(arg, &id);
- defer _ = Library.winrt_procs.?.WindowsDeleteString(id);
- std.debug.print("updated: {any}\n", .{id});
- }
- };
- pub const Updated = Helpers.createEventHandler(Enumeration.IDeviceWatcher.Updated_EventHandler, Updated_, This);
- const Removed_ = struct {
- pub fn invoke(arg: *Enumeration.IDeviceInformationUpdate, ctx: *This) void {
- var id: HSTRING = undefined;
- _ = arg.vtable.get_Id(arg, &id);
- defer _ = Library.winrt_procs.?.WindowsDeleteString(id);
- const id_utf8 = Helpers.hstring_to_utf8_alloc(ctx.allocator, id) catch @panic("OOM");
- defer ctx.allocator.free(id_utf8);
- const id_hash: u64 = std.hash.Wyhash.hash(0, id_utf8);
- if (ctx.devices.getPtr(id_hash)) |existing_device| {
- switch (existing_device.state) {
- .Closed => {
- existing_device.state = .{ .Disconnected = void{} };
- },
- .Open => |*port| {
- _ = port.midi_in_port.vtable.remove_MessageReceived(port.midi_in_port, port.message_received_event_token);
- _ = port.message_received_event_handler.com.IUnknown.Release();
- existing_device.state = .{ .Disconnected = void{} };
- std.debug.print("TODO: notify of the closing", .{});
- },
- .Disconnected => {
- std.debug.print("weird, it was supposed to already be disconnected\n", .{});
- },
- }
- } else {
- std.debug.print("Error: a device was removed but was not in the list", .{});
- }
- }
- };
- pub const Removed = Helpers.createEventHandler(Enumeration.IDeviceWatcher.Removed_EventHandler, Removed_, This);
- const EnumerationCompleted_ = struct {
- pub fn invoke(arg: *IInspectable, ctx: *This) void {
- _ = ctx;
- _ = arg;
- std.debug.print("enumeration_completed\n", .{});
- }
- };
- const EnumerationCompleted = Helpers.createEventHandler(Enumeration.IDeviceWatcher.EnumerationCompleted_Handler, EnumerationCompleted_, This);
- const Stopped_ = struct {
- pub fn invoke(arg: *IInspectable, ctx: *This) void {
- _ = ctx;
- _ = arg;
- std.debug.print("Stopped\n", .{});
- }
- };
- const Stopped = Helpers.createEventHandler(Enumeration.IDeviceWatcher.Stopped_Handler, Stopped_, This);
- };
- const Device_Map = std.AutoArrayHashMap(u64, InputDevice);
- allocator: std.mem.Allocator,
- options: midi.Context.Options,
- midi_in_port_statics: *WinMidi.IMidiInPortStatics,
- device_info_statics: *Enumeration.IDeviceInformationStatics,
- watcher: *Enumeration.IDeviceWatcher,
- devices: Device_Map,
- added_handler: Watcher_Procs.Added,
- added_token: EventRegistrationToken,
- updated_handler: Watcher_Procs.Updated,
- updated_token: EventRegistrationToken,
- removed_handler: Watcher_Procs.Removed,
- removed_token: EventRegistrationToken,
- enumeration_completed_handler: Watcher_Procs.EnumerationCompleted,
- enumeration_completed_token: EventRegistrationToken,
- stopped_handler: Watcher_Procs.Stopped,
- stopped_token: EventRegistrationToken,
- pub fn init(allocator: std.mem.Allocator, options: midi.Context.Options) !*Context {
- var ctx: *Context = try allocator.create(Context);
- errdefer allocator.destroy(ctx);
- ctx.devices = Device_Map.init(allocator);
- ctx.allocator = allocator;
- ctx.options = options;
- ctx.midi_in_port_statics = try Helpers.get_statics(WinMidi.IMidiInPortStatics);
- errdefer _ = ctx.midi_in_port_statics.IUnknown.Release();
- const midi_in_selector = tryGet(HSTRING, ctx.midi_in_port_statics, "GetDeviceSelector") catch @panic("");
- defer _ = Library.winrt_procs.?.WindowsDeleteString(midi_in_selector);
- ctx.device_info_statics = try Helpers.get_statics(Enumeration.IDeviceInformationStatics);
- errdefer _ = ctx.device_info_statics.IUnknown.Release();
- ctx.watcher = blk: {
- var w: ?*Enumeration.IDeviceWatcher = undefined;
- const h = ctx.device_info_statics.vtable.CreateWatcherAqsFilter(ctx.device_info_statics, midi_in_selector, &w);
- try Success(h);
- break :blk w orelse null_panic();
- };
- errdefer _ = ctx.watcher.IUnknown.Release();
- ctx.added_handler = Watcher_Procs.Added.init(ctx);
- var hr = ctx.watcher.vtable.add_Added(ctx.watcher, @ptrCast(&ctx.added_handler), &ctx.added_token);
- try Success(hr);
- errdefer _ = ctx.added_handler.com.IUnknown.Release();
- ctx.updated_handler = Watcher_Procs.Updated.init(ctx);
- hr = ctx.watcher.vtable.add_Updated(ctx.watcher, @ptrCast(&ctx.updated_handler), &ctx.updated_token);
- try Success(hr);
- errdefer _ = ctx.updated_handler.com.IUnknown.Release();
- ctx.removed_handler = Watcher_Procs.Removed.init(ctx);
- hr = ctx.watcher.vtable.add_Removed(ctx.watcher, @ptrCast(&ctx.removed_handler), &ctx.removed_token);
- try Success(hr);
- errdefer _ = ctx.removed_handler.com.IUnknown.Release();
- ctx.enumeration_completed_handler = Watcher_Procs.EnumerationCompleted.init(ctx);
- hr = ctx.watcher.vtable.add_EnumerationCompleted(ctx.watcher, @ptrCast(&ctx.enumeration_completed_handler), &ctx.enumeration_completed_token);
- try Success(hr);
- errdefer _ = ctx.enumeration_completed_handler.com.IUnknown.Release();
- ctx.stopped_handler = Watcher_Procs.Stopped.init(ctx);
- hr = ctx.watcher.vtable.add_Stopped(ctx.watcher, @ptrCast(&ctx.stopped_handler), &ctx.stopped_token);
- try Success(hr);
- errdefer _ = ctx.stopped_handler.com.IUnknown.Release();
- hr = ctx.watcher.vtable.Start(ctx.watcher);
- try Success(hr);
- return ctx;
- }
- pub fn deinit(ctx: *Context) void {
- _ = ctx.watcher.vtable.remove_Added(ctx.watcher, ctx.added_token);
- _ = ctx.watcher.vtable.remove_Updated(ctx.watcher, ctx.updated_token);
- _ = ctx.watcher.vtable.remove_Removed(ctx.watcher, ctx.removed_token);
- _ = ctx.watcher.vtable.remove_EnumerationCompleted(ctx.watcher, ctx.enumeration_completed_token);
- _ = ctx.watcher.vtable.remove_Stopped(ctx.watcher, ctx.stopped_token);
- _ = ctx.watcher.vtable.Stop(ctx.watcher);
- std.debug.assert(ctx.added_handler.ref == 1);
- std.debug.assert(ctx.removed_handler.ref == 1);
- std.debug.assert(ctx.updated_handler.ref == 1);
- std.debug.assert(ctx.enumeration_completed_handler.ref == 1);
- std.debug.assert(ctx.stopped_handler.ref == 1);
- std.debug.assert(ctx.stopped_handler.ref == 1);
- const watcher_ref = ctx.watcher.IUnknown.Release();
- std.debug.assert(watcher_ref == 0);
- for (ctx.devices.values()) |*device| {
- if (@as(InputDeviceState, device.state) == .Open) {
- ctx.closeDevice(device.descriptor.id);
- }
- ctx.allocator.free(device.descriptor.name);
- _ = Library.winrt_procs.?.WindowsDeleteString(device.descriptor.hstring_id);
- }
- //release statics
- ctx.devices.deinit();
- ctx.allocator.destroy(ctx);
- }
- pub fn refresh(ctx: *Context) !void {
- _ = ctx;
- }
- pub fn getDeviceDescriptors(ctx: *Context, allocator: std.mem.Allocator) ![]const DeviceDescriptor {
- const descriptors = try allocator.alloc(DeviceDescriptor, ctx.devices.count());
- for (descriptors, ctx.devices.values()) |*descriptor, *input_device| {
- descriptor.* = input_device.*.descriptor;
- }
- return descriptors;
- }
- const OpenDeviceOptions = struct {
- user_callback: *const fn (midi.Message, *anyopaque) void,
- callback_arg: *anyopaque,
- };
- //this shit should be async
- pub fn openDevice(ctx: Context, device_id: DeviceId, options: OpenDeviceOptions) !void {
- const device = ctx.devices.getPtr(device_id) orelse {
- return error.Unknown;
- };
- switch (device.state) {
- .Closed => {},
- .Open => {
- std.debug.print("Error: device is already open", .{});
- return error.AlreadyOpen;
- },
- .Disconnected => {
- std.debug.print("Error: device is disconncted", .{});
- return error.Disconnected;
- },
- }
- const create_port_op = ctx.midi_in_port_statics.fromIdAsync(device.descriptor.hstring_id) catch @panic("");
- defer _ = create_port_op.IUnknown.Release();
- const create_port_op_info = try create_port_op.getInfo();
- defer _ = create_port_op_info.IUnknown.Release();
- while (true) {
- const async_status = try create_port_op_info.getStatus();
- if (async_status != .Started) {
- break;
- }
- std.time.sleep(100_000_000);
- }
- const midi_in_port = try create_port_op.getResults();
- errdefer _ = midi_in_port.IUnknown.Release();
- const midi_event_handler = try ctx.allocator.create(MidiInEventHandler);
- midi_event_handler.* = MidiInEventHandler.init(options.callback_arg, options.user_callback, &ctx.allocator);
- const token = blk: {
- var t: EventRegistrationToken = undefined;
- const h = midi_in_port.vtable.add_MessageReceived(midi_in_port, @ptrCast(midi_event_handler), &t);
- try Success(h);
- break :blk t;
- };
- device.state = .{ .Open = .{
- .midi_in_port = midi_in_port,
- .message_received_event_handler = midi_event_handler,
- .message_received_event_token = token,
- } };
- }
- pub fn closeDevice(ctx: Context, device_id: DeviceId) void {
- if (ctx.devices.getPtr(device_id)) |device| {
- switch (device.state) {
- .Closed => {
- std.debug.print("Error: device is already closed", .{});
- },
- .Open => |*port| {
- _ = port.midi_in_port.vtable.remove_MessageReceived(port.midi_in_port, port.message_received_event_token);
- _ = port.message_received_event_handler.com.IUnknown.Release();
- device.state = .{ .Closed = void{} };
- },
- .Disconnected => {
- std.debug.print("Error: device is disconncted", .{});
- },
- }
- } else {
- std.debug.print("Error: device does not exitst", .{});
- }
- }
- };
- pub const DeviceId = u64;
- pub const DeviceDescriptor = struct {
- name: [:0]const u8,
- hstring_id: HSTRING,
- id: DeviceId,
- };
- pub const InputDeviceState = enum {
- Closed,
- Open,
- Disconnected,
- };
- pub const InputDevice = struct {
- descriptor: DeviceDescriptor,
- state: union(InputDeviceState) {
- Closed: void,
- Open: InputPort,
- Disconnected: void,
- },
- };
- pub const InputPort = struct {
- midi_in_port: *Windows.Devices.Midi.IMidiInPort,
- message_received_event_handler: *MidiInEventHandler,
- message_received_event_token: EventRegistrationToken,
- };
- fn null_panic() noreturn {
- @panic("winrt returned hr = 0 and this pointer is still null\n");
- }
- fn Success(hr: HRESULT) !void {
- if (hr < 0) {
- return error.Unknown;
- }
- }
- fn tryGet(comptime out_type: type, source: anytype, comptime func_name: []const u8) !out_type {
- var out: out_type = undefined;
- const hr = @field(source.vtable, func_name)(source, &out);
- try Success(hr);
- return out;
- }
- test {
- std.testing.refAllDeclsRecursive(@This());
- }
Advertisement
Add Comment
Please, Sign In to add comment