From e3393abbc110e97525cb4b02aa4c5cb70b29f33d Mon Sep 17 00:00:00 2001 From: Stephen Gutekanst Date: Sun, 25 Aug 2024 15:24:24 -0700 Subject: [PATCH] deduplicate win32 bindings Signed-off-by: Stephen Gutekanst --- src/core/win32.zig | 2 +- src/sysaudio/wasapi.zig | 40 +- src/sysaudio/wasapi/win32.zig | 1821 -------------------------------- src/{core/win32 => }/win32.zig | 1766 ++++++++++++++++++++++++++++++- 4 files changed, 1784 insertions(+), 1845 deletions(-) delete mode 100644 src/sysaudio/wasapi/win32.zig rename src/{core/win32 => }/win32.zig (57%) diff --git a/src/core/win32.zig b/src/core/win32.zig index 9cf9489f..7b440846 100644 --- a/src/core/win32.zig +++ b/src/core/win32.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const w = @import("win32/win32.zig"); +const w = @import("../win32.zig"); const mach = @import("../main.zig"); const Core = @import("../Core.zig"); const InputState = @import("InputState.zig"); diff --git a/src/sysaudio/wasapi.zig b/src/sysaudio/wasapi.zig index 538b6837..f3b828bd 100644 --- a/src/sysaudio/wasapi.zig +++ b/src/sysaudio/wasapi.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const win32 = @import("wasapi/win32.zig"); +const win32 = @import("../win32.zig"); const main = @import("main.zig"); const backends = @import("backends.zig"); const util = @import("util.zig"); @@ -100,7 +100,7 @@ pub const Context = struct { fn queryInterfaceCB(ctx: *const win32.IUnknown, riid: ?*const win32.Guid, ppv: ?*?*anyopaque) callconv(std.os.windows.WINAPI) win32.HRESULT { if (riid.?.eql(win32.IID_IUnknown.*) or riid.?.eql(win32.IID_IMMNotificationClient.*)) { ppv.?.* = @as(?*anyopaque, @ptrFromInt(@intFromPtr(ctx))); - _ = ctx.AddRef(); + _ = ctx.IUnknown_AddRef(); return win32.S_OK; } else { ppv.?.* = null; @@ -150,7 +150,7 @@ pub const Context = struct { if (ctx.watcher) |*watcher| { _ = ctx.enumerator.?.UnregisterEndpointNotificationCallback(&watcher.notif_client); } - _ = ctx.enumerator.?.Release(); + _ = ctx.enumerator.?.IUnknown_Release(); for (ctx.devices_info.list.items) |d| freeDevice(ctx.allocator, d); ctx.devices_info.list.deinit(ctx.allocator); @@ -180,7 +180,7 @@ pub const Context = struct { win32.E_OUTOFMEMORY => return error.OutOfMemory, else => return error.OpeningDevice, } - defer _ = collection.?.Release(); + defer _ = collection.?.IUnknown_Release(); var device_count: u32 = 0; hr = collection.?.GetCount(&device_count); @@ -200,7 +200,7 @@ pub const Context = struct { win32.E_INVALIDARG => unreachable, else => return error.OpeningDevice, } - defer _ = imm_device.?.Release(); + defer _ = imm_device.?.IUnknown_Release(); var property_store: ?*win32.IPropertyStore = null; var variant: win32.PROPVARIANT = undefined; @@ -212,7 +212,7 @@ pub const Context = struct { win32.E_OUTOFMEMORY => return error.OutOfMemory, else => return error.OpeningDevice, } - defer _ = property_store.?.Release(); + defer _ = property_store.?.IUnknown_Release(); hr = property_store.?.GetValue(&win32.PKEY_AudioEngine_DeviceFormat, &variant); switch (hr) { @@ -302,14 +302,14 @@ pub const Context = struct { const dataflow = blk: { var endpoint: ?*win32.IMMEndpoint = null; - hr = imm_device.?.QueryInterface(win32.IID_IMMEndpoint, @as(?*?*anyopaque, @ptrCast(&endpoint))); + hr = imm_device.?.IUnknown_QueryInterface(win32.IID_IMMEndpoint, @as(?*?*anyopaque, @ptrCast(&endpoint))); switch (hr) { win32.S_OK => {}, win32.E_POINTER => unreachable, win32.E_NOINTERFACE => unreachable, else => unreachable, } - defer _ = endpoint.?.Release(); + defer _ = endpoint.?.IUnknown_Release(); var dataflow: win32.DataFlow = undefined; hr = endpoint.?.GetDataFlow(&dataflow); @@ -399,7 +399,7 @@ pub const Context = struct { win32.E_NOT_FOUND => return null, else => return error.OpeningDevice, } - defer _ = default_playback_device.?.Release(); + defer _ = default_playback_device.?.IUnknown_Release(); var default_playback_id_u16: ?[*:0]u16 = undefined; hr = default_playback_device.?.GetId(&default_playback_id_u16); @@ -442,7 +442,7 @@ pub const Context = struct { hr = imm_device.*.?.Activate(win32.IID_IAudioClient3, win32.CLSCTX_ALL, null, @as(?*?*anyopaque, @ptrCast(audio_client3))); if (hr == win32.S_OK) { - hr = audio_client3.*.?.QueryInterface(win32.IID_IAudioClient, @as(?*?*anyopaque, @ptrCast(audio_client))); + hr = audio_client3.*.?.IUnknown_QueryInterface(win32.IID_IAudioClient, @as(?*?*anyopaque, @ptrCast(audio_client))); switch (hr) { win32.S_OK => {}, win32.E_NOINTERFACE => unreachable, @@ -732,11 +732,11 @@ pub const Player = struct { pub fn deinit(player: *Player) void { player.aborted.store(true, .unordered); player.thread.join(); - _ = player.simple_volume.?.Release(); - _ = player.render_client.?.Release(); - _ = player.audio_client.?.Release(); - _ = player.audio_client3.?.Release(); - _ = player.imm_device.?.Release(); + _ = player.simple_volume.?.IUnknown_Release(); + _ = player.render_client.?.IUnknown_Release(); + _ = player.audio_client.?.IUnknown_Release(); + _ = player.audio_client3.?.IUnknown_Release(); + _ = player.imm_device.?.IUnknown_Release(); player.allocator.destroy(player); } @@ -894,11 +894,11 @@ pub const Recorder = struct { pub fn deinit(recorder: *Recorder) void { recorder.aborted.store(true, .unordered); recorder.thread.join(); - _ = recorder.simple_volume.?.Release(); - _ = recorder.capture_client.?.Release(); - _ = recorder.audio_client.?.Release(); - _ = recorder.audio_client3.?.Release(); - _ = recorder.imm_device.?.Release(); + _ = recorder.simple_volume.?.IUnknown_Release(); + _ = recorder.capture_client.?.IUnknown_Release(); + _ = recorder.audio_client.?.IUnknown_Release(); + _ = recorder.audio_client3.?.IUnknown_Release(); + _ = recorder.imm_device.?.IUnknown_Release(); recorder.allocator.destroy(recorder); } diff --git a/src/sysaudio/wasapi/win32.zig b/src/sysaudio/wasapi/win32.zig deleted file mode 100644 index eaba8ac5..00000000 --- a/src/sysaudio/wasapi/win32.zig +++ /dev/null @@ -1,1821 +0,0 @@ -const WINAPI = @import("std").os.windows.WINAPI; -pub const Guid = extern union { - Ints: extern struct { - a: u32, - b: u16, - c: u16, - d: [8]u8, - }, - Bytes: [16]u8, - const hex_offsets = switch (@import("builtin").target.cpu.arch.endian()) { - .big => [16]u6{ 0, 2, 4, 6, 9, 11, 14, 16, 19, 21, 24, 26, 28, 30, 32, 34 }, - .little => [16]u6{ 6, 4, 2, 0, 11, 9, 16, 14, 19, 21, 24, 26, 28, 30, 32, 34 }, - }; - pub fn initString(s: []const u8) Guid { - var guid = Guid{ .Bytes = undefined }; - for (hex_offsets, 0..) |hex_offset, i| { - guid.Bytes[i] = decodeHexByte([2]u8{ s[hex_offset], s[hex_offset + 1] }); - } - return guid; - } - fn hexVal(c: u8) u4 { - if (c <= '9') return @as(u4, @intCast(c - '0')); - if (c >= 'a') return @as(u4, @intCast(c + 10 - 'a')); - return @as(u4, @intCast(c + 10 - 'A')); - } - fn decodeHexByte(hex: [2]u8) u8 { - return @as(u8, @intCast(hexVal(hex[0]))) << 4 | hexVal(hex[1]); - } - pub fn eql(riid1: Guid, riid2: Guid) bool { - return riid1.Ints.a == riid2.Ints.a and - riid1.Ints.b == riid2.Ints.b and - riid1.Ints.c == riid2.Ints.c and - @import("std").mem.eql(u8, &riid1.Ints.d, &riid2.Ints.d) and - @import("std").mem.eql(u8, &riid1.Bytes, &riid2.Bytes); - } -}; -pub const PROPERTYKEY = extern struct { - fmtid: Guid, - pid: u32, -}; -pub const DECIMAL = extern struct { - wReserved: u16, - anon1: extern union { - anon: extern struct { - scale: u8, - sign: u8, - }, - signscale: u16, - }, - Hi32: u32, - anon2: extern union { - anon: extern struct { - Lo32: u32, - Mid32: u32, - }, - Lo64: u64, - }, -}; -pub const LARGE_INTEGER = extern union { - anon: extern struct { - LowPart: u32, - HighPart: i32, - }, - u: extern struct { - LowPart: u32, - HighPart: i32, - }, - QuadPart: i64, -}; -pub const ULARGE_INTEGER = extern union { - anon: extern struct { - LowPart: u32, - HighPart: u32, - }, - u: extern struct { - LowPart: u32, - HighPart: u32, - }, - QuadPart: u64, -}; -pub const FILETIME = extern struct { - dwLowDateTime: u32, - dwHighDateTime: u32, -}; -pub const BOOL = i32; -pub const BSTR = *u16; -pub const PSTR = [*:0]u8; -pub const PWSTR = [*:0]u16; -pub const CHAR = u8; -pub const HRESULT = i32; -pub const S_OK = 0; -pub const S_FALSE = 1; -pub const E_NOTIMPL = -2147467263; -pub const E_NOT_FOUND = -2147023728; -pub const E_OUTOFMEMORY = -2147024882; -pub const E_INVALIDARG = -2147024809; -pub const E_FAIL = -2147467259; -pub const E_UNEXPECTED = -2147418113; -pub const E_NOINTERFACE = -2147467262; -pub const E_POINTER = -2147467261; -pub const E_HANDLE = -2147024890; -pub const E_ABORT = -2147467260; -pub const E_ACCESSDENIED = -2147024891; -pub const E_BOUNDS = -2147483637; -pub const E_CHANGED_STATE = -2147483636; -pub const E_ILLEGAL_STATE_CHANGE = -2147483635; -pub const E_ILLEGAL_METHOD_CALL = -2147483634; -pub const CLASS_E_NOAGGREGATION = -2147221232; -pub const CLASS_E_CLASSNOTAVAILABLE = -2147221231; -pub const CLASS_E_NOTLICENSED = -2147221230; -pub const REGDB_E_CLASSNOTREG = -2147221164; -pub const RPC_E_CHANGED_MODE = -2147417850; -pub const SAFEARRAYBOUND = extern struct { - cElements: u32, - lLbound: i32, -}; -pub const SAFEARRAY = extern struct { - cDims: u16, - fFeatures: u16, - cbElements: u32, - cLocks: u32, - pvData: ?*anyopaque, - rgsabound: [1]SAFEARRAYBOUND, -}; -pub const CLIPDATA = extern struct { - cbSize: u32, - ulClipFmt: i32, - pClipData: ?*u8, -}; -pub const VERSIONEDSTREAM = extern struct { - guidVersion: Guid, - pStream: ?*IStream, -}; -pub const STREAM_SEEK = enum(u32) { - SET = 0, - CUR = 1, - END = 2, -}; -pub const STATSTG = extern struct { - pwcsName: ?PWSTR, - type: u32, - cbSize: ULARGE_INTEGER, - mtime: FILETIME, - ctime: FILETIME, - atime: FILETIME, - grfMode: u32, - grfLocksSupported: u32, - clsid: Guid, - grfStateBits: u32, - reserved: u32, -}; -pub const IStream = extern struct { - pub const VTable = extern struct { - base: ISequentialStream.VTable, - Seek: *const fn ( - self: *const IStream, - dlibMove: LARGE_INTEGER, - dwOrigin: STREAM_SEEK, - plibNewPosition: ?*ULARGE_INTEGER, - ) callconv(WINAPI) HRESULT, - SetSize: *const fn ( - self: *const IStream, - libNewSize: ULARGE_INTEGER, - ) callconv(WINAPI) HRESULT, - CopyTo: *const fn ( - self: *const IStream, - pstm: ?*IStream, - cb: ULARGE_INTEGER, - pcbRead: ?*ULARGE_INTEGER, - pcbWritten: ?*ULARGE_INTEGER, - ) callconv(WINAPI) HRESULT, - Commit: *const fn ( - self: *const IStream, - grfCommitFlags: u32, - ) callconv(WINAPI) HRESULT, - Revert: *const fn ( - self: *const IStream, - ) callconv(WINAPI) HRESULT, - LockRegion: *const fn ( - self: *const IStream, - libOffset: ULARGE_INTEGER, - cb: ULARGE_INTEGER, - dwLockType: u32, - ) callconv(WINAPI) HRESULT, - UnlockRegion: *const fn ( - self: *const IStream, - libOffset: ULARGE_INTEGER, - cb: ULARGE_INTEGER, - dwLockType: u32, - ) callconv(WINAPI) HRESULT, - Stat: *const fn ( - self: *const IStream, - pstatstg: ?*STATSTG, - grfStatFlag: u32, - ) callconv(WINAPI) HRESULT, - Clone: *const fn ( - self: *const IStream, - ppstm: ?*?*IStream, - ) callconv(WINAPI) HRESULT, - }; - vtable: *const VTable, -}; -pub const COINIT = u32; -pub const COINIT_MULTITHREADED = 0x0; -pub const COINIT_APARTMENTTHREADED = 0x2; -pub const COINIT_DISABLE_OLE1DDE = 0x4; -pub const COINIT_SPEED_OVER_MEMORY = 0x8; -pub const CLSCTX = u32; -pub const CLSCTX_ALL = 23; -pub extern "ole32" fn CoInitializeEx( - pvReserved: ?*anyopaque, - dwCoInit: COINIT, -) callconv(WINAPI) HRESULT; -pub extern "ole32" fn CoCreateInstance( - rclsid: ?*const Guid, - pUnkOuter: ?*IUnknown, - dwClsContext: CLSCTX, - riid: *const Guid, - ppv: ?*?*anyopaque, -) callconv(WINAPI) HRESULT; -pub extern "kernel32" fn CreateEventA( - lpEventAttributes: ?*SECURITY_ATTRIBUTES, - bManualReset: BOOL, - bInitialState: BOOL, - lpName: ?[*:0]const u8, -) callconv(WINAPI) ?*anyopaque; -pub extern "kernel32" fn WaitForSingleObject( - hHandle: ?*anyopaque, - dwMilliseconds: u32, -) callconv(WINAPI) u32; -pub extern "kernel32" fn GetModuleHandleA( - lpModuleName: ?[*:0]const u8, -) callconv(WINAPI) ?*anyopaque; -pub extern "kernel32" fn GetProcAddress( - hModule: ?*anyopaque, - lpProcName: ?[*:0]const u8, -) callconv(WINAPI) ?*const fn () callconv(WINAPI) isize; -pub const INFINITE = 4294967295; -pub const SECURITY_ATTRIBUTES = extern struct { - nLength: u32, - lpSecurityDescriptor: ?*anyopaque, - bInheritHandle: BOOL, -}; -pub const IID_IUnknown = &Guid.initString("00000000-0000-0000-c000-000000000046"); -pub const IUnknown = extern struct { - pub const VTable = extern struct { - QueryInterface: *const fn ( - self: *const IUnknown, - riid: ?*const Guid, - ppvObject: ?*?*anyopaque, - ) callconv(WINAPI) HRESULT, - AddRef: *const fn ( - self: *const IUnknown, - ) callconv(WINAPI) u32, - Release: *const fn ( - self: *const IUnknown, - ) callconv(WINAPI) u32, - }; - vtable: *const VTable, - pub fn MethodMixin(comptime T: type) type { - return struct { - pub inline fn QueryInterface(self: *const T, riid: ?*const Guid, ppvObject: ?*?*anyopaque) HRESULT { - return @as(*const IUnknown.VTable, @ptrCast(self.vtable)).QueryInterface(@as(*const IUnknown, @ptrCast(self)), riid, ppvObject); - } - pub inline fn AddRef(self: *const T) u32 { - return @as(*const IUnknown.VTable, @ptrCast(self.vtable)).AddRef(@as(*const IUnknown, @ptrCast(self))); - } - pub inline fn Release(self: *const T) u32 { - return @as(*const IUnknown.VTable, @ptrCast(self.vtable)).Release(@as(*const IUnknown, @ptrCast(self))); - } - }; - } - pub usingnamespace MethodMixin(@This()); -}; -pub const ISequentialStream = extern struct { - pub const VTable = extern struct { - base: IUnknown.VTable, - Read: *const fn ( - self: *const ISequentialStream, - pv: ?*anyopaque, - cb: u32, - pcbRead: ?*u32, - ) callconv(WINAPI) HRESULT, - Write: *const fn ( - self: *const ISequentialStream, - pv: ?*const anyopaque, - cb: u32, - pcbWritten: ?*u32, - ) callconv(WINAPI) HRESULT, - }; - vtable: *const VTable, -}; -pub const CY = extern union { - anon: extern struct { - Lo: u32, - Hi: i32, - }, - int64: i64, -}; -pub const CAC = extern struct { - cElems: u32, - pElems: ?PSTR, -}; -pub const CAUB = extern struct { - cElems: u32, - pElems: ?*u8, -}; -pub const CAI = extern struct { - cElems: u32, - pElems: ?*i16, -}; -pub const CAUI = extern struct { - cElems: u32, - pElems: ?*u16, -}; -pub const CAL = extern struct { - cElems: u32, - pElems: ?*i32, -}; -pub const CAUL = extern struct { - cElems: u32, - pElems: ?*u32, -}; -pub const CAFLT = extern struct { - cElems: u32, - pElems: ?*f32, -}; -pub const CADBL = extern struct { - cElems: u32, - pElems: ?*f64, -}; -pub const CACY = extern struct { - cElems: u32, - pElems: ?*CY, -}; -pub const CADATE = extern struct { - cElems: u32, - pElems: ?*f64, -}; -pub const CABSTR = extern struct { - cElems: u32, - pElems: ?*?BSTR, -}; -pub const BSTRBLOB = extern struct { - cbSize: u32, - pData: ?*u8, -}; -pub const CABSTRBLOB = extern struct { - cElems: u32, - pElems: ?*BSTRBLOB, -}; -pub const CABOOL = extern struct { - cElems: u32, - pElems: ?*i16, -}; -pub const CASCODE = extern struct { - cElems: u32, - pElems: ?*i32, -}; -pub const CAPROPVARIANT = extern struct { - cElems: u32, - pElems: ?*PROPVARIANT, -}; -pub const CAH = extern struct { - cElems: u32, - pElems: ?*LARGE_INTEGER, -}; -pub const CAUH = extern struct { - cElems: u32, - pElems: ?*ULARGE_INTEGER, -}; -pub const CALPSTR = extern struct { - cElems: u32, - pElems: ?*?PSTR, -}; -pub const CALPWSTR = extern struct { - cElems: u32, - pElems: ?*?PWSTR, -}; -pub const CAFILETIME = extern struct { - cElems: u32, - pElems: ?*FILETIME, -}; -pub const CACLIPDATA = extern struct { - cElems: u32, - pElems: ?*CLIPDATA, -}; -pub const CACLSID = extern struct { - cElems: u32, - pElems: ?*Guid, -}; -pub const BLOB = extern struct { - cbSize: u32, - pBlobData: ?*u8, -}; -pub const INVOKEKIND = enum(i32) { - FUNC = 1, - PROPERTYGET = 2, - PROPERTYPUT = 4, - PROPERTYPUTREF = 8, -}; -pub const IDLDESC = extern struct { - dwReserved: usize, - wIDLFlags: u16, -}; -pub const VARIANT = extern struct { - anon: extern union { - anon: extern struct { - vt: u16, - wReserved1: u16, - wReserved2: u16, - wReserved3: u16, - anon: extern union { - llVal: i64, - lVal: i32, - bVal: u8, - iVal: i16, - fltVal: f32, - dblVal: f64, - boolVal: i16, - __OBSOLETE__VARIANT_BOOL: i16, - scode: i32, - cyVal: CY, - date: f64, - bstrVal: ?BSTR, - punkVal: ?*IUnknown, - pdispVal: ?*IDispatch, - parray: ?*SAFEARRAY, - pbVal: ?*u8, - piVal: ?*i16, - plVal: ?*i32, - pllVal: ?*i64, - pfltVal: ?*f32, - pdblVal: ?*f64, - pboolVal: ?*i16, - __OBSOLETE__VARIANT_PBOOL: ?*i16, - pscode: ?*i32, - pcyVal: ?*CY, - pdate: ?*f64, - pbstrVal: ?*?BSTR, - ppunkVal: ?*?*IUnknown, - ppdispVal: ?*?*IDispatch, - pparray: ?*?*SAFEARRAY, - pvarVal: ?*VARIANT, - byref: ?*anyopaque, - cVal: CHAR, - uiVal: u16, - ulVal: u32, - ullVal: u64, - intVal: i32, - uintVal: u32, - pdecVal: ?*DECIMAL, - pcVal: ?PSTR, - puiVal: ?*u16, - pulVal: ?*u32, - pullVal: ?*u64, - pintVal: ?*i32, - puintVal: ?*u32, - anon: extern struct { - pvRecord: ?*anyopaque, - pRecInfo: ?*IRecordInfo, - }, - }, - }, - decVal: DECIMAL, - }, -}; -pub const IRecordInfo = extern struct { - pub const VTable = extern struct { - base: IUnknown.VTable, - RecordInit: *const fn ( - self: *const IRecordInfo, - pvNew: ?*anyopaque, - ) callconv(WINAPI) HRESULT, - RecordClear: *const fn ( - self: *const IRecordInfo, - pvExisting: ?*anyopaque, - ) callconv(WINAPI) HRESULT, - RecordCopy: *const fn ( - self: *const IRecordInfo, - pvExisting: ?*anyopaque, - pvNew: ?*anyopaque, - ) callconv(WINAPI) HRESULT, - GetGuid: *const fn ( - self: *const IRecordInfo, - pguid: ?*Guid, - ) callconv(WINAPI) HRESULT, - GetName: *const fn ( - self: *const IRecordInfo, - pbstrName: ?*?BSTR, - ) callconv(WINAPI) HRESULT, - GetSize: *const fn ( - self: *const IRecordInfo, - pcbSize: ?*u32, - ) callconv(WINAPI) HRESULT, - GetTypeInfo: *const fn ( - self: *const IRecordInfo, - ppTypeInfo: ?*?*ITypeInfo, - ) callconv(WINAPI) HRESULT, - GetField: *const fn ( - self: *const IRecordInfo, - pvData: ?*anyopaque, - szFieldName: ?[*:0]const u16, - pvarField: ?*VARIANT, - ) callconv(WINAPI) HRESULT, - GetFieldNoCopy: *const fn ( - self: *const IRecordInfo, - pvData: ?*anyopaque, - szFieldName: ?[*:0]const u16, - pvarField: ?*VARIANT, - ppvDataCArray: ?*?*anyopaque, - ) callconv(WINAPI) HRESULT, - PutField: *const fn ( - self: *const IRecordInfo, - wFlags: u32, - pvData: ?*anyopaque, - szFieldName: ?[*:0]const u16, - pvarField: ?*VARIANT, - ) callconv(WINAPI) HRESULT, - PutFieldNoCopy: *const fn ( - self: *const IRecordInfo, - wFlags: u32, - pvData: ?*anyopaque, - szFieldName: ?[*:0]const u16, - pvarField: ?*VARIANT, - ) callconv(WINAPI) HRESULT, - GetFieldNames: *const fn ( - self: *const IRecordInfo, - pcNames: ?*u32, - rgBstrNames: [*]?BSTR, - ) callconv(WINAPI) HRESULT, - IsMatchingType: *const fn ( - self: *const IRecordInfo, - pRecordInfo: ?*IRecordInfo, - ) callconv(WINAPI) BOOL, - RecordCreate: *const fn ( - self: *const IRecordInfo, - ) callconv(WINAPI) ?*anyopaque, - RecordCreateCopy: *const fn ( - self: *const IRecordInfo, - pvSource: ?*anyopaque, - ppvDest: ?*?*anyopaque, - ) callconv(WINAPI) HRESULT, - RecordDestroy: *const fn ( - self: *const IRecordInfo, - pvRecord: ?*anyopaque, - ) callconv(WINAPI) HRESULT, - }; - vtable: *const VTable, -}; -pub const PARAMDESCEX = extern struct { - cBytes: u32, - varDefaultValue: VARIANT, -}; -pub const PARAMDESC = extern struct { - pparamdescex: ?*PARAMDESCEX, - wParamFlags: u16, -}; -pub const ARRAYDESC = extern struct { - tdescElem: TYPEDESC, - cDims: u16, - rgbounds: [1]SAFEARRAYBOUND, -}; -pub const TYPEDESC = extern struct { - anon: extern union { - lptdesc: ?*TYPEDESC, - lpadesc: ?*ARRAYDESC, - hreftype: u32, - }, - vt: u16, -}; -pub const ELEMDESC = extern struct { - tdesc: TYPEDESC, - anon: extern union { - idldesc: IDLDESC, - paramdesc: PARAMDESC, - }, -}; -pub const CALLCONV = enum(i32) { - FASTCALL = 0, - CDECL = 1, - MSCPASCAL = 2, - MACPASCAL = 3, - STDCALL = 4, - FPFASTCALL = 5, - SYSCALL = 6, - MPWCDECL = 7, - MPWPASCAL = 8, - MAX = 9, -}; -pub const FUNCKIND = enum(i32) { - VIRTUAL = 0, - PUREVIRTUAL = 1, - NONVIRTUAL = 2, - STATIC = 3, - DISPATCH = 4, -}; -pub const FUNCDESC = extern struct { - memid: i32, - lprgscode: ?*i32, - lprgelemdescParam: ?*ELEMDESC, - funckind: FUNCKIND, - invkind: INVOKEKIND, - @"callconv": CALLCONV, - cParams: i16, - cParamsOpt: i16, - oVft: i16, - cScodes: i16, - elemdescFunc: ELEMDESC, - wFuncFlags: u16, -}; -pub const TYPEATTR = extern struct { - guid: Guid, - lcid: u32, - dwReserved: u32, - memidConstructor: i32, - memidDestructor: i32, - lpstrSchema: ?PWSTR, - cbSizeInstance: u32, - typekind: TYPEKIND, - cFuncs: u16, - cVars: u16, - cImplTypes: u16, - cbSizeVft: u16, - cbAlignment: u16, - wTypeFlags: u16, - wMajorVerNum: u16, - wMinorVerNum: u16, - tdescAlias: TYPEDESC, - idldescType: IDLDESC, -}; -pub const TYPEKIND = enum(i32) { - ENUM = 0, - RECORD = 1, - MODULE = 2, - INTERFACE = 3, - DISPATCH = 4, - COCLASS = 5, - ALIAS = 6, - UNION = 7, - MAX = 8, -}; -pub const DESCKIND = enum(i32) { - NONE = 0, - FUNCDESC = 1, - VARDESC = 2, - TYPECOMP = 3, - IMPLICITAPPOBJ = 4, - MAX = 5, -}; -pub const BINDPTR = extern union { - lpfuncdesc: ?*FUNCDESC, - lpvardesc: ?*VARDESC, - lptcomp: ?*ITypeComp, -}; -pub const VARDESC = extern struct { - memid: i32, - lpstrSchema: ?PWSTR, - anon: extern union { - oInst: u32, - lpvarValue: ?*VARIANT, - }, - elemdescVar: ELEMDESC, - wVarFlags: u16, - varkind: VARKIND, -}; -pub const VARKIND = enum(i32) { - PERINSTANCE = 0, - STATIC = 1, - CONST = 2, - DISPATCH = 3, -}; -pub const ITypeComp = extern struct { - pub const VTable = extern struct { - base: IUnknown.VTable, - Bind: *const fn ( - self: *const ITypeComp, - szName: ?PWSTR, - lHashVal: u32, - wFlags: u16, - ppTInfo: ?*?*ITypeInfo, - pDescKind: ?*DESCKIND, - pBindPtr: ?*BINDPTR, - ) callconv(WINAPI) HRESULT, - BindType: *const fn ( - self: *const ITypeComp, - szName: ?PWSTR, - lHashVal: u32, - ppTInfo: ?*?*ITypeInfo, - ppTComp: ?*?*ITypeComp, - ) callconv(WINAPI) HRESULT, - }; - vtable: *const VTable, -}; -pub const DISPPARAMS = extern struct { - rgvarg: ?*VARIANT, - rgdispidNamedArgs: ?*i32, - cArgs: u32, - cNamedArgs: u32, -}; -pub const EXCEPINFO = extern struct { - wCode: u16, - wReserved: u16, - bstrSource: ?BSTR, - bstrDescription: ?BSTR, - bstrHelpFile: ?BSTR, - dwHelpContext: u32, - pvReserved: ?*anyopaque, - pfnDeferredFillIn: ?LPEXCEPFINO_DEFERRED_FILLIN, - scode: i32, -}; -pub const LPEXCEPFINO_DEFERRED_FILLIN = *const fn ( - pExcepInfo: ?*EXCEPINFO, -) callconv(WINAPI) HRESULT; -pub const ITypeInfo = extern struct { - pub const VTable = extern struct { - base: IUnknown.VTable, - GetTypeAttr: *const fn ( - self: *const ITypeInfo, - ppTypeAttr: ?*?*TYPEATTR, - ) callconv(WINAPI) HRESULT, - GetTypeComp: *const fn ( - self: *const ITypeInfo, - ppTComp: ?*?*ITypeComp, - ) callconv(WINAPI) HRESULT, - GetFuncDesc: *const fn ( - self: *const ITypeInfo, - index: u32, - ppFuncDesc: ?*?*FUNCDESC, - ) callconv(WINAPI) HRESULT, - GetVarDesc: *const fn ( - self: *const ITypeInfo, - index: u32, - ppVarDesc: ?*?*VARDESC, - ) callconv(WINAPI) HRESULT, - GetNames: *const fn ( - self: *const ITypeInfo, - memid: i32, - rgBstrNames: [*]?BSTR, - cMaxNames: u32, - pcNames: ?*u32, - ) callconv(WINAPI) HRESULT, - GetRefTypeOfImplType: *const fn ( - self: *const ITypeInfo, - index: u32, - pRefType: ?*u32, - ) callconv(WINAPI) HRESULT, - GetImplTypeFlags: *const fn ( - self: *const ITypeInfo, - index: u32, - pImplTypeFlags: ?*i32, - ) callconv(WINAPI) HRESULT, - GetIDsOfNames: *const fn ( - self: *const ITypeInfo, - rgszNames: [*]?PWSTR, - cNames: u32, - pMemId: [*]i32, - ) callconv(WINAPI) HRESULT, - Invoke: *const fn ( - self: *const ITypeInfo, - pvInstance: ?*anyopaque, - memid: i32, - wFlags: u16, - pDispParams: ?*DISPPARAMS, - pVarResult: ?*VARIANT, - pExcepInfo: ?*EXCEPINFO, - puArgErr: ?*u32, - ) callconv(WINAPI) HRESULT, - GetDocumentation: *const fn ( - self: *const ITypeInfo, - memid: i32, - pBstrName: ?*?BSTR, - pBstrDocString: ?*?BSTR, - pdwHelpContext: ?*u32, - pBstrHelpFile: ?*?BSTR, - ) callconv(WINAPI) HRESULT, - GetDllEntry: *const fn ( - self: *const ITypeInfo, - memid: i32, - invKind: INVOKEKIND, - pBstrDllName: ?*?BSTR, - pBstrName: ?*?BSTR, - pwOrdinal: ?*u16, - ) callconv(WINAPI) HRESULT, - GetRefTypeInfo: *const fn ( - self: *const ITypeInfo, - hRefType: u32, - ppTInfo: ?*?*ITypeInfo, - ) callconv(WINAPI) HRESULT, - AddressOfMember: *const fn ( - self: *const ITypeInfo, - memid: i32, - invKind: INVOKEKIND, - ppv: ?*?*anyopaque, - ) callconv(WINAPI) HRESULT, - CreateInstance: *const fn ( - self: *const ITypeInfo, - pUnkOuter: ?*IUnknown, - riid: ?*const Guid, - ppvObj: ?*?*anyopaque, - ) callconv(WINAPI) HRESULT, - GetMops: *const fn ( - self: *const ITypeInfo, - memid: i32, - pBstrMops: ?*?BSTR, - ) callconv(WINAPI) HRESULT, - GetContainingTypeLib: *const fn ( - self: *const ITypeInfo, - ppTLib: ?*?*ITypeLib, - pIndex: ?*u32, - ) callconv(WINAPI) HRESULT, - ReleaseTypeAttr: *const fn ( - self: *const ITypeInfo, - pTypeAttr: ?*TYPEATTR, - ) callconv(WINAPI) void, - ReleaseFuncDesc: *const fn ( - self: *const ITypeInfo, - pFuncDesc: ?*FUNCDESC, - ) callconv(WINAPI) void, - ReleaseVarDesc: *const fn ( - self: *const ITypeInfo, - pVarDesc: ?*VARDESC, - ) callconv(WINAPI) void, - }; - vtable: *const VTable, -}; -pub const SYSKIND = enum(i32) { - WIN16 = 0, - WIN32 = 1, - MAC = 2, - WIN64 = 3, -}; -pub const TLIBATTR = extern struct { - guid: Guid, - lcid: u32, - syskind: SYSKIND, - wMajorVerNum: u16, - wMinorVerNum: u16, - wLibFlags: u16, -}; -pub const ITypeLib = extern struct { - pub const VTable = extern struct { - base: IUnknown.VTable, - GetTypeInfoCount: *const fn ( - self: *const ITypeLib, - ) callconv(WINAPI) u32, - GetTypeInfo: *const fn ( - self: *const ITypeLib, - index: u32, - ppTInfo: ?*?*ITypeInfo, - ) callconv(WINAPI) HRESULT, - GetTypeInfoType: *const fn ( - self: *const ITypeLib, - index: u32, - pTKind: ?*TYPEKIND, - ) callconv(WINAPI) HRESULT, - GetTypeInfoOfGuid: *const fn ( - self: *const ITypeLib, - guid: ?*const Guid, - ppTinfo: ?*?*ITypeInfo, - ) callconv(WINAPI) HRESULT, - GetLibAttr: *const fn ( - self: *const ITypeLib, - ppTLibAttr: ?*?*TLIBATTR, - ) callconv(WINAPI) HRESULT, - GetTypeComp: *const fn ( - self: *const ITypeLib, - ppTComp: ?*?*ITypeComp, - ) callconv(WINAPI) HRESULT, - GetDocumentation: *const fn ( - self: *const ITypeLib, - index: i32, - pBstrName: ?*?BSTR, - pBstrDocString: ?*?BSTR, - pdwHelpContext: ?*u32, - pBstrHelpFile: ?*?BSTR, - ) callconv(WINAPI) HRESULT, - IsName: *const fn ( - self: *const ITypeLib, - szNameBuf: ?PWSTR, - lHashVal: u32, - pfName: ?*BOOL, - ) callconv(WINAPI) HRESULT, - FindName: *const fn ( - self: *const ITypeLib, - szNameBuf: ?PWSTR, - lHashVal: u32, - ppTInfo: [*]?*ITypeInfo, - rgMemId: [*]i32, - pcFound: ?*u16, - ) callconv(WINAPI) HRESULT, - ReleaseTLibAttr: *const fn ( - self: *const ITypeLib, - pTLibAttr: ?*TLIBATTR, - ) callconv(WINAPI) void, - }; - vtable: *const VTable, -}; -pub const IDispatch = extern struct { - pub const VTable = extern struct { - base: IUnknown.VTable, - GetTypeInfoCount: *const fn ( - self: *const IDispatch, - pctinfo: ?*u32, - ) callconv(WINAPI) HRESULT, - GetTypeInfo: *const fn ( - self: *const IDispatch, - iTInfo: u32, - lcid: u32, - ppTInfo: ?*?*ITypeInfo, - ) callconv(WINAPI) HRESULT, - GetIDsOfNames: *const fn ( - self: *const IDispatch, - riid: ?*const Guid, - rgszNames: [*]?PWSTR, - cNames: u32, - lcid: u32, - rgDispId: [*]i32, - ) callconv(WINAPI) HRESULT, - Invoke: *const fn ( - self: *const IDispatch, - dispIdMember: i32, - riid: ?*const Guid, - lcid: u32, - wFlags: u16, - pDispParams: ?*DISPPARAMS, - pVarResult: ?*VARIANT, - pExcepInfo: ?*EXCEPINFO, - puArgErr: ?*u32, - ) callconv(WINAPI) HRESULT, - }; - vtable: *const VTable, -}; -pub const IEnumSTATSTG = extern struct { - pub const VTable = extern struct { - base: IUnknown.VTable, - Next: *const fn ( - self: *const IEnumSTATSTG, - celt: u32, - rgelt: [*]STATSTG, - pceltFetched: ?*u32, - ) callconv(WINAPI) HRESULT, - Skip: *const fn ( - self: *const IEnumSTATSTG, - celt: u32, - ) callconv(WINAPI) HRESULT, - Reset: *const fn ( - self: *const IEnumSTATSTG, - ) callconv(WINAPI) HRESULT, - Clone: *const fn ( - self: *const IEnumSTATSTG, - ppenum: ?*?*IEnumSTATSTG, - ) callconv(WINAPI) HRESULT, - }; - vtable: *const VTable, -}; -pub const IStorage = extern struct { - pub const VTable = extern struct { - base: IUnknown.VTable, - CreateStream: *const fn ( - self: *const IStorage, - pwcsName: ?[*:0]const u16, - grfMode: u32, - reserved1: u32, - reserved2: u32, - ppstm: ?*?*IStream, - ) callconv(WINAPI) HRESULT, - OpenStream: *const fn ( - self: *const IStorage, - pwcsName: ?[*:0]const u16, - reserved1: ?*anyopaque, - grfMode: u32, - reserved2: u32, - ppstm: ?*?*IStream, - ) callconv(WINAPI) HRESULT, - CreateStorage: *const fn ( - self: *const IStorage, - pwcsName: ?[*:0]const u16, - grfMode: u32, - reserved1: u32, - reserved2: u32, - ppstg: ?*?*IStorage, - ) callconv(WINAPI) HRESULT, - OpenStorage: *const fn ( - self: *const IStorage, - pwcsName: ?[*:0]const u16, - pstgPriority: ?*IStorage, - grfMode: u32, - snbExclude: ?*?*u16, - reserved: u32, - ppstg: ?*?*IStorage, - ) callconv(WINAPI) HRESULT, - CopyTo: *const fn ( - self: *const IStorage, - ciidExclude: u32, - rgiidExclude: ?[*]const Guid, - snbExclude: ?*?*u16, - pstgDest: ?*IStorage, - ) callconv(WINAPI) HRESULT, - MoveElementTo: *const fn ( - self: *const IStorage, - pwcsName: ?[*:0]const u16, - pstgDest: ?*IStorage, - pwcsNewName: ?[*:0]const u16, - grfFlags: u32, - ) callconv(WINAPI) HRESULT, - Commit: *const fn ( - self: *const IStorage, - grfCommitFlags: u32, - ) callconv(WINAPI) HRESULT, - Revert: *const fn ( - self: *const IStorage, - ) callconv(WINAPI) HRESULT, - EnumElements: *const fn ( - self: *const IStorage, - reserved1: u32, - reserved2: ?*anyopaque, - reserved3: u32, - ppenum: ?*?*IEnumSTATSTG, - ) callconv(WINAPI) HRESULT, - DestroyElement: *const fn ( - self: *const IStorage, - pwcsName: ?[*:0]const u16, - ) callconv(WINAPI) HRESULT, - RenameElement: *const fn ( - self: *const IStorage, - pwcsOldName: ?[*:0]const u16, - pwcsNewName: ?[*:0]const u16, - ) callconv(WINAPI) HRESULT, - SetElementTimes: *const fn ( - self: *const IStorage, - pwcsName: ?[*:0]const u16, - pctime: ?*const FILETIME, - patime: ?*const FILETIME, - pmtime: ?*const FILETIME, - ) callconv(WINAPI) HRESULT, - SetClass: *const fn ( - self: *const IStorage, - clsid: ?*const Guid, - ) callconv(WINAPI) HRESULT, - SetStateBits: *const fn ( - self: *const IStorage, - grfStateBits: u32, - grfMask: u32, - ) callconv(WINAPI) HRESULT, - Stat: *const fn ( - self: *const IStorage, - pstatstg: ?*STATSTG, - grfStatFlag: u32, - ) callconv(WINAPI) HRESULT, - }; - vtable: *const VTable, -}; -pub const PROPVARIANT = extern struct { - anon: extern union { - anon: extern struct { - vt: u16, - wReserved1: u16, - wReserved2: u16, - wReserved3: u16, - anon: extern union { - cVal: CHAR, - bVal: u8, - iVal: i16, - uiVal: u16, - lVal: i32, - ulVal: u32, - intVal: i32, - uintVal: u32, - hVal: LARGE_INTEGER, - uhVal: ULARGE_INTEGER, - fltVal: f32, - dblVal: f64, - boolVal: i16, - __OBSOLETE__VARIANT_BOOL: i16, - scode: i32, - cyVal: CY, - date: f64, - filetime: FILETIME, - puuid: ?*Guid, - pclipdata: ?*CLIPDATA, - bstrVal: ?BSTR, - bstrblobVal: BSTRBLOB, - blob: BLOB, - pszVal: ?PSTR, - pwszVal: ?PWSTR, - punkVal: ?*IUnknown, - pdispVal: ?*IDispatch, - pStream: ?*IStream, - pStorage: ?*IStorage, - pVersionedStream: ?*VERSIONEDSTREAM, - parray: ?*SAFEARRAY, - cac: CAC, - caub: CAUB, - cai: CAI, - caui: CAUI, - cal: CAL, - caul: CAUL, - cah: CAH, - cauh: CAUH, - caflt: CAFLT, - cadbl: CADBL, - cabool: CABOOL, - cascode: CASCODE, - cacy: CACY, - cadate: CADATE, - cafiletime: CAFILETIME, - cauuid: CACLSID, - caclipdata: CACLIPDATA, - cabstr: CABSTR, - cabstrblob: CABSTRBLOB, - calpstr: CALPSTR, - calpwstr: CALPWSTR, - capropvar: CAPROPVARIANT, - pcVal: ?PSTR, - pbVal: ?*u8, - piVal: ?*i16, - puiVal: ?*u16, - plVal: ?*i32, - pulVal: ?*u32, - pintVal: ?*i32, - puintVal: ?*u32, - pfltVal: ?*f32, - pdblVal: ?*f64, - pboolVal: ?*i16, - pdecVal: ?*DECIMAL, - pscode: ?*i32, - pcyVal: ?*CY, - pdate: ?*f64, - pbstrVal: ?*?BSTR, - ppunkVal: ?*?*IUnknown, - ppdispVal: ?*?*IDispatch, - pparray: ?*?*SAFEARRAY, - pvarVal: ?*PROPVARIANT, - }, - }, - decVal: DECIMAL, - }, -}; -pub const WAVEFORMATEX = extern struct { - wFormatTag: u16 align(1), - nChannels: u16 align(1), - nSamplesPerSec: u32 align(1), - nAvgBytesPerSec: u32 align(1), - nBlockAlign: u16 align(1), - wBitsPerSample: u16 align(1), - cbSize: u16 align(1), -}; -pub const WAVEFORMATEXTENSIBLE = extern struct { - Format: WAVEFORMATEX align(1), - Samples: extern union { - wValidBitsPerSample: u16 align(1), - wSamplesPerBlock: u16 align(1), - wReserved: u16 align(1), - }, - dwChannelMask: u32 align(1), - SubFormat: Guid align(1), -}; -pub const CLSID_MMDeviceEnumerator = &Guid.initString("bcde0395-e52f-467c-8e3d-c4579291692e"); -pub const DIRECTX_AUDIO_ACTIVATION_PARAMS = extern struct { - cbDirectXAudioActivationParams: u32, - guidAudioSession: Guid, - dwAudioStreamFlags: u32, -}; -pub const DataFlow = enum(i32) { - render = 0, - capture = 1, - all = 2, -}; -pub const Role = enum(i32) { - console = 0, - multimedia = 1, - communications = 2, -}; -pub const AUDCLNT_SHAREMODE = enum(i32) { - SHARED = 0, - EXCLUSIVE = 1, -}; -pub const IID_IAudioClient = &Guid.initString("1cb9ad4c-dbfa-4c32-b178-c2f568a703b2"); -pub const IAudioClient = extern struct { - pub const VTable = extern struct { - base: IUnknown.VTable, - Initialize: *const fn ( - self: *const IAudioClient, - ShareMode: AUDCLNT_SHAREMODE, - StreamFlags: u32, - hnsBufferDuration: i64, - hnsPeriodicity: i64, - pFormat: ?*const WAVEFORMATEX, - AudioSessionGuid: ?*const Guid, - ) callconv(WINAPI) HRESULT, - GetBufferSize: *const fn ( - self: *const IAudioClient, - pNumBufferFrames: ?*u32, - ) callconv(WINAPI) HRESULT, - GetStreamLatency: *const fn ( - self: *const IAudioClient, - phnsLatency: ?*i64, - ) callconv(WINAPI) HRESULT, - GetCurrentPadding: *const fn ( - self: *const IAudioClient, - pNumPaddingFrames: ?*u32, - ) callconv(WINAPI) HRESULT, - IsFormatSupported: *const fn ( - self: *const IAudioClient, - ShareMode: AUDCLNT_SHAREMODE, - pFormat: ?*const WAVEFORMATEX, - ppClosestMatch: ?*?*WAVEFORMATEX, - ) callconv(WINAPI) HRESULT, - GetMixFormat: *const fn ( - self: *const IAudioClient, - ppDeviceFormat: ?*?*WAVEFORMATEX, - ) callconv(WINAPI) HRESULT, - GetDevicePeriod: *const fn ( - self: *const IAudioClient, - phnsDefaultDevicePeriod: ?*i64, - phnsMinimumDevicePeriod: ?*i64, - ) callconv(WINAPI) HRESULT, - Start: *const fn ( - self: *const IAudioClient, - ) callconv(WINAPI) HRESULT, - Stop: *const fn ( - self: *const IAudioClient, - ) callconv(WINAPI) HRESULT, - Reset: *const fn ( - self: *const IAudioClient, - ) callconv(WINAPI) HRESULT, - SetEventHandle: *const fn ( - self: *const IAudioClient, - eventHandle: ?*anyopaque, - ) callconv(WINAPI) HRESULT, - GetService: *const fn ( - self: *const IAudioClient, - riid: ?*const Guid, - ppv: ?*?*anyopaque, - ) callconv(WINAPI) HRESULT, - }; - vtable: *const VTable, - pub fn MethodMixin(comptime T: type) type { - return struct { - pub usingnamespace IUnknown.MethodMixin(T); - pub inline fn Initialize(self: *const T, ShareMode: AUDCLNT_SHAREMODE, StreamFlags: u32, hnsBufferDuration: i64, hnsPeriodicity: i64, pFormat: ?*const WAVEFORMATEX, AudioSessionGuid: ?*const Guid) HRESULT { - return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).Initialize(@as(*const IAudioClient, @ptrCast(self)), ShareMode, StreamFlags, hnsBufferDuration, hnsPeriodicity, pFormat, AudioSessionGuid); - } - pub inline fn GetBufferSize(self: *const T, pNumBufferFrames: ?*u32) HRESULT { - return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).GetBufferSize(@as(*const IAudioClient, @ptrCast(self)), pNumBufferFrames); - } - pub inline fn GetStreamLatency(self: *const T, phnsLatency: ?*i64) HRESULT { - return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).GetStreamLatency(@as(*const IAudioClient, @ptrCast(self)), phnsLatency); - } - pub inline fn GetCurrentPadding(self: *const T, pNumPaddingFrames: ?*u32) HRESULT { - return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).GetCurrentPadding(@as(*const IAudioClient, @ptrCast(self)), pNumPaddingFrames); - } - pub inline fn IsFormatSupported(self: *const T, ShareMode: AUDCLNT_SHAREMODE, pFormat: ?*const WAVEFORMATEX, ppClosestMatch: ?*?*WAVEFORMATEX) HRESULT { - return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).IsFormatSupported(@as(*const IAudioClient, @ptrCast(self)), ShareMode, pFormat, ppClosestMatch); - } - pub inline fn GetMixFormat(self: *const T, ppDeviceFormat: ?*?*WAVEFORMATEX) HRESULT { - return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).GetMixFormat(@as(*const IAudioClient, @ptrCast(self)), ppDeviceFormat); - } - pub inline fn GetDevicePeriod(self: *const T, phnsDefaultDevicePeriod: ?*i64, phnsMinimumDevicePeriod: ?*i64) HRESULT { - return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).GetDevicePeriod(@as(*const IAudioClient, @ptrCast(self)), phnsDefaultDevicePeriod, phnsMinimumDevicePeriod); - } - pub inline fn Start(self: *const T) HRESULT { - return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).Start(@as(*const IAudioClient, @ptrCast(self))); - } - pub inline fn Stop(self: *const T) HRESULT { - return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).Stop(@as(*const IAudioClient, @ptrCast(self))); - } - pub inline fn Reset(self: *const T) HRESULT { - return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).Reset(@as(*const IAudioClient, @ptrCast(self))); - } - pub inline fn SetEventHandle(self: *const T, eventHandle: ?*anyopaque) HRESULT { - return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).SetEventHandle(@as(*const IAudioClient, @ptrCast(self)), eventHandle); - } - pub inline fn GetService(self: *const T, riid: ?*const Guid, ppv: ?*?*anyopaque) HRESULT { - return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).GetService(@as(*const IAudioClient, @ptrCast(self)), riid, ppv); - } - }; - } - pub usingnamespace MethodMixin(@This()); -}; -pub const AUDCLNT_STREAMOPTIONS = enum(u32) { - NONE = 0, - RAW = 1, - MATCH_FORMAT = 2, - AMBISONICS = 4, -}; -pub const AudioClientProperties = extern struct { - cbSize: u32, - bIsOffload: BOOL, - eCategory: AUDIO_STREAM_CATEGORY, - Options: AUDCLNT_STREAMOPTIONS, -}; -pub const AUDIO_STREAM_CATEGORY = enum(i32) { - Other = 0, - ForegroundOnlyMedia = 1, - Communications = 3, - Alerts = 4, - SoundEffects = 5, - GameEffects = 6, - GameMedia = 7, - GameChat = 8, - Speech = 9, - Movie = 10, - Media = 11, - FarFieldSpeech = 12, - UniformSpeech = 13, - VoiceTyping = 14, -}; -const IID_IAudioClient2 = &Guid.initString("726778cd-f60a-4eda-82de-e47610cd78aa"); -pub const IAudioClient2 = extern struct { - pub const VTable = extern struct { - base: IAudioClient.VTable, - IsOffloadCapable: *const fn ( - self: *const IAudioClient2, - Category: AUDIO_STREAM_CATEGORY, - pbOffloadCapable: ?*BOOL, - ) callconv(WINAPI) HRESULT, - SetClientProperties: *const fn ( - self: *const IAudioClient2, - pProperties: ?*const AudioClientProperties, - ) callconv(WINAPI) HRESULT, - GetBufferSizeLimits: *const fn ( - self: *const IAudioClient2, - pFormat: ?*const WAVEFORMATEX, - bEventDriven: BOOL, - phnsMinBufferDuration: ?*i64, - phnsMaxBufferDuration: ?*i64, - ) callconv(WINAPI) HRESULT, - }; - vtable: *const VTable, - pub fn MethodMixin(comptime T: type) type { - return struct { - pub usingnamespace IAudioClient.MethodMixin(T); - pub inline fn IsOffloadCapable(self: *const T, Category: AUDIO_STREAM_CATEGORY, pbOffloadCapable: ?*BOOL) HRESULT { - return @as(*const IAudioClient2.VTable, @ptrCast(self.vtable)).IsOffloadCapable(@as(*const IAudioClient2, @ptrCast(self)), Category, pbOffloadCapable); - } - pub inline fn SetClientProperties(self: *const T, pProperties: ?*const AudioClientProperties) HRESULT { - return @as(*const IAudioClient2.VTable, @ptrCast(self.vtable)).SetClientProperties(@as(*const IAudioClient2, @ptrCast(self)), pProperties); - } - pub inline fn GetBufferSizeLimits(self: *const T, pFormat: ?*const WAVEFORMATEX, bEventDriven: BOOL, phnsMinBufferDuration: ?*i64, phnsMaxBufferDuration: ?*i64) HRESULT { - return @as(*const IAudioClient2.VTable, @ptrCast(self.vtable)).GetBufferSizeLimits(@as(*const IAudioClient2, @ptrCast(self)), pFormat, bEventDriven, phnsMinBufferDuration, phnsMaxBufferDuration); - } - }; - } - pub usingnamespace MethodMixin(@This()); -}; -pub const IID_IAudioClient3 = &Guid.initString("7ed4ee07-8e67-4cd4-8c1a-2b7a5987ad42"); -pub const IAudioClient3 = extern struct { - pub const VTable = extern struct { - base: IAudioClient2.VTable, - GetSharedModeEnginePeriod: *const fn ( - self: *const IAudioClient3, - pFormat: ?*const WAVEFORMATEX, - pDefaultPeriodInFrames: ?*u32, - pFundamentalPeriodInFrames: ?*u32, - pMinPeriodInFrames: ?*u32, - pMaxPeriodInFrames: ?*u32, - ) callconv(WINAPI) HRESULT, - GetCurrentSharedModeEnginePeriod: *const fn ( - self: *const IAudioClient3, - ppFormat: ?*?*WAVEFORMATEX, - pCurrentPeriodInFrames: ?*u32, - ) callconv(WINAPI) HRESULT, - InitializeSharedAudioStream: *const fn ( - self: *const IAudioClient3, - StreamFlags: u32, - PeriodInFrames: u32, - pFormat: ?*const WAVEFORMATEX, - AudioSessionGuid: ?*const Guid, - ) callconv(WINAPI) HRESULT, - }; - vtable: *const VTable, - pub fn MethodMixin(comptime T: type) type { - return struct { - pub usingnamespace IAudioClient2.MethodMixin(T); - pub inline fn GetSharedModeEnginePeriod(self: *const T, pFormat: ?*const WAVEFORMATEX, pDefaultPeriodInFrames: ?*u32, pFundamentalPeriodInFrames: ?*u32, pMinPeriodInFrames: ?*u32, pMaxPeriodInFrames: ?*u32) HRESULT { - return @as(*const IAudioClient3.VTable, @ptrCast(self.vtable)).GetSharedModeEnginePeriod(@as(*const IAudioClient3, @ptrCast(self)), pFormat, pDefaultPeriodInFrames, pFundamentalPeriodInFrames, pMinPeriodInFrames, pMaxPeriodInFrames); - } - pub inline fn GetCurrentSharedModeEnginePeriod(self: *const T, ppFormat: ?*?*WAVEFORMATEX, pCurrentPeriodInFrames: ?*u32) HRESULT { - return @as(*const IAudioClient3.VTable, @ptrCast(self.vtable)).GetCurrentSharedModeEnginePeriod(@as(*const IAudioClient3, @ptrCast(self)), ppFormat, pCurrentPeriodInFrames); - } - pub inline fn InitializeSharedAudioStream(self: *const T, StreamFlags: u32, PeriodInFrames: u32, pFormat: ?*const WAVEFORMATEX, AudioSessionGuid: ?*const Guid) HRESULT { - return @as(*const IAudioClient3.VTable, @ptrCast(self.vtable)).InitializeSharedAudioStream(@as(*const IAudioClient3, @ptrCast(self)), StreamFlags, PeriodInFrames, pFormat, AudioSessionGuid); - } - }; - } - pub usingnamespace MethodMixin(@This()); -}; -pub extern "ole32" fn CoTaskMemFree(pv: ?*anyopaque) callconv(WINAPI) void; -pub const IID_IAudioRenderClient = &Guid.initString("f294acfc-3146-4483-a7bf-addca7c260e2"); -pub const IAudioRenderClient = extern struct { - pub const VTable = extern struct { - base: IUnknown.VTable, - GetBuffer: *const fn ( - self: *const IAudioRenderClient, - NumFramesRequested: u32, - ppData: ?*?*u8, - ) callconv(WINAPI) HRESULT, - ReleaseBuffer: *const fn ( - self: *const IAudioRenderClient, - NumFramesWritten: u32, - dwFlags: u32, - ) callconv(WINAPI) HRESULT, - }; - vtable: *const VTable, - pub fn MethodMixin(comptime T: type) type { - return struct { - pub usingnamespace IUnknown.MethodMixin(T); - pub inline fn GetBuffer(self: *const T, NumFramesRequested: u32, ppData: ?*?*u8) HRESULT { - return @as(*const IAudioRenderClient.VTable, @ptrCast(self.vtable)).GetBuffer(@as(*const IAudioRenderClient, @ptrCast(self)), NumFramesRequested, ppData); - } - pub inline fn ReleaseBuffer(self: *const T, NumFramesWritten: u32, dwFlags: u32) HRESULT { - return @as(*const IAudioRenderClient.VTable, @ptrCast(self.vtable)).ReleaseBuffer(@as(*const IAudioRenderClient, @ptrCast(self)), NumFramesWritten, dwFlags); - } - }; - } - pub usingnamespace MethodMixin(@This()); -}; -pub const IID_IAudioCaptureClient = &Guid.initString("c8adbd64-e71e-48a0-a4de-185c395cd317"); -pub const IAudioCaptureClient = extern struct { - pub const VTable = extern struct { - base: IUnknown.VTable, - GetBuffer: *const fn ( - self: *const IAudioCaptureClient, - ppData: ?*?*u8, - pNumFramesToRead: ?*u32, - pdwFlags: ?*u32, - pu64DevicePosition: ?*u64, - pu64QPCPosition: ?*u64, - ) callconv(WINAPI) HRESULT, - ReleaseBuffer: *const fn ( - self: *const IAudioCaptureClient, - NumFramesRead: u32, - ) callconv(WINAPI) HRESULT, - GetNextPacketSize: *const fn ( - self: *const IAudioCaptureClient, - pNumFramesInNextPacket: ?*u32, - ) callconv(WINAPI) HRESULT, - }; - vtable: *const VTable, - pub fn MethodMixin(comptime T: type) type { - return struct { - pub usingnamespace IUnknown.MethodMixin(T); - pub inline fn GetBuffer(self: *const T, ppData: ?*?*u8, pNumFramesToRead: ?*u32, pdwFlags: ?*u32, pu64DevicePosition: ?*u64, pu64QPCPosition: ?*u64) HRESULT { - return @as(*const IAudioCaptureClient.VTable, @ptrCast(self.vtable)).GetBuffer(@as(*const IAudioCaptureClient, @ptrCast(self)), ppData, pNumFramesToRead, pdwFlags, pu64DevicePosition, pu64QPCPosition); - } - pub inline fn ReleaseBuffer(self: *const T, NumFramesRead: u32) HRESULT { - return @as(*const IAudioCaptureClient.VTable, @ptrCast(self.vtable)).ReleaseBuffer(@as(*const IAudioCaptureClient, @ptrCast(self)), NumFramesRead); - } - pub inline fn GetNextPacketSize(self: *const T, pNumFramesInNextPacket: ?*u32) HRESULT { - return @as(*const IAudioCaptureClient.VTable, @ptrCast(self.vtable)).GetNextPacketSize(@as(*const IAudioCaptureClient, @ptrCast(self)), pNumFramesInNextPacket); - } - }; - } - pub usingnamespace MethodMixin(@This()); -}; -pub const IID_ISimpleAudioVolume = &Guid.initString("87ce5498-68d6-44e5-9215-6da47ef883d8"); -pub const ISimpleAudioVolume = extern struct { - pub const VTable = extern struct { - base: IUnknown.VTable, - SetMasterVolume: *const fn ( - self: *const ISimpleAudioVolume, - fLevel: f32, - EventContext: ?*const Guid, - ) callconv(WINAPI) HRESULT, - GetMasterVolume: *const fn ( - self: *const ISimpleAudioVolume, - pfLevel: ?*f32, - ) callconv(WINAPI) HRESULT, - SetMute: *const fn ( - self: *const ISimpleAudioVolume, - bMute: BOOL, - EventContext: ?*const Guid, - ) callconv(WINAPI) HRESULT, - GetMute: *const fn ( - self: *const ISimpleAudioVolume, - pbMute: ?*BOOL, - ) callconv(WINAPI) HRESULT, - }; - vtable: *const VTable, - pub fn MethodMixin(comptime T: type) type { - return struct { - pub usingnamespace IUnknown.MethodMixin(T); - pub inline fn SetMasterVolume(self: *const T, fLevel: f32, EventContext: ?*const Guid) HRESULT { - return @as(*const ISimpleAudioVolume.VTable, @ptrCast(self.vtable)).SetMasterVolume(@as(*const ISimpleAudioVolume, @ptrCast(self)), fLevel, EventContext); - } - pub inline fn GetMasterVolume(self: *const T, pfLevel: ?*f32) HRESULT { - return @as(*const ISimpleAudioVolume.VTable, @ptrCast(self.vtable)).GetMasterVolume(@as(*const ISimpleAudioVolume, @ptrCast(self)), pfLevel); - } - pub inline fn SetMute(self: *const T, bMute: BOOL, EventContext: ?*const Guid) HRESULT { - return @as(*const ISimpleAudioVolume.VTable, @ptrCast(self.vtable)).SetMute(@as(*const ISimpleAudioVolume, @ptrCast(self)), bMute, EventContext); - } - pub inline fn GetMute(self: *const T, pbMute: ?*BOOL) HRESULT { - return @as(*const ISimpleAudioVolume.VTable, @ptrCast(self.vtable)).GetMute(@as(*const ISimpleAudioVolume, @ptrCast(self)), pbMute); - } - }; - } - pub usingnamespace MethodMixin(@This()); -}; -pub const IPropertyStore = extern struct { - pub const VTable = extern struct { - base: IUnknown.VTable, - GetCount: *const fn ( - self: *const IPropertyStore, - cProps: ?*u32, - ) callconv(WINAPI) HRESULT, - GetAt: *const fn ( - self: *const IPropertyStore, - iProp: u32, - pkey: ?*PROPERTYKEY, - ) callconv(WINAPI) HRESULT, - GetValue: *const fn ( - self: *const IPropertyStore, - key: ?*const PROPERTYKEY, - pv: ?*PROPVARIANT, - ) callconv(WINAPI) HRESULT, - SetValue: *const fn ( - self: *const IPropertyStore, - key: ?*const PROPERTYKEY, - propvar: ?*const PROPVARIANT, - ) callconv(WINAPI) HRESULT, - Commit: *const fn ( - self: *const IPropertyStore, - ) callconv(WINAPI) HRESULT, - }; - vtable: *const VTable, - pub fn MethodMixin(comptime T: type) type { - return struct { - pub usingnamespace IUnknown.MethodMixin(T); - pub inline fn GetCount(self: *const T, cProps: ?*u32) HRESULT { - return @as(*const IPropertyStore.VTable, @ptrCast(self.vtable)).GetCount(@as(*const IPropertyStore, @ptrCast(self)), cProps); - } - pub inline fn GetAt(self: *const T, iProp: u32, pkey: ?*PROPERTYKEY) HRESULT { - return @as(*const IPropertyStore.VTable, @ptrCast(self.vtable)).GetAt(@as(*const IPropertyStore, @ptrCast(self)), iProp, pkey); - } - pub inline fn GetValue(self: *const T, key: ?*const PROPERTYKEY, pv: ?*PROPVARIANT) HRESULT { - return @as(*const IPropertyStore.VTable, @ptrCast(self.vtable)).GetValue(@as(*const IPropertyStore, @ptrCast(self)), key, pv); - } - pub inline fn SetValue(self: *const T, key: ?*const PROPERTYKEY, propvar: ?*const PROPVARIANT) HRESULT { - return @as(*const IPropertyStore.VTable, @ptrCast(self.vtable)).SetValue(@as(*const IPropertyStore, @ptrCast(self)), key, propvar); - } - pub inline fn Commit(self: *const T) HRESULT { - return @as(*const IPropertyStore.VTable, @ptrCast(self.vtable)).Commit(@as(*const IPropertyStore, @ptrCast(self))); - } - }; - } - pub usingnamespace MethodMixin(@This()); -}; -const IID_IMMDevice = &Guid.initString("d666063f-1587-4e43-81f1-b948e807363f"); -pub const IMMDevice = extern struct { - pub const VTable = extern struct { - base: IUnknown.VTable, - Activate: *const fn ( - self: *const IMMDevice, - iid: ?*const Guid, - dwClsCtx: u32, - pActivationParams: ?*PROPVARIANT, - ppInterface: ?*?*anyopaque, - ) callconv(WINAPI) HRESULT, - OpenPropertyStore: *const fn ( - self: *const IMMDevice, - stgmAccess: u32, - ppProperties: ?*?*IPropertyStore, - ) callconv(WINAPI) HRESULT, - GetId: *const fn ( - self: *const IMMDevice, - ppstrId: ?*?PWSTR, - ) callconv(WINAPI) HRESULT, - GetState: *const fn ( - self: *const IMMDevice, - pdwState: ?*u32, - ) callconv(WINAPI) HRESULT, - }; - vtable: *const VTable, - pub fn MethodMixin(comptime T: type) type { - return struct { - pub usingnamespace IUnknown.MethodMixin(T); - pub inline fn Activate(self: *const T, iid: ?*const Guid, dwClsCtx: u32, pActivationParams: ?*PROPVARIANT, ppInterface: ?*?*anyopaque) HRESULT { - return @as(*const IMMDevice.VTable, @ptrCast(self.vtable)).Activate(@as(*const IMMDevice, @ptrCast(self)), iid, dwClsCtx, pActivationParams, ppInterface); - } - pub inline fn OpenPropertyStore(self: *const T, stgmAccess: u32, ppProperties: ?*?*IPropertyStore) HRESULT { - return @as(*const IMMDevice.VTable, @ptrCast(self.vtable)).OpenPropertyStore(@as(*const IMMDevice, @ptrCast(self)), stgmAccess, ppProperties); - } - pub inline fn GetId(self: *const T, ppstrId: ?*?PWSTR) HRESULT { - return @as(*const IMMDevice.VTable, @ptrCast(self.vtable)).GetId(@as(*const IMMDevice, @ptrCast(self)), ppstrId); - } - pub inline fn GetState(self: *const T, pdwState: ?*u32) HRESULT { - return @as(*const IMMDevice.VTable, @ptrCast(self.vtable)).GetState(@as(*const IMMDevice, @ptrCast(self)), pdwState); - } - }; - } - pub usingnamespace MethodMixin(@This()); -}; -pub const IID_IMMNotificationClient = &Guid.initString("7991eec9-7e89-4d85-8390-6c703cec60c0"); -pub const IMMNotificationClient = extern struct { - pub const VTable = extern struct { - base: IUnknown.VTable, - OnDeviceStateChanged: *const fn ( - self: *const IMMNotificationClient, - pwstrDeviceId: ?[*:0]const u16, - dwNewState: u32, - ) callconv(WINAPI) HRESULT, - OnDeviceAdded: *const fn ( - self: *const IMMNotificationClient, - pwstrDeviceId: ?[*:0]const u16, - ) callconv(WINAPI) HRESULT, - OnDeviceRemoved: *const fn ( - self: *const IMMNotificationClient, - pwstrDeviceId: ?[*:0]const u16, - ) callconv(WINAPI) HRESULT, - OnDefaultDeviceChanged: *const fn ( - self: *const IMMNotificationClient, - flow: DataFlow, - role: Role, - pwstrDefaultDeviceId: ?[*:0]const u16, - ) callconv(WINAPI) HRESULT, - OnPropertyValueChanged: *const fn ( - self: *const IMMNotificationClient, - pwstrDeviceId: ?[*:0]const u16, - key: PROPERTYKEY, - ) callconv(WINAPI) HRESULT, - }; - vtable: *const VTable, - pub fn MethodMixin(comptime T: type) type { - return struct { - pub usingnamespace IUnknown.MethodMixin(T); - pub inline fn OnDeviceStateChanged(self: *const T, pwstrDeviceId: ?[*:0]const u16, dwNewState: u32) HRESULT { - return @as(*const IMMNotificationClient.VTable, @ptrCast(self.vtable)).OnDeviceStateChanged(@as(*const IMMNotificationClient, @ptrCast(self)), pwstrDeviceId, dwNewState); - } - pub inline fn OnDeviceAdded(self: *const T, pwstrDeviceId: ?[*:0]const u16) HRESULT { - return @as(*const IMMNotificationClient.VTable, @ptrCast(self.vtable)).OnDeviceAdded(@as(*const IMMNotificationClient, @ptrCast(self)), pwstrDeviceId); - } - pub inline fn OnDeviceRemoved(self: *const T, pwstrDeviceId: ?[*:0]const u16) HRESULT { - return @as(*const IMMNotificationClient.VTable, @ptrCast(self.vtable)).OnDeviceRemoved(@as(*const IMMNotificationClient, @ptrCast(self)), pwstrDeviceId); - } - pub inline fn OnDefaultDeviceChanged(self: *const T, flow: DataFlow, role: Role, pwstrDefaultDeviceId: ?[*:0]const u16) HRESULT { - return @as(*const IMMNotificationClient.VTable, @ptrCast(self.vtable)).OnDefaultDeviceChanged(@as(*const IMMNotificationClient, @ptrCast(self)), flow, role, pwstrDefaultDeviceId); - } - pub inline fn OnPropertyValueChanged(self: *const T, pwstrDeviceId: ?[*:0]const u16, key: PROPERTYKEY) HRESULT { - return @as(*const IMMNotificationClient.VTable, @ptrCast(self.vtable)).OnPropertyValueChanged(@as(*const IMMNotificationClient, @ptrCast(self)), pwstrDeviceId, key); - } - }; - } - pub usingnamespace MethodMixin(@This()); -}; -pub const IID_IMMDeviceCollection = &Guid.initString("0bd7a1be-7a1a-44db-8397-cc5392387b5e"); -pub const IMMDeviceCollection = extern struct { - pub const VTable = extern struct { - base: IUnknown.VTable, - GetCount: *const fn ( - self: *const IMMDeviceCollection, - pcDevices: ?*u32, - ) callconv(WINAPI) HRESULT, - Item: *const fn ( - self: *const IMMDeviceCollection, - nDevice: u32, - ppDevice: ?*?*IMMDevice, - ) callconv(WINAPI) HRESULT, - }; - vtable: *const VTable, - pub fn MethodMixin(comptime T: type) type { - return struct { - pub usingnamespace IUnknown.MethodMixin(T); - pub inline fn GetCount(self: *const T, pcDevices: ?*u32) HRESULT { - return @as(*const IMMDeviceCollection.VTable, @ptrCast(self.vtable)).GetCount(@as(*const IMMDeviceCollection, @ptrCast(self)), pcDevices); - } - pub inline fn Item(self: *const T, nDevice: u32, ppDevice: ?*?*IMMDevice) HRESULT { - return @as(*const IMMDeviceCollection.VTable, @ptrCast(self.vtable)).Item(@as(*const IMMDeviceCollection, @ptrCast(self)), nDevice, ppDevice); - } - }; - } - pub usingnamespace MethodMixin(@This()); -}; -pub const IID_IMMDeviceEnumerator = &Guid.initString("a95664d2-9614-4f35-a746-de8db63617e6"); -pub const IMMDeviceEnumerator = extern struct { - pub const VTable = extern struct { - base: IUnknown.VTable, - EnumAudioEndpoints: *const fn ( - self: *const IMMDeviceEnumerator, - dataFlow: DataFlow, - dwStateMask: u32, - ppDevices: ?*?*IMMDeviceCollection, - ) callconv(WINAPI) HRESULT, - GetDefaultAudioEndpoint: *const fn ( - self: *const IMMDeviceEnumerator, - dataFlow: DataFlow, - role: Role, - ppEndpoint: ?*?*IMMDevice, - ) callconv(WINAPI) HRESULT, - GetDevice: *const fn ( - self: *const IMMDeviceEnumerator, - pwstrId: ?[*:0]const u16, - ppDevice: ?*?*IMMDevice, - ) callconv(WINAPI) HRESULT, - RegisterEndpointNotificationCallback: *const fn ( - self: *const IMMDeviceEnumerator, - pClient: ?*IMMNotificationClient, - ) callconv(WINAPI) HRESULT, - UnregisterEndpointNotificationCallback: *const fn ( - self: *const IMMDeviceEnumerator, - pClient: ?*IMMNotificationClient, - ) callconv(WINAPI) HRESULT, - }; - vtable: *const VTable, - pub fn MethodMixin(comptime T: type) type { - return struct { - pub usingnamespace IUnknown.MethodMixin(T); - pub inline fn EnumAudioEndpoints(self: *const T, dataFlow: DataFlow, dwStateMask: u32, ppDevices: ?*?*IMMDeviceCollection) HRESULT { - return @as(*const IMMDeviceEnumerator.VTable, @ptrCast(self.vtable)).EnumAudioEndpoints(@as(*const IMMDeviceEnumerator, @ptrCast(self)), dataFlow, dwStateMask, ppDevices); - } - pub inline fn GetDefaultAudioEndpoint(self: *const T, dataFlow: DataFlow, role: Role, ppEndpoint: ?*?*IMMDevice) HRESULT { - return @as(*const IMMDeviceEnumerator.VTable, @ptrCast(self.vtable)).GetDefaultAudioEndpoint(@as(*const IMMDeviceEnumerator, @ptrCast(self)), dataFlow, role, ppEndpoint); - } - pub inline fn GetDevice(self: *const T, pwstrId: ?[*:0]const u16, ppDevice: ?*?*IMMDevice) HRESULT { - return @as(*const IMMDeviceEnumerator.VTable, @ptrCast(self.vtable)).GetDevice(@as(*const IMMDeviceEnumerator, @ptrCast(self)), pwstrId, ppDevice); - } - pub inline fn RegisterEndpointNotificationCallback(self: *const T, pClient: ?*IMMNotificationClient) HRESULT { - return @as(*const IMMDeviceEnumerator.VTable, @ptrCast(self.vtable)).RegisterEndpointNotificationCallback(@as(*const IMMDeviceEnumerator, @ptrCast(self)), pClient); - } - pub inline fn UnregisterEndpointNotificationCallback(self: *const T, pClient: ?*IMMNotificationClient) HRESULT { - return @as(*const IMMDeviceEnumerator.VTable, @ptrCast(self.vtable)).UnregisterEndpointNotificationCallback(@as(*const IMMDeviceEnumerator, @ptrCast(self)), pClient); - } - }; - } - pub usingnamespace MethodMixin(@This()); -}; -pub const IID_IMMEndpoint = &Guid.initString("1be09788-6894-4089-8586-9a2a6c265ac5"); -pub const IMMEndpoint = extern struct { - pub const VTable = extern struct { - base: IUnknown.VTable, - GetDataFlow: *const fn ( - self: *const IMMEndpoint, - pDataFlow: ?*DataFlow, - ) callconv(WINAPI) HRESULT, - }; - vtable: *const VTable, - pub fn MethodMixin(comptime T: type) type { - return struct { - pub usingnamespace IUnknown.MethodMixin(T); - pub inline fn GetDataFlow(self: *const T, pDataFlow: ?*DataFlow) HRESULT { - return @as(*const IMMEndpoint.VTable, @ptrCast(self.vtable)).GetDataFlow(@as(*const IMMEndpoint, @ptrCast(self)), pDataFlow); - } - }; - } - pub usingnamespace MethodMixin(@This()); -}; -pub const AUDCLNT_STREAMFLAGS_CROSSPROCESS = 65536; -pub const AUDCLNT_STREAMFLAGS_LOOPBACK = 131072; -pub const AUDCLNT_STREAMFLAGS_EVENTCALLBACK = 262144; -pub const AUDCLNT_STREAMFLAGS_NOPERSIST = 524288; -pub const AUDCLNT_STREAMFLAGS_RATEADJUST = 1048576; -pub const AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY = 134217728; -pub const AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM = 2147483648; -pub const AUDCLNT_SESSIONFLAGS_EXPIREWHENUNOWNED = 268435456; -pub const PKEY_Device_FriendlyName = PROPERTYKEY{ .fmtid = Guid.initString("a45c254e-df1c-4efd-8020-67d146a850e0"), .pid = 14 }; -pub const CLSID_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT = &Guid.initString("00000003-0000-0010-8000-00aa00389b71"); -pub const SPEAKER_FRONT_LEFT = 1; -pub const SPEAKER_FRONT_RIGHT = 2; -pub const SPEAKER_FRONT_CENTER = 4; -pub const SPEAKER_LOW_FREQUENCY = 8; -pub const SPEAKER_BACK_LEFT = 16; -pub const SPEAKER_BACK_RIGHT = 32; -pub const SPEAKER_FRONT_LEFT_OF_CENTER = 64; -pub const SPEAKER_FRONT_RIGHT_OF_CENTER = 128; -pub const SPEAKER_BACK_CENTER = 256; -pub const SPEAKER_SIDE_LEFT = 512; -pub const SPEAKER_SIDE_RIGHT = 1024; -pub const SPEAKER_TOP_CENTER = 2048; -pub const SPEAKER_TOP_FRONT_LEFT = 4096; -pub const SPEAKER_TOP_FRONT_CENTER = 8192; -pub const SPEAKER_TOP_FRONT_RIGHT = 16384; -pub const SPEAKER_TOP_BACK_LEFT = 32768; -pub const SPEAKER_TOP_BACK_CENTER = 65536; -pub const SPEAKER_TOP_BACK_RIGHT = 131072; -pub const SPEAKER_RESERVED = @as(u32, 2147221504); -pub const SPEAKER_ALL = @as(u32, 2147483648); -pub const CLSID_KSDATAFORMAT_SUBTYPE_PCM = &Guid.initString("00000001-0000-0010-8000-00aa00389b71"); -pub const INPLACE_S_TRUNCATED = 262560; -pub const PKEY_AudioEngine_DeviceFormat = PROPERTYKEY{ .fmtid = Guid.initString("f19f064d-082c-4e27-bc73-6882a1bb8e4c"), .pid = 0 }; -pub const WAVE_FORMAT_EXTENSIBLE = 65534; -pub const STGM_READ = 0; -pub const DEVICE_STATE_ACTIVE = 1; -pub const AUDCLNT_E_NOT_INITIALIZED = -2004287487; -pub const AUDCLNT_E_ALREADY_INITIALIZED = -2004287486; -pub const AUDCLNT_E_WRONG_ENDPOINT_TYPE = -2004287485; -pub const AUDCLNT_E_DEVICE_INVALIDATED = -2004287484; -pub const AUDCLNT_E_NOT_STOPPED = -2004287483; -pub const AUDCLNT_E_BUFFER_TOO_LARGE = -2004287482; -pub const AUDCLNT_E_OUT_OF_ORDER = -2004287481; -pub const AUDCLNT_E_UNSUPPORTED_FORMAT = -2004287480; -pub const AUDCLNT_E_INVALID_SIZE = -2004287479; -pub const AUDCLNT_E_DEVICE_IN_USE = -2004287478; -pub const AUDCLNT_E_BUFFER_OPERATION_PENDING = -2004287477; -pub const AUDCLNT_E_THREAD_NOT_REGISTERED = -2004287476; -pub const AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED = -2004287474; -pub const AUDCLNT_E_ENDPOINT_CREATE_FAILED = -2004287473; -pub const AUDCLNT_E_SERVICE_NOT_RUNNING = -2004287472; -pub const AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED = -2004287471; -pub const AUDCLNT_E_EXCLUSIVE_MODE_ONLY = -2004287470; -pub const AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL = -2004287469; -pub const AUDCLNT_E_EVENTHANDLE_NOT_SET = -2004287468; -pub const AUDCLNT_E_INCORRECT_BUFFER_SIZE = -2004287467; -pub const AUDCLNT_E_BUFFER_SIZE_ERROR = -2004287466; -pub const AUDCLNT_E_CPUUSAGE_EXCEEDED = -2004287465; -pub const AUDCLNT_E_BUFFER_ERROR = -2004287464; -pub const AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED = -2004287463; -pub const AUDCLNT_E_INVALID_DEVICE_PERIOD = -2004287456; -pub const AUDCLNT_E_INVALID_STREAM_FLAG = -2004287455; -pub const AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE = -2004287454; -pub const AUDCLNT_E_OUT_OF_OFFLOAD_RESOURCES = -2004287453; -pub const AUDCLNT_E_OFFLOAD_MODE_ONLY = -2004287452; -pub const AUDCLNT_E_NONOFFLOAD_MODE_ONLY = -2004287451; -pub const AUDCLNT_E_RESOURCES_INVALIDATED = -2004287450; -pub const AUDCLNT_E_RAW_MODE_UNSUPPORTED = -2004287449; -pub const AUDCLNT_E_ENGINE_PERIODICITY_LOCKED = -2004287448; -pub const AUDCLNT_E_ENGINE_FORMAT_LOCKED = -2004287447; -pub const AUDCLNT_E_HEADTRACKING_ENABLED = -2004287440; -pub const AUDCLNT_E_HEADTRACKING_UNSUPPORTED = -2004287424; -pub const AUDCLNT_E_EFFECT_NOT_AVAILABLE = -2004287423; -pub const AUDCLNT_E_EFFECT_STATE_READ_ONLY = -2004287422; diff --git a/src/core/win32/win32.zig b/src/win32.zig similarity index 57% rename from src/core/win32/win32.zig rename to src/win32.zig index 1b641936..4819532d 100644 --- a/src/core/win32/win32.zig +++ b/src/win32.zig @@ -371,11 +371,24 @@ pub const Guid = extern union { pub fn initString(s: []const u8) Guid { var guid = Guid{ .Bytes = undefined }; for (hex_offsets, 0..) |hex_offset, i| { - //guid.Bytes[i] = decodeHexByte(s[offset..offset+2]); guid.Bytes[i] = decodeHexByte([2]u8{ s[hex_offset], s[hex_offset + 1] }); } return guid; } + + fn hexVal(c: u8) u4 { + if (c <= '9') return @as(u4, @intCast(c - '0')); + if (c >= 'a') return @as(u4, @intCast(c + 10 - 'a')); + return @as(u4, @intCast(c + 10 - 'A')); + } + + pub fn eql(riid1: Guid, riid2: Guid) bool { + return riid1.Ints.a == riid2.Ints.a and + riid1.Ints.b == riid2.Ints.b and + riid1.Ints.c == riid2.Ints.c and + @import("std").mem.eql(u8, &riid1.Ints.d, &riid2.Ints.d) and + @import("std").mem.eql(u8, &riid1.Bytes, &riid2.Bytes); + } }; comptime { std.debug.assert(@sizeOf(Guid) == 16); @@ -776,10 +789,10 @@ pub const IDirectInputDevice8W = extern struct { return self.lpVtbl.base.QueryInterface(self, riid, ppvObject); } pub fn AddRef(self: *const IDirectInputDevice8W) u32 { - return self.lpVtbl.base.AddRef(self); + return self.lpVtbl.base.IUnknown_AddRef(self); } pub fn Release(self: *const IDirectInputDevice8W) u32 { - return self.lpVtbl.base.Release(self); + return self.lpVtbl.base.IUnknown_Release(self); } }; @@ -2397,3 +2410,1750 @@ pub extern "user32" fn EnumDisplayMonitors( lpfnEnum: ?MONITORENUMPROC, dwData: LPARAM, ) callconv(@import("std").os.windows.WINAPI) BOOL; + +pub const PROPERTYKEY = extern struct { + fmtid: Guid, + pid: u32, +}; +pub const DECIMAL = extern struct { + wReserved: u16, + anon1: extern union { + anon: extern struct { + scale: u8, + sign: u8, + }, + signscale: u16, + }, + Hi32: u32, + anon2: extern union { + anon: extern struct { + Lo32: u32, + Mid32: u32, + }, + Lo64: u64, + }, +}; +pub const LARGE_INTEGER = extern union { + anon: extern struct { + LowPart: u32, + HighPart: i32, + }, + u: extern struct { + LowPart: u32, + HighPart: i32, + }, + QuadPart: i64, +}; +pub const ULARGE_INTEGER = extern union { + anon: extern struct { + LowPart: u32, + HighPart: u32, + }, + u: extern struct { + LowPart: u32, + HighPart: u32, + }, + QuadPart: u64, +}; +pub const BSTR = *u16; +pub const PSTR = [*:0]u8; +pub const S_OK = 0; +pub const S_FALSE = 1; +pub const E_NOTIMPL = -2147467263; +pub const E_NOT_FOUND = -2147023728; +pub const E_OUTOFMEMORY = -2147024882; +pub const E_INVALIDARG = -2147024809; +pub const E_FAIL = -2147467259; +pub const E_UNEXPECTED = -2147418113; +pub const E_NOINTERFACE = -2147467262; +pub const E_POINTER = -2147467261; +pub const E_HANDLE = -2147024890; +pub const E_ABORT = -2147467260; +pub const E_ACCESSDENIED = -2147024891; +pub const E_BOUNDS = -2147483637; +pub const E_CHANGED_STATE = -2147483636; +pub const E_ILLEGAL_STATE_CHANGE = -2147483635; +pub const E_ILLEGAL_METHOD_CALL = -2147483634; +pub const CLASS_E_NOAGGREGATION = -2147221232; +pub const CLASS_E_CLASSNOTAVAILABLE = -2147221231; +pub const CLASS_E_NOTLICENSED = -2147221230; +pub const REGDB_E_CLASSNOTREG = -2147221164; +pub const RPC_E_CHANGED_MODE = -2147417850; +pub const SAFEARRAYBOUND = extern struct { + cElements: u32, + lLbound: i32, +}; +pub const SAFEARRAY = extern struct { + cDims: u16, + fFeatures: u16, + cbElements: u32, + cLocks: u32, + pvData: ?*anyopaque, + rgsabound: [1]SAFEARRAYBOUND, +}; +pub const CLIPDATA = extern struct { + cbSize: u32, + ulClipFmt: i32, + pClipData: ?*u8, +}; +pub const VERSIONEDSTREAM = extern struct { + guidVersion: Guid, + pStream: ?*IStream, +}; +pub const STREAM_SEEK = enum(u32) { + SET = 0, + CUR = 1, + END = 2, +}; +pub const STATSTG = extern struct { + pwcsName: ?PWSTR, + type: u32, + cbSize: ULARGE_INTEGER, + mtime: FILETIME, + ctime: FILETIME, + atime: FILETIME, + grfMode: u32, + grfLocksSupported: u32, + clsid: Guid, + grfStateBits: u32, + reserved: u32, +}; +pub const IStream = extern struct { + pub const VTable = extern struct { + base: ISequentialStream.VTable, + Seek: *const fn ( + self: *const IStream, + dlibMove: LARGE_INTEGER, + dwOrigin: STREAM_SEEK, + plibNewPosition: ?*ULARGE_INTEGER, + ) callconv(WINAPI) HRESULT, + SetSize: *const fn ( + self: *const IStream, + libNewSize: ULARGE_INTEGER, + ) callconv(WINAPI) HRESULT, + CopyTo: *const fn ( + self: *const IStream, + pstm: ?*IStream, + cb: ULARGE_INTEGER, + pcbRead: ?*ULARGE_INTEGER, + pcbWritten: ?*ULARGE_INTEGER, + ) callconv(WINAPI) HRESULT, + Commit: *const fn ( + self: *const IStream, + grfCommitFlags: u32, + ) callconv(WINAPI) HRESULT, + Revert: *const fn ( + self: *const IStream, + ) callconv(WINAPI) HRESULT, + LockRegion: *const fn ( + self: *const IStream, + libOffset: ULARGE_INTEGER, + cb: ULARGE_INTEGER, + dwLockType: u32, + ) callconv(WINAPI) HRESULT, + UnlockRegion: *const fn ( + self: *const IStream, + libOffset: ULARGE_INTEGER, + cb: ULARGE_INTEGER, + dwLockType: u32, + ) callconv(WINAPI) HRESULT, + Stat: *const fn ( + self: *const IStream, + pstatstg: ?*STATSTG, + grfStatFlag: u32, + ) callconv(WINAPI) HRESULT, + Clone: *const fn ( + self: *const IStream, + ppstm: ?*?*IStream, + ) callconv(WINAPI) HRESULT, + }; + vtable: *const VTable, +}; +pub const COINIT = u32; +pub const COINIT_MULTITHREADED = 0x0; +pub const COINIT_APARTMENTTHREADED = 0x2; +pub const COINIT_DISABLE_OLE1DDE = 0x4; +pub const COINIT_SPEED_OVER_MEMORY = 0x8; +pub const CLSCTX = u32; +pub const CLSCTX_ALL = 23; +pub extern "ole32" fn CoInitializeEx( + pvReserved: ?*anyopaque, + dwCoInit: COINIT, +) callconv(WINAPI) HRESULT; +pub extern "ole32" fn CoCreateInstance( + rclsid: ?*const Guid, + pUnkOuter: ?*IUnknown, + dwClsContext: CLSCTX, + riid: *const Guid, + ppv: ?*?*anyopaque, +) callconv(WINAPI) HRESULT; +pub extern "kernel32" fn CreateEventA( + lpEventAttributes: ?*SECURITY_ATTRIBUTES, + bManualReset: BOOL, + bInitialState: BOOL, + lpName: ?[*:0]const u8, +) callconv(WINAPI) ?*anyopaque; +pub extern "kernel32" fn WaitForSingleObject( + hHandle: ?*anyopaque, + dwMilliseconds: u32, +) callconv(WINAPI) u32; +pub extern "kernel32" fn GetModuleHandleA( + lpModuleName: ?[*:0]const u8, +) callconv(WINAPI) ?*anyopaque; +pub extern "kernel32" fn GetProcAddress( + hModule: ?*anyopaque, + lpProcName: ?[*:0]const u8, +) callconv(WINAPI) ?*const fn () callconv(WINAPI) isize; +pub const INFINITE = 4294967295; +pub const SECURITY_ATTRIBUTES = extern struct { + nLength: u32, + lpSecurityDescriptor: ?*anyopaque, + bInheritHandle: BOOL, +}; +pub const ISequentialStream = extern struct { + pub const VTable = extern struct { + base: IUnknown.VTable, + Read: *const fn ( + self: *const ISequentialStream, + pv: ?*anyopaque, + cb: u32, + pcbRead: ?*u32, + ) callconv(WINAPI) HRESULT, + Write: *const fn ( + self: *const ISequentialStream, + pv: ?*const anyopaque, + cb: u32, + pcbWritten: ?*u32, + ) callconv(WINAPI) HRESULT, + }; + vtable: *const VTable, +}; +pub const CY = extern union { + anon: extern struct { + Lo: u32, + Hi: i32, + }, + int64: i64, +}; +pub const CAC = extern struct { + cElems: u32, + pElems: ?PSTR, +}; +pub const CAUB = extern struct { + cElems: u32, + pElems: ?*u8, +}; +pub const CAI = extern struct { + cElems: u32, + pElems: ?*i16, +}; +pub const CAUI = extern struct { + cElems: u32, + pElems: ?*u16, +}; +pub const CAL = extern struct { + cElems: u32, + pElems: ?*i32, +}; +pub const CAUL = extern struct { + cElems: u32, + pElems: ?*u32, +}; +pub const CAFLT = extern struct { + cElems: u32, + pElems: ?*f32, +}; +pub const CADBL = extern struct { + cElems: u32, + pElems: ?*f64, +}; +pub const CACY = extern struct { + cElems: u32, + pElems: ?*CY, +}; +pub const CADATE = extern struct { + cElems: u32, + pElems: ?*f64, +}; +pub const CABSTR = extern struct { + cElems: u32, + pElems: ?*?BSTR, +}; +pub const BSTRBLOB = extern struct { + cbSize: u32, + pData: ?*u8, +}; +pub const CABSTRBLOB = extern struct { + cElems: u32, + pElems: ?*BSTRBLOB, +}; +pub const CABOOL = extern struct { + cElems: u32, + pElems: ?*i16, +}; +pub const CASCODE = extern struct { + cElems: u32, + pElems: ?*i32, +}; +pub const CAPROPVARIANT = extern struct { + cElems: u32, + pElems: ?*PROPVARIANT, +}; +pub const CAH = extern struct { + cElems: u32, + pElems: ?*LARGE_INTEGER, +}; +pub const CAUH = extern struct { + cElems: u32, + pElems: ?*ULARGE_INTEGER, +}; +pub const CALPSTR = extern struct { + cElems: u32, + pElems: ?*?PSTR, +}; +pub const CALPWSTR = extern struct { + cElems: u32, + pElems: ?*?PWSTR, +}; +pub const CAFILETIME = extern struct { + cElems: u32, + pElems: ?*FILETIME, +}; +pub const CACLIPDATA = extern struct { + cElems: u32, + pElems: ?*CLIPDATA, +}; +pub const CACLSID = extern struct { + cElems: u32, + pElems: ?*Guid, +}; +pub const BLOB = extern struct { + cbSize: u32, + pBlobData: ?*u8, +}; +pub const INVOKEKIND = enum(i32) { + FUNC = 1, + PROPERTYGET = 2, + PROPERTYPUT = 4, + PROPERTYPUTREF = 8, +}; +pub const IDLDESC = extern struct { + dwReserved: usize, + wIDLFlags: u16, +}; +pub const VARIANT = extern struct { + anon: extern union { + anon: extern struct { + vt: u16, + wReserved1: u16, + wReserved2: u16, + wReserved3: u16, + anon: extern union { + llVal: i64, + lVal: i32, + bVal: u8, + iVal: i16, + fltVal: f32, + dblVal: f64, + boolVal: i16, + __OBSOLETE__VARIANT_BOOL: i16, + scode: i32, + cyVal: CY, + date: f64, + bstrVal: ?BSTR, + punkVal: ?*IUnknown, + pdispVal: ?*IDispatch, + parray: ?*SAFEARRAY, + pbVal: ?*u8, + piVal: ?*i16, + plVal: ?*i32, + pllVal: ?*i64, + pfltVal: ?*f32, + pdblVal: ?*f64, + pboolVal: ?*i16, + __OBSOLETE__VARIANT_PBOOL: ?*i16, + pscode: ?*i32, + pcyVal: ?*CY, + pdate: ?*f64, + pbstrVal: ?*?BSTR, + ppunkVal: ?*?*IUnknown, + ppdispVal: ?*?*IDispatch, + pparray: ?*?*SAFEARRAY, + pvarVal: ?*VARIANT, + byref: ?*anyopaque, + cVal: CHAR, + uiVal: u16, + ulVal: u32, + ullVal: u64, + intVal: i32, + uintVal: u32, + pdecVal: ?*DECIMAL, + pcVal: ?PSTR, + puiVal: ?*u16, + pulVal: ?*u32, + pullVal: ?*u64, + pintVal: ?*i32, + puintVal: ?*u32, + anon: extern struct { + pvRecord: ?*anyopaque, + pRecInfo: ?*IRecordInfo, + }, + }, + }, + decVal: DECIMAL, + }, +}; +pub const IRecordInfo = extern struct { + pub const VTable = extern struct { + base: IUnknown.VTable, + RecordInit: *const fn ( + self: *const IRecordInfo, + pvNew: ?*anyopaque, + ) callconv(WINAPI) HRESULT, + RecordClear: *const fn ( + self: *const IRecordInfo, + pvExisting: ?*anyopaque, + ) callconv(WINAPI) HRESULT, + RecordCopy: *const fn ( + self: *const IRecordInfo, + pvExisting: ?*anyopaque, + pvNew: ?*anyopaque, + ) callconv(WINAPI) HRESULT, + GetGuid: *const fn ( + self: *const IRecordInfo, + pguid: ?*Guid, + ) callconv(WINAPI) HRESULT, + GetName: *const fn ( + self: *const IRecordInfo, + pbstrName: ?*?BSTR, + ) callconv(WINAPI) HRESULT, + GetSize: *const fn ( + self: *const IRecordInfo, + pcbSize: ?*u32, + ) callconv(WINAPI) HRESULT, + GetTypeInfo: *const fn ( + self: *const IRecordInfo, + ppTypeInfo: ?*?*ITypeInfo, + ) callconv(WINAPI) HRESULT, + GetField: *const fn ( + self: *const IRecordInfo, + pvData: ?*anyopaque, + szFieldName: ?[*:0]const u16, + pvarField: ?*VARIANT, + ) callconv(WINAPI) HRESULT, + GetFieldNoCopy: *const fn ( + self: *const IRecordInfo, + pvData: ?*anyopaque, + szFieldName: ?[*:0]const u16, + pvarField: ?*VARIANT, + ppvDataCArray: ?*?*anyopaque, + ) callconv(WINAPI) HRESULT, + PutField: *const fn ( + self: *const IRecordInfo, + wFlags: u32, + pvData: ?*anyopaque, + szFieldName: ?[*:0]const u16, + pvarField: ?*VARIANT, + ) callconv(WINAPI) HRESULT, + PutFieldNoCopy: *const fn ( + self: *const IRecordInfo, + wFlags: u32, + pvData: ?*anyopaque, + szFieldName: ?[*:0]const u16, + pvarField: ?*VARIANT, + ) callconv(WINAPI) HRESULT, + GetFieldNames: *const fn ( + self: *const IRecordInfo, + pcNames: ?*u32, + rgBstrNames: [*]?BSTR, + ) callconv(WINAPI) HRESULT, + IsMatchingType: *const fn ( + self: *const IRecordInfo, + pRecordInfo: ?*IRecordInfo, + ) callconv(WINAPI) BOOL, + RecordCreate: *const fn ( + self: *const IRecordInfo, + ) callconv(WINAPI) ?*anyopaque, + RecordCreateCopy: *const fn ( + self: *const IRecordInfo, + pvSource: ?*anyopaque, + ppvDest: ?*?*anyopaque, + ) callconv(WINAPI) HRESULT, + RecordDestroy: *const fn ( + self: *const IRecordInfo, + pvRecord: ?*anyopaque, + ) callconv(WINAPI) HRESULT, + }; + vtable: *const VTable, +}; +pub const PARAMDESCEX = extern struct { + cBytes: u32, + varDefaultValue: VARIANT, +}; +pub const PARAMDESC = extern struct { + pparamdescex: ?*PARAMDESCEX, + wParamFlags: u16, +}; +pub const ARRAYDESC = extern struct { + tdescElem: TYPEDESC, + cDims: u16, + rgbounds: [1]SAFEARRAYBOUND, +}; +pub const TYPEDESC = extern struct { + anon: extern union { + lptdesc: ?*TYPEDESC, + lpadesc: ?*ARRAYDESC, + hreftype: u32, + }, + vt: u16, +}; +pub const ELEMDESC = extern struct { + tdesc: TYPEDESC, + anon: extern union { + idldesc: IDLDESC, + paramdesc: PARAMDESC, + }, +}; +pub const CALLCONV = enum(i32) { + FASTCALL = 0, + CDECL = 1, + MSCPASCAL = 2, + MACPASCAL = 3, + STDCALL = 4, + FPFASTCALL = 5, + SYSCALL = 6, + MPWCDECL = 7, + MPWPASCAL = 8, + MAX = 9, +}; +pub const FUNCKIND = enum(i32) { + VIRTUAL = 0, + PUREVIRTUAL = 1, + NONVIRTUAL = 2, + STATIC = 3, + DISPATCH = 4, +}; +pub const FUNCDESC = extern struct { + memid: i32, + lprgscode: ?*i32, + lprgelemdescParam: ?*ELEMDESC, + funckind: FUNCKIND, + invkind: INVOKEKIND, + @"callconv": CALLCONV, + cParams: i16, + cParamsOpt: i16, + oVft: i16, + cScodes: i16, + elemdescFunc: ELEMDESC, + wFuncFlags: u16, +}; +pub const TYPEATTR = extern struct { + guid: Guid, + lcid: u32, + dwReserved: u32, + memidConstructor: i32, + memidDestructor: i32, + lpstrSchema: ?PWSTR, + cbSizeInstance: u32, + typekind: TYPEKIND, + cFuncs: u16, + cVars: u16, + cImplTypes: u16, + cbSizeVft: u16, + cbAlignment: u16, + wTypeFlags: u16, + wMajorVerNum: u16, + wMinorVerNum: u16, + tdescAlias: TYPEDESC, + idldescType: IDLDESC, +}; +pub const TYPEKIND = enum(i32) { + ENUM = 0, + RECORD = 1, + MODULE = 2, + INTERFACE = 3, + DISPATCH = 4, + COCLASS = 5, + ALIAS = 6, + UNION = 7, + MAX = 8, +}; +pub const DESCKIND = enum(i32) { + NONE = 0, + FUNCDESC = 1, + VARDESC = 2, + TYPECOMP = 3, + IMPLICITAPPOBJ = 4, + MAX = 5, +}; +pub const BINDPTR = extern union { + lpfuncdesc: ?*FUNCDESC, + lpvardesc: ?*VARDESC, + lptcomp: ?*ITypeComp, +}; +pub const VARDESC = extern struct { + memid: i32, + lpstrSchema: ?PWSTR, + anon: extern union { + oInst: u32, + lpvarValue: ?*VARIANT, + }, + elemdescVar: ELEMDESC, + wVarFlags: u16, + varkind: VARKIND, +}; +pub const VARKIND = enum(i32) { + PERINSTANCE = 0, + STATIC = 1, + CONST = 2, + DISPATCH = 3, +}; +pub const ITypeComp = extern struct { + pub const VTable = extern struct { + base: IUnknown.VTable, + Bind: *const fn ( + self: *const ITypeComp, + szName: ?PWSTR, + lHashVal: u32, + wFlags: u16, + ppTInfo: ?*?*ITypeInfo, + pDescKind: ?*DESCKIND, + pBindPtr: ?*BINDPTR, + ) callconv(WINAPI) HRESULT, + BindType: *const fn ( + self: *const ITypeComp, + szName: ?PWSTR, + lHashVal: u32, + ppTInfo: ?*?*ITypeInfo, + ppTComp: ?*?*ITypeComp, + ) callconv(WINAPI) HRESULT, + }; + vtable: *const VTable, +}; +pub const DISPPARAMS = extern struct { + rgvarg: ?*VARIANT, + rgdispidNamedArgs: ?*i32, + cArgs: u32, + cNamedArgs: u32, +}; +pub const EXCEPINFO = extern struct { + wCode: u16, + wReserved: u16, + bstrSource: ?BSTR, + bstrDescription: ?BSTR, + bstrHelpFile: ?BSTR, + dwHelpContext: u32, + pvReserved: ?*anyopaque, + pfnDeferredFillIn: ?LPEXCEPFINO_DEFERRED_FILLIN, + scode: i32, +}; +pub const LPEXCEPFINO_DEFERRED_FILLIN = *const fn ( + pExcepInfo: ?*EXCEPINFO, +) callconv(WINAPI) HRESULT; +pub const ITypeInfo = extern struct { + pub const VTable = extern struct { + base: IUnknown.VTable, + GetTypeAttr: *const fn ( + self: *const ITypeInfo, + ppTypeAttr: ?*?*TYPEATTR, + ) callconv(WINAPI) HRESULT, + GetTypeComp: *const fn ( + self: *const ITypeInfo, + ppTComp: ?*?*ITypeComp, + ) callconv(WINAPI) HRESULT, + GetFuncDesc: *const fn ( + self: *const ITypeInfo, + index: u32, + ppFuncDesc: ?*?*FUNCDESC, + ) callconv(WINAPI) HRESULT, + GetVarDesc: *const fn ( + self: *const ITypeInfo, + index: u32, + ppVarDesc: ?*?*VARDESC, + ) callconv(WINAPI) HRESULT, + GetNames: *const fn ( + self: *const ITypeInfo, + memid: i32, + rgBstrNames: [*]?BSTR, + cMaxNames: u32, + pcNames: ?*u32, + ) callconv(WINAPI) HRESULT, + GetRefTypeOfImplType: *const fn ( + self: *const ITypeInfo, + index: u32, + pRefType: ?*u32, + ) callconv(WINAPI) HRESULT, + GetImplTypeFlags: *const fn ( + self: *const ITypeInfo, + index: u32, + pImplTypeFlags: ?*i32, + ) callconv(WINAPI) HRESULT, + GetIDsOfNames: *const fn ( + self: *const ITypeInfo, + rgszNames: [*]?PWSTR, + cNames: u32, + pMemId: [*]i32, + ) callconv(WINAPI) HRESULT, + Invoke: *const fn ( + self: *const ITypeInfo, + pvInstance: ?*anyopaque, + memid: i32, + wFlags: u16, + pDispParams: ?*DISPPARAMS, + pVarResult: ?*VARIANT, + pExcepInfo: ?*EXCEPINFO, + puArgErr: ?*u32, + ) callconv(WINAPI) HRESULT, + GetDocumentation: *const fn ( + self: *const ITypeInfo, + memid: i32, + pBstrName: ?*?BSTR, + pBstrDocString: ?*?BSTR, + pdwHelpContext: ?*u32, + pBstrHelpFile: ?*?BSTR, + ) callconv(WINAPI) HRESULT, + GetDllEntry: *const fn ( + self: *const ITypeInfo, + memid: i32, + invKind: INVOKEKIND, + pBstrDllName: ?*?BSTR, + pBstrName: ?*?BSTR, + pwOrdinal: ?*u16, + ) callconv(WINAPI) HRESULT, + GetRefTypeInfo: *const fn ( + self: *const ITypeInfo, + hRefType: u32, + ppTInfo: ?*?*ITypeInfo, + ) callconv(WINAPI) HRESULT, + AddressOfMember: *const fn ( + self: *const ITypeInfo, + memid: i32, + invKind: INVOKEKIND, + ppv: ?*?*anyopaque, + ) callconv(WINAPI) HRESULT, + CreateInstance: *const fn ( + self: *const ITypeInfo, + pUnkOuter: ?*IUnknown, + riid: ?*const Guid, + ppvObj: ?*?*anyopaque, + ) callconv(WINAPI) HRESULT, + GetMops: *const fn ( + self: *const ITypeInfo, + memid: i32, + pBstrMops: ?*?BSTR, + ) callconv(WINAPI) HRESULT, + GetContainingTypeLib: *const fn ( + self: *const ITypeInfo, + ppTLib: ?*?*ITypeLib, + pIndex: ?*u32, + ) callconv(WINAPI) HRESULT, + ReleaseTypeAttr: *const fn ( + self: *const ITypeInfo, + pTypeAttr: ?*TYPEATTR, + ) callconv(WINAPI) void, + ReleaseFuncDesc: *const fn ( + self: *const ITypeInfo, + pFuncDesc: ?*FUNCDESC, + ) callconv(WINAPI) void, + ReleaseVarDesc: *const fn ( + self: *const ITypeInfo, + pVarDesc: ?*VARDESC, + ) callconv(WINAPI) void, + }; + vtable: *const VTable, +}; +pub const SYSKIND = enum(i32) { + WIN16 = 0, + WIN32 = 1, + MAC = 2, + WIN64 = 3, +}; +pub const TLIBATTR = extern struct { + guid: Guid, + lcid: u32, + syskind: SYSKIND, + wMajorVerNum: u16, + wMinorVerNum: u16, + wLibFlags: u16, +}; +pub const ITypeLib = extern struct { + pub const VTable = extern struct { + base: IUnknown.VTable, + GetTypeInfoCount: *const fn ( + self: *const ITypeLib, + ) callconv(WINAPI) u32, + GetTypeInfo: *const fn ( + self: *const ITypeLib, + index: u32, + ppTInfo: ?*?*ITypeInfo, + ) callconv(WINAPI) HRESULT, + GetTypeInfoType: *const fn ( + self: *const ITypeLib, + index: u32, + pTKind: ?*TYPEKIND, + ) callconv(WINAPI) HRESULT, + GetTypeInfoOfGuid: *const fn ( + self: *const ITypeLib, + guid: ?*const Guid, + ppTinfo: ?*?*ITypeInfo, + ) callconv(WINAPI) HRESULT, + GetLibAttr: *const fn ( + self: *const ITypeLib, + ppTLibAttr: ?*?*TLIBATTR, + ) callconv(WINAPI) HRESULT, + GetTypeComp: *const fn ( + self: *const ITypeLib, + ppTComp: ?*?*ITypeComp, + ) callconv(WINAPI) HRESULT, + GetDocumentation: *const fn ( + self: *const ITypeLib, + index: i32, + pBstrName: ?*?BSTR, + pBstrDocString: ?*?BSTR, + pdwHelpContext: ?*u32, + pBstrHelpFile: ?*?BSTR, + ) callconv(WINAPI) HRESULT, + IsName: *const fn ( + self: *const ITypeLib, + szNameBuf: ?PWSTR, + lHashVal: u32, + pfName: ?*BOOL, + ) callconv(WINAPI) HRESULT, + FindName: *const fn ( + self: *const ITypeLib, + szNameBuf: ?PWSTR, + lHashVal: u32, + ppTInfo: [*]?*ITypeInfo, + rgMemId: [*]i32, + pcFound: ?*u16, + ) callconv(WINAPI) HRESULT, + ReleaseTLibAttr: *const fn ( + self: *const ITypeLib, + pTLibAttr: ?*TLIBATTR, + ) callconv(WINAPI) void, + }; + vtable: *const VTable, +}; +pub const IDispatch = extern struct { + pub const VTable = extern struct { + base: IUnknown.VTable, + GetTypeInfoCount: *const fn ( + self: *const IDispatch, + pctinfo: ?*u32, + ) callconv(WINAPI) HRESULT, + GetTypeInfo: *const fn ( + self: *const IDispatch, + iTInfo: u32, + lcid: u32, + ppTInfo: ?*?*ITypeInfo, + ) callconv(WINAPI) HRESULT, + GetIDsOfNames: *const fn ( + self: *const IDispatch, + riid: ?*const Guid, + rgszNames: [*]?PWSTR, + cNames: u32, + lcid: u32, + rgDispId: [*]i32, + ) callconv(WINAPI) HRESULT, + Invoke: *const fn ( + self: *const IDispatch, + dispIdMember: i32, + riid: ?*const Guid, + lcid: u32, + wFlags: u16, + pDispParams: ?*DISPPARAMS, + pVarResult: ?*VARIANT, + pExcepInfo: ?*EXCEPINFO, + puArgErr: ?*u32, + ) callconv(WINAPI) HRESULT, + }; + vtable: *const VTable, +}; +pub const IEnumSTATSTG = extern struct { + pub const VTable = extern struct { + base: IUnknown.VTable, + Next: *const fn ( + self: *const IEnumSTATSTG, + celt: u32, + rgelt: [*]STATSTG, + pceltFetched: ?*u32, + ) callconv(WINAPI) HRESULT, + Skip: *const fn ( + self: *const IEnumSTATSTG, + celt: u32, + ) callconv(WINAPI) HRESULT, + Reset: *const fn ( + self: *const IEnumSTATSTG, + ) callconv(WINAPI) HRESULT, + Clone: *const fn ( + self: *const IEnumSTATSTG, + ppenum: ?*?*IEnumSTATSTG, + ) callconv(WINAPI) HRESULT, + }; + vtable: *const VTable, +}; +pub const IStorage = extern struct { + pub const VTable = extern struct { + base: IUnknown.VTable, + CreateStream: *const fn ( + self: *const IStorage, + pwcsName: ?[*:0]const u16, + grfMode: u32, + reserved1: u32, + reserved2: u32, + ppstm: ?*?*IStream, + ) callconv(WINAPI) HRESULT, + OpenStream: *const fn ( + self: *const IStorage, + pwcsName: ?[*:0]const u16, + reserved1: ?*anyopaque, + grfMode: u32, + reserved2: u32, + ppstm: ?*?*IStream, + ) callconv(WINAPI) HRESULT, + CreateStorage: *const fn ( + self: *const IStorage, + pwcsName: ?[*:0]const u16, + grfMode: u32, + reserved1: u32, + reserved2: u32, + ppstg: ?*?*IStorage, + ) callconv(WINAPI) HRESULT, + OpenStorage: *const fn ( + self: *const IStorage, + pwcsName: ?[*:0]const u16, + pstgPriority: ?*IStorage, + grfMode: u32, + snbExclude: ?*?*u16, + reserved: u32, + ppstg: ?*?*IStorage, + ) callconv(WINAPI) HRESULT, + CopyTo: *const fn ( + self: *const IStorage, + ciidExclude: u32, + rgiidExclude: ?[*]const Guid, + snbExclude: ?*?*u16, + pstgDest: ?*IStorage, + ) callconv(WINAPI) HRESULT, + MoveElementTo: *const fn ( + self: *const IStorage, + pwcsName: ?[*:0]const u16, + pstgDest: ?*IStorage, + pwcsNewName: ?[*:0]const u16, + grfFlags: u32, + ) callconv(WINAPI) HRESULT, + Commit: *const fn ( + self: *const IStorage, + grfCommitFlags: u32, + ) callconv(WINAPI) HRESULT, + Revert: *const fn ( + self: *const IStorage, + ) callconv(WINAPI) HRESULT, + EnumElements: *const fn ( + self: *const IStorage, + reserved1: u32, + reserved2: ?*anyopaque, + reserved3: u32, + ppenum: ?*?*IEnumSTATSTG, + ) callconv(WINAPI) HRESULT, + DestroyElement: *const fn ( + self: *const IStorage, + pwcsName: ?[*:0]const u16, + ) callconv(WINAPI) HRESULT, + RenameElement: *const fn ( + self: *const IStorage, + pwcsOldName: ?[*:0]const u16, + pwcsNewName: ?[*:0]const u16, + ) callconv(WINAPI) HRESULT, + SetElementTimes: *const fn ( + self: *const IStorage, + pwcsName: ?[*:0]const u16, + pctime: ?*const FILETIME, + patime: ?*const FILETIME, + pmtime: ?*const FILETIME, + ) callconv(WINAPI) HRESULT, + SetClass: *const fn ( + self: *const IStorage, + clsid: ?*const Guid, + ) callconv(WINAPI) HRESULT, + SetStateBits: *const fn ( + self: *const IStorage, + grfStateBits: u32, + grfMask: u32, + ) callconv(WINAPI) HRESULT, + Stat: *const fn ( + self: *const IStorage, + pstatstg: ?*STATSTG, + grfStatFlag: u32, + ) callconv(WINAPI) HRESULT, + }; + vtable: *const VTable, +}; +pub const PROPVARIANT = extern struct { + anon: extern union { + anon: extern struct { + vt: u16, + wReserved1: u16, + wReserved2: u16, + wReserved3: u16, + anon: extern union { + cVal: CHAR, + bVal: u8, + iVal: i16, + uiVal: u16, + lVal: i32, + ulVal: u32, + intVal: i32, + uintVal: u32, + hVal: LARGE_INTEGER, + uhVal: ULARGE_INTEGER, + fltVal: f32, + dblVal: f64, + boolVal: i16, + __OBSOLETE__VARIANT_BOOL: i16, + scode: i32, + cyVal: CY, + date: f64, + filetime: FILETIME, + puuid: ?*Guid, + pclipdata: ?*CLIPDATA, + bstrVal: ?BSTR, + bstrblobVal: BSTRBLOB, + blob: BLOB, + pszVal: ?PSTR, + pwszVal: ?PWSTR, + punkVal: ?*IUnknown, + pdispVal: ?*IDispatch, + pStream: ?*IStream, + pStorage: ?*IStorage, + pVersionedStream: ?*VERSIONEDSTREAM, + parray: ?*SAFEARRAY, + cac: CAC, + caub: CAUB, + cai: CAI, + caui: CAUI, + cal: CAL, + caul: CAUL, + cah: CAH, + cauh: CAUH, + caflt: CAFLT, + cadbl: CADBL, + cabool: CABOOL, + cascode: CASCODE, + cacy: CACY, + cadate: CADATE, + cafiletime: CAFILETIME, + cauuid: CACLSID, + caclipdata: CACLIPDATA, + cabstr: CABSTR, + cabstrblob: CABSTRBLOB, + calpstr: CALPSTR, + calpwstr: CALPWSTR, + capropvar: CAPROPVARIANT, + pcVal: ?PSTR, + pbVal: ?*u8, + piVal: ?*i16, + puiVal: ?*u16, + plVal: ?*i32, + pulVal: ?*u32, + pintVal: ?*i32, + puintVal: ?*u32, + pfltVal: ?*f32, + pdblVal: ?*f64, + pboolVal: ?*i16, + pdecVal: ?*DECIMAL, + pscode: ?*i32, + pcyVal: ?*CY, + pdate: ?*f64, + pbstrVal: ?*?BSTR, + ppunkVal: ?*?*IUnknown, + ppdispVal: ?*?*IDispatch, + pparray: ?*?*SAFEARRAY, + pvarVal: ?*PROPVARIANT, + }, + }, + decVal: DECIMAL, + }, +}; +pub const WAVEFORMATEX = extern struct { + wFormatTag: u16 align(1), + nChannels: u16 align(1), + nSamplesPerSec: u32 align(1), + nAvgBytesPerSec: u32 align(1), + nBlockAlign: u16 align(1), + wBitsPerSample: u16 align(1), + cbSize: u16 align(1), +}; +pub const WAVEFORMATEXTENSIBLE = extern struct { + Format: WAVEFORMATEX align(1), + Samples: extern union { + wValidBitsPerSample: u16 align(1), + wSamplesPerBlock: u16 align(1), + wReserved: u16 align(1), + }, + dwChannelMask: u32 align(1), + SubFormat: Guid align(1), +}; +pub const CLSID_MMDeviceEnumerator = &Guid.initString("bcde0395-e52f-467c-8e3d-c4579291692e"); +pub const DIRECTX_AUDIO_ACTIVATION_PARAMS = extern struct { + cbDirectXAudioActivationParams: u32, + guidAudioSession: Guid, + dwAudioStreamFlags: u32, +}; +pub const DataFlow = enum(i32) { + render = 0, + capture = 1, + all = 2, +}; +pub const Role = enum(i32) { + console = 0, + multimedia = 1, + communications = 2, +}; +pub const AUDCLNT_SHAREMODE = enum(i32) { + SHARED = 0, + EXCLUSIVE = 1, +}; +pub const IID_IAudioClient = &Guid.initString("1cb9ad4c-dbfa-4c32-b178-c2f568a703b2"); +pub const IAudioClient = extern struct { + pub const VTable = extern struct { + base: IUnknown.VTable, + Initialize: *const fn ( + self: *const IAudioClient, + ShareMode: AUDCLNT_SHAREMODE, + StreamFlags: u32, + hnsBufferDuration: i64, + hnsPeriodicity: i64, + pFormat: ?*const WAVEFORMATEX, + AudioSessionGuid: ?*const Guid, + ) callconv(WINAPI) HRESULT, + GetBufferSize: *const fn ( + self: *const IAudioClient, + pNumBufferFrames: ?*u32, + ) callconv(WINAPI) HRESULT, + GetStreamLatency: *const fn ( + self: *const IAudioClient, + phnsLatency: ?*i64, + ) callconv(WINAPI) HRESULT, + GetCurrentPadding: *const fn ( + self: *const IAudioClient, + pNumPaddingFrames: ?*u32, + ) callconv(WINAPI) HRESULT, + IsFormatSupported: *const fn ( + self: *const IAudioClient, + ShareMode: AUDCLNT_SHAREMODE, + pFormat: ?*const WAVEFORMATEX, + ppClosestMatch: ?*?*WAVEFORMATEX, + ) callconv(WINAPI) HRESULT, + GetMixFormat: *const fn ( + self: *const IAudioClient, + ppDeviceFormat: ?*?*WAVEFORMATEX, + ) callconv(WINAPI) HRESULT, + GetDevicePeriod: *const fn ( + self: *const IAudioClient, + phnsDefaultDevicePeriod: ?*i64, + phnsMinimumDevicePeriod: ?*i64, + ) callconv(WINAPI) HRESULT, + Start: *const fn ( + self: *const IAudioClient, + ) callconv(WINAPI) HRESULT, + Stop: *const fn ( + self: *const IAudioClient, + ) callconv(WINAPI) HRESULT, + Reset: *const fn ( + self: *const IAudioClient, + ) callconv(WINAPI) HRESULT, + SetEventHandle: *const fn ( + self: *const IAudioClient, + eventHandle: ?*anyopaque, + ) callconv(WINAPI) HRESULT, + GetService: *const fn ( + self: *const IAudioClient, + riid: ?*const Guid, + ppv: ?*?*anyopaque, + ) callconv(WINAPI) HRESULT, + }; + vtable: *const VTable, + pub fn MethodMixin(comptime T: type) type { + return struct { + pub usingnamespace IUnknown.MethodMixin(T); + pub inline fn Initialize(self: *const T, ShareMode: AUDCLNT_SHAREMODE, StreamFlags: u32, hnsBufferDuration: i64, hnsPeriodicity: i64, pFormat: ?*const WAVEFORMATEX, AudioSessionGuid: ?*const Guid) HRESULT { + return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).Initialize(@as(*const IAudioClient, @ptrCast(self)), ShareMode, StreamFlags, hnsBufferDuration, hnsPeriodicity, pFormat, AudioSessionGuid); + } + pub inline fn GetBufferSize(self: *const T, pNumBufferFrames: ?*u32) HRESULT { + return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).GetBufferSize(@as(*const IAudioClient, @ptrCast(self)), pNumBufferFrames); + } + pub inline fn GetStreamLatency(self: *const T, phnsLatency: ?*i64) HRESULT { + return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).GetStreamLatency(@as(*const IAudioClient, @ptrCast(self)), phnsLatency); + } + pub inline fn GetCurrentPadding(self: *const T, pNumPaddingFrames: ?*u32) HRESULT { + return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).GetCurrentPadding(@as(*const IAudioClient, @ptrCast(self)), pNumPaddingFrames); + } + pub inline fn IsFormatSupported(self: *const T, ShareMode: AUDCLNT_SHAREMODE, pFormat: ?*const WAVEFORMATEX, ppClosestMatch: ?*?*WAVEFORMATEX) HRESULT { + return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).IsFormatSupported(@as(*const IAudioClient, @ptrCast(self)), ShareMode, pFormat, ppClosestMatch); + } + pub inline fn GetMixFormat(self: *const T, ppDeviceFormat: ?*?*WAVEFORMATEX) HRESULT { + return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).GetMixFormat(@as(*const IAudioClient, @ptrCast(self)), ppDeviceFormat); + } + pub inline fn GetDevicePeriod(self: *const T, phnsDefaultDevicePeriod: ?*i64, phnsMinimumDevicePeriod: ?*i64) HRESULT { + return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).GetDevicePeriod(@as(*const IAudioClient, @ptrCast(self)), phnsDefaultDevicePeriod, phnsMinimumDevicePeriod); + } + pub inline fn Start(self: *const T) HRESULT { + return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).Start(@as(*const IAudioClient, @ptrCast(self))); + } + pub inline fn Stop(self: *const T) HRESULT { + return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).Stop(@as(*const IAudioClient, @ptrCast(self))); + } + pub inline fn Reset(self: *const T) HRESULT { + return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).Reset(@as(*const IAudioClient, @ptrCast(self))); + } + pub inline fn SetEventHandle(self: *const T, eventHandle: ?*anyopaque) HRESULT { + return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).SetEventHandle(@as(*const IAudioClient, @ptrCast(self)), eventHandle); + } + pub inline fn GetService(self: *const T, riid: ?*const Guid, ppv: ?*?*anyopaque) HRESULT { + return @as(*const IAudioClient.VTable, @ptrCast(self.vtable)).GetService(@as(*const IAudioClient, @ptrCast(self)), riid, ppv); + } + }; + } + pub usingnamespace MethodMixin(@This()); +}; +pub const AUDCLNT_STREAMOPTIONS = enum(u32) { + NONE = 0, + RAW = 1, + MATCH_FORMAT = 2, + AMBISONICS = 4, +}; +pub const AudioClientProperties = extern struct { + cbSize: u32, + bIsOffload: BOOL, + eCategory: AUDIO_STREAM_CATEGORY, + Options: AUDCLNT_STREAMOPTIONS, +}; +pub const AUDIO_STREAM_CATEGORY = enum(i32) { + Other = 0, + ForegroundOnlyMedia = 1, + Communications = 3, + Alerts = 4, + SoundEffects = 5, + GameEffects = 6, + GameMedia = 7, + GameChat = 8, + Speech = 9, + Movie = 10, + Media = 11, + FarFieldSpeech = 12, + UniformSpeech = 13, + VoiceTyping = 14, +}; +const IID_IAudioClient2 = &Guid.initString("726778cd-f60a-4eda-82de-e47610cd78aa"); +pub const IAudioClient2 = extern struct { + pub const VTable = extern struct { + base: IAudioClient.VTable, + IsOffloadCapable: *const fn ( + self: *const IAudioClient2, + Category: AUDIO_STREAM_CATEGORY, + pbOffloadCapable: ?*BOOL, + ) callconv(WINAPI) HRESULT, + SetClientProperties: *const fn ( + self: *const IAudioClient2, + pProperties: ?*const AudioClientProperties, + ) callconv(WINAPI) HRESULT, + GetBufferSizeLimits: *const fn ( + self: *const IAudioClient2, + pFormat: ?*const WAVEFORMATEX, + bEventDriven: BOOL, + phnsMinBufferDuration: ?*i64, + phnsMaxBufferDuration: ?*i64, + ) callconv(WINAPI) HRESULT, + }; + vtable: *const VTable, + pub fn MethodMixin(comptime T: type) type { + return struct { + pub usingnamespace IAudioClient.MethodMixin(T); + pub inline fn IsOffloadCapable(self: *const T, Category: AUDIO_STREAM_CATEGORY, pbOffloadCapable: ?*BOOL) HRESULT { + return @as(*const IAudioClient2.VTable, @ptrCast(self.vtable)).IsOffloadCapable(@as(*const IAudioClient2, @ptrCast(self)), Category, pbOffloadCapable); + } + pub inline fn SetClientProperties(self: *const T, pProperties: ?*const AudioClientProperties) HRESULT { + return @as(*const IAudioClient2.VTable, @ptrCast(self.vtable)).SetClientProperties(@as(*const IAudioClient2, @ptrCast(self)), pProperties); + } + pub inline fn GetBufferSizeLimits(self: *const T, pFormat: ?*const WAVEFORMATEX, bEventDriven: BOOL, phnsMinBufferDuration: ?*i64, phnsMaxBufferDuration: ?*i64) HRESULT { + return @as(*const IAudioClient2.VTable, @ptrCast(self.vtable)).GetBufferSizeLimits(@as(*const IAudioClient2, @ptrCast(self)), pFormat, bEventDriven, phnsMinBufferDuration, phnsMaxBufferDuration); + } + }; + } + pub usingnamespace MethodMixin(@This()); +}; +pub const IID_IAudioClient3 = &Guid.initString("7ed4ee07-8e67-4cd4-8c1a-2b7a5987ad42"); +pub const IAudioClient3 = extern struct { + pub const VTable = extern struct { + base: IAudioClient2.VTable, + GetSharedModeEnginePeriod: *const fn ( + self: *const IAudioClient3, + pFormat: ?*const WAVEFORMATEX, + pDefaultPeriodInFrames: ?*u32, + pFundamentalPeriodInFrames: ?*u32, + pMinPeriodInFrames: ?*u32, + pMaxPeriodInFrames: ?*u32, + ) callconv(WINAPI) HRESULT, + GetCurrentSharedModeEnginePeriod: *const fn ( + self: *const IAudioClient3, + ppFormat: ?*?*WAVEFORMATEX, + pCurrentPeriodInFrames: ?*u32, + ) callconv(WINAPI) HRESULT, + InitializeSharedAudioStream: *const fn ( + self: *const IAudioClient3, + StreamFlags: u32, + PeriodInFrames: u32, + pFormat: ?*const WAVEFORMATEX, + AudioSessionGuid: ?*const Guid, + ) callconv(WINAPI) HRESULT, + }; + vtable: *const VTable, + pub fn MethodMixin(comptime T: type) type { + return struct { + pub usingnamespace IAudioClient2.MethodMixin(T); + pub inline fn GetSharedModeEnginePeriod(self: *const T, pFormat: ?*const WAVEFORMATEX, pDefaultPeriodInFrames: ?*u32, pFundamentalPeriodInFrames: ?*u32, pMinPeriodInFrames: ?*u32, pMaxPeriodInFrames: ?*u32) HRESULT { + return @as(*const IAudioClient3.VTable, @ptrCast(self.vtable)).GetSharedModeEnginePeriod(@as(*const IAudioClient3, @ptrCast(self)), pFormat, pDefaultPeriodInFrames, pFundamentalPeriodInFrames, pMinPeriodInFrames, pMaxPeriodInFrames); + } + pub inline fn GetCurrentSharedModeEnginePeriod(self: *const T, ppFormat: ?*?*WAVEFORMATEX, pCurrentPeriodInFrames: ?*u32) HRESULT { + return @as(*const IAudioClient3.VTable, @ptrCast(self.vtable)).GetCurrentSharedModeEnginePeriod(@as(*const IAudioClient3, @ptrCast(self)), ppFormat, pCurrentPeriodInFrames); + } + pub inline fn InitializeSharedAudioStream(self: *const T, StreamFlags: u32, PeriodInFrames: u32, pFormat: ?*const WAVEFORMATEX, AudioSessionGuid: ?*const Guid) HRESULT { + return @as(*const IAudioClient3.VTable, @ptrCast(self.vtable)).InitializeSharedAudioStream(@as(*const IAudioClient3, @ptrCast(self)), StreamFlags, PeriodInFrames, pFormat, AudioSessionGuid); + } + }; + } + pub usingnamespace MethodMixin(@This()); +}; +pub extern "ole32" fn CoTaskMemFree(pv: ?*anyopaque) callconv(WINAPI) void; +pub const IID_IAudioRenderClient = &Guid.initString("f294acfc-3146-4483-a7bf-addca7c260e2"); +pub const IAudioRenderClient = extern struct { + pub const VTable = extern struct { + base: IUnknown.VTable, + GetBuffer: *const fn ( + self: *const IAudioRenderClient, + NumFramesRequested: u32, + ppData: ?*?*u8, + ) callconv(WINAPI) HRESULT, + ReleaseBuffer: *const fn ( + self: *const IAudioRenderClient, + NumFramesWritten: u32, + dwFlags: u32, + ) callconv(WINAPI) HRESULT, + }; + vtable: *const VTable, + pub fn MethodMixin(comptime T: type) type { + return struct { + pub usingnamespace IUnknown.MethodMixin(T); + pub inline fn GetBuffer(self: *const T, NumFramesRequested: u32, ppData: ?*?*u8) HRESULT { + return @as(*const IAudioRenderClient.VTable, @ptrCast(self.vtable)).GetBuffer(@as(*const IAudioRenderClient, @ptrCast(self)), NumFramesRequested, ppData); + } + pub inline fn ReleaseBuffer(self: *const T, NumFramesWritten: u32, dwFlags: u32) HRESULT { + return @as(*const IAudioRenderClient.VTable, @ptrCast(self.vtable)).ReleaseBuffer(@as(*const IAudioRenderClient, @ptrCast(self)), NumFramesWritten, dwFlags); + } + }; + } + pub usingnamespace MethodMixin(@This()); +}; +pub const IID_IAudioCaptureClient = &Guid.initString("c8adbd64-e71e-48a0-a4de-185c395cd317"); +pub const IAudioCaptureClient = extern struct { + pub const VTable = extern struct { + base: IUnknown.VTable, + GetBuffer: *const fn ( + self: *const IAudioCaptureClient, + ppData: ?*?*u8, + pNumFramesToRead: ?*u32, + pdwFlags: ?*u32, + pu64DevicePosition: ?*u64, + pu64QPCPosition: ?*u64, + ) callconv(WINAPI) HRESULT, + ReleaseBuffer: *const fn ( + self: *const IAudioCaptureClient, + NumFramesRead: u32, + ) callconv(WINAPI) HRESULT, + GetNextPacketSize: *const fn ( + self: *const IAudioCaptureClient, + pNumFramesInNextPacket: ?*u32, + ) callconv(WINAPI) HRESULT, + }; + vtable: *const VTable, + pub fn MethodMixin(comptime T: type) type { + return struct { + pub usingnamespace IUnknown.MethodMixin(T); + pub inline fn GetBuffer(self: *const T, ppData: ?*?*u8, pNumFramesToRead: ?*u32, pdwFlags: ?*u32, pu64DevicePosition: ?*u64, pu64QPCPosition: ?*u64) HRESULT { + return @as(*const IAudioCaptureClient.VTable, @ptrCast(self.vtable)).GetBuffer(@as(*const IAudioCaptureClient, @ptrCast(self)), ppData, pNumFramesToRead, pdwFlags, pu64DevicePosition, pu64QPCPosition); + } + pub inline fn ReleaseBuffer(self: *const T, NumFramesRead: u32) HRESULT { + return @as(*const IAudioCaptureClient.VTable, @ptrCast(self.vtable)).ReleaseBuffer(@as(*const IAudioCaptureClient, @ptrCast(self)), NumFramesRead); + } + pub inline fn GetNextPacketSize(self: *const T, pNumFramesInNextPacket: ?*u32) HRESULT { + return @as(*const IAudioCaptureClient.VTable, @ptrCast(self.vtable)).GetNextPacketSize(@as(*const IAudioCaptureClient, @ptrCast(self)), pNumFramesInNextPacket); + } + }; + } + pub usingnamespace MethodMixin(@This()); +}; +pub const IID_ISimpleAudioVolume = &Guid.initString("87ce5498-68d6-44e5-9215-6da47ef883d8"); +pub const ISimpleAudioVolume = extern struct { + pub const VTable = extern struct { + base: IUnknown.VTable, + SetMasterVolume: *const fn ( + self: *const ISimpleAudioVolume, + fLevel: f32, + EventContext: ?*const Guid, + ) callconv(WINAPI) HRESULT, + GetMasterVolume: *const fn ( + self: *const ISimpleAudioVolume, + pfLevel: ?*f32, + ) callconv(WINAPI) HRESULT, + SetMute: *const fn ( + self: *const ISimpleAudioVolume, + bMute: BOOL, + EventContext: ?*const Guid, + ) callconv(WINAPI) HRESULT, + GetMute: *const fn ( + self: *const ISimpleAudioVolume, + pbMute: ?*BOOL, + ) callconv(WINAPI) HRESULT, + }; + vtable: *const VTable, + pub fn MethodMixin(comptime T: type) type { + return struct { + pub usingnamespace IUnknown.MethodMixin(T); + pub inline fn SetMasterVolume(self: *const T, fLevel: f32, EventContext: ?*const Guid) HRESULT { + return @as(*const ISimpleAudioVolume.VTable, @ptrCast(self.vtable)).SetMasterVolume(@as(*const ISimpleAudioVolume, @ptrCast(self)), fLevel, EventContext); + } + pub inline fn GetMasterVolume(self: *const T, pfLevel: ?*f32) HRESULT { + return @as(*const ISimpleAudioVolume.VTable, @ptrCast(self.vtable)).GetMasterVolume(@as(*const ISimpleAudioVolume, @ptrCast(self)), pfLevel); + } + pub inline fn SetMute(self: *const T, bMute: BOOL, EventContext: ?*const Guid) HRESULT { + return @as(*const ISimpleAudioVolume.VTable, @ptrCast(self.vtable)).SetMute(@as(*const ISimpleAudioVolume, @ptrCast(self)), bMute, EventContext); + } + pub inline fn GetMute(self: *const T, pbMute: ?*BOOL) HRESULT { + return @as(*const ISimpleAudioVolume.VTable, @ptrCast(self.vtable)).GetMute(@as(*const ISimpleAudioVolume, @ptrCast(self)), pbMute); + } + }; + } + pub usingnamespace MethodMixin(@This()); +}; +pub const IPropertyStore = extern struct { + pub const VTable = extern struct { + base: IUnknown.VTable, + GetCount: *const fn ( + self: *const IPropertyStore, + cProps: ?*u32, + ) callconv(WINAPI) HRESULT, + GetAt: *const fn ( + self: *const IPropertyStore, + iProp: u32, + pkey: ?*PROPERTYKEY, + ) callconv(WINAPI) HRESULT, + GetValue: *const fn ( + self: *const IPropertyStore, + key: ?*const PROPERTYKEY, + pv: ?*PROPVARIANT, + ) callconv(WINAPI) HRESULT, + SetValue: *const fn ( + self: *const IPropertyStore, + key: ?*const PROPERTYKEY, + propvar: ?*const PROPVARIANT, + ) callconv(WINAPI) HRESULT, + Commit: *const fn ( + self: *const IPropertyStore, + ) callconv(WINAPI) HRESULT, + }; + vtable: *const VTable, + pub fn MethodMixin(comptime T: type) type { + return struct { + pub usingnamespace IUnknown.MethodMixin(T); + pub inline fn GetCount(self: *const T, cProps: ?*u32) HRESULT { + return @as(*const IPropertyStore.VTable, @ptrCast(self.vtable)).GetCount(@as(*const IPropertyStore, @ptrCast(self)), cProps); + } + pub inline fn GetAt(self: *const T, iProp: u32, pkey: ?*PROPERTYKEY) HRESULT { + return @as(*const IPropertyStore.VTable, @ptrCast(self.vtable)).GetAt(@as(*const IPropertyStore, @ptrCast(self)), iProp, pkey); + } + pub inline fn GetValue(self: *const T, key: ?*const PROPERTYKEY, pv: ?*PROPVARIANT) HRESULT { + return @as(*const IPropertyStore.VTable, @ptrCast(self.vtable)).GetValue(@as(*const IPropertyStore, @ptrCast(self)), key, pv); + } + pub inline fn SetValue(self: *const T, key: ?*const PROPERTYKEY, propvar: ?*const PROPVARIANT) HRESULT { + return @as(*const IPropertyStore.VTable, @ptrCast(self.vtable)).SetValue(@as(*const IPropertyStore, @ptrCast(self)), key, propvar); + } + pub inline fn Commit(self: *const T) HRESULT { + return @as(*const IPropertyStore.VTable, @ptrCast(self.vtable)).Commit(@as(*const IPropertyStore, @ptrCast(self))); + } + }; + } + pub usingnamespace MethodMixin(@This()); +}; +const IID_IMMDevice = &Guid.initString("d666063f-1587-4e43-81f1-b948e807363f"); +pub const IMMDevice = extern struct { + pub const VTable = extern struct { + base: IUnknown.VTable, + Activate: *const fn ( + self: *const IMMDevice, + iid: ?*const Guid, + dwClsCtx: u32, + pActivationParams: ?*PROPVARIANT, + ppInterface: ?*?*anyopaque, + ) callconv(WINAPI) HRESULT, + OpenPropertyStore: *const fn ( + self: *const IMMDevice, + stgmAccess: u32, + ppProperties: ?*?*IPropertyStore, + ) callconv(WINAPI) HRESULT, + GetId: *const fn ( + self: *const IMMDevice, + ppstrId: ?*?PWSTR, + ) callconv(WINAPI) HRESULT, + GetState: *const fn ( + self: *const IMMDevice, + pdwState: ?*u32, + ) callconv(WINAPI) HRESULT, + }; + vtable: *const VTable, + pub fn MethodMixin(comptime T: type) type { + return struct { + pub usingnamespace IUnknown.MethodMixin(T); + pub inline fn Activate(self: *const T, iid: ?*const Guid, dwClsCtx: u32, pActivationParams: ?*PROPVARIANT, ppInterface: ?*?*anyopaque) HRESULT { + return @as(*const IMMDevice.VTable, @ptrCast(self.vtable)).Activate(@as(*const IMMDevice, @ptrCast(self)), iid, dwClsCtx, pActivationParams, ppInterface); + } + pub inline fn OpenPropertyStore(self: *const T, stgmAccess: u32, ppProperties: ?*?*IPropertyStore) HRESULT { + return @as(*const IMMDevice.VTable, @ptrCast(self.vtable)).OpenPropertyStore(@as(*const IMMDevice, @ptrCast(self)), stgmAccess, ppProperties); + } + pub inline fn GetId(self: *const T, ppstrId: ?*?PWSTR) HRESULT { + return @as(*const IMMDevice.VTable, @ptrCast(self.vtable)).GetId(@as(*const IMMDevice, @ptrCast(self)), ppstrId); + } + pub inline fn GetState(self: *const T, pdwState: ?*u32) HRESULT { + return @as(*const IMMDevice.VTable, @ptrCast(self.vtable)).GetState(@as(*const IMMDevice, @ptrCast(self)), pdwState); + } + }; + } + pub usingnamespace MethodMixin(@This()); +}; +pub const IID_IMMNotificationClient = &Guid.initString("7991eec9-7e89-4d85-8390-6c703cec60c0"); +pub const IMMNotificationClient = extern struct { + pub const VTable = extern struct { + base: IUnknown.VTable, + OnDeviceStateChanged: *const fn ( + self: *const IMMNotificationClient, + pwstrDeviceId: ?[*:0]const u16, + dwNewState: u32, + ) callconv(WINAPI) HRESULT, + OnDeviceAdded: *const fn ( + self: *const IMMNotificationClient, + pwstrDeviceId: ?[*:0]const u16, + ) callconv(WINAPI) HRESULT, + OnDeviceRemoved: *const fn ( + self: *const IMMNotificationClient, + pwstrDeviceId: ?[*:0]const u16, + ) callconv(WINAPI) HRESULT, + OnDefaultDeviceChanged: *const fn ( + self: *const IMMNotificationClient, + flow: DataFlow, + role: Role, + pwstrDefaultDeviceId: ?[*:0]const u16, + ) callconv(WINAPI) HRESULT, + OnPropertyValueChanged: *const fn ( + self: *const IMMNotificationClient, + pwstrDeviceId: ?[*:0]const u16, + key: PROPERTYKEY, + ) callconv(WINAPI) HRESULT, + }; + vtable: *const VTable, + pub fn MethodMixin(comptime T: type) type { + return struct { + pub usingnamespace IUnknown.MethodMixin(T); + pub inline fn OnDeviceStateChanged(self: *const T, pwstrDeviceId: ?[*:0]const u16, dwNewState: u32) HRESULT { + return @as(*const IMMNotificationClient.VTable, @ptrCast(self.vtable)).OnDeviceStateChanged(@as(*const IMMNotificationClient, @ptrCast(self)), pwstrDeviceId, dwNewState); + } + pub inline fn OnDeviceAdded(self: *const T, pwstrDeviceId: ?[*:0]const u16) HRESULT { + return @as(*const IMMNotificationClient.VTable, @ptrCast(self.vtable)).OnDeviceAdded(@as(*const IMMNotificationClient, @ptrCast(self)), pwstrDeviceId); + } + pub inline fn OnDeviceRemoved(self: *const T, pwstrDeviceId: ?[*:0]const u16) HRESULT { + return @as(*const IMMNotificationClient.VTable, @ptrCast(self.vtable)).OnDeviceRemoved(@as(*const IMMNotificationClient, @ptrCast(self)), pwstrDeviceId); + } + pub inline fn OnDefaultDeviceChanged(self: *const T, flow: DataFlow, role: Role, pwstrDefaultDeviceId: ?[*:0]const u16) HRESULT { + return @as(*const IMMNotificationClient.VTable, @ptrCast(self.vtable)).OnDefaultDeviceChanged(@as(*const IMMNotificationClient, @ptrCast(self)), flow, role, pwstrDefaultDeviceId); + } + pub inline fn OnPropertyValueChanged(self: *const T, pwstrDeviceId: ?[*:0]const u16, key: PROPERTYKEY) HRESULT { + return @as(*const IMMNotificationClient.VTable, @ptrCast(self.vtable)).OnPropertyValueChanged(@as(*const IMMNotificationClient, @ptrCast(self)), pwstrDeviceId, key); + } + }; + } + pub usingnamespace MethodMixin(@This()); +}; +pub const IID_IMMDeviceCollection = &Guid.initString("0bd7a1be-7a1a-44db-8397-cc5392387b5e"); +pub const IMMDeviceCollection = extern struct { + pub const VTable = extern struct { + base: IUnknown.VTable, + GetCount: *const fn ( + self: *const IMMDeviceCollection, + pcDevices: ?*u32, + ) callconv(WINAPI) HRESULT, + Item: *const fn ( + self: *const IMMDeviceCollection, + nDevice: u32, + ppDevice: ?*?*IMMDevice, + ) callconv(WINAPI) HRESULT, + }; + vtable: *const VTable, + pub fn MethodMixin(comptime T: type) type { + return struct { + pub usingnamespace IUnknown.MethodMixin(T); + pub inline fn GetCount(self: *const T, pcDevices: ?*u32) HRESULT { + return @as(*const IMMDeviceCollection.VTable, @ptrCast(self.vtable)).GetCount(@as(*const IMMDeviceCollection, @ptrCast(self)), pcDevices); + } + pub inline fn Item(self: *const T, nDevice: u32, ppDevice: ?*?*IMMDevice) HRESULT { + return @as(*const IMMDeviceCollection.VTable, @ptrCast(self.vtable)).Item(@as(*const IMMDeviceCollection, @ptrCast(self)), nDevice, ppDevice); + } + }; + } + pub usingnamespace MethodMixin(@This()); +}; +pub const IID_IMMDeviceEnumerator = &Guid.initString("a95664d2-9614-4f35-a746-de8db63617e6"); +pub const IMMDeviceEnumerator = extern struct { + pub const VTable = extern struct { + base: IUnknown.VTable, + EnumAudioEndpoints: *const fn ( + self: *const IMMDeviceEnumerator, + dataFlow: DataFlow, + dwStateMask: u32, + ppDevices: ?*?*IMMDeviceCollection, + ) callconv(WINAPI) HRESULT, + GetDefaultAudioEndpoint: *const fn ( + self: *const IMMDeviceEnumerator, + dataFlow: DataFlow, + role: Role, + ppEndpoint: ?*?*IMMDevice, + ) callconv(WINAPI) HRESULT, + GetDevice: *const fn ( + self: *const IMMDeviceEnumerator, + pwstrId: ?[*:0]const u16, + ppDevice: ?*?*IMMDevice, + ) callconv(WINAPI) HRESULT, + RegisterEndpointNotificationCallback: *const fn ( + self: *const IMMDeviceEnumerator, + pClient: ?*IMMNotificationClient, + ) callconv(WINAPI) HRESULT, + UnregisterEndpointNotificationCallback: *const fn ( + self: *const IMMDeviceEnumerator, + pClient: ?*IMMNotificationClient, + ) callconv(WINAPI) HRESULT, + }; + vtable: *const VTable, + pub fn MethodMixin(comptime T: type) type { + return struct { + pub usingnamespace IUnknown.MethodMixin(T); + pub inline fn EnumAudioEndpoints(self: *const T, dataFlow: DataFlow, dwStateMask: u32, ppDevices: ?*?*IMMDeviceCollection) HRESULT { + return @as(*const IMMDeviceEnumerator.VTable, @ptrCast(self.vtable)).EnumAudioEndpoints(@as(*const IMMDeviceEnumerator, @ptrCast(self)), dataFlow, dwStateMask, ppDevices); + } + pub inline fn GetDefaultAudioEndpoint(self: *const T, dataFlow: DataFlow, role: Role, ppEndpoint: ?*?*IMMDevice) HRESULT { + return @as(*const IMMDeviceEnumerator.VTable, @ptrCast(self.vtable)).GetDefaultAudioEndpoint(@as(*const IMMDeviceEnumerator, @ptrCast(self)), dataFlow, role, ppEndpoint); + } + pub inline fn GetDevice(self: *const T, pwstrId: ?[*:0]const u16, ppDevice: ?*?*IMMDevice) HRESULT { + return @as(*const IMMDeviceEnumerator.VTable, @ptrCast(self.vtable)).GetDevice(@as(*const IMMDeviceEnumerator, @ptrCast(self)), pwstrId, ppDevice); + } + pub inline fn RegisterEndpointNotificationCallback(self: *const T, pClient: ?*IMMNotificationClient) HRESULT { + return @as(*const IMMDeviceEnumerator.VTable, @ptrCast(self.vtable)).RegisterEndpointNotificationCallback(@as(*const IMMDeviceEnumerator, @ptrCast(self)), pClient); + } + pub inline fn UnregisterEndpointNotificationCallback(self: *const T, pClient: ?*IMMNotificationClient) HRESULT { + return @as(*const IMMDeviceEnumerator.VTable, @ptrCast(self.vtable)).UnregisterEndpointNotificationCallback(@as(*const IMMDeviceEnumerator, @ptrCast(self)), pClient); + } + }; + } + pub usingnamespace MethodMixin(@This()); +}; +pub const IID_IMMEndpoint = &Guid.initString("1be09788-6894-4089-8586-9a2a6c265ac5"); +pub const IMMEndpoint = extern struct { + pub const VTable = extern struct { + base: IUnknown.VTable, + GetDataFlow: *const fn ( + self: *const IMMEndpoint, + pDataFlow: ?*DataFlow, + ) callconv(WINAPI) HRESULT, + }; + vtable: *const VTable, + pub fn MethodMixin(comptime T: type) type { + return struct { + pub usingnamespace IUnknown.MethodMixin(T); + pub inline fn GetDataFlow(self: *const T, pDataFlow: ?*DataFlow) HRESULT { + return @as(*const IMMEndpoint.VTable, @ptrCast(self.vtable)).GetDataFlow(@as(*const IMMEndpoint, @ptrCast(self)), pDataFlow); + } + }; + } + pub usingnamespace MethodMixin(@This()); +}; +pub const AUDCLNT_STREAMFLAGS_CROSSPROCESS = 65536; +pub const AUDCLNT_STREAMFLAGS_LOOPBACK = 131072; +pub const AUDCLNT_STREAMFLAGS_EVENTCALLBACK = 262144; +pub const AUDCLNT_STREAMFLAGS_NOPERSIST = 524288; +pub const AUDCLNT_STREAMFLAGS_RATEADJUST = 1048576; +pub const AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY = 134217728; +pub const AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM = 2147483648; +pub const AUDCLNT_SESSIONFLAGS_EXPIREWHENUNOWNED = 268435456; +pub const PKEY_Device_FriendlyName = PROPERTYKEY{ .fmtid = Guid.initString("a45c254e-df1c-4efd-8020-67d146a850e0"), .pid = 14 }; +pub const CLSID_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT = &Guid.initString("00000003-0000-0010-8000-00aa00389b71"); +pub const SPEAKER_FRONT_LEFT = 1; +pub const SPEAKER_FRONT_RIGHT = 2; +pub const SPEAKER_FRONT_CENTER = 4; +pub const SPEAKER_LOW_FREQUENCY = 8; +pub const SPEAKER_BACK_LEFT = 16; +pub const SPEAKER_BACK_RIGHT = 32; +pub const SPEAKER_FRONT_LEFT_OF_CENTER = 64; +pub const SPEAKER_FRONT_RIGHT_OF_CENTER = 128; +pub const SPEAKER_BACK_CENTER = 256; +pub const SPEAKER_SIDE_LEFT = 512; +pub const SPEAKER_SIDE_RIGHT = 1024; +pub const SPEAKER_TOP_CENTER = 2048; +pub const SPEAKER_TOP_FRONT_LEFT = 4096; +pub const SPEAKER_TOP_FRONT_CENTER = 8192; +pub const SPEAKER_TOP_FRONT_RIGHT = 16384; +pub const SPEAKER_TOP_BACK_LEFT = 32768; +pub const SPEAKER_TOP_BACK_CENTER = 65536; +pub const SPEAKER_TOP_BACK_RIGHT = 131072; +pub const SPEAKER_RESERVED = @as(u32, 2147221504); +pub const SPEAKER_ALL = @as(u32, 2147483648); +pub const CLSID_KSDATAFORMAT_SUBTYPE_PCM = &Guid.initString("00000001-0000-0010-8000-00aa00389b71"); +pub const INPLACE_S_TRUNCATED = 262560; +pub const PKEY_AudioEngine_DeviceFormat = PROPERTYKEY{ .fmtid = Guid.initString("f19f064d-082c-4e27-bc73-6882a1bb8e4c"), .pid = 0 }; +pub const WAVE_FORMAT_EXTENSIBLE = 65534; +pub const STGM_READ = 0; +pub const DEVICE_STATE_ACTIVE = 1; +pub const AUDCLNT_E_NOT_INITIALIZED = -2004287487; +pub const AUDCLNT_E_ALREADY_INITIALIZED = -2004287486; +pub const AUDCLNT_E_WRONG_ENDPOINT_TYPE = -2004287485; +pub const AUDCLNT_E_DEVICE_INVALIDATED = -2004287484; +pub const AUDCLNT_E_NOT_STOPPED = -2004287483; +pub const AUDCLNT_E_BUFFER_TOO_LARGE = -2004287482; +pub const AUDCLNT_E_OUT_OF_ORDER = -2004287481; +pub const AUDCLNT_E_UNSUPPORTED_FORMAT = -2004287480; +pub const AUDCLNT_E_INVALID_SIZE = -2004287479; +pub const AUDCLNT_E_DEVICE_IN_USE = -2004287478; +pub const AUDCLNT_E_BUFFER_OPERATION_PENDING = -2004287477; +pub const AUDCLNT_E_THREAD_NOT_REGISTERED = -2004287476; +pub const AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED = -2004287474; +pub const AUDCLNT_E_ENDPOINT_CREATE_FAILED = -2004287473; +pub const AUDCLNT_E_SERVICE_NOT_RUNNING = -2004287472; +pub const AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED = -2004287471; +pub const AUDCLNT_E_EXCLUSIVE_MODE_ONLY = -2004287470; +pub const AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL = -2004287469; +pub const AUDCLNT_E_EVENTHANDLE_NOT_SET = -2004287468; +pub const AUDCLNT_E_INCORRECT_BUFFER_SIZE = -2004287467; +pub const AUDCLNT_E_BUFFER_SIZE_ERROR = -2004287466; +pub const AUDCLNT_E_CPUUSAGE_EXCEEDED = -2004287465; +pub const AUDCLNT_E_BUFFER_ERROR = -2004287464; +pub const AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED = -2004287463; +pub const AUDCLNT_E_INVALID_DEVICE_PERIOD = -2004287456; +pub const AUDCLNT_E_INVALID_STREAM_FLAG = -2004287455; +pub const AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE = -2004287454; +pub const AUDCLNT_E_OUT_OF_OFFLOAD_RESOURCES = -2004287453; +pub const AUDCLNT_E_OFFLOAD_MODE_ONLY = -2004287452; +pub const AUDCLNT_E_NONOFFLOAD_MODE_ONLY = -2004287451; +pub const AUDCLNT_E_RESOURCES_INVALIDATED = -2004287450; +pub const AUDCLNT_E_RAW_MODE_UNSUPPORTED = -2004287449; +pub const AUDCLNT_E_ENGINE_PERIODICITY_LOCKED = -2004287448; +pub const AUDCLNT_E_ENGINE_FORMAT_LOCKED = -2004287447; +pub const AUDCLNT_E_HEADTRACKING_ENABLED = -2004287440; +pub const AUDCLNT_E_HEADTRACKING_UNSUPPORTED = -2004287424; +pub const AUDCLNT_E_EFFECT_NOT_AVAILABLE = -2004287423; +pub const AUDCLNT_E_EFFECT_STATE_READ_ONLY = -2004287422;