[SOLVED] ActivateAudioInterfaceAsync function Help!

Just starting out? Need help? Post your questions and find answers here.
AndyMK
Enthusiast
Enthusiast
Posts: 582
Joined: Wed Jul 12, 2006 4:38 pm
Location: UK

[SOLVED] ActivateAudioInterfaceAsync function Help!

Post by AndyMK »

So, I am trying to use this function to enable WASAPI Loopback Audio Capture per process as described here

https://learn.microsoft.com/en-us/windo ... rfaceasync

and a Microsoft sample here

https://learn.microsoft.com/en-us/sampl ... io-sample/

I have already done this in dotnet but i would love to get this going in PB. At the moment it unexpectedly quits without much to go on. I have a feeling the ActivateAudioInterfaceAsync parameter declaration may be wrong. Any help would be much appreciated.

Code: Select all

Global ActivateAudioInterfaceAsync
Prototype.i ActivateAudioInterfaceAsync(deviceInterfacePath.p-unicode, *riid, *activationParams, *completionHandler, *activationOperation)

If OpenLibrary(0, "Mmdevapi.dll")
  ActivateAudioInterfaceAsync.ActivateAudioInterfaceAsync = GetFunction(0, "ActivateAudioInterfaceAsync")
  ;CloseLibrary(0)
EndIf

; -----------------------------------------------------------------------------
;  COM Interfaces
; -----------------------------------------------------------------------------
Interface IActivateAudioInterfaceAsyncOperation Extends IUnknown
  GetActivateResult(*activateResult, *activatedInterface)
EndInterface

Interface IActivateAudioInterfaceCompletionHandler Extends IUnknown
  ActivateCompleted(*activateOperation)
EndInterface

; Enumerations
Enumeration; AUDIOCLIENT_ACTIVATION_TYPE
  #AUDIOCLIENT_ACTIVATION_TYPE_DEFAULT
  #AUDIOCLIENT_ACTIVATION_TYPE_PROCESS_LOOPBACK
EndEnumeration

Enumeration; PROCESS_LOOPBACK_MODE
  #PROCESS_LOOPBACK_MODE_INCLUDE_TARGET_PROCESS_TREE
  #PROCESS_LOOPBACK_MODE_EXCLUDE_TARGET_PROCESS_TREE
EndEnumeration

; Structures
Structure AUDIOCLIENT_PROCESS_LOOPBACK_PARAMS Align #PB_Structure_AlignC
  TargetProcessId.l    ; DWORD (32-bit integer)
  ProcessLoopbackMode.l ; PROCESS_LOOPBACK_MODE enumeration
EndStructure

; Main structure
Structure AUDIOCLIENT_ACTIVATION_PARAMS Align #PB_Structure_AlignC
  ActivationType.l      ; AUDIOCLIENT_ACTIVATION_TYPE enumeration
  ProcessLoopbackParams.AUDIOCLIENT_PROCESS_LOOPBACK_PARAMS
EndStructure

; COM object structure.
Structure MyAudioSessionNotificationObj
  lpVtbl.i    ; Pointer to vtable
  RefCount.l  ; Reference counter
EndStructure

; Global pointer to the shared vtable
Global *MyAudioSessionNotificationVTable = #Null

Procedure MyAddRef(*Object)
  Protected newCount = PeekL(*Object + SizeOf(Quad)) + 1
  PokeL(*Object + SizeOf(Quad), newCount)
  ProcedureReturn newCount
EndProcedure

Procedure MyQueryInterface(*Object, riid.i, ppvObject.i)
  PokeD(ppvObject, *Object)
  MyAddRef(*Object)
  ProcedureReturn #S_OK
EndProcedure

Procedure MyRelease(*Object)
  Protected newCount = PeekL(*Object + SizeOf(Quad)) - 1
  PokeL(*Object + SizeOf(Quad), newCount)
  If newCount = 0
    FreeMemory(*Object)
  EndIf
  ProcedureReturn newCount
EndProcedure

Procedure MyActivateCompleted(*Object, *asyncOp.IActivateAudioInterfaceAsyncOperation)
  Protected activateResult, activatedInterface
  
  *asyncOp\GetActivateResult(@activateResult, @activatedInterface)
  
  If activateResult = #S_OK
    Debug "Activation succeeded!"
    ; use activatedInterface here (cast to IAudioClient)
  Else
    Debug "Activation failed: " + Hex(activateResult)
  EndIf
  
  ;asyncOp\Release()
  
  ProcedureReturn #S_OK
EndProcedure

Procedure CreateMyAudioSessionNotification()
  Protected *pObj = AllocateMemory(SizeOf(MyAudioSessionNotificationObj))
  If *pObj = 0
    ProcedureReturn #Null
  EndIf
  
  If *MyAudioSessionNotificationVTable = #Null
    *MyAudioSessionNotificationVTable = AllocateMemory(4 * SizeOf(Quad))
    If *MyAudioSessionNotificationVTable = #Null
      FreeMemory(*pObj)
      ProcedureReturn #Null
    EndIf
    PokeI(*MyAudioSessionNotificationVTable + 0 * SizeOf(Quad), @MyQueryInterface())
    PokeI(*MyAudioSessionNotificationVTable + 1 * SizeOf(Quad), @MyAddRef())
    PokeI(*MyAudioSessionNotificationVTable + 2 * SizeOf(Quad), @MyRelease())
    PokeI(*MyAudioSessionNotificationVTable + 3 * SizeOf(Quad), @MyActivateCompleted())
  EndIf
  
  PokeI(*pObj, *MyAudioSessionNotificationVTable)
  PokeL(*pObj + SizeOf(Quad), 1)
  
  ProcedureReturn *pObj
EndProcedure

Structure BlobData
  cbSize.l
  *pBlobData
EndStructure

Structure PropVariant
  vt.w
  wReserved1.w
  wReserved2.w
  wReserved3.w
  blob.BlobData
EndStructure

Global asyncOp.IActivateAudioInterfaceAsyncOperation
Global MyAudioSessionNotification.IActivateAudioInterfaceCompletionHandler

Procedure MTAThread(val)
hr = CoInitializeEx_(#Null, #COINIT_MULTITHREADED)
If hr <> #S_OK
  Debug "CoInitialize_ failed, hr=" + Hex(hr)
  End
EndIf

VIRTUAL_AUDIO_DEVICE_PROCESS_LOOPBACK.s = "VAD\Process_Loopback"

audioclientActivationParams.AUDIOCLIENT_ACTIVATION_PARAMS
audioclientActivationParams\ProcessLoopbackParams\ProcessLoopbackMode = #PROCESS_LOOPBACK_MODE_INCLUDE_TARGET_PROCESS_TREE
audioclientActivationParams\ProcessLoopbackParams\TargetProcessId = 27336
audioclientActivationParams\ActivationType = #AUDIOCLIENT_ACTIVATION_TYPE_PROCESS_LOOPBACK

activateParams.PropVariant
activateParams\vt = 65; VT_BLOB
activateParams\blob\cbSize = SizeOf(audioclientActivationParams)
activateParams\blob\pBlobData = audioclientActivationParams

MyAudioSessionNotification = CreateMyAudioSessionNotification()
hr = ActivateAudioInterfaceAsync(VIRTUAL_AUDIO_DEVICE_PROCESS_LOOPBACK, ?IID_IAudioClient, PropVariant, MyAudioSessionNotification, @asyncOp)

If hr <> #S_OK
  Debug "ActivateAudioInterfaceAsync() failed hr=" + Hex(hr)
  End
EndIf

EndProcedure

CreateThread(@MTAThread(), 0)

Repeat
  Delay(1000)
ForEver
    
DataSection
  IID_IAudioClient:
  Data.l $1CB9AD4C
  Data.w $DBFA,$4C32
  Data.b $B1,$78,$C2,$F5,$68,$A7,$03,$B2
EndDataSection
*EDIT* changed

Code: Select all

"VAD\\Process_Loopback"
to

Code: Select all

"VAD\Process_Loopback"
added

Code: Select all

Define asyncOp.IActivateAudioInterfaceAsyncOperation
Define MyAudioSessionNotification.IActivateAudioInterfaceCompletionHandler
Still not working but now i get an invalid argument error

*EDIT*
Modified to run in an MTA thread.

Solved thanks to mk-soft and Justin.
https://www.purebasic.fr/english/viewtopic.php?t=86273
Last edited by AndyMK on Wed Feb 12, 2025 11:07 am, edited 1 time in total.
User avatar
mk-soft
Always Here
Always Here
Posts: 6315
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: ActivateAudioInterfaceAsync function Help!

Post by mk-soft »

Some parameter is wrong.
Please write the structure for objects correctly ...
QuerInterface is also not yet evaluated correctly. But this can be done later.
For testing, do not run in a thread for the time being

Code: Select all


CompilerIf Not #PB_Compiler_Thread
  CompilerError "Use Compiler Option ThreadSafe!"
CompilerEndIf

Procedure.s FormatMessage(ErrorCode.l) 

  Protected *Buffer, len, result.s 
  
  len = FormatMessage_(#FORMAT_MESSAGE_ALLOCATE_BUFFER|#FORMAT_MESSAGE_FROM_SYSTEM,0,ErrorCode,0,@*Buffer,0,0) 
  If len 
    result = PeekS(*Buffer) 
    LocalFree_(*Buffer) 
    ProcedureReturn result 
  Else 
    ProcedureReturn "Errorcode: " + Hex(ErrorCode, #PB_Long) 
  EndIf 
  
EndProcedure 

Global ActivateAudioInterfaceAsync
Prototype.i ActivateAudioInterfaceAsync(deviceInterfacePath.p-unicode, *riid, *activationParams, *completionHandler, *activationOperation)

If OpenLibrary(0, "Mmdevapi.dll")
  ActivateAudioInterfaceAsync.ActivateAudioInterfaceAsync = GetFunction(0, "ActivateAudioInterfaceAsync")
  ;CloseLibrary(0)
EndIf

; -----------------------------------------------------------------------------
;  COM Interfaces
; -----------------------------------------------------------------------------
Interface IActivateAudioInterfaceAsyncOperation Extends IUnknown
  GetActivateResult(*activateResult, *activatedInterface)
EndInterface

Interface IActivateAudioInterfaceCompletionHandler Extends IUnknown
  ActivateCompleted(*activateOperation)
EndInterface

; Enumerations
Enumeration; AUDIOCLIENT_ACTIVATION_TYPE
  #AUDIOCLIENT_ACTIVATION_TYPE_DEFAULT
  #AUDIOCLIENT_ACTIVATION_TYPE_PROCESS_LOOPBACK
EndEnumeration

Enumeration; PROCESS_LOOPBACK_MODE
  #PROCESS_LOOPBACK_MODE_INCLUDE_TARGET_PROCESS_TREE
  #PROCESS_LOOPBACK_MODE_EXCLUDE_TARGET_PROCESS_TREE
EndEnumeration

; Structures
Structure AUDIOCLIENT_PROCESS_LOOPBACK_PARAMS Align #PB_Structure_AlignC
  TargetProcessId.l    ; DWORD (32-bit integer)
  ProcessLoopbackMode.l; PROCESS_LOOPBACK_MODE enumeration
EndStructure

; Main structure
Structure AUDIOCLIENT_ACTIVATION_PARAMS Align #PB_Structure_AlignC
  ActivationType.l      ; AUDIOCLIENT_ACTIVATION_TYPE enumeration
  ProcessLoopbackParams.AUDIOCLIENT_PROCESS_LOOPBACK_PARAMS
EndStructure

; COM object structure.
Structure MyAudioSessionNotificationObj
  *vTable    ; Pointer to vtable
  RefCount.i  ; Reference counter
EndStructure

; Global pointer to the shared vtable
Global *MyAudioSessionNotificationVTable = #Null

Procedure MyAddRef(*Object.MyAudioSessionNotificationObj)
  With *Object
    \RefCount +1
    ProcedureReturn \RefCount
  EndWith
EndProcedure

Procedure MyQueryInterface(*Object.MyAudioSessionNotificationObj, *riid, *ppvObject.Integer)
  With *Object
    *ppvObject\i = *Object
    \RefCount + 1
    ProcedureReturn #S_OK
  EndWith
EndProcedure

Procedure MyRelease(*Object.MyAudioSessionNotificationObj)
  With *Object
    \RefCount - 1
    If \RefCount <= 0
      FreeStructure(*Object)
    EndIf
    ProcedureReturn \RefCount
  EndWith
EndProcedure

Procedure MyActivateCompleted(*Object.MyAudioSessionNotificationObj, *asyncOp.IActivateAudioInterfaceAsyncOperation)
  Protected activateResult, activatedInterface
  
  r1 = *asyncOp\GetActivateResult(@activateResult, @activatedInterface)
  If r1 = #S_OK
    If activateResult = #S_OK 
      Debug "ActivationCompleted Ok " + PeekS(activateResult)
    Else
      Debug "Activation failed: " + FormatMessage(activateResult)
    EndIf
    *asyncOp\Release()
  Else
    Debug "AsynOperation faild: " + FormatMessage(r1)
  EndIf
    
  
  ProcedureReturn #S_OK
EndProcedure

Procedure CreateMyAudioSessionNotification()
  Protected *Object.MyAudioSessionNotificationObj
  
  *Object = AllocateStructure(MyAudioSessionNotificationObj)
  
  If *Object = 0
    ProcedureReturn #E_OUTOFMEMORY
  EndIf
  
  
  With *Object
    \vTable = ?MyObject
    \RefCount = 1
  EndWith
  ProcedureReturn *Object
EndProcedure

DataSection 
  MyObject:
  data.i @MyQueryInterface()
  data.i @MyAddRef()
  data.i @MyRelease()
  data.i @MyActivateCompleted()
EndDataSection

Structure BlobData
  cbSize.l
  *pBlobData
EndStructure

Structure PropVariant
  vt.w
  wReserved1.w
  wReserved2.w
  wReserved3.w
  blob.BlobData
EndStructure

Global asyncOp.IActivateAudioInterfaceAsyncOperation
Global *MyAudioSessionNotification.IActivateAudioInterfaceCompletionHandler

Procedure MTAThread(val)
  hr = CoInitializeEx_(#Null, #COINIT_MULTITHREADED)
  If hr <> #S_OK
    Debug "CoInitialize_ failed, hr=" + Hex(hr)
    End
  EndIf
  
  VIRTUAL_AUDIO_DEVICE_PROCESS_LOOPBACK.s = "VAD\Process_Loopback"
  
  audioclientActivationParams.AUDIOCLIENT_ACTIVATION_PARAMS
  audioclientActivationParams\ProcessLoopbackParams\ProcessLoopbackMode = #PROCESS_LOOPBACK_MODE_INCLUDE_TARGET_PROCESS_TREE
  audioclientActivationParams\ProcessLoopbackParams\TargetProcessId = 27336
  audioclientActivationParams\ActivationType = #AUDIOCLIENT_ACTIVATION_TYPE_PROCESS_LOOPBACK
  
  activateParams.PropVariant
  activateParams\vt = #VT_BLOB
  activateParams\blob\cbSize = SizeOf(audioclientActivationParams)
  activateParams\blob\pBlobData = audioclientActivationParams
  
  *MyAudioSessionNotification = CreateMyAudioSessionNotification()
  hr = ActivateAudioInterfaceAsync(VIRTUAL_AUDIO_DEVICE_PROCESS_LOOPBACK, ?IID_IAudioClient, PropVariant, *MyAudioSessionNotification, @asyncOp)
  
  If hr <> #S_OK
    Debug "ActivateAudioInterfaceAsync() failed: " + FormatMessage(hr)
    End
  EndIf
  
EndProcedure

;CreateThread(@MTAThread(), 0)
MTAThread(0)
Repeat
  Delay(1000)
ForEver

DataSection
  IID_IAudioClient:
  data.l $1CB9AD4C
  data.w $DBFA,$4C32
  data.b $B1,$78,$C2,$F5,$68,$A7,$03,$B2
EndDataSection
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
Justin
Addict
Addict
Posts: 956
Joined: Sat Apr 26, 2003 2:49 pm

Re: ActivateAudioInterfaceAsync function Help!

Post by Justin »

This works for the default device,

Code: Select all

EnableExplicit

;- AUDIOCLIENT_ACTIVATION_TYPE
Enumeration
  #AUDIOCLIENT_ACTIVATION_TYPE_DEFAULT
  #AUDIOCLIENT_ACTIVATION_TYPE_PROCESS_LOOPBACK
EndEnumeration

;- PROCESS_LOOPBACK_MODE
Enumeration
  #PROCESS_LOOPBACK_MODE_INCLUDE_TARGET_PROCESS_TREE
  #PROCESS_LOOPBACK_MODE_EXCLUDE_TARGET_PROCESS_TREE
EndEnumeration

#CLSCTX_ALL = #CLSCTX_INPROC_SERVER | #CLSCTX_INPROC_HANDLER | #CLSCTX_LOCAL_SERVER | #CLSCTX_REMOTE_SERVER


;- Enum EDataFlow
#eRender = 0
#eCapture = 1
#eAll = 2

;- Enum ERole
#eConsole = 0
#eMultimedia = 1
#eCommunications = 2

;- IActivateAudioInterfaceAsyncOperation
Interface IActivateAudioInterfaceAsyncOperation Extends IUnknown
  GetActivateResult(activateResult.i, activatedInterface.i)
EndInterface

;- IMMDeviceEnumerator
Interface IMMDeviceEnumerator Extends IUnknown
	EnumAudioEndpoints(dataFlow.l, dwStateMask.l, ppDevices.i)
	GetDefaultAudioEndpoint(dataFlow.l, role.l, ppEndpoint.i)
	GetDevice(pwstrId.s, ppDevice.i)
	RegisterEndpointNotificationCallback(pClient.i)
	UnregisterEndpointNotificationCallback(pClient.i)
EndInterface 

;- IMMDevice
Interface IMMDevice Extends IUnknown
	Activate(iid.i, dwClsCtx.l, pActivationParams.i, ppInterface.i)
	OpenPropertyStore(stgmAccess.l, ppProperties.i)
	GetId(ppstrId.i)
	GetState(pdwState.i)
EndInterface 

;- BLOB
Structure BLOB Align #PB_Structure_AlignC
  cbSize.l
  pBlobData.i
EndStructure

;- PROPVARIANT
Structure PROPVARIANT Align #PB_Structure_AlignC
  vt.w
  wReserved1.w
  wReserved2.w
  wReserved3.w
  blob.BLOB
EndStructure

;- AUDIOCLIENT_PROCESS_LOOPBACK_PARAMS
Structure AUDIOCLIENT_PROCESS_LOOPBACK_PARAMS Align #PB_Structure_AlignC
  TargetProcessId.l 
  ProcessLoopbackMode.l 
EndStructure

;- AUDIOCLIENT_ACTIVATION_PARAMS
Structure AUDIOCLIENT_ACTIVATION_PARAMS Align #PB_Structure_AlignC
  ActivationType.l
  ProcessLoopbackParams.AUDIOCLIENT_PROCESS_LOOPBACK_PARAMS
EndStructure

;- IUnknownVtbl
Structure IUnknownVtbl
	QueryInterface.i
	AddRef.i
	Release.i
EndStructure

;- ActivateCompletionHandlerVtbl
Structure ActivateCompletionHandlerVtbl Extends IUnknownVtbl
	ActivateCompleted.i
EndStructure
Global.ActivateCompletionHandlerVtbl g_ActivateCompletionHandlerVtbl

;- ActivateCompletionHandlerObj
Structure ActivateCompletionHandlerObj
	*vt.ActivateCompletionHandlerVtbl
	refCount.i
EndStructure

Procedure.i ACH_Free(*this.ActivateCompletionHandlerObj)
	Debug #PB_Compiler_Procedure
	
	FreeMemory(*this)
EndProcedure

Procedure.l ACH_QueryInterface(*this.ActivateCompletionHandlerObj, *iid.IID, *Obj.Integer)
	*Obj\i = *this
	*this\refCount + 1
	
	ProcedureReturn #S_OK
EndProcedure

Procedure.l ACH_AddRef(*this.ActivateCompletionHandlerObj)
	*this\refCount + 1
	ProcedureReturn #S_OK
EndProcedure

Procedure.l ACH_Release(*this.ActivateCompletionHandlerObj)
	Protected.l refCount
	
	*this\refCount - 1
	refCount = *this\refCount
	
	If *this\refCount = 0
		ACH_Free(*this)
	EndIf
	
	ProcedureReturn refCount
EndProcedure

Procedure.l ACH_ActivateCompleted(*this.ActivateCompletionHandlerObj, activateOperation.IActivateAudioInterfaceAsyncOperation)
	Protected.l result
	Protected.IUnknown activatedInterface
	
	activateOperation\GetActivateResult(@result, @activatedInterface)
	Debug #PB_Compiler_Procedure
	Debug result
	Debug activatedInterface
	
	ProcedureReturn #S_OK
EndProcedure

;- ACH VTABLE
g_ActivateCompletionHandlerVtbl\QueryInterface = @ACH_QueryInterface()
g_ActivateCompletionHandlerVtbl\AddRef = @ACH_AddRef()
g_ActivateCompletionHandlerVtbl\Release = @ACH_Release()
g_ActivateCompletionHandlerVtbl\ActivateCompleted = @ACH_ActivateCompleted()

Procedure.i ACH_New()
	Protected.ActivateCompletionHandlerObj *this
	
	*this = AllocateMemory(SizeOf(ActivateCompletionHandlerObj))
	*this\vt = @g_ActivateCompletionHandlerVtbl
	*this\refCount = 1
	
	ProcedureReturn *this
EndProcedure

Import "Mmdevapi.lib"
	ActivateAudioInterfaceAsync.l(deviceInterfacePath.s, *riid.IID, *activationParams.PROPVARIANT, completionHandler.i, activationOperation.i)
EndImport

Procedure main()
	Protected.IActivateAudioInterfaceAsyncOperation asyncOp
	Protected.l hr
	Protected.s VIRTUAL_AUDIO_DEVICE_PROCESS_LOOPBACK
	Protected.AUDIOCLIENT_ACTIVATION_PARAMS audioclientActivationParams
	Protected.PROPVARIANT activateParams
	Protected.ActivateCompletionHandlerObj *ach
	Protected.s deviceID
	Protected.i is
	
	hr = CoInitializeEx_(#Null, #COINIT_MULTITHREADED)
	If hr <> #S_OK
	  Debug "CoInitialize_ failed, hr=" + Hex(hr)
	  End
	EndIf
	
	*ach = ACH_New()

	audioclientActivationParams\ProcessLoopbackParams\ProcessLoopbackMode = #PROCESS_LOOPBACK_MODE_INCLUDE_TARGET_PROCESS_TREE
	audioclientActivationParams\ProcessLoopbackParams\TargetProcessId = GetCurrentProcessId_() ;??
	audioclientActivationParams\ActivationType = #AUDIOCLIENT_ACTIVATION_TYPE_PROCESS_LOOPBACK
	
	activateParams\vt = #VT_BLOB
	activateParams\blob\cbSize = SizeOf(AUDIOCLIENT_ACTIVATION_PARAMS)
	activateParams\blob\pBlobData = @audioclientActivationParams
	
	StringFromIID_(?DEVINTERFACE_AUDIO_RENDER, @is)
	deviceID = PeekS(is)
	CoTaskMemFree_(is)
	hr = ActivateAudioInterfaceAsync(deviceID, ?IID_IAudioClient, @activateParams, *ach, @asyncOp)
	
	ACH_Release(*ach)
	
	If asyncOp
		asyncOp\Release()
	EndIf
	
	
	If hr <> #S_OK
	  Debug "ActivateAudioInterfaceAsync() failed hr=" + Hex(hr)
	  End
	EndIf
	
	Repeat
	  Delay(1000)
	ForEver
EndProcedure

main()

DataSection
  IID_IAudioClient:
  Data.l $1CB9AD4C
  Data.w $DBFA,$4c32
  Data.b $B1, $78, $C2, $F5, $68, $A7, $03, $B2
EndDataSection

DataSection
  DEVINTERFACE_AUDIO_RENDER:
  Data.l $e6327cad
  Data.w $dcec,$4949
  Data.b $ae, $8a, $99, $1e, $97, $6a, $79, $d2
EndDataSection

DataSection
  DEVINTERFACE_AUDIO_CAPTURE:
  Data.l $2EEF81BE
  Data.w $33FA,$4800
  Data.b $96, $70, $1C, $D4, $74, $97, $2C, $3F
EndDataSection

;- IID_IMMDeviceEnumerator
DataSection
	IID_IMMDeviceEnumerator:
	Data.l $A95664D2
	Data.w $9614, $4F35
	Data.b $A7, $46, $DE, $8D, $B6, $36, $17, $E6
EndDataSection

;- CLSID_MMDeviceEnumerator
DataSection
	CLSID_MMDeviceEnumerator:
	Data.l $bcde0395
	Data.w $e52f, $467c
	Data.b $8e, $3d, $c4, $57, $92, $91, $69, $2e
EndDataSection
Justin
Addict
Addict
Posts: 956
Joined: Sat Apr 26, 2003 2:49 pm

Re: [SOLVED] ActivateAudioInterfaceAsync function Help!

Post by Justin »

It's strange it only works when passing the DEVINTERFACE_AUDIO_RENDER string guid, any other deviceid string in the form:
{0.0.0.00000000}.{aec1ad44-225e-4690-9e52-0e43846356fc}
fails, the handler returns an error and the interface is not activated.
Post Reply