Airfoil

Airfoil is a great application from Rogue Amoeba that allows you to stream sound and video from your Mac across the network to a bunch of different devices - and it keeps it all in sync. Many Indigo users use it in conjunction with Apple TVs, Airport Expresses, and other computers to create whole-house audio systems, all streaming from your Mac server running iTunes or other music applications.

The Airfoil plugin allows you to control the local (to the IndigoServer) copy of the Airfoil application and trigger based on various events.

Note - you must be running Airfoil on the same Mac as the IndigoServer.

Actions

The Airfoil plugin provides the following actions:

Speaker Actions

  • Connect to Speaker - tell Airfoil to begin transmitting to the selected speaker.
  • Disconnect from Speaker - tell Airfoil to stop transmitting to the selected speaker.
  • Toggle Speaker - tell Airfoil to disconnect if it's connected and vice versa.
  • Save Current Speaker State - save each speaker and it's current connected/disconnected state. You can then use the next action to restore every speaker back to this state. So, for instance, if you wanted to temporarily change what speakers were connected (maybe to play a verbal announcement in some specific parts of your house), then you could use this to save the state of all speakers, set the speakers to what you need and play the announcement, then restore the previous set.
  • Restore Saved Speaker State - this is the opposite action from the one above. Use it to restore a previously saved set.

Source Actions

  • Change Audio Source - change the source of the audio that Airfoil is broadcasting to it's connected speakers.
  • Save Current Source - much like the “Save Current Speaker State”, this will save the current source so you can restore it later.
  • Restore Saved Source - the opposite action to the one above. Use it to restore a previously saved source.

Volume

  • Set Volume - set the volume of the selected speaker(s) to a specific value (on a scale of 0 to 100).
  • Increase Volume - increase the volume of the selected speaker(s) by the amount specified (0 to 100).
  • Decrease Volume - decrease the volume of the selected speaker(s) by the amount specified (0 to 100).

Events

  • Airfoil Becomes Available - fires when Airfoil starts up.
  • Airfoil Becomes Unavailable - fires when Airfoil shuts down.
  • Speaker State Changes - watches for the selected speaker's state to change in up to 4 different ways:
    • Becomes Connected - when the speaker begins to receive broadcasts from Airfoil.
    • Becomes Disconnected - when the speaker stops receiving broadcasts from Airfoil.
    • Becomes Available - when a speaker comes online (i.e. when an Apple TV starts up).
    • Becomes Unavailable - when a speaker goes offline (i.e. when you quit Airfoil Speakers running on another computer or iOS device).
  • Audio Source Changes - fires when the audio source that Airfoil is broadcasting changes.

Optional Variables

In the Plugin Configuration dialog you have the option of having the plugin create variables for each speaker that holds it's current state: unavailable, connected, disconnected. Note - because variable names are restricted to certain characters, we substitute spaces with underscores (“_”) and remove any other invalid characters.

You can also have a variable called “CurrentSource” created that holds the name of the current audio source. These variables will be created in a folder named “Airfoil”. Once it's created, you can rename it if you like. However, note that if you turn off both checkboxes the variable folder and all it's contents will be deleted.

Scripting Support

As with all plugins, actions defined by this plugin may be executed by Python scripts. Here's the information you need to script the actions in this plugin.

Plugin ID: com.perceptiveautomation.indigoplugin.Airfoil

Action specific properties

Connect to Speaker

Action id: connectToSpeaker

Properties for scripting:

speaker the string key of the speaker to use - select “Show Speaker List in Event Log” from the Airfoil plugin menu to have a list of available speakers and their associated IDs displayed in the Event Log - most look like numbers although they are really strings - the one representing the local speaker is obviously a string (“com.rogueamoeba.airfoil.LocalSpeaker”)

Example:

airfoilPlugin = indigo.server.getPlugin("com.perceptiveautomation.indigoplugin.Airfoil")
if airfoilPlugin.isEnabled():
	airfoilPlugin.executeAction("connectToSpeaker", props={'speaker':"0017F2F8BE78"})

Disconnect from Speaker

Action id: disconnectFromSpeaker

Properties for scripting:

speaker the string key of the speaker to use - select “Show Speaker List in Event Log” from the Airfoil plugin menu to have a list of available speakers and their associated IDs displayed in the Event Log - most look like numbers although they are really strings - the one representing the local speaker is obviously a string (“com.rogueamoeba.airfoil.LocalSpeaker”)

Example:

airfoilPlugin = indigo.server.getPlugin("com.perceptiveautomation.indigoplugin.Airfoil")
if airfoilPlugin.isEnabled():
	airfoilPlugin.executeAction("disconnectFromSpeaker", props={'speaker':"0017F2F8BE78"})

Toggle Speaker

Action id: toggleSpeaker

Properties for scripting:

speaker the string key of the speaker to use - select “Show Speaker List in Event Log” from the Airfoil plugin menu to have a list of available speakers and their associated IDs displayed in the Event Log - most look like numbers although they are really strings - the one representing the local speaker is obviously a string (“com.rogueamoeba.airfoil.LocalSpeaker”)

Example:

airfoilPlugin = indigo.server.getPlugin("com.perceptiveautomation.indigoplugin.Airfoil")
if airfoilPlugin.isEnabled():
	airfoilPlugin.executeAction("toggleSpeaker", props={'speaker':"0017F2F8BE78"})

Save Speaker Set

Action id: saveSpeakerSet

No properties needed for scripting.

Example:

airfoilPlugin = indigo.server.getPlugin("com.perceptiveautomation.indigoplugin.Airfoil")
if airfoilPlugin.isEnabled():
	airfoilPlugin.executeAction("saveSpeakerSet")

Restore Speaker Set

Action id: restoreSpeakerSet

No properties needed for scripting.

Example:

airfoilPlugin = indigo.server.getPlugin("com.perceptiveautomation.indigoplugin.Airfoil")
if airfoilPlugin.isEnabled():
	airfoilPlugin.executeAction("restoreSpeakerSet")

Change Audio Source

Action id: changeAudioSource

Properties for scripting:

sourceType the string key of the type of audio source to change to - must be one of: “application”, “device”, or “system”
appSource if sourceType is “application”, the name string of the application as it shows in the Airfoil UI (i.e. “Adium”, “IndigoServer”, etc.)
devSource if sourceType is “device”, the name string of the audio device as it shows in the Airfoil UI (i.e. “Default System Input”, etc.)

Example:

airfoilPlugin = indigo.server.getPlugin("com.perceptiveautomation.indigoplugin.Airfoil")
if airfoilPlugin.isEnabled():
	# set the source to the IndigoServer
	airfoilPlugin.executeAction("changeAudioSource", props={'sourceType':"application", 'appSource':'IndigoServer'})
	# set the source to the default system input
	airfoilPlugin.executeAction("changeAudioSource", props={'sourceType':"device", 'devSource':'Default System Input'}) 
	# set the source to all system audio via soundflower
	airfoilPlugin.executeAction("changeAudioSource", props={'sourceType':"system"})

Save Source

Action id: saveSource

No properties needed for scripting.

Example:

airfoilPlugin = indigo.server.getPlugin("com.perceptiveautomation.indigoplugin.Airfoil")
if airfoilPlugin.isEnabled():
	airfoilPlugin.executeAction("saveSource")

Restore Source

Action id: restoreSource

No properties needed for scripting.

Example:

airfoilPlugin = indigo.server.getPlugin("com.perceptiveautomation.indigoplugin.Airfoil")
if airfoilPlugin.isEnabled():
	airfoilPlugin.executeAction("restoreSource")

Set Volume

Action id: setVolume

Properties for scripting:

volume a number from 0 to 100 representing the absolute volume
speakerIds a list of speaker ID strings to change - select “Show Speaker List in Event Log” from the Airfoil plugin menu to have a list of available speakers and their associated IDs displayed in the Event Log - most look like numbers although they are really strings - the one representing the local speaker is obviously a string (“com.rogueamoeba.airfoil.LocalSpeaker”)

Example:

airfoilPlugin = indigo.server.getPlugin("com.perceptiveautomation.indigoplugin.Airfoil")
if airfoilPlugin.isEnabled():
	airfoilPlugin.executeAction("setVolume", props={'volume':"75", 'speakerIds':["0017F2F8BE78","5855CA5E94F9"]})

Increase Volume

Action id: increaseVolume

Properties for scripting:

volume a number from 0 to 100 representing the amount to increase - so if a speaker is currently at 50, and volume is set to 25, the volume will end up being 75
speakerIds a list of speaker ID strings to change - select “Show Speaker List in Event Log” from the Airfoil plugin menu to have a list of available speakers and their associated IDs displayed in the Event Log - most look like numbers although they are really strings - the one representing the local speaker is obviously a string (“com.rogueamoeba.airfoil.LocalSpeaker”)

Example:

airfoilPlugin = indigo.server.getPlugin("com.perceptiveautomation.indigoplugin.Airfoil")
if airfoilPlugin.isEnabled():
	airfoilPlugin.executeAction("increaseVolume", props={'volume':"25", 'speakerIds':["0017F2F8BE78","5855CA5E94F9"]})

Decrease Volume

Action id: decreaseVolume

Properties for scripting:

volume a number from 0 to 100 representing the amount to increase - so if a speaker is currently at 50, and volume is set to 25, the volume will end up being 25
speakerIds a list of speaker ID strings to change - select “Show Speaker List in Event Log” from the Airfoil plugin menu to have a list of available speakers and their associated IDs displayed in the Event Log - most look like numbers although they are really strings - the one representing the local speaker is obviously a string (“com.rogueamoeba.airfoil.LocalSpeaker”)

Example:

airfoilPlugin = indigo.server.getPlugin("com.perceptiveautomation.indigoplugin.Airfoil")
if airfoilPlugin.isEnabled():
	airfoilPlugin.executeAction("decreaseVolume", props={'volume':"25", 'speakerIds':["0017F2F8BE78","5855CA5E94F9"]})

Support and Troubleshooting

For usage or troubleshooting tips discuss this plugin on our forum.

plugins/airfoil.txt · Last modified: 2014/02/26 09:41 by jay