Danyfirex Posted April 24, 2012 Posted April 24, 2012 Hi mate. today I got a doubt, about if is possible detect when I put my headphones using autoit? 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
Moderators JLogan3o13 Posted April 24, 2012 Moderators Posted April 24, 2012 Hi, Danyfirex. For XP I know you could tell from the registry; looking at HKEY_LOCAL_MACHINESYSTEMCurrentControlSetHardware ProfilesCurrentSystemCurrentControlSetEnumHDAUDIO would show a switch between 0x00000001 for headphones and 0x00000004 for speakers. However, I think that method has been abandoned in Win7.There is also the DirectSound API, which has a Device.SpeakerConfig.Headphone property, if you want to go that way. You'd have to poll the devices and look for a match. I haven't played with this myself, but you might search MSDN for more info. Below is just the first hit I came upon.http://msdn.microsoft.com/en-us/library/windows/desktop/bb318770(v=vs.85).aspx "Profanity is the last vestige of the feeble mind. For the man who cannot express himself forcibly through intellect must do so through shock and awe" - Spencer W. Kimball How to get your question answered on this forum!
Danyfirex Posted April 24, 2012 Author Posted April 24, 2012 Ok thank you very much. I just want to know If that was Possible.So I'will Read about you Say. thank you JLogan3o13 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
rover Posted April 24, 2012 Posted April 24, 2012 Looks like you can do this with the BASSWASAPI add-on BASS_WASAPI_SetNotify function BASSWASAPI beta http://www.un4seen.com/forum/?topic=11170 Detect device changes http://www.un4seen.com/forum/?topic=12218.msg84967;hl=detect#msg84967 BASS Function Library (Sound and Music Functions) I see fascists...
Danyfirex Posted April 24, 2012 Author Posted April 24, 2012 Thank you rover I'll see that. 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
rover Posted April 24, 2012 Posted April 24, 2012 I could have used this a few years ago, and TTBOMK there's nothing like this on the forum, so my curiosity was piqued to check out the device change notification function in the BASS_WASAPI dll. It works, but is not *useable run from a script. Perhaps someone will be inspired to code a DLL in another language to implement this. Should run on Vista, but only tested on Win7 x64 as a 32bit process (does not run as a 64bit process) The 64 bit version of the latest dll still won't load, as mentioned by BrettF (DllOpen returns -1) *The notification callback is run in a new thread and AutoIt is not threadsafe. The basswasapi.dll needs to be run from an app compiled in another language with some inter-process communication back to AutoIt scripts. Detects I/O connect/disconnect, but crashes when inputs connected, a bit more stable when outputs connected/disconnected + ! _BASS_WASAPI_Startup = True @error: 0 @extended code: 0 + ! _BASS_WASAPI_SetNotify = True @error: -1 @extended code: 0 This device is now the Default Output: >Device Name: AMD HDMI Output (AMD High Definition Audio Device) >Device ID : {0.0.0.00000000}.{52012906-567c-4847-a343-1006b8f7da97} +Device Type: HDMI -Device Status: 3 This device is now the Default Output: >Device Name: Speakers (High Definition Audio Device) >Device ID : {0.0.0.00000000}.{3fb5f448-a7f7-4046-8169-10d6a78daf19} +Device Type: SPEAKERS -Device Status: 3 expandcollapse popup;Get audio I/O device change notifications ;coded by rover 2k12 #AutoIt3Wrapper_UseX64=n #include "BassWASAPI.au3" #include "Bass.au3" OnAutoItExitRegister("_Exit") Global Const $BASS_WASAPI_NOTIFY_DEFINPUT = 2 Global $aDev[11] = ["NETWORKDEVICE", "SPEAKERS", "LINELEVEL", "HEADPHONES", "MICROPHONE", "HEADSET", "HANDSET", "DIGITAL", "SPDIF", "HDMI", "UNKNOWN"] Global $iCBProc, $aNotify[3], $bRet, $aRet, $sErr = "+ " $bRet = _BASS_WASAPI_Startup() If Not $bRet Then $sErr = "! " ConsoleWrite($sErr & '! _BASS_WASAPI_Startup = ' & $bRet & ' @error: ' & @error & ' @extended code: ' & @extended & @CRLF) $iCBProc = DllCallbackRegister("_WasapiNotifyProc", "none", "dword;dword;int_ptr") $bRet = _BASS_WASAPI_SetNotify(DllCallbackGetPtr($iCBProc)) If Not $bRet Then $sErr = "! " ConsoleWrite($sErr & '! _BASS_WASAPI_SetNotify = ' & $bRet & ' @error: ' & @error & ' @extended code: ' & @extended & @CRLF & @CRLF) While 1 Sleep(1000) If $aNotify[0] Then ;ConsoleWrite("!Notify/Device: " & $aNotify[1] &":"& $aNotify[2] & @LF) If $aNotify[1] = $BASS_WASAPI_NOTIFY_DEFINPUT Then ConsoleWrite('This device is now the Default Output: ' & @CRLF) $aRet = __BASS_WASAPI_GetdeviceInfo($aNotify[2]) ;ConsoleWrite('->Error code: ' & @error & @crlf) ;### Debug Console If @error Then ContinueLoop ;~ For $i In $aRet ;~ ConsoleWrite("+ " & $i & @LF) ;~ Next ConsoleWrite('>Device Name: ' & $aRet[0] & @CRLF) ConsoleWrite('>Device ID : ' & $aRet[1] & @CRLF) ConsoleWrite('+Device Type: ' & $aDev[$aRet[2]] & @CRLF) ConsoleWrite('-Device Status: ' & $aRet[3] & @CRLF & @CRLF) ; 3 = BASS_DEVICE_ENABLED = 1 + BASS_DEVICE_DEFAULT = 2 $aNotify[0] = 0 EndIf WEnd Func _Exit() _BASS_WASAPI_SetNotify(0) ;send null to cancel callback DllCallbackFree($iCBProc) EndFunc ;==>_Exit Func _WasapiNotifyProc($Notify, $Device, $User) ;#forceref $Notify, $Device, $User ;callback run in a thread ;can't run functions from here, only check global array in main loop $aNotify[0] = $User $aNotify[1] = $Notify $aNotify[2] = $Device EndFunc ;==>_WasapiNotifyProc Func _BASS_WASAPI_SetNotify($pCB = 0, $iUser = 1) ;rover 2k12 Local $BASSWASAPI_ret_ = DllCall($_ghBassWASAPIDll, "int", "BASS_WASAPI_SetNotify", "ptr", $pCB, "int_ptr", $iUser) If @error Then Return SetError(1, 1, 0) <> 0 If $BASSWASAPI_ret_[0] = 0 Then Return SetError(_BASS_ErrorGetCode(), 0, 0) <> 0 Return SetError(_BASS_ErrorGetCode(), 0, 1) <> 0 EndFunc ;==>_BASS_WASAPI_SetNotify Func __BASS_WASAPI_GetdeviceInfo($Device) ;rover 2k12 ;fixed version of _BASS_WASAPI_GetdeviceInfo from BassWASAPI.au3 RC1 by BrettF Local Const $tagBASS_WASAPI_DEVICEINFO = "ptr name;" & _ "ptr id;" & _ "dword type;" & _ "dword flags;" & _ "float minperiod;" & _ "float defperiod;" & _ "dword mixfreq;" & _ "dword mixchans;" Local $aBASS_WASAPI_DEVICEINFO[8] Local $tBASS_WASAPI_DEVICEINFO = DllStructCreate($tagBASS_WASAPI_DEVICEINFO) Local $aBASSWASAPI_ret_ = DllCall($_ghBassWASAPIDll, "bool", "BASS_WASAPI_GetDeviceInfo", "dword", $Device, "struct*", $tBASS_WASAPI_DEVICEINFO) If @error Then Return SetError(1, 1, 0) If $aBASSWASAPI_ret_[0] = 0 Then Return SetError(_BASS_ErrorGetCode(), 0, 0) Local $tTxtBuf, $pTxtBuf, $aLen For $i = 0 To 7 If $i <= 1 Then $pTxtBuf = DllStructGetData($tBASS_WASAPI_DEVICEINFO, $i + 1) $aLen = DllCall('kernel32.dll', 'int', 'lstrlenA', 'ptr', $pTxtBuf) If @error Then ContinueLoop $tTxtBuf = DllStructCreate("char[" & $aLen[0] + 1 & "]", $pTxtBuf) $aBASS_WASAPI_DEVICEINFO[$i] = DllStructGetData($tTxtBuf, 1) Else $aBASS_WASAPI_DEVICEINFO[$i] = DllStructGetData($tBASS_WASAPI_DEVICEINFO, $i + 1) EndIf Next Return $aBASS_WASAPI_DEVICEINFO EndFunc ;==>__BASS_WASAPI_GetdeviceInfo I see fascists...
Danyfirex Posted April 25, 2012 Author Posted April 25, 2012 thank you for your time. that's great. I wanna test it. 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
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