• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Der Frühling ist auch in den eingesandten Fotos deutlich zu erkennen. Zeigt uns, wer Euer Favorit ist! hier geht es lang für Euer Voting --> Klick

Applescript zum Ändern der Audio Devices in Skype (v2.8) über GUI Scripting

fyysh

Schweizer Glockenapfel
Registriert
25.01.10
Beiträge
1.386
Hi,

ich verwende von Zeit zu Zeit ein Bluetooth-Headset zum Telefonieren mit Skype am Mac.
Nervig ist, dass man jedes Mal in Skype explizit die Einstellungen ändern gehen muss, wenn das Headset verfügbar oder eben nicht verfügbar ist, denn wenn das Headset in den SkypePrefs eingestellt ist, jedoch nicht verfügbar, dann spielt Skype erstmal eine Weile Beachball bevor es eine Meldung bringt. Hat man es dann angeschlossen, muss man es dann wieder ändern.... etc.

Deshalb ist dieses Skript entstanden. Es nützt einfaches GUI-Scripting mit AS, um die entsprechenden Einstellungen automatisiert zu ändern.
Was es nicht macht (kommt vielleicht noch... mal gucken), ist selbständig erkennen, ob das Headset angeschlossen ist.
Es erspart einfach nur Klickerei, mehr nicht.

Getestet ist es mit Skype 2.8. Skype 5 für Mac ist mir zuwider.


Ich dachte ich poste es mal hier. Vielleicht kann es jemand gebrauchen - und sei es nur des GUI-Scriptings wegen.


Hier ist das Script. Bitte zum Verwenden auch die Anmerkungen unten lesen.
Code:
(*
	run this script from terminal using
	osascript /path/to/script/script.scpt [argv]
	
	to activate bluetooth device, use "bt", "BT" or "bluetooth" as argv
	
	to switch device use "switch" or "sw"
	this will switch to ALL devices buildin if any of the input or output settings is set to a bluetoor device and vice versa
	
	any other or none passed argument will activate the built in devices
	
*)

--check skype preferences for the right names of the devices
--output device names
property outputDevs : {builtin:"Built-in Output Headphones", bluetooth:"Sennheiser MM450"}

--input device names
property inputDevs : {builtin:"Built-in Microphone Internal microphone", bluetooth:"Sennheiser MM450"}

--ringing device names
property ringDevs : {builtin:"Built-in Output Headphones", bluetooth:"Built-in Output Headphones"}

--name of gui elements of skype
--property skypeMenuItemPreferences : "Preferences..." --not needed, using cmd+, instead
property skypeToolBarButtonAudio : "Audio"

--name of skype preferences plist in ~/Library/Preferences (used for getting which devices are currently used to be able to switch)
property skypePrefsPlist : "com.skype.skype.plist"


on run argv
	set argv to argv as string
	
	set useBT to false
	set switchDevs to false
	if argv contains "bluetooth" or argv contains "bt" or argv contains "BT" then
		set useBT to true
	else if argv contains "sw" or argv contains "switch" then
		set switchDevs to true
	end if
	
	if switchDevs then
		set useBT to not checkSkypeUsingBTDevs()
	end if
	
	
	if useBT then
		set outputDev to bluetooth of outputDevs
		set inputDev to bluetooth of inputDevs
		set ringDev to bluetooth of ringDevs
	else
		set outputDev to builtin of outputDevs
		set inputDev to builtin of inputDevs
		set ringDev to builtin of ringDevs
	end if
	
	changeSykpeAudioSettings(outputDev, inputDev, ringDev)
	
	--set msg to "Set Skype output device to " & outputDev & return & "Set Skype input device to " & inputDev & return & "Set Skype ring device to " & ringDev
	set msg to "Set Skype output device to " & outputDev & "\nSet Skype input device to " & inputDev & "\nSet Skype ring device to " & ringDev
	return msg
end run



to checkSkypeUsingBTDevs()
	
	set usingBtOut to (do shell script "defaults read '" & POSIX path of (path to preferences folder) & "com.skype.skype' SKAudioInputDeviceUID | grep -q IOBluetoothSCOAudioEngine && echo true || echo false") as boolean
	
	set usingBtIn to (do shell script "defaults read '" & POSIX path of (path to preferences folder) & "com.skype.skype' SKAudioInputDeviceUID | grep -q IOBluetoothSCOAudioEngine && echo true || echo false") as boolean
	
	set usingBtRing to (do shell script "defaults read '" & POSIX path of (path to preferences folder) & "com.skype.skype' SKAudioRingerDeviceUID | grep -q IOBluetoothSCOAudioEngine && echo true || echo false") as boolean
	
	
	if usingBtOut or usingBtIn or usingBtRing then
		return true
	else
		return false
	end if
	
end checkSkypeUsingBTDevs

to changeSykpeAudioSettings(outputDev, inputDev, ringDev)
	
	tell application "System Events"
		--if skype is not running, won't launch it. exit instead
		set skypeRunning to (exists (some process whose bundle identifier is "com.skype.skype"))
		if not skypeRunning then
			log "skype is not running. exiting"
			return false
		end if
		
		
		set skypeProc to some process whose bundle identifier is "com.skype.skype"
		set frontmost of skypeProc to true --bring skype to front
		
		
		tell skypeProc
			--if the preferences windows isn't open and frontmost, an error will occur. so use a loop and try
			repeat 10 times
				try
					keystroke "," using {command down} --open preferences
					
					set skypePrefs to first window of it
					tell skypePrefs
						tell first tool bar to click button skypeToolBarButtonAudio --go to audio prefs of skype
						
						--get the pop up buttons
						tell first group of first group of it
							set skypeOutputPopUpButton to first pop up button of it
							set skypeInputPopUpButton to second pop up button of it
							set skypeRingingPopUpButton to third pop up button of it
						end tell
						
						--set audio source
						tell skypeOutputPopUpButton
							click it
							tell first menu of it
								repeat with aMenuItem in (every menu item of it)
									tell aMenuItem
										if (its name) contains outputDev then
											click it
											exit repeat
										end if
									end tell
								end repeat
							end tell
						end tell
						
						--set input source
						tell skypeInputPopUpButton
							click it
							tell first menu of it
								repeat with aMenuItem in (every menu item of it)
									tell aMenuItem
										if (its name) contains inputDev then
											click it
											exit repeat
										end if
									end tell
								end repeat
							end tell
						end tell
						
						--set ringing device
						tell skypeRingingPopUpButton
							click it
							tell first menu of it
								repeat with aMenuItem in (every menu item of it)
									tell aMenuItem
										if (its name) contains ringDev then
											click it
											exit repeat
										end if
									end tell
								end repeat
							end tell
						end tell
						
						--close preferences window
						click first button of it --first button is the x
						exit repeat
						
						
					end tell
					
					exit repeat
				on error
					--errorhandler
				end try
			end repeat
		end tell
		
	end tell
end changeSykpeAudioSettings


Damit es funktioniert, muss man die properties outputDevs, inputDevs, ringDevs und skypeToolBarButtonAudio erst anpassen. Dafür öffnet man die Skype Preferences (z.B. mit CMD+,) und schaut mal, wie die Built-ins und das Bluetooth-Headset heißt:
2011-04-13_1520.png


Die entsprechenden Werte dann bei den entsprechenden Properties eintragen.

Übrigens: Ich habe bei ringDevs bei mir sowohl bei builtin als auch bei bluetooth den Built-in Namen eingetragen, weil ich möchte, dass Skype immer auf den Mac-Lautsprechern bimmelt, egal ob das Headset verfügbar ist oder nicht.


Wie man das Script ausführt, steht im Script selbst (ganz oben).

Um es jetzt nicht ständig aus dem Terminal starten zu müssen, kann man einen shortcut manager verwenden (Keyboard Maestro ($), Quikeys ($), Spark, Quicksilver und was es da sonst so gibt) oder in Snowleo auch die Services.

Ich verwende Keyboard Maestro. Da habe ich es so eingerichtet:
1. 2011-04-13_1531.png
2. 2011-04-13_1532.png2011-04-13_1532-1.png
3. 2011-04-13_1533.png

Dadurch, dass beide Aktionen den selben Shortcut haben, bekomme ich von Keyboard Maestro dieses Auswahlfenster.


Mit den Services in Snow Leopard könnte man es so einrichten:
2011-04-13_1537.png
Allerdings müsste man sich dann zwei Services bauen (eigentlich wie in Keyboard Maestro, da sind es auch zwei, siehe Screenshots) und diese mit verschiedenen Tastenkombinationen triggern. Die Tastenkombinationen stellt man in den Keyboardeinstellungen ein.


Das Script nutzt GUI-Scripting, also müssen ...uhm... der Access von Assistive Devices (sorry, ich schalte jetzt nicht auf Dt. um, um rauszufinden, wie das in Dt. heißt) eingeschaltet sein.
2011-04-13_1542.png => 2011-04-13_1543.png



Ich hoffe, dass das Script nicht nur mir was nützt.

Danke für die Aufmerksamkeit. :D
 
Zuletzt bearbeitet:

fyysh

Schweizer Glockenapfel
Registriert
25.01.10
Beiträge
1.386
Kleiner Nachtrag:

Nach einem Neustart funktionierte das Script nicht mehr. Nach einem Kurzen Blick fiel mir auf, dass mein Built-in Output in Skype nun nicht mehr
Built-in Output Headphones
sondern
Built-in Output Internal Speakers
heißt.

Das Skript hat ca. 1w funktioniert, d.h. 1w lang hieß es Headphones, nach Neustart eben Speakers. Ich starte selten neu, dewegen war es mir noch nicht aufgefallen.

Das Problem besteht darin, dass nie das richtige Device angeklickt werden kann, weil der Name nicht existiert. Ergo gibt es einen Fehler, das Script loopt und macht den selben Fehler nochmal.

Ich werde das noch abfangen und reiche es nach.

Eine schnelle Lösung des Problems ist, den Namen der Audio Devices in Skype zu verallgemeinern, also so:
Code:
--check skype preferences for the right names of the devices
--output device names
property outputDevs : {builtin:"Built-in Output", bluetooth:"Sennheiser MM450"}

--input device names
property inputDevs : {builtin:"Built-in Microphone", bluetooth:"Sennheiser MM450"}

--ringing device names
property ringDevs : {builtin:"Built-in Output", bluetooth:"Built-in Output"}