AppleScripting Airfoil

Inside AppleScript

Airfoil supports a full AppleScripting suite, so that just about anything you can do with the graphical user interface you can also script. The following is a brief overview of the object model that Airfoil exposes. For a complete reference, see Airfoil's Scripting Dictionary in Script Editor.

If you are new to AppleScript, we recommend you pick up a copy of AppleScript : The Definitive Guide by Matt Neuburg, before proceeding.

Airfoil's AppleScript Dictionary

Accessing and Controlling Speakers

The primary object in Airfoil, is the speaker. It represents an Airport Express on the network, which you can start and stop and set the volume of.

Before that though, we need to actually retrieve a speaker instance on which to operate on. Airfoil maintains a list of available speakers on the application object.

tell application "Airfoil" get first speaker --speaker id "0011245FA40D" get every speaker --{speaker id "0011245FA40D", speaker id "001124000AE3"} get every speaker whose name is "Kitchen" --{speaker id "001124000AE3"} end tell

Once we have a speaker, we can set its volume, or connect/disconnect from it. Here's an example script that toggles the connection to the first speaker found:

tell application "Airfoil" set aSpeaker to first speaker if not (connected of aSpeaker) then set (volume of aSpeaker) to 0.5 connect to aSpeaker else disconnect from aSpeaker end if end tell

All About Audio Sources

Beyond controlling the speakers, Airfoil's AppleScript dictionary gives you complete control over the audio source used. The five types of audio sources are all represented: application source, device source, and system source.

Application sources represent an application on the hard disk. To target an application source, you create a new instance, set its application file property to the full POSIX path of an application, and then set the application's current audio source to it:

tell application "Airfoil" set aSource to make new application source set application file of aSource to "/Applications/" set current audio source to aSource end tell

Device sources represent hardware audio devices such as microphones or line-in ports. Airfoil maintains a list of device sources from which you can select, and then target. The following example script displays a "choose from list" dialog with every audio device in it:

tell application "Airfoil" set listOfDevices to name of every device source set selectedDevice to choose from list listOfDevices with prompt "Choose an audio device:" set aSource to first device source whose name is (first item of selectedDevice) set current audio source to aSource end tell

If you have the Instant On extra installed, you can use the system sources to transmit all audio from the computer. Naturally, there is only ever one System Audio source:

tell application "Airfoil" set aSource to first system source set current audio source to aSource end tell

Putting it all together

Finally, heres a complete script showing a typical usage of Airfoil. We find a target application, create a new application source for it, and then transmit it to a speaker.

tell application "Airfoil" --Find QuickTime Player set pathToApp to (POSIX path of (path to application "QuickTime Player")) --Create a new source and set it to QT set newSource to make new application source set application file of newSource to pathToApp --Set the source set (current audio source) to newSource --Set the speaker volumes set (volume of every speaker) to 0.5 --And finally start transmitting connect to every speaker end tell

Source Remote Control

As well as the built-in AppleScript dictionary, Airfoil also uses AppleScript for handling Remote Controls (from the AppleTV or Keyspan Express). When Airfoil receives a command from the remote control, it calls a given handler in a script. The following handlers are defined:

remote_play --Play/Pause remote_stop remote_pause remote_previous_item remote_next_item remote_begin_seek_backward --Always followed by a call to remote_end_seek remote_begin_seek_forward --Always followed by a call to remote_end_seek remote_end_seek remote_volume_up remote_volume_down remote_mute remote_shuffle remote_other --Currently unused

Example Remote Control scripts can be found and modified inside of Airfoil at: Custom remote control scripts can be placed in ~/Library/Application Support/Airfoil/RemoteControl/.

Get in Touch

That's all for now. If you do something interesting with this, let us know! As well, if you have need for more AppleScript control, get in touch and we'll consider adding it.