nacerbaaziz Posted August 14, 2017 Share Posted August 14, 2017 Hello my friends I have an urgent problem and we hope you can help me I want to detect if the audio output of the device has changed Such as the headset is connected or disConnected. or change the default audio output Is this possible? I really searched a lot and found suggestions but unfortunately I did not understand them Please explain to me Greetings Link to comment Share on other sites More sharing options...
Confuzzled Posted August 14, 2017 Share Posted August 14, 2017 (edited) Um, I see that you haven't given enough detail in what approaches you have already taken and researched. This may be difficult for a blind person. How about some code for what you already have done in this 'urgent' problem? Is this related to the other post you made at https://www.autoitscript.com/forum/topic/189645-an-important-question-in-the-bassdll-file/ ? Would the condensed summary of AutoIt at https://github.com/J2TeaM/awesome-AutoIt be of assistance? Edited August 14, 2017 by Confuzzled Link to comment Share on other sites More sharing options...
Danyfirex Posted August 14, 2017 Share Posted August 14, 2017 You need to implement something like this: https://msdn.microsoft.com/en-us/library/dd370810(v=VS.85).aspx Saludos Danysys.com AutoIt... UDFs: VirusTotal API 2.0 UDF - libZPlay UDF - Apps: Guitar Tab Tester - VirusTotal Hash Checker Examples: Text-to-Speech ISpVoice Interface - Get installed applications - Enable/Disable Network connection PrintHookProc - WINTRUST - Mute Microphone Level - Get Connected NetWorks - Create NetWork Connection ShortCut Link to comment Share on other sites More sharing options...
nacerbaaziz Posted August 14, 2017 Author Share Posted August 14, 2017 Sorry I want an example using autoit Link to comment Share on other sites More sharing options...
KaFu Posted August 14, 2017 Share Posted August 14, 2017 expandcollapse popup; _IMMNotificationClient ; By KaFu, based on this example by trancexx ; http://www.autoitscript.com/forum/topic/151474-looking-to-capture-immnotificationclientondevicestatechanged-events/#entry1084193 Global $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc") Func _ErrFunc($oError) ConsoleWrite("COM Error, ScriptLine(" & $oError.scriptline & ") : Number 0x" & Hex($oError.number, 8) & " - " & $oError.windescription & @CRLF) EndFunc ;==>_ErrFunc ; Global Const $sIID_IMMNotificationClient = "{7991EEC9-7E89-4D85-8390-6C703CEC60C0}" Global Const $tagIMMNotificationClient = "OnDeviceStateChanged hresult(wstr;dword);" & _ "OnDeviceAdded hresult(wstr);" & _ "OnDeviceRemoved hresult(wstr);" & _ "OnDefaultDeviceChanged hresult(dword;dword;wstr);" & _ "OnPropertyValueChanged hresult(wstr;int64);" ; last param type is improvisation because AutoIt lacks proper type Func _IMMNotificationClient_OnDeviceStateChanged($hresult, $wstr, $dword) #forceref $hresult ConsoleWrite("_IMMNotificationClient_OnDeviceStateChanged" & @TAB & $wstr & @TAB & $dword & @CRLF) Return 0 ; S_OK EndFunc ;==>_IMMNotificationClient_OnDeviceStateChanged Func _IMMNotificationClient_OnDeviceAdded($hresult, $wstr) #forceref $hresult ConsoleWrite("_IMMNotificationClient_OnDeviceAdded" & @TAB & $wstr & @CRLF) Return 0 ; S_OK EndFunc ;==>_IMMNotificationClient_OnDeviceAdded Func _IMMNotificationClient_OnDeviceRemoved($hresult, $wstr) #forceref $hresult ConsoleWrite("_IMMNotificationClient_OnDeviceRemoved" & @TAB & $wstr & @CRLF) Return 0 ; S_OK EndFunc ;==>_IMMNotificationClient_OnDeviceRemoved Func _IMMNotificationClient_OnDefaultDeviceChanged($hresult, $dword1, $dword2, $wstr) #forceref $hresult ConsoleWrite("_IMMNotificationClient_OnDefaultDeviceChanged" & @TAB & $dword1 & @TAB & $dword2 & @TAB & $wstr & @CRLF) Return 0 ; S_OK EndFunc ;==>_IMMNotificationClient_OnDefaultDeviceChanged Func _IMMNotificationClient_OnPropertyValueChanged($hresult, $wstr, $int64) #forceref $hresult ConsoleWrite("_IMMNotificationClient_OnPropertyValueChanged" & @TAB & $wstr & @TAB & $int64 & @CRLF) Return 0 ; S_OK EndFunc ;==>_IMMNotificationClient_OnPropertyValueChanged #cs Global Const $sIID_IUnknown = "{00000000-0000-0000-C000-000000000046}" Global Const $tagMyInterface = "FirstMethod hresult(wstr);" & _ "SecondMethod hresult(int;wstr);" #ce Global $t_IMMNotificationClient Global $o_IMMNotificationClient = ObjectFromDtag("_IMMNotificationClient_", $tagIMMNotificationClient, $t_IMMNotificationClient) ; Global $p_IMMNotificationClient = ptr($o_IMMNotificationClient()) Global $p_IMMNotificationClient = $o_IMMNotificationClient() #cs ; Is object get? ConsoleWrite("!!! IsObj($oMyObject) = " & IsObj($o_IMMNotificationClient) & @CRLF) $o_IMMNotificationClient.OnDeviceRemoved("Test") ; Get object pointer: ConsoleWrite("+>>> Object pointer = " & $o_IMMNotificationClient() & @CRLF) #ce Func ObjectFromDtag($sFunctionPrefix, $tagInterface, ByRef $tInterface) Local Const $tagIUnknown = "QueryInterface hresult(ptr;ptr*);" & _ "AddRef dword();" & _ "Release dword();" ; Adding IUnknown methods $tagInterface = $tagIUnknown & $tagInterface Local Const $PTR_SIZE = DllStructGetSize(DllStructCreate("ptr")) ; Below line really simple even though it looks super complex. It's just written weird to fit one line, not to steal your eyes Local $aMethods = StringSplit(StringReplace(StringReplace(StringReplace(StringReplace(StringTrimRight(StringReplace(StringRegExpReplace($tagInterface, "\h*(\w+)\h*(\w+\*?)\h*(\((.*?)\))\h*(;|;*\z)", "$1\|$2;$4" & @LF), ";" & @LF, @LF), 1), "object", "idispatch"), "variant*", "ptr"), "hresult", "long"), "bstr", "ptr"), @LF, 3) Local $iUbound = UBound($aMethods) Local $sMethod, $aSplit, $sNamePart, $aTagPart, $sTagPart, $sRet, $sParams ; Allocation. Read http://msdn.microsoft.com/en-us/library/ms810466.aspx to see why like this (object + methods): $tInterface = DllStructCreate("ptr[" & $iUbound + 1 & "]") If @error Then Return SetError(1, 0, 0) For $i = 0 To $iUbound - 1 $aSplit = StringSplit($aMethods[$i], "|", 2) If UBound($aSplit) <> 2 Then ReDim $aSplit[2] $sNamePart = $aSplit[0] $sTagPart = $aSplit[1] $sMethod = $sFunctionPrefix & $sNamePart $aTagPart = StringSplit($sTagPart, ";", 2) $sRet = $aTagPart[0] $sParams = StringReplace($sTagPart, $sRet, "", 1) $sParams = "ptr" & $sParams DllStructSetData($tInterface, 1, DllCallbackGetPtr(DllCallbackRegister($sMethod, $sRet, $sParams)), $i + 2) ; Freeing is left to AutoIt. Next DllStructSetData($tInterface, 1, DllStructGetPtr($tInterface) + $PTR_SIZE) ; Interface method pointers are actually pointer size away Return ObjCreateInterface(DllStructGetPtr($tInterface), "", $tagInterface, False) ; and first pointer is object pointer that's wrapped EndFunc ;==>ObjectFromDtag Global Const $sCLSID_MMDeviceEnumerator = "{BCDE0395-E52F-467C-8E3D-C4579291692E}" Global Const $sIID_IMMDeviceEnumerator = "{A95664D2-9614-4F35-A746-DE8DB63617E6}" Global Const $tagIMMDeviceEnumerator = "EnumAudioEndpoints hresult(dword;dword;ptr*);" & _ "GetDefaultAudioEndpoint hresult(dword;dword;ptr*);" & _ "GetDevice hresult(wstr;ptr*);" & _ "RegisterEndpointNotificationCallback hresult(ptr);" & _ "UnregisterEndpointNotificationCallback hresult(ptr);" Global $o_MMDeviceEnumerator = ObjCreateInterface($sCLSID_MMDeviceEnumerator, $sIID_IMMDeviceEnumerator, $tagIMMDeviceEnumerator) $o_MMDeviceEnumerator.RegisterEndpointNotificationCallback($p_IMMNotificationClient) OnAutoItExitRegister("_UnregisterEndpointNotificationCallback") Func _UnregisterEndpointNotificationCallback() $o_MMDeviceEnumerator.UnregisterEndpointNotificationCallback($p_IMMNotificationClient) EndFunc ;==>_UnregisterEndpointNotificationCallback ; =================================================================================== ; Main Loop #include <Misc.au3> While Sleep(10) If _IsPressed("1B") Then ExitLoop ; ESC to exit WEnd OS: Win10-22H2 - 64bit - German, AutoIt Version: 3.3.16.1, AutoIt Editor: SciTE, Website: https://funk.eu AMT - Auto-Movie-Thumbnailer (2024-Oct-13) BIC - Batch-Image-Cropper (2023-Apr-01) COP - Color Picker (2009-May-21) DCS - Dynamic Cursor Selector (2024-Oct-13) HMW - Hide my Windows (2024-Oct-19) HRC - HotKey Resolution Changer (2012-May-16) ICU - Icon Configuration Utility (2018-Sep-16) SMF - Search my Files (2024-Oct-20) - THE file info and duplicates search tool SSD - Set Sound Device (2017-Sep-16) Link to comment Share on other sites More sharing options...
nacerbaaziz Posted August 14, 2017 Author Share Posted August 14, 2017 Sorry dear i not understand very well please I want more clarification Link to comment Share on other sites More sharing options...
KaFu Posted August 14, 2017 Share Posted August 14, 2017 Start the script in SciTE, switch your audio device manually and see the console notification. OS: Win10-22H2 - 64bit - German, AutoIt Version: 3.3.16.1, AutoIt Editor: SciTE, Website: https://funk.eu AMT - Auto-Movie-Thumbnailer (2024-Oct-13) BIC - Batch-Image-Cropper (2023-Apr-01) COP - Color Picker (2009-May-21) DCS - Dynamic Cursor Selector (2024-Oct-13) HMW - Hide my Windows (2024-Oct-19) HRC - HotKey Resolution Changer (2012-May-16) ICU - Icon Configuration Utility (2018-Sep-16) SMF - Search my Files (2024-Oct-20) - THE file info and duplicates search tool SSD - Set Sound Device (2017-Sep-16) Link to comment Share on other sites More sharing options...
nacerbaaziz Posted August 14, 2017 Author Share Posted August 14, 2017 Dear brother to be everything is clear for me please provide this service to me I want when I change the default audio output the script execute these commands #### _BASS_Free() _BASS_Startup(@scriptDir & "\dll\bass.dll") If @error = -1 Then MsgBox (0, "", "DLL Does not exist? Please check file exists.") Exit EndIf _BASS_Init(0, -1, 44100, 0, "") If @error Then MsgBox(0, "Error", "Could not initialize audio") Exit EndIf $MusicHandle = _BASS_StreamCreateFile(False, $file, 0, 0, 0) _BASS_ChannelSetDevice($MusicHandle, 1) _BASS_ChannelSetvolume($MusicHandle, $volume) autoefect() _BASS_ChannelPlay($MusicHandle, 1) _BASS_ChannelSetPosition($MusicHandle, $restartPlaying, $BASS_POS_BYTE) ### I'm sorry if I upset you greetings Link to comment Share on other sites More sharing options...
KaFu Posted August 14, 2017 Share Posted August 14, 2017 expandcollapse popup; _IMMNotificationClient ; By KaFu, based on this example by trancexx ; http://www.autoitscript.com/forum/topic/151474-looking-to-capture-immnotificationclientondevicestatechanged-events/#entry1084193 Global $iAudioSwitched = 0 Global $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc") Func _ErrFunc($oError) ConsoleWrite("COM Error, ScriptLine(" & $oError.scriptline & ") : Number 0x" & Hex($oError.number, 8) & " - " & $oError.windescription & @CRLF) EndFunc ;==>_ErrFunc ; Global Const $sIID_IMMNotificationClient = "{7991EEC9-7E89-4D85-8390-6C703CEC60C0}" Global Const $tagIMMNotificationClient = "OnDeviceStateChanged hresult(wstr;dword);" & _ "OnDeviceAdded hresult(wstr);" & _ "OnDeviceRemoved hresult(wstr);" & _ "OnDefaultDeviceChanged hresult(dword;dword;wstr);" & _ "OnPropertyValueChanged hresult(wstr;int64);" ; last param type is improvisation because AutoIt lacks proper type Func _IMMNotificationClient_OnDeviceStateChanged($hresult, $wstr, $dword) #forceref $hresult ConsoleWrite("_IMMNotificationClient_OnDeviceStateChanged" & @TAB & $wstr & @TAB & $dword & @CRLF) Return 0 ; S_OK EndFunc ;==>_IMMNotificationClient_OnDeviceStateChanged Func _IMMNotificationClient_OnDeviceAdded($hresult, $wstr) #forceref $hresult ConsoleWrite("_IMMNotificationClient_OnDeviceAdded" & @TAB & $wstr & @CRLF) Return 0 ; S_OK EndFunc ;==>_IMMNotificationClient_OnDeviceAdded Func _IMMNotificationClient_OnDeviceRemoved($hresult, $wstr) #forceref $hresult ConsoleWrite("_IMMNotificationClient_OnDeviceRemoved" & @TAB & $wstr & @CRLF) Return 0 ; S_OK EndFunc ;==>_IMMNotificationClient_OnDeviceRemoved Func _IMMNotificationClient_OnDefaultDeviceChanged($hresult, $dword1, $dword2, $wstr) #forceref $hresult ConsoleWrite("_IMMNotificationClient_OnDefaultDeviceChanged" & @TAB & $dword1 & @TAB & $dword2 & @TAB & $wstr & @CRLF) $iAudioSwitched = TimerInit() Return 0 ; S_OK EndFunc ;==>_IMMNotificationClient_OnDefaultDeviceChanged Func _IMMNotificationClient_OnPropertyValueChanged($hresult, $wstr, $int64) #forceref $hresult ConsoleWrite("_IMMNotificationClient_OnPropertyValueChanged" & @TAB & $wstr & @TAB & $int64 & @CRLF) Return 0 ; S_OK EndFunc ;==>_IMMNotificationClient_OnPropertyValueChanged #cs Global Const $sIID_IUnknown = "{00000000-0000-0000-C000-000000000046}" Global Const $tagMyInterface = "FirstMethod hresult(wstr);" & _ "SecondMethod hresult(int;wstr);" #ce Global $t_IMMNotificationClient Global $o_IMMNotificationClient = ObjectFromDtag("_IMMNotificationClient_", $tagIMMNotificationClient, $t_IMMNotificationClient) ; Global $p_IMMNotificationClient = ptr($o_IMMNotificationClient()) Global $p_IMMNotificationClient = $o_IMMNotificationClient() #cs ; Is object get? ConsoleWrite("!!! IsObj($oMyObject) = " & IsObj($o_IMMNotificationClient) & @CRLF) $o_IMMNotificationClient.OnDeviceRemoved("Test") ; Get object pointer: ConsoleWrite("+>>> Object pointer = " & $o_IMMNotificationClient() & @CRLF) #ce Func ObjectFromDtag($sFunctionPrefix, $tagInterface, ByRef $tInterface) Local Const $tagIUnknown = "QueryInterface hresult(ptr;ptr*);" & _ "AddRef dword();" & _ "Release dword();" ; Adding IUnknown methods $tagInterface = $tagIUnknown & $tagInterface Local Const $PTR_SIZE = DllStructGetSize(DllStructCreate("ptr")) ; Below line really simple even though it looks super complex. It's just written weird to fit one line, not to steal your eyes Local $aMethods = StringSplit(StringReplace(StringReplace(StringReplace(StringReplace(StringTrimRight(StringReplace(StringRegExpReplace($tagInterface, "\h*(\w+)\h*(\w+\*?)\h*(\((.*?)\))\h*(;|;*\z)", "$1\|$2;$4" & @LF), ";" & @LF, @LF), 1), "object", "idispatch"), "variant*", "ptr"), "hresult", "long"), "bstr", "ptr"), @LF, 3) Local $iUbound = UBound($aMethods) Local $sMethod, $aSplit, $sNamePart, $aTagPart, $sTagPart, $sRet, $sParams ; Allocation. Read http://msdn.microsoft.com/en-us/library/ms810466.aspx to see why like this (object + methods): $tInterface = DllStructCreate("ptr[" & $iUbound + 1 & "]") If @error Then Return SetError(1, 0, 0) For $i = 0 To $iUbound - 1 $aSplit = StringSplit($aMethods[$i], "|", 2) If UBound($aSplit) <> 2 Then ReDim $aSplit[2] $sNamePart = $aSplit[0] $sTagPart = $aSplit[1] $sMethod = $sFunctionPrefix & $sNamePart $aTagPart = StringSplit($sTagPart, ";", 2) $sRet = $aTagPart[0] $sParams = StringReplace($sTagPart, $sRet, "", 1) $sParams = "ptr" & $sParams DllStructSetData($tInterface, 1, DllCallbackGetPtr(DllCallbackRegister($sMethod, $sRet, $sParams)), $i + 2) ; Freeing is left to AutoIt. Next DllStructSetData($tInterface, 1, DllStructGetPtr($tInterface) + $PTR_SIZE) ; Interface method pointers are actually pointer size away Return ObjCreateInterface(DllStructGetPtr($tInterface), "", $tagInterface, False) ; and first pointer is object pointer that's wrapped EndFunc ;==>ObjectFromDtag Global Const $sCLSID_MMDeviceEnumerator = "{BCDE0395-E52F-467C-8E3D-C4579291692E}" Global Const $sIID_IMMDeviceEnumerator = "{A95664D2-9614-4F35-A746-DE8DB63617E6}" Global Const $tagIMMDeviceEnumerator = "EnumAudioEndpoints hresult(dword;dword;ptr*);" & _ "GetDefaultAudioEndpoint hresult(dword;dword;ptr*);" & _ "GetDevice hresult(wstr;ptr*);" & _ "RegisterEndpointNotificationCallback hresult(ptr);" & _ "UnregisterEndpointNotificationCallback hresult(ptr);" Global $o_MMDeviceEnumerator = ObjCreateInterface($sCLSID_MMDeviceEnumerator, $sIID_IMMDeviceEnumerator, $tagIMMDeviceEnumerator) $o_MMDeviceEnumerator.RegisterEndpointNotificationCallback($p_IMMNotificationClient) OnAutoItExitRegister("_UnregisterEndpointNotificationCallback") Func _UnregisterEndpointNotificationCallback() $o_MMDeviceEnumerator.UnregisterEndpointNotificationCallback($p_IMMNotificationClient) EndFunc ;==>_UnregisterEndpointNotificationCallback ; =================================================================================== ; Main Loop #include <Misc.au3> While Sleep(10) ; If _IsPressed("1B") Then ExitLoop ; ESC to exit if $iAudioSwitched and TimerDiff($iAudioSwitched) > 250 then ConsoleWrite("Audio switched" & @crlf) _BASS_Free() _BASS_Startup(@scriptDir & "\dll\bass.dll") If @error = -1 Then MsgBox (0, "", "DLL Does not exist? Please check file exists.") Exit EndIf _BASS_Init(0, -1, 44100, 0, "") If @error Then MsgBox(0, "Error", "Could not initialize audio") Exit EndIf $MusicHandle = _BASS_StreamCreateFile(False, $file, 0, 0, 0) _BASS_ChannelSetDevice($MusicHandle, 1) _BASS_ChannelSetvolume($MusicHandle, $volume) autoefect() _BASS_ChannelPlay($MusicHandle, 1) _BASS_ChannelSetPosition($MusicHandle, $restartPlaying, $BASS_POS_BYTE) $iAudioSwitched = 0 endif WEnd OS: Win10-22H2 - 64bit - German, AutoIt Version: 3.3.16.1, AutoIt Editor: SciTE, Website: https://funk.eu AMT - Auto-Movie-Thumbnailer (2024-Oct-13) BIC - Batch-Image-Cropper (2023-Apr-01) COP - Color Picker (2009-May-21) DCS - Dynamic Cursor Selector (2024-Oct-13) HMW - Hide my Windows (2024-Oct-19) HRC - HotKey Resolution Changer (2012-May-16) ICU - Icon Configuration Utility (2018-Sep-16) SMF - Search my Files (2024-Oct-20) - THE file info and duplicates search tool SSD - Set Sound Device (2017-Sep-16) Link to comment Share on other sites More sharing options...
nacerbaaziz Posted August 14, 2017 Author Share Posted August 14, 2017 Hello again can you correct the errors in this file after you adjust it according to what suits me. please When I use it I am having many errors I want it as an include file to use it in my program Please help me dear! Greetings to all audioOutputIsChanged.au3 Link to comment Share on other sites More sharing options...
nacerbaaziz Posted August 15, 2017 Author Share Posted August 15, 2017 Hello , good morning Is there anyone who can help me to correct the previous include file? I could not correct it with myself thank you. Link to comment Share on other sites More sharing options...
nacerbaaziz Posted August 15, 2017 Author Share Posted August 15, 2017 Hello First, I want to apologize to you on this issue I urgently need to convert this code into an include file and simplify it ; _IMMNotificationClient ; By KaFu, based on this example by trancexx ; http://www.autoitscript.com/forum/topic/151474-looking-to-capture-immnotificationclientondevicestatechanged-events/#entry1084193 Global $iAudioSwitched = 0 Global $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc") Func _ErrFunc($oError) ConsoleWrite("COM Error, ScriptLine(" & $oError.scriptline & ") : Number 0x" & Hex($oError.number, 8) & " - " & $oError.windescription & @CRLF) EndFunc ; Global Const $sIID_IMMNotificationClient = "{7991EEC9-7E89-4D85-8390-6C703CEC60C0}" Global Const $tagIMMNotificationClient = "OnDeviceStateChanged hresult(wstr;dword);" & _ "OnDeviceAdded hresult(wstr);" & _ "OnDeviceRemoved hresult(wstr);" & _ "OnDefaultDeviceChanged hresult(dword;dword;wstr);" & _ "OnPropertyValueChanged hresult(wstr;int64);" ; last param type is improvisation because AutoIt lacks proper type Func _IMMNotificationClient_OnDeviceStateChanged($hresult, $wstr, $dword) #forceref $hresult Return 0 ; S_OK EndFunc Func _IMMNotificationClient_OnDeviceAdded($hresult, $wstr) #forceref $hresult Return 0 ; S_OK EndFunc Func _IMMNotificationClient_OnDeviceRemoved($hresult, $wstr) #forceref $hresult Return 0 ; S_OK EndFunc Func _IMMNotificationClient_OnDefaultDeviceChanged($hresult, $dword1, $dword2, $wstr) #forceref $hresult $iAudioSwitched = TimerInit() Return 0 ; S_OK EndFunc Func _IMMNotificationClient_OnPropertyValueChanged($hresult, $wstr, $int64) #forceref $hresult Return 0 ; S_OK EndFunc #cs Global Const $sIID_IUnknown = "{00000000-0000-0000-C000-000000000046}" Global Const $tagMyInterface = "FirstMethod hresult(wstr);" & _ "SecondMethod hresult(int;wstr);" #ce Global $t_IMMNotificationClient Global $o_IMMNotificationClient = ObjectFromDtag("_IMMNotificationClient_", $tagIMMNotificationClient, $t_IMMNotificationClient) ; Global $p_IMMNotificationClient = ptr($o_IMMNotificationClient()) Global $p_IMMNotificationClient = $o_IMMNotificationClient() #cs ; Is object get? ConsoleWrite("!!! IsObj($oMyObject) = " & IsObj($o_IMMNotificationClient) & @CRLF) $o_IMMNotificationClient.OnDeviceRemoved("Test") ; Get object pointer: ConsoleWrite("+>>> Object pointer = " & $o_IMMNotificationClient() & @CRLF) #ce Func ObjectFromDtag($sFunctionPrefix, $tagInterface, ByRef $tInterface) Local Const $tagIUnknown = "QueryInterface hresult(ptr;ptr*);" & _ "AddRef dword();" & _ "Release dword();" ; Adding IUnknown methods $tagInterface = $tagIUnknown & $tagInterface Local Const $PTR_SIZE = DllStructGetSize(DllStructCreate("ptr")) ; Below line really simple even though it looks super complex. It's just written weird to fit one line, not to steal your eyes Local $aMethods = StringSplit(StringReplace(StringReplace(StringReplace(StringReplace(StringTrimRight(StringReplace(StringRegExpReplace($tagInterface,"\h*(\w+)\h*(\w+\*?)\h*(\((.*?)\))\h*(;|;*\z)", "$1\|$2;$4" & @LF), ";" & @LF, @LF), 1), "object", "idispatch"), "variant*", "ptr"), "hresult", "long"),"bstr", "ptr"), @LF, 3) Local $iUbound = UBound($aMethods) Local $sMethod, $aSplit, $sNamePart, $aTagPart, $sTagPart, $sRet, $sParams ; Allocation. Read http://msdn.microsoft.com/en-us/library/ms810466.aspx to see why like this (object + methods): $tInterface = DllStructCreate("ptr[" & $iUbound + 1 & "]") If @error Then Return SetError(1, 0, 0) For $i = 0 To $iUbound - 1 $aSplit = StringSplit($aMethods[$i], "|", 2) If UBound($aSplit) <> 2 Then ReDim $aSplit[2] $sNamePart = $aSplit[0] $sTagPart = $aSplit[1] $sMethod = $sFunctionPrefix & $sNamePart $aTagPart = StringSplit($sTagPart, ";", 2) $sRet = $aTagPart[0] $sParams = StringReplace($sTagPart, $sRet, "", 1) $sParams = "ptr" & $sParams DllStructSetData($tInterface, 1, DllCallbackGetPtr(DllCallbackRegister($sMethod, $sRet, $sParams)), $i + 2) ; Freeing is left to AutoIt. Next DllStructSetData($tInterface, 1, DllStructGetPtr($tInterface) + $PTR_SIZE) ; Interface method pointers are actually pointer size away Return ObjCreateInterface(DllStructGetPtr($tInterface), "", $tagInterface, False) ; and first pointer is object pointer that's wrapped EndFunc Global Const $sCLSID_MMDeviceEnumerator = "{BCDE0395-E52F-467C-8E3D-C4579291692E}" Global Const $sIID_IMMDeviceEnumerator = "{A95664D2-9614-4F35-A746-DE8DB63617E6}" Global Const $tagIMMDeviceEnumerator = "EnumAudioEndpoints hresult(dword;dword;ptr*);" & _ "GetDefaultAudioEndpoint hresult(dword;dword;ptr*);" & _ "GetDevice hresult(wstr;ptr*);" & _ "RegisterEndpointNotificationCallback hresult(ptr);" & _ "UnregisterEndpointNotificationCallback hresult(ptr);" Global $o_MMDeviceEnumerator = ObjCreateInterface($sCLSID_MMDeviceEnumerator, $sIID_IMMDeviceEnumerator, $tagIMMDeviceEnumerator) $o_MMDeviceEnumerator.RegisterEndpointNotificationCallback($p_IMMNotificationClient) OnAutoItExitRegister("_UnregisterEndpointNotificationCallback") Func _UnregisterEndpointNotificationCallback() $o_MMDeviceEnumerator.UnregisterEndpointNotificationCallback($p_IMMNotificationClient) EndFunc ; =================================================================================== ; Main Loop FUNC outputChanged() if $iAudioSwitched and TimerDiff($iAudioSwitched) > 250 then $iAudioSwitched = 0 RETURN 1 ELSE $iAudioSwitched = 0 RETURN 0 endif EndFunc Link to comment Share on other sites More sharing options...
MattHiggs Posted August 15, 2017 Share Posted August 15, 2017 (edited) 1 hour ago, nacerbaaziz said: nnm Edited August 15, 2017 by MattHiggs Link to comment Share on other sites More sharing options...
nacerbaaziz Posted August 15, 2017 Author Share Posted August 15, 2017 19 minutes ago, MattHiggs said: Sorry but I did not understand what you said Link to comment Share on other sites More sharing options...
nacerbaaziz Posted August 25, 2017 Author Share Posted August 25, 2017 Is there any suggestion about how to do this file as a include file please? I mean the file in comment above Link to comment Share on other sites More sharing options...
nacerbaaziz Posted April 17, 2018 Author Share Posted April 17, 2018 Please, dear, try to help me to integrate this example. In a audio player program When i try to make it as a include file as this way, it obstruct several tasks in the program. And I couldn't figure out why. This is the include file Please help me audioOutputIsChanged.au3 Link to comment Share on other sites More sharing options...
BrewManNH Posted April 17, 2018 Share Posted April 17, 2018 1 hour ago, nacerbaaziz said: it obstruct several tasks in the program. What do you mean by this? what's not working, and what, if any, errors are you seeing? If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag GudeHow to ask questions the smart way! I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from. Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays. - ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script. - Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label. - _FileGetProperty - Retrieve the properties of a file - SciTE Toolbar - A toolbar demo for use with the SciTE editor - GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI. - Latin Square password generator Link to comment Share on other sites More sharing options...
nacerbaaziz Posted April 17, 2018 Author Share Posted April 17, 2018 There's a error message that some of the variables in the program is Not Declarated وهذه المتغيرات ليس لها علاقة بهذا الرمز. حيث انها مسؤوله عن أمور أخرى في البرنامج please help me Link to comment Share on other sites More sharing options...
BrewManNH Posted April 17, 2018 Share Posted April 17, 2018 Declare them then. I'm not getting that from what you posted by the way, so it is somewhere else that you're getting that error. Probably in you main script or one of the other includes you might have in it. There's no way to troubleshoot this without know what variables aren't declared or where they're used in the script. If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag GudeHow to ask questions the smart way! I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from. Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays. - ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script. - Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label. - _FileGetProperty - Retrieve the properties of a file - SciTE Toolbar - A toolbar demo for use with the SciTE editor - GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI. - Latin Square password generator Link to comment Share on other sites More sharing options...
nacerbaaziz Posted April 18, 2018 Author Share Posted April 18, 2018 But the problem is if I don't include this file, everything's fine. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now