Features

Features

Configurable bitmask

Features are declared in the features field of the mDNS records as a 64 bits long bitfield and encoded as two 32 bits hex values separated by a comma. For example, the features set 0x1111111122222222 will be declared as "0x22222222,0x11111111".

The following table is a listing of the features extracted so far. The column condition, if available, contains the necessary condition(s) to satisfy a specific feature.

Bit Property Condition Description
0 SupportsAirPlayVideoV1
1 SupportsAirPlayPhoto
5 SupportsAirPlaySlideshow
7 SupportsAirPlayScreen
9 SupportsAirPlayAudio
11 AudioRedunant
14 Authentication_4 FairPlay authentication
15 MetadataFeatures_0 Send artwork image to receiver
16 MetadataFeatures_1 Send track progress status to receiver
17 MetadataFeatures_2 Send NowPlaying info via DAAP
18 AudioFormats_0
19 AudioFormats_1
20 AudioFormats_2
21 AudioFormats_3
23 Authentication_1 RSA authentication (NA)
26 Authentication_8 26 || 51 MFi authentication
27 SupportsLegacyPairing
30 HasUnifiedAdvertiserInfo
32 IsCarPlay
32 SupportsVolume !32
33 SupportsAirPlayVideoPlayQueue
34 SupportsAirPlayFromCloud 34 && flags_6_SupportsAirPlayFromCloud
35 SupportsTLS_PSK
38 SupportsUnifiedMediaControl
40 SupportsBufferedAudio srcvers >= 354.54.6 && 40
41 SupportsPTP srcvers >= 366 && 41
42 SupportsScreenMultiCodec
43 SupportsSystemPairing
44 IsAPValeriaScreenSender
46 SupportsHKPairingAndAccessControl
48 SupportsCoreUtilsPairingAndEncryption 38 || 46 || 43 || 48
49 SupportsAirPlayVideoV2
50 MetadataFeatures_3 Send NowPlaying info via bplist
51 SupportsUnifiedPairSetupAndMFi
52 SupportsSetPeersExtendedMessage
54 SupportsAPSync
55 SupportsWoL 55 || 56
56 SupportsWoL 55 || 56
58 SupportsHangdogRemoteControl ((isAppleTV || isAppleAudioAccessory) && 58) || (isThirdPartyTV && flags_10)
59 SupportsAudioStreamConnectionSetup 59 && !disableStreamConnectionSetup
60 SupportsAudioMediaDataControl 59 && 60 && !disableMediaDataControl
61 SupportsRFC2198Redundancy

Bits not present in the table are still unknown.

Example: features declared by Sonos one

0x445F8A00,0x1C340 => 0x1C340445F8A00

Bits: 9, 11, 15, 16, 17, 18, 19, 20, 22, 26, 30, 38, 40, 41, 46, 47, 48

Other features

Some features are not associated to any bit, but they are rather tested over other feature bits and/or flags.

Property Condition Description
AudioFormats supportedFormats || (18 | 19 | 20 | 21)
SupportsAirPlayVideo 0 || 49
SupportsExtendedWHA srcvers >= 366 && (41 || forceAirPlay2NTP) && 40
ThirdPartySpeaker 26 || 51
ThirdPartyTV (26 || 51) && (0 || 49)
SupportsTransientPairing 48 || 43
SupportsKeepAlive srcvers >= 0.74.25
SupportsCBCSEncryption srcvers >= 301.44.30 && len("OSversion") > 0 #wut
SupportsUnifiedPairVerifyAndMFi 51 && srcvers >= 377
SupportsInitialVolume !32 && srcvers >= 120.2
SupportsAirPlayVideoPausedStart srcvers >= 220.68
SupportsMuteCommand srcvers >= 370.35
SupportsScreenIdle srcvers >= 150.35

Minimal set of features

Multi-room support

The minimal set of features an AirPlay 2 receiver must declare for multi-room support are:

  • SupportsAirPlayAudio (bit 9)
  • AudioRedundant (bit 11)
  • HasUnifiedAdvertiserInfo (bit 30)
  • SupportsBufferedAudio (bit 40)
  • SupportsPTP (bit 41)
  • SupportsUnifiedPairSetupAndMFi (bit 51)

The respective features bitmask is 0x8030040000a00 and will be declared as features=0x40000a00,0x80300.

Metadata support

The receiver can support metadata information by controlling bits 15, 16, 17 and 50:

  • bit 15 - receive the artwork of the track currently played;
  • bit 16 - receive the progress status;
  • bit 17 - receive a set of #nowplaying info via DAAP1
  • bit 50 - receive #nowplaying info encoded in a binary plist - overrides bit 17.

Internal configurable fields (WIP)

  • disableStreamConnectionSetup
  • forceAirPlay2NTP
  • supportedFormats
  • canRecordScreenStream
  • keepAliveSendStatsAsBody
  • extendedFeatures
  • playbackCapabilities
  • voiceModelSupportedLanguages

  1. Digital Audio Access Protocol - https://en.wikipedia.org/wiki/Digital_Audio_Access_Protocol ↩︎