# HomePod quad surround: preliminary firmware evidence Comparison: audioOS 27.2 beta 3, build 24K5103f, both HomePod generations. This paste contains all 22 text files from the publication-evidence folder. No firmware archives or executable firmware binaries are included. The main finding is 17 quad-role configuration entries in the inspected HomePod 2 plist and none in the equivalent HomePod 1 plist. This is static evidence, not a demonstrated unlock or a four-device runtime test. Each section below identifies the original bundle filename. Configuration excerpts preserve the decoded values; provenance, limitations and the verification script are included. ## File: README.md ````markdown # Preliminary HomePod quad-surround firmware evidence Static comparison of **audioOS 27.2 beta 3, build 24K5103f**, for the original HomePod (`AudioAccessory1,1`, `B238aAP`) and HomePod 2 (`AudioAccessory6,1`, `B620AP`). Analysis dated 10 October 2026. The second-generation tuning plist contains **17 configuration entries mentioning quad roles**. The original-generation tuning plist contains 69 entries using only `solo`, `stereoleft` and `stereoright`. This supports preparation of quad rendering profiles for HomePod 2 in this build. It does not establish a release commitment, permanent first-generation exclusion, an operational four-speaker system or a way to enable it. ## Inspect the evidence - `gen2-quad-configurations.json`: all 17 selected entries, decoded directly from the original binary plist. Values are preserved; JSON formatting replaces plist encoding. - `gen1-role-index.json` and `gen2-role-index.json`: entry name and original role field for every entry in each examined plist. These are projections, not complete configuration files. - `comparison-excerpt.json`: source Apple CDN URLs, recorded full-package hashes, original resource paths and hashes, counts, library versions, conclusions and limitations. - `gen1-ota-metadata-excerpt.json`: selected original Apple `AssetData/Info.plist` fields and the source file hash. - `gen2-ota-info-tool-output.txt`: metadata rendered by the `ipsw` parser from the downloaded gen2 package. This is **tool output**, not a verbatim Apple metadata plist. - `gen2-extraction-log-excerpt.txt`: the parser's log showing extraction from `payload.051` to the `AID12001/VAD` configuration path. - `gen1-spatial-markers.txt` and `gen2-spatial-markers.txt`: five exact strings with virtual addresses and containing images from shared-cache inspection. Presence does not prove that these components implement or activate quad playback. - `code-excerpts/`: five short targeted function disassemblies for each generation. They cover cluster model names, fallback device model names, RTAPAT group/member checks and one calibration method. ## What associates AID12001 with HomePod 2? The metadata parser identifies the package as `HomePod (2nd generation)` / `AudioAccessory6,1_B620AP_24K5103f`. The extraction log places the examined plist under: ```text Library/Audio/Tunings/AID12001/VAD/SoundAutoConfigStrips.plist ``` The original plist then declares, among others: ```json "volume_suv_front": { "calibrationMode": false, "VirtualAudioDeviceType": ["vdef", "vsyl", "vsri", "vlow"], "groupComposition": ["AID12001-AID12001-AID12001-AID12001"], "role": ["quad_frontleft", "quad_frontright"] } ``` This is an association by package identity and resource path. An explicit executable mapping from `B620AP` to `AID12001` was not traced, and exclusivity across all Apple models is not established. **AID12007 is unidentified**; the mixed composition is not evidence of first-generation compatibility. ## Code interpretation and unresolved questions `APSGetSupportsRTAPATFromClusterSummary` and its member block check the member-advertised `RTAPATAudioFeatureSupported` value. A nonempty group requires all member values to be nonzero. These functions do not directly compare HomePod generations, but we have not established that HomePod 1 advertises the capability or receives/renders distinct front/rear roles. The inspected `AudioAccessory1,1` references construct or supply model-name strings. They are not explicit quad eligibility refusals. Other call sites, Apple TV and iPhone/Home eligibility checks were not exhaustively audited. `buildDistanceMatrixFromOnsetOffsets:roles:` immediately returns on both devices in the inspected service. This statement concerns **one method**, not the entire calibration subsystem. Matching library versions do not mean identical binary code; the devices use different architectures. No mandatory U1/S7 requirement was demonstrated in the inspected material. Hardware feasibility remains unresolved. Apple's [gen1 specifications](https://support.apple.com/fr-fr/111994) describe its existing audio/calibration hardware; Apple's [gen2 specifications, footnote 2](https://support.apple.com/fr-fr/111843) state that existing spatial audio supports both generations. Neither source establishes four-HomePod compatibility. ## Verify or reproduce Using Python 3 and its standard library: ```sh python3 verify.py python3 verify.py --gen1-plist /path/to/gen1/SoundAutoConfigStrips.plist --gen2-plist /path/to/gen2/SoundAutoConfigStrips.plist ``` The first command checks bundle integrity and internal consistency. **It does not independently authenticate firmware contents.** The second additionally verifies each complete source plist's hash, all role fields and the 17 selected gen2 entries against independently supplied originals. `SHA256SUMS.json` detects file changes; it is not a signature or an independent attestation. To repeat acquisition, obtain the two official Apple OTA packages using the URLs in `comparison-excerpt.json`, check their full SHA256 hashes, and extract the firmware paths listed there. The gen1 full OTA is a ZIP with Apple Archive payloads; the gen2 full OTA is AEA. The original analysis used the native Apple Archive tooling and [ipsw v3.1.735](https://github.com/blacktop/ipsw/releases/tag/v3.1.735). This bundle does not include extraction keys or a complete acquisition script. The package hashes were checked against the Apple CDN digest header during the original acquisition. The full archives and shared caches were subsequently removed locally; this publication export rechecks the retained original tuning plists, not the removed packages. Cache strings and disassembly are retained tool outputs from that earlier inspection. Tool-generated model labels are not independent Apple model documentation. ## Sharing scope Only this small folder is prepared for sharing: selected configuration excerpts, short disassembly excerpts, provenance and a verifier. No OTA archives, firmware images, shared caches, extracted libraries or executable firmware binaries are included. Do not upload the parent research directory. The original preparation did not publish a Reddit post or GitHub repository. ```` ## File: gen2-quad-configurations.json ````json { "speaker_stereo_surround_spatialize_off_rear": { "calibrationMode": false, "spatializeStereo": false, "VirtualAudioDeviceType": [ "vdef", "vlow" ], "VirtualAudioPlugInMode": [ "imdf", "spkn", "movp" ], "role": [ "quad_rearleft", "quad_rearright" ] }, "speaker_multichannel_ltrt.propstrip": { "calibrationMode": false, "VirtualAudioDeviceType": [ "vdef", "vlow" ], "VirtualAudioPlugInMode": [ "mcdf", "mcmv" ], "role": [ "stereoleft", "stereoright", "quad_frontleft", "quad_frontright", "quad_rearleft", "quad_rearright" ] }, "speaker_sirioutput_surround_rear": { "calibrationMode": false, "VirtualAudioDeviceType": [ "vsri" ], "VirtualAudioPlugInMode": [ "imdf" ], "role": [ "quad_rearleft", "quad_rearright" ] }, "volume_suv_rear_stereo": { "calibrationMode": false, "VirtualAudioDeviceType": [ "vdef", "vsyl", "vsri", "vlow" ], "groupComposition": [ "AID12001-AID12001-AID12001-AID12001" ], "VirtualAudioPlugInMode": [ "imdf", "spkn", "vlss", "movp" ], "role": [ "quad_rearleft", "quad_rearright" ] }, "speaker_stereo_surround_spatialize_on": { "calibrationMode": false, "spatializeStereo": true, "VirtualAudioDeviceType": [ "vdef", "vlow", "vsyl", "vsri" ], "VirtualAudioPlugInMode": [ "imdf", "spkn", "vlss", "movp" ], "role": [ "quad_frontleft", "quad_frontright", "quad_rearleft", "quad_rearright" ] }, "speaker_multichannel_music_surround": { "calibrationMode": false, "VirtualAudioDeviceType": [ "vdef", "vlow" ], "VirtualAudioPlugInMode": [ "mcdf" ], "role": [ "quad_frontleft", "quad_frontright", "quad_rearleft", "quad_rearright" ] }, "speaker_surround_rear": { "calibrationMode": false, "VirtualAudioDeviceType": [ "vdef", "vlow" ], "VirtualAudioPlugInMode": [ "mcdf", "mcmv", "imdf", "movp", "spkn" ], "role": [ "quad_rearleft", "quad_rearright" ] }, "speaker_multichannel_movie_frontright": { "calibrationMode": false, "VirtualAudioDeviceType": [ "vdef" ], "VirtualAudioPlugInMode": [ "movp", "mcmv" ], "role": "quad_frontright" }, "speaker_multichannel_movie_surround": { "calibrationMode": false, "VirtualAudioDeviceType": [ "vdef" ], "role": [ "quad_frontleft", "quad_frontright", "quad_rearleft", "quad_rearright" ], "VirtualAudioPlugInMode": [ "mcmv" ] }, "speaker_multichannel_lowlatency_surround": { "calibrationMode": false, "VirtualAudioDeviceType": [ "vlow" ], "VirtualAudioPlugInMode": [ "mcdf" ], "role": [ "quad_frontleft", "quad_frontright", "quad_rearleft", "quad_rearright" ] }, "speaker_multichannel_movie_frontleft": { "calibrationMode": false, "VirtualAudioDeviceType": [ "vdef" ], "VirtualAudioPlugInMode": [ "movp", "mcmv" ], "role": "quad_frontleft" }, "speaker_stereo_surround_spatialize_off_front": { "calibrationMode": false, "spatializeStereo": false, "VirtualAudioDeviceType": [ "vdef", "vlow" ], "VirtualAudioPlugInMode": [ "imdf", "spkn", "movp" ], "role": [ "quad_frontleft", "quad_frontright" ] }, "volume_suv_front": { "calibrationMode": false, "VirtualAudioDeviceType": [ "vdef", "vsyl", "vsri", "vlow" ], "groupComposition": [ "AID12001-AID12001-AID12001-AID12001" ], "role": [ "quad_frontleft", "quad_frontright" ] }, "volume_suv_rear_multichannel": { "calibrationMode": false, "VirtualAudioDeviceType": [ "vdef", "vlow" ], "groupComposition": [ "AID12001-AID12001-AID12001-AID12001" ], "VirtualAudioPlugInMode": [ "mcdf", "mcmv" ], "role": [ "quad_rearleft", "quad_rearright" ] }, "speaker_local_systemsound_surround_rear": { "calibrationMode": false, "VirtualAudioDeviceType": [ "vsyl" ], "VirtualAudioPlugInMode": [ "vlss" ], "role": [ "quad_rearleft", "quad_rearright" ] }, "volume_forklift_front": { "calibrationMode": false, "VirtualAudioDeviceType": [ "vdef", "vsyl", "vsri", "vlow" ], "groupComposition": [ "AID12001-AID12001-AID12007-AID12007" ], "role": [ "quad_frontleft", "quad_frontright" ] }, "speaker_multichannel_movie_rear": { "calibrationMode": false, "VirtualAudioDeviceType": [ "vdef" ], "VirtualAudioPlugInMode": [ "movp", "mcmv" ], "role": [ "quad_rearleft", "quad_rearright" ] } } ```` ## File: comparison-excerpt.json ````json { "checked_on": "2026-10-10", "version": "27.2 beta 3", "build": "24K5103f", "source_packages": { "gen1": { "url": "https://updates.cdn-apple.com/2026FallSeed/b6a29ea1-6c5f-44e6-906c-5233d68884fa/com_apple_MobileAsset_SoftwareUpdate/4da0ee9471dfd9c67aaa614de957d8856740c249.zip", "sha256": "ae4856cd99690cc2cbd96100d19c329221abca0cce5e0746b8240cf5baec5fc5" }, "gen2": { "url": "https://updates.cdn-apple.com/2026FallSeed/8e5b897b-2dfa-4b63-8693-0bc22ff76ef6/com_apple_MobileAsset_SoftwareUpdate/4c350d02d26cfc2cc6de1105c9843ba513cb6068b7f77ff45c4cdbaaf4cde177.aea", "sha256": "02d79d6357f619412be767452b438e9461ee91c86351a1047390500331758498" } }, "scope": "Device audio tuning files, eight shared-cache libraries, VirtualAudio and SoundAutoConfig service, five feature flag domains, targeted AirPlay disassembly; no runtime test, Apple TV/iPhone firmware audit or exhaustive call graph.", "package_hash_status": "Recorded during the original download and extraction: both complete OTA hashes were checked against Apple CDN x-amz-meta-digest-sha256. The OTA packages have since been removed locally; this export does not re-download or re-hash them.", "devices": { "gen1": { "product_type": "AudioAccessory1,1", "hardware_model": "B238aAP", "configuration_path_in_firmware": "Library/Audio/Tunings/B238a/VAD/SoundAutoConfigStrips.plist", "configuration_sha256": "8aba1ea39d4858a35d92e54fb13217876cd42bbaef798b2330f80db5f990972b", "configuration_entries": 69, "quad_entries": 0, "role_occurrences": { "solo": 23, "stereoleft": 23, "stereoright": 23 }, "group_compositions": {}, "library_versions": { "HomeKit": "1520.2.3.0.2", "MediaExperience": "385.10.1.0.0", "libAudioDSP.dylib": "881.210.0.0.0", "AirPlaySupport": "1005.12.1.0.0", "libEmbeddedSystemAUs.dylib": "1638.211.0.0.0", "AirPlayReceiver": "1005.12.1.0.0", "SoundAutoConfig": "109.89.0.0.0", "libAudioDSPCore.dylib": "881.210.0.0.0" }, "source_binary_hashes_recorded_during_analysis": { "soundautoconfigservice.internal": "f080ae89aef475b64eea4878663bd584837eeba4a5a430d46192744e8e6d460e", "AirPlaySupport": "e8bdab7baf4fa1d6cb19791d29424d7255ee2bbb9905f86f128c0a5b754a01ab", "AirPlayReceiver": "3c81691c0e972e6fb61efbaf73f7ce1663cdc301355abfec3d5290dec4e6409e", "libAudioDSP.dylib": "904d1dcdb273d966b9fe5518250ab3c9e7ab713dd5432f82283cc3b83c87be9f", "libAudioDSPCore.dylib": "9eb1d2a7622b753973d9502c4574445643b537448ef5fa49e12751f3c017269b", "SoundAutoConfig": "22034d2f8314b2ae4782228cf8e49cea2a51e6bd6a1e471bdd72ca747ffe63b5", "HomeKit": "f21633d8201bd3a440082f6c10480943fa0af11f5116dda67bb41a78026150cd", "MediaExperience": "8c38405efe5eddb4fcd96cf96634d8194b3d14dc168cf4cbb9471ae83dbf1762", "libEmbeddedSystemAUs.dylib": "55dbe95f071fa78e7bcaa31d8c21b37b9a51fe074907a2a5701952d06bcf9d76" } }, "gen2": { "product_type": "AudioAccessory6,1", "hardware_model": "B620AP", "configuration_path_in_firmware": "Library/Audio/Tunings/AID12001/VAD/SoundAutoConfigStrips.plist", "configuration_sha256": "fe0fe64099427e6134ccf395de601519cedd6235a57b4ce821738de3f0dddca0", "configuration_entries": 39, "quad_entries": 17, "role_occurrences": { "quad_frontleft": 9, "quad_frontright": 9, "quad_rearleft": 12, "quad_rearright": 12, "solo": 10, "stereoleft": 13, "stereoright": 13 }, "group_compositions": { "volume_suv_rear_stereo": [ "AID12001-AID12001-AID12001-AID12001" ], "volume_suv_front": [ "AID12001-AID12001-AID12001-AID12001" ], "volume_suv_rear_multichannel": [ "AID12001-AID12001-AID12001-AID12001" ], "volume_forklift_front": [ "AID12001-AID12001-AID12007-AID12007" ] }, "library_versions": { "HomeKit": "1520.2.3.0.2", "MediaExperience": "385.10.1.0.0", "libAudioDSP.dylib": "881.210.0.0.0", "AirPlaySupport": "1005.12.1.0.0", "libEmbeddedSystemAUs.dylib": "1638.211.0.0.0", "AirPlayReceiver": "1005.12.1.0.0", "SoundAutoConfig": "109.89.0.0.0", "libAudioDSPCore.dylib": "881.210.0.0.0" }, "source_binary_hashes_recorded_during_analysis": { "soundautoconfigservice.internal": "711d10767f910bfa945ed17a2c47aaf182b26ba058e957d6597706da332a90c9", "AirPlaySupport": "9afb597f286eae84b83bd005a1eeb4776de85971a389bf764047b7466c9aebf1", "AirPlayReceiver": "a814966cc85d82980fb89f564784d2215ac2b19ae4d8cef14bbf2223daab65ea", "libAudioDSP.dylib": "3ca455d546f74ec68f763a5a29a45828880c6e424bcbb0565f317a145722f26d", "libAudioDSPCore.dylib": "ec601c4f194c1dad1667811e3152efa22047094afa60ee369e057c406218db67", "SoundAutoConfig": "33285df95ba706c9d7f629139a216513cfe4801f1f2a8cc461283de21e34a121", "HomeKit": "f3b2b003d324e2ae2dcd3313182d6871673c31be6e4d0c666e1799c162c01550", "MediaExperience": "d23b57776208a7fc289577bc1684705b91597b2176377cfe62995d8ed5adc7f1", "libEmbeddedSystemAUs.dylib": "ae8ecb40fdf47a9339897a373bc4ec3a6d62b259f50cd653ad26280b5536d0ca" } } }, "AID12001_association": { "evidence_chain": [ "The ipsw metadata parser identifies the downloaded package as AudioAccessory6,1 / B620AP / HomePod (2nd generation).", "The extraction log places SoundAutoConfigStrips.plist under Library/Audio/Tunings/AID12001/VAD in that package.", "That plist contains compositions using four AID12001 identifiers and the four quad roles." ], "limits": "Package and resource-path association; an explicit executable mapping from B620AP to AID12001 was not traced. Exclusivity across all Apple models is not established. AID12007 remains unidentified.", "gen2_metadata_status": "Parser-generated output, not a verbatim excerpt of an Apple metadata plist; retain this distinction when citing it." }, "compatibility_inspection": { "AirPlaySupport_gen1_model_reference": "The located AudioAccessory1,1 string xref is in APSGetClusterModelName; disassembly builds a model-name string, not a quad compatibility refusal.", "AirPlayReceiver_gen1_model_reference": "The located string xref is in sysInfo_getDeviceModel; it supplies a fallback model name, not a quad compatibility refusal.", "explicit_gen1_quad_exclusion": "Not established in inspected paths; other call sites and eligibility checks remain unaudited.", "cross_generation_disassembly": "Model-name and RTAPAT functions inspected on both generations. Same relevant behavior; architecture-dependent instructions/addresses differ.", "RTAPAT": "APSGetSupportsRTAPATFromClusterSummary initializes true for nonempty groups and tests RTAPATAudioFeatureSupported on each member; one zero/missing member value makes it false. No model test in this function. This does not prove that gen1 advertises the capability or can render quad roles.", "hardware": "No decoded U1, UWB or S7 requirement identified in extracted surround tuning files. No exhaustive hardware-dependency proof." }, "library_versions_equal": { "AirPlaySupport": true, "AirPlayReceiver": true, "libAudioDSP.dylib": true, "libAudioDSPCore.dylib": true, "SoundAutoConfig": true, "HomeKit": true, "MediaExperience": true, "libEmbeddedSystemAUs.dylib": true }, "feature_flag_files_byte_identical_recorded_during_analysis": { "AudioDSPGraph.plist": true, "AudioAccessoryFeatures.plist": true, "AudioDSP.plist": true, "MediaExperience.plist": true, "AirPlay.plist": true }, "limitations": [ "Static, targeted analysis of one beta build; no four-device runtime experiment.", "17 means configuration entries, not 17 speakers, functions or channel layouts.", "No quad roles in the examined gen1 plist; absence throughout every possible runtime path is not proven.", "Shared symbol/string presence and equal library versions do not establish active quad support or byte-identical binaries.", "Only buildDistanceMatrixFromOnsetOffsets:roles: was verified as an immediate-return calibration method on both devices.", "No explicit gen1 rejection in the inspected functions; Apple TV, iPhone/Home eligibility checks and other call sites remain unaudited.", "No mandatory U1/S7 dependence demonstrated in the inspected assets; complete hardware feasibility is unresolved.", "The bundle contains selected configuration values and short disassembly excerpts, not firmware archives, libraries or an unlock." ] } ```` ## File: SHA256SUMS.json ````json { "README.md": "e084200877630b1887a72e6b8dce7e58cde1c539407057428e9f8963a549b109", "code-excerpts/gen1-cluster-model.txt": "9fb89ade3b4193570a73a49c048471cd4772fc5fc2f2762f3ee00e113e00ba51", "code-excerpts/gen1-receiver-model.txt": "a29858ec475b16b0515011c30b4c99ff3224885a103cd6c2e39cfd92ce172b71", "code-excerpts/gen1-rtapat-capability.txt": "2fcd03dbbab0166415ea50631ef30446aed940b2ed6b304ca51ffb20d456129a", "code-excerpts/gen1-rtapat-member.txt": "af7be6d4ff9627f54f7c3f66746921e51a1b6e61ccd4a634708e91b8f3ea1982", "code-excerpts/gen1-surround-matrix.txt": "25dcffa76e8ec548eb383fa46ae7ef21f889acc2e155dc3d26b772b44ddcc940", "code-excerpts/gen2-cluster-model.txt": "f444a5c6425b6268ac1481520538d014c4f0fb9386dfd586e75ab21e80889c6f", "code-excerpts/gen2-receiver-model.txt": "4d7e3aa8b6784e4180894e7e1145282252265e9978151f3bf30fadf3a7f79427", "code-excerpts/gen2-rtapat-capability.txt": "dd2372c2396ac160237301947b9050b20d691feacdbe89ae7533a46d9634badf", "code-excerpts/gen2-rtapat-member.txt": "623dbfbea2062c23bfb0fcb92fef6440baef5f91b4e6572544d8c0cc393b28f8", "code-excerpts/gen2-surround-matrix.txt": "d6971c8a41cefa7ed50b57cf6a2fa0c392dfbc9d744f3094eb849fb5c29ab473", "comparison-excerpt.json": "bb69af0468e170d92f0228291a15d6e6a6847809d11d3e746a7df744de5b7f62", "gen1-ota-metadata-excerpt.json": "d0e94832074e74aa9ad5a2b7282353353ef655a6cdf3359aaa74a09792223987", "gen1-role-index.json": "3be966a70372f5a68bedfb7fbbcc41ef72ec0092d3008bab1d3a9195934d757f", "gen1-spatial-markers.txt": "b0878508de883dcd92abff0b0fc1dbaed881525451b5445fe872800bcbbc0fc5", "gen2-extraction-log-excerpt.txt": "f69708b0d59153c05dbb3b7a22061a0f6e9dc210c1c213c6abcfa94841fa0bcd", "gen2-ota-info-tool-output.txt": "113256895cea0bb996a0745f57a51c71a0afee66f5c3b75686b81b7f90a0d6b7", "gen2-quad-configurations.json": "401f021b25a02759b04b6656252ef48ad27f6d7d07c6dfef6bc6d314a7e14c0f", "gen2-role-index.json": "5baf41a801d7211a7be1a6e25ab10942d9f90a65bdc9ed90f7b870dd9fc838e6", "gen2-spatial-markers.txt": "0ee021d1cd582913cf2aab219e82cb107d2cdfd1c45ffa079f4a508637f2a096", "verify.py": "f8ee1bc776725117eb7a403ab40a971c77413957120c5af8ebb9b0300be779bd" } ```` ## File: code-excerpts/gen1-cluster-model.txt ````text _APSGetClusterModelName: 0x19491a078: ff 43 01 d1 sub sp, sp, #0x50 0x19491a07c: f8 5f 01 a9 stp x24, x23, [sp, #0x10] 0x19491a080: f6 57 02 a9 stp x22, x21, [sp, #0x20] 0x19491a084: f4 4f 03 a9 stp x20, x19, [sp, #0x30] 0x19491a088: fd 7b 04 a9 stp fp, lr, [sp, #0x40] 0x19491a08c: fd 03 01 91 add fp, sp, #0x40 0x19491a090: f4 03 02 aa mov x20, x2 0x19491a094: f6 03 01 aa mov x22, x1 0x19491a098: f5 03 00 aa mov x21, x0 0x19491a09c: 48 e2 27 b0 adrp x8, 0x1e4563000 0x19491a0a0: 00 4d 44 f9 ldr x0, [x8, #0x898] ; _ptr.NSMutableString 0x19491a0a4: c7 12 02 94 bl _objc_msgSend$string 0x19491a0a8: f3 03 00 aa mov x19, x0 0x19491a0ac: b4 00 00 35 cbnz w20, loc_19491a0c0 ; ⤵ 0x14 0x19491a0b0: df 0e 00 71 cmp w22, #0x3 0x19491a0b4: 88 09 00 54 b.hi loc_19491a1e4 ; ⤵ 0x130 0x19491a0b8: 28 00 80 52 mov w8, #0x1 0x19491a0bc: 14 21 d6 1a lsl w20, w8, w22 0x19491a0c0: ; loc_19491a0c0 0x19491a0c0: b6 06 00 71 subs w22, w21, #0x1 0x19491a0c4: a0 00 00 54 b.eq loc_19491a0d8 ; ⤵ 0x14 0x19491a0c8: bf 0a 00 71 cmp w21, #0x2 0x19491a0cc: a1 02 00 54 b.ne loc_19491a120 ; ⤵ 0x54 0x19491a0d0: 9f 06 00 71 cmp w20, #0x1 0x19491a0d4: 60 02 00 54 b.eq loc_19491a120 ; ⤵ 0x4c 0x19491a0d8: ; loc_19491a0d8 0x19491a0d8: 55 03 00 d0 adrp x21, 0x194984000 0x19491a0dc: b5 de 18 91 add x21, x21, #0x637 0x19491a0e0: 97 02 00 b0 adrp x23, 0x19496b000 0x19491a0e4: f7 1a 3d 91 add x23, x23, #0xf46 ; data_19496bf46 (AirPlaySupport/__TEXT.__cstring) 0x19491a0e8: d4 04 00 37 tbnz w20, #0, loc_19491a180 ; ⤵ 0x98 0x19491a0ec: 34 06 08 37 tbnz w20, #0x1, loc_19491a1b0 ; ⤵ 0xc4 0x19491a0f0: ; loc_19491a0f0 0x19491a0f0: 94 01 10 36 tbz w20, #0x2, loc_19491a120 ; ⤵ 0x30 0x19491a0f4: ; loc_19491a0f4 0x19491a0f4: e0 03 13 aa mov x0, x19 0x19491a0f8: 3a 10 02 94 bl _objc_msgSend$length 0x19491a0fc: 1f 00 00 f1 cmp x0, #0 0x19491a100: e8 02 95 9a csel x8, x23, x21, eq 0x19491a104: 49 03 00 f0 adrp x9, 0x194985000 0x19491a108: 29 b5 04 91 add x9, x9, #0x12d ; "AudioAccessory6,1" 0x19491a10c: e8 27 00 a9 stp x8, x9, [sp] 0x19491a110: c2 15 29 b0 adrp x2, 0x1e6bd3000 0x19491a114: 42 20 2e 91 add x2, x2, #0xb88 ; "%s%s" 0x19491a118: e0 03 13 aa mov x0, x19 0x19491a11c: 19 0e 02 94 bl _objc_msgSend$appendFormat: 0x19491a120: ; loc_19491a120 0x19491a120: e0 03 13 aa mov x0, x19 0x19491a124: 2f 10 02 94 bl _objc_msgSend$length 0x19491a128: a0 00 00 b4 cbz x0, loc_19491a13c ; ⤵ 0x14 0x19491a12c: c2 15 29 b0 adrp x2, 0x1e6bd3000 0x19491a130: 42 a0 2e 91 add x2, x2, #0xba8 ; "-" 0x19491a134: e0 03 13 aa mov x0, x19 0x19491a138: 1a 0e 02 94 bl _objc_msgSend$appendString: 0x19491a13c: ; loc_19491a13c 0x19491a13c: df 0a 00 71 cmp w22, #0x2 0x19491a140: c8 00 00 54 b.hi loc_19491a158 ; ⤵ 0x18 0x19491a144: a8 15 29 90 adrp x8, 0x1e6bce000 0x19491a148: 08 01 30 91 add x8, x8, #0xc00 ; _ptr."TightSyncCluster" 0x19491a14c: 02 59 76 f8 ldr x2, [x8, w22, uxtw #0x3] 0x19491a150: e0 03 13 aa mov x0, x19 0x19491a154: 13 0e 02 94 bl _objc_msgSend$appendString: 0x19491a158: ; loc_19491a158 0x19491a158: e0 03 13 aa mov x0, x19 0x19491a15c: 21 10 02 94 bl _objc_msgSend$length 0x19491a160: 1f 00 00 f1 cmp x0, #0 0x19491a164: e0 03 93 9a csel x0, xzr, x19, eq 0x19491a168: ; loc_19491a168 0x19491a168: fd 7b 44 a9 ldp fp, lr, [sp, #0x40] 0x19491a16c: f4 4f 43 a9 ldp x20, x19, [sp, #0x30] 0x19491a170: f6 57 42 a9 ldp x22, x21, [sp, #0x20] 0x19491a174: f8 5f 41 a9 ldp x24, x23, [sp, #0x10] 0x19491a178: ff 43 01 91 add sp, sp, #0x50 0x19491a17c: c0 03 5f d6 ret 0x19491a180: ; loc_19491a180 0x19491a180: e0 03 13 aa mov x0, x19 0x19491a184: 17 10 02 94 bl _objc_msgSend$length 0x19491a188: 1f 00 00 f1 cmp x0, #0 0x19491a18c: e8 02 95 9a csel x8, x23, x21, eq 0x19491a190: 49 03 00 f0 adrp x9, 0x194985000 0x19491a194: 29 25 04 91 add x9, x9, #0x109 ; "AudioAccessory1,1" 0x19491a198: e8 27 00 a9 stp x8, x9, [sp] 0x19491a19c: c2 15 29 b0 adrp x2, 0x1e6bd3000 0x19491a1a0: 42 20 2e 91 add x2, x2, #0xb88 ; "%s%s" 0x19491a1a4: e0 03 13 aa mov x0, x19 0x19491a1a8: f6 0d 02 94 bl _objc_msgSend$appendFormat: 0x19491a1ac: 34 fa 0f 36 tbz w20, #0x1, loc_19491a0f0 ; ⤴ -0xbc 0x19491a1b0: ; loc_19491a1b0 0x19491a1b0: e0 03 13 aa mov x0, x19 0x19491a1b4: 0b 10 02 94 bl _objc_msgSend$length 0x19491a1b8: 1f 00 00 f1 cmp x0, #0 0x19491a1bc: e8 02 95 9a csel x8, x23, x21, eq 0x19491a1c0: 49 03 00 f0 adrp x9, 0x194985000 0x19491a1c4: 29 6d 04 91 add x9, x9, #0x11b ; "AudioAccessory5,1" 0x19491a1c8: e8 27 00 a9 stp x8, x9, [sp] 0x19491a1cc: c2 15 29 b0 adrp x2, 0x1e6bd3000 0x19491a1d0: 42 20 2e 91 add x2, x2, #0xb88 ; "%s%s" 0x19491a1d4: e0 03 13 aa mov x0, x19 0x19491a1d8: ea 0d 02 94 bl _objc_msgSend$appendFormat: 0x19491a1dc: d4 f8 17 37 tbnz w20, #0x2, loc_19491a0f4 ; ⤴ -0xe8 0x19491a1e0: d0 ff ff 17 b loc_19491a120 ; ⤴ -0xc0 0x19491a1e4: ; loc_19491a1e4 0x19491a1e4: 00 00 80 d2 mov x0, #0 0x19491a1e8: e0 ff ff 17 b loc_19491a168 ; ⤴ -0x80 ```` ## File: code-excerpts/gen1-receiver-model.txt ````text _sysInfo_getDeviceModel: 0x1ae924214: f4 4f be a9 stp x20, x19, [sp, #-0x20]! 0x1ae924218: fd 7b 01 a9 stp fp, lr, [sp, #0x10] 0x1ae92421c: fd 43 00 91 add fp, sp, #0x10 0x1ae924220: f3 03 00 aa mov x19, x0 0x1ae924224: 1f 00 00 39 strb wzr, [x0] 0x1ae924228: 21 80 80 52 mov w1, #0x401 0x1ae92422c: 93 04 07 94 bl j__GetDeviceModelString 0x1ae924230: 68 02 40 39 ldrb w8, [x19] 0x1ae924234: 88 01 00 35 cbnz w8, loc_1ae924264 ; ⤵ 0x30 0x1ae924238: 78 fe 06 94 bl j__APSIsAPMSpeaker 0x1ae92423c: 00 01 00 34 cbz w0, loc_1ae92425c ; ⤵ 0x20 0x1ae924240: 28 06 80 52 mov w8, #0x31 0x1ae924244: 68 22 00 79 strh w8, [x19, #0x10] 0x1ae924248: c8 0c 00 b0 adrp x8, 0x1aeabd000 0x1ae92424c: 08 1d 2f 91 add x8, x8, #0xbc7 ; "AudioAccessory1,1" 0x1ae924250: ; loc_1ae924250 0x1ae924250: 00 01 c0 3d ldr q0, [x8] 0x1ae924254: 60 02 80 3d str q0, [x19] 0x1ae924258: 03 00 00 14 b loc_1ae924264 ; ⤵ 0xc 0x1ae92425c: ; loc_1ae92425c 0x1ae92425c: 68 02 40 39 ldrb w8, [x19] 0x1ae924260: 88 00 00 34 cbz w8, loc_1ae924270 ; ⤵ 0x10 0x1ae924264: ; loc_1ae924264 0x1ae924264: fd 7b 41 a9 ldp fp, lr, [sp, #0x10] 0x1ae924268: f4 4f c2 a8 ldp x20, x19, [sp], #0x20 0x1ae92426c: c0 03 5f d6 ret 0x1ae924270: ; loc_1ae924270 0x1ae924270: 28 06 80 52 mov w8, #0x31 0x1ae924274: 68 22 00 79 strh w8, [x19, #0x10] 0x1ae924278: c8 0c 00 b0 adrp x8, 0x1aeabd000 0x1ae92427c: 08 65 2f 91 add x8, x8, #0xbd9 ; "AirPlayGeneric1,1" 0x1ae924280: f4 ff ff 17 b loc_1ae924250 ; ⤴ -0x30 ```` ## File: code-excerpts/gen1-rtapat-capability.txt ````text _APSGetSupportsRTAPATFromClusterSummary: 0x1949197b8: ff c3 01 d1 sub sp, sp, #0x70 0x1949197bc: f4 4f 05 a9 stp x20, x19, [sp, #0x50] 0x1949197c0: fd 7b 06 a9 stp fp, lr, [sp, #0x60] 0x1949197c4: fd 83 01 91 add fp, sp, #0x60 0x1949197c8: f3 03 00 aa mov x19, x0 0x1949197cc: e8 c3 00 91 add x8, sp, #0x30 0x1949197d0: ff 23 03 a9 stp xzr, x8, [sp, #0x30] 0x1949197d4: 68 02 00 b0 adrp x8, 0x194966000 0x1949197d8: 00 2d 45 fd ldr d0, [x8, #0xa58] 0x1949197dc: e0 23 00 fd str d0, [sp, #0x40] 0x1949197e0: ff 23 01 39 strb wzr, [sp, #0x48] 0x1949197e4: 9c 19 02 94 bl j__FigCFDictionaryGetCount 0x1949197e8: 80 02 00 b4 cbz x0, loc_194919838 ; ⤵ 0x50 0x1949197ec: e8 1f 40 f9 ldr x8, [sp, #0x38] 0x1949197f0: 29 00 80 52 mov w9, #0x1 0x1949197f4: 09 61 00 39 strb w9, [x8, #0x18] 0x1949197f8: c8 ec 27 b0 adrp x8, 0x1e46b2000 0x1949197fc: 08 1d 40 f9 ldr x8, [x8, #0x38] ; _ptr.__NSStackBlock__ 0x194919800: e8 07 00 f9 str x8, [sp, #0x8] 0x194919804: 68 02 00 b0 adrp x8, 0x194966000 0x194919808: 00 09 45 fd ldr d0, [x8, #0xa10] 0x19491980c: e0 0b 00 fd str d0, [sp, #0x10] 0x194919810: 08 00 00 90 adrp x8, 0x194919000 0x194919814: 08 e1 21 91 add x8, x8, #0x878 ; ___APSGetSupportsRTAPATFromClusterSummary_block_invoke 0x194919818: 89 15 29 d0 adrp x9, 0x1e6bcb000 0x19491981c: 29 a1 3a 91 add x9, x9, #0xea8 ; data_1e6bcbea8 (AirPlaySupport/__DATA_CONST.__const) 0x194919820: e8 a7 01 a9 stp x8, x9, [sp, #0x18] 0x194919824: e8 c3 00 91 add x8, sp, #0x30 0x194919828: e8 17 00 f9 str x8, [sp, #0x28] 0x19491982c: e1 23 00 91 add x1, sp, #0x8 0x194919830: e0 03 13 aa mov x0, x19 0x194919834: 5e 16 02 94 bl j__CFDictionaryApplyBlock 0x194919838: ; loc_194919838 0x194919838: e8 1f 40 f9 ldr x8, [sp, #0x38] 0x19491983c: 13 61 40 39 ldrb w19, [x8, #0x18] 0x194919840: e0 c3 00 91 add x0, sp, #0x30 0x194919844: 01 01 80 52 mov w1, #0x8 0x194919848: 32 1c 02 94 bl j___Block_object_dispose 0x19491984c: e0 03 13 aa mov x0, x19 0x194919850: fd 7b 46 a9 ldp fp, lr, [sp, #0x60] 0x194919854: f4 4f 45 a9 ldp x20, x19, [sp, #0x50] 0x194919858: ff c3 01 91 add sp, sp, #0x70 0x19491985c: c0 03 5f d6 ret 0x194919860: f3 03 00 aa mov x19, x0 0x194919864: e0 c3 00 91 add x0, sp, #0x30 0x194919868: 01 01 80 52 mov w1, #0x8 0x19491986c: 29 1c 02 94 bl j___Block_object_dispose 0x194919870: e0 03 13 aa mov x0, x19 0x194919874: 4b 1c 02 94 bl j___Unwind_Resume ```` ## File: code-excerpts/gen1-rtapat-member.txt ````text ___APSGetSupportsRTAPATFromClusterSummary_block_invoke: 0x194919878: f4 4f be a9 stp x20, x19, [sp, #-0x20]! 0x19491987c: fd 7b 01 a9 stp fp, lr, [sp, #0x10] 0x194919880: fd 43 00 91 add fp, sp, #0x10 0x194919884: f3 03 00 aa mov x19, x0 0x194919888: c1 15 29 d0 adrp x1, 0x1e6bd3000 0x19491988c: 21 20 2b 91 add x1, x1, #0xac8 ; "RTAPATAudioFeatureSupported" 0x194919890: e0 03 02 aa mov x0, x2 0x194919894: 02 00 80 d2 mov x2, #0 0x194919898: 6f 16 02 94 bl j__CFDictionaryGetInt64 0x19491989c: 68 12 40 f9 ldr x8, [x19, #0x20] 0x1949198a0: 08 05 40 f9 ldr x8, [x8, #0x8] 0x1949198a4: 09 61 40 39 ldrb w9, [x8, #0x18] 0x1949198a8: 29 01 00 12 and w9, w9, #0x1 0x1949198ac: 1f 00 00 f1 cmp x0, #0 0x1949198b0: e9 03 89 1a csel w9, wzr, w9, eq 0x1949198b4: 09 61 00 39 strb w9, [x8, #0x18] 0x1949198b8: fd 7b 41 a9 ldp fp, lr, [sp, #0x10] 0x1949198bc: f4 4f c2 a8 ldp x20, x19, [sp], #0x20 0x1949198c0: c0 03 5f d6 ret ```` ## File: code-excerpts/gen1-surround-matrix.txt ````text -[SACSurroundCalibration buildDistanceMatrixFromOnsetOffsets:roles:]: 0x10002f1f0: c0 03 5f d6 ret ```` ## File: code-excerpts/gen2-cluster-model.txt ````text _APSGetClusterModelName: 0x1967b0f8c: 7f 23 03 d5 pacibsp 0x1967b0f90: ff 43 01 d1 sub sp, sp, #0x50 0x1967b0f94: f8 5f 01 a9 stp x24, x23, [sp, #0x10] 0x1967b0f98: f6 57 02 a9 stp x22, x21, [sp, #0x20] 0x1967b0f9c: f4 4f 03 a9 stp x20, x19, [sp, #0x30] 0x1967b0fa0: fd 7b 04 a9 stp fp, lr, [sp, #0x40] 0x1967b0fa4: fd 03 01 91 add fp, sp, #0x40 0x1967b0fa8: f4 03 02 aa mov x20, x2 0x1967b0fac: f6 03 01 aa mov x22, x1 0x1967b0fb0: f5 03 00 aa mov x21, x0 0x1967b0fb4: 28 c5 24 90 adrp x8, 0x1e0054000 0x1967b0fb8: 00 a5 42 f9 ldr x0, [x8, #0x548] ; _ptr.NSMutableString 0x1967b0fbc: d9 1f 62 94 bl 0x198038f20 0x1967b0fc0: f3 03 00 aa mov x19, x0 0x1967b0fc4: b4 00 00 35 cbnz w20, loc_1967b0fd8 ; ⤵ 0x14 0x1967b0fc8: df 0e 00 71 cmp w22, #0x3 0x1967b0fcc: 88 09 00 54 b.hi loc_1967b10fc ; ⤵ 0x130 0x1967b0fd0: 28 00 80 52 mov w8, #0x1 0x1967b0fd4: 14 21 d6 1a lsl w20, w8, w22 0x1967b0fd8: ; loc_1967b0fd8 0x1967b0fd8: b6 06 00 71 subs w22, w21, #0x1 0x1967b0fdc: a0 00 00 54 b.eq loc_1967b0ff0 ; ⤵ 0x14 0x1967b0fe0: bf 0a 00 71 cmp w21, #0x2 0x1967b0fe4: a1 02 00 54 b.ne loc_1967b1038 ; ⤵ 0x54 0x1967b0fe8: 9f 06 00 71 cmp w20, #0x1 0x1967b0fec: 60 02 00 54 b.eq loc_1967b1038 ; ⤵ 0x4c 0x1967b0ff0: ; loc_1967b0ff0 0x1967b0ff0: 95 03 00 d0 adrp x21, 0x196822000 0x1967b0ff4: b5 be 05 91 add x21, x21, #0x16f 0x1967b0ff8: d7 02 00 b0 adrp x23, 0x196809000 0x1967b0ffc: f7 fa 29 91 add x23, x23, #0xa7e ; data_196809a7e (AirPlaySupport/__TEXT.__cstring) 0x1967b1000: d4 04 00 37 tbnz w20, #0, loc_1967b1098 ; ⤵ 0x98 0x1967b1004: 34 06 08 37 tbnz w20, #0x1, loc_1967b10c8 ; ⤵ 0xc4 0x1967b1008: ; loc_1967b1008 0x1967b1008: 94 01 10 36 tbz w20, #0x2, loc_1967b1038 ; ⤵ 0x30 0x1967b100c: ; loc_1967b100c 0x1967b100c: e0 03 13 aa mov x0, x19 0x1967b1010: 1c b4 61 94 bl 0x19801e080 0x1967b1014: 1f 00 00 f1 cmp x0, #0 0x1967b1018: e8 02 95 9a csel x8, x23, x21, eq 0x1967b101c: 89 03 00 b0 adrp x9, 0x196822000 0x1967b1020: 29 95 31 91 add x9, x9, #0xc65 ; "AudioAccessory6,1" 0x1967b1024: e8 27 00 a9 stp x8, x9, [sp] 0x1967b1028: 82 b9 26 f0 adrp x2, 0x1e3ee4000 0x1967b102c: 42 a0 2e 91 add x2, x2, #0xba8 ; "%s%s" 0x1967b1030: e0 03 13 aa mov x0, x19 0x1967b1034: 5b 64 61 94 bl 0x19800a1a0 0x1967b1038: ; loc_1967b1038 0x1967b1038: e0 03 13 aa mov x0, x19 0x1967b103c: 11 b4 61 94 bl 0x19801e080 0x1967b1040: a0 00 00 b4 cbz x0, loc_1967b1054 ; ⤵ 0x14 0x1967b1044: 82 b9 26 f0 adrp x2, 0x1e3ee4000 0x1967b1048: 42 20 2f 91 add x2, x2, #0xbc8 ; "-" 0x1967b104c: e0 03 13 aa mov x0, x19 0x1967b1050: 5c 64 61 94 bl 0x19800a1c0 0x1967b1054: ; loc_1967b1054 0x1967b1054: df 0a 00 71 cmp w22, #0x2 0x1967b1058: c8 00 00 54 b.hi loc_1967b1070 ; ⤵ 0x18 0x1967b105c: 08 15 25 b0 adrp x8, 0x1e0a52000 0x1967b1060: 08 e1 19 91 add x8, x8, #0x678 ; "\xe8K\xeec" 0x1967b1064: 02 59 76 f8 ldr x2, [x8, w22, uxtw #0x3] 0x1967b1068: e0 03 13 aa mov x0, x19 0x1967b106c: 55 64 61 94 bl 0x19800a1c0 0x1967b1070: ; loc_1967b1070 0x1967b1070: e0 03 13 aa mov x0, x19 0x1967b1074: 03 b4 61 94 bl 0x19801e080 0x1967b1078: 1f 00 00 f1 cmp x0, #0 0x1967b107c: e0 03 93 9a csel x0, xzr, x19, eq 0x1967b1080: ; loc_1967b1080 0x1967b1080: fd 7b 44 a9 ldp fp, lr, [sp, #0x40] 0x1967b1084: f4 4f 43 a9 ldp x20, x19, [sp, #0x30] 0x1967b1088: f6 57 42 a9 ldp x22, x21, [sp, #0x20] 0x1967b108c: f8 5f 41 a9 ldp x24, x23, [sp, #0x10] 0x1967b1090: ff 43 01 91 add sp, sp, #0x50 0x1967b1094: ff 0f 5f d6 retab 0x1967b1098: ; loc_1967b1098 0x1967b1098: e0 03 13 aa mov x0, x19 0x1967b109c: f9 b3 61 94 bl 0x19801e080 0x1967b10a0: 1f 00 00 f1 cmp x0, #0 0x1967b10a4: e8 02 95 9a csel x8, x23, x21, eq 0x1967b10a8: 89 03 00 b0 adrp x9, 0x196822000 0x1967b10ac: 29 05 31 91 add x9, x9, #0xc41 ; "AudioAccessory1,1" 0x1967b10b0: e8 27 00 a9 stp x8, x9, [sp] 0x1967b10b4: 82 b9 26 f0 adrp x2, 0x1e3ee4000 0x1967b10b8: 42 a0 2e 91 add x2, x2, #0xba8 ; "%s%s" 0x1967b10bc: e0 03 13 aa mov x0, x19 0x1967b10c0: 38 64 61 94 bl 0x19800a1a0 0x1967b10c4: 34 fa 0f 36 tbz w20, #0x1, loc_1967b1008 ; ⤴ -0xbc 0x1967b10c8: ; loc_1967b10c8 0x1967b10c8: e0 03 13 aa mov x0, x19 0x1967b10cc: ed b3 61 94 bl 0x19801e080 0x1967b10d0: 1f 00 00 f1 cmp x0, #0 0x1967b10d4: e8 02 95 9a csel x8, x23, x21, eq 0x1967b10d8: 89 03 00 b0 adrp x9, 0x196822000 0x1967b10dc: 29 4d 31 91 add x9, x9, #0xc53 ; "AudioAccessory5,1" 0x1967b10e0: e8 27 00 a9 stp x8, x9, [sp] 0x1967b10e4: 82 b9 26 f0 adrp x2, 0x1e3ee4000 0x1967b10e8: 42 a0 2e 91 add x2, x2, #0xba8 ; "%s%s" 0x1967b10ec: e0 03 13 aa mov x0, x19 0x1967b10f0: 2c 64 61 94 bl 0x19800a1a0 0x1967b10f4: d4 f8 17 37 tbnz w20, #0x2, loc_1967b100c ; ⤴ -0xe8 0x1967b10f8: d0 ff ff 17 b loc_1967b1038 ; ⤴ -0xc0 0x1967b10fc: ; loc_1967b10fc 0x1967b10fc: 00 00 80 d2 mov x0, #0 0x1967b1100: e0 ff ff 17 b loc_1967b1080 ; ⤴ -0x80 ```` ## File: code-excerpts/gen2-receiver-model.txt ````text _sysInfo_getDeviceModel: 0x1b4114390: 7f 23 03 d5 pacibsp 0x1b4114394: f4 4f be a9 stp x20, x19, [sp, #-0x20]! 0x1b4114398: fd 7b 01 a9 stp fp, lr, [sp, #0x10] 0x1b411439c: fd 43 00 91 add fp, sp, #0x10 0x1b41143a0: f3 03 00 aa mov x19, x0 0x1b41143a4: 1f 00 00 39 strb wzr, [x0] 0x1b41143a8: 21 80 80 52 mov w1, #0x401 0x1b41143ac: 9d 91 ff 94 bl _GetDeviceModelString_stub 0x1b41143b0: 68 02 40 39 ldrb w8, [x19] 0x1b41143b4: 88 01 00 35 cbnz w8, loc_1b41143e4 ; ⤵ 0x30 0x1b41143b8: 26 8b ff 94 bl _APSIsAPMSpeaker_stub 0x1b41143bc: 00 01 00 34 cbz w0, loc_1b41143dc ; ⤵ 0x20 0x1b41143c0: 28 06 80 52 mov w8, #0x31 0x1b41143c4: 68 22 00 79 strh w8, [x19, #0x10] 0x1b41143c8: a8 07 00 d0 adrp x8, 0x1b420a000 0x1b41143cc: 08 7d 0c 91 add x8, x8, #0x31f ; "AudioAccessory1,1" 0x1b41143d0: ; loc_1b41143d0 0x1b41143d0: 00 01 c0 3d ldr q0, [x8] 0x1b41143d4: 60 02 80 3d str q0, [x19] 0x1b41143d8: 03 00 00 14 b loc_1b41143e4 ; ⤵ 0xc 0x1b41143dc: ; loc_1b41143dc 0x1b41143dc: 68 02 40 39 ldrb w8, [x19] 0x1b41143e0: 88 00 00 34 cbz w8, loc_1b41143f0 ; ⤵ 0x10 0x1b41143e4: ; loc_1b41143e4 0x1b41143e4: fd 7b 41 a9 ldp fp, lr, [sp, #0x10] 0x1b41143e8: f4 4f c2 a8 ldp x20, x19, [sp], #0x20 0x1b41143ec: ff 0f 5f d6 retab 0x1b41143f0: ; loc_1b41143f0 0x1b41143f0: 28 06 80 52 mov w8, #0x31 0x1b41143f4: 68 22 00 79 strh w8, [x19, #0x10] 0x1b41143f8: a8 07 00 d0 adrp x8, 0x1b420a000 0x1b41143fc: 08 c5 0c 91 add x8, x8, #0x331 ; "AirPlayGeneric1,1" 0x1b4114400: f4 ff ff 17 b loc_1b41143d0 ; ⤴ -0x30 ```` ## File: code-excerpts/gen2-rtapat-capability.txt ````text _APSGetSupportsRTAPATFromClusterSummary: 0x1967b0670: 7f 23 03 d5 pacibsp 0x1967b0674: ff c3 01 d1 sub sp, sp, #0x70 0x1967b0678: f4 4f 05 a9 stp x20, x19, [sp, #0x50] 0x1967b067c: fd 7b 06 a9 stp fp, lr, [sp, #0x60] 0x1967b0680: fd 83 01 91 add fp, sp, #0x60 0x1967b0684: f3 03 00 aa mov x19, x0 0x1967b0688: e8 c3 00 91 add x8, sp, #0x30 0x1967b068c: ff 23 03 a9 stp xzr, x8, [sp, #0x30] 0x1967b0690: a8 02 00 90 adrp x8, 0x196804000 0x1967b0694: 00 59 44 fd ldr d0, [x8, #0x8b0] 0x1967b0698: e0 23 00 fd str d0, [sp, #0x40] 0x1967b069c: ff 23 01 39 strb wzr, [sp, #0x48] 0x1967b06a0: 8c 15 67 94 bl _FigCFDictionaryGetCount_stub 0x1967b06a4: 40 03 00 b4 cbz x0, loc_1967b070c ; ⤵ 0x68 0x1967b06a8: e8 1f 40 f9 ldr x8, [sp, #0x38] 0x1967b06ac: 29 00 80 52 mov w9, #0x1 0x1967b06b0: 09 61 00 39 strb w9, [x8, #0x18] 0x1967b06b4: e8 23 00 91 add x8, sp, #0x8 0x1967b06b8: 90 c8 24 d0 adrp x16, 0x1e00c2000 0x1967b06bc: 10 a6 44 f9 ldr x16, [x16, #0x948] ; _ptr.__NSStackBlock__ 0x1967b06c0: f1 03 08 aa mov x17, x8 0x1967b06c4: 31 5c ed f2 movk x17, #0x6ae1, lsl #0x30 0x1967b06c8: 30 0a c1 da pacda x16, x17 0x1967b06cc: f0 07 00 f9 str x16, [sp, #0x8] 0x1967b06d0: a9 02 00 90 adrp x9, 0x196804000 0x1967b06d4: 20 35 44 fd ldr d0, [x9, #0x868] 0x1967b06d8: e0 0b 00 fd str d0, [sp, #0x10] 0x1967b06dc: 08 41 00 91 add x8, x8, #0x10 0x1967b06e0: 09 15 25 b0 adrp x9, 0x1e0a51000 0x1967b06e4: 29 c1 08 91 add x9, x9, #0x230 ; data_1e0a51230 (AirPlaySupport/__DATA_CONST.__const) 0x1967b06e8: 10 00 00 90 adrp x16, 0x1967b0000 0x1967b06ec: 10 32 1d 91 add x16, x16, #0x74c ; ___APSGetSupportsRTAPATFromClusterSummary_block_invoke 0x1967b06f0: 10 01 c1 da pacia x16, x8 0x1967b06f4: f0 a7 01 a9 stp x16, x9, [sp, #0x18] 0x1967b06f8: e8 c3 00 91 add x8, sp, #0x30 0x1967b06fc: e8 17 00 f9 str x8, [sp, #0x28] 0x1967b0700: e1 23 00 91 add x1, sp, #0x8 0x1967b0704: e0 03 13 aa mov x0, x19 0x1967b0708: 62 12 67 94 bl _CFDictionaryApplyBlock_stub 0x1967b070c: ; loc_1967b070c 0x1967b070c: e8 1f 40 f9 ldr x8, [sp, #0x38] 0x1967b0710: 13 61 40 39 ldrb w19, [x8, #0x18] 0x1967b0714: e0 c3 00 91 add x0, sp, #0x30 0x1967b0718: 01 01 80 52 mov w1, #0x8 0x1967b071c: f1 ae 66 94 bl __Block_object_dispose_stub 0x1967b0720: e0 03 13 aa mov x0, x19 0x1967b0724: fd 7b 46 a9 ldp fp, lr, [sp, #0x60] 0x1967b0728: f4 4f 45 a9 ldp x20, x19, [sp, #0x50] 0x1967b072c: ff c3 01 91 add sp, sp, #0x70 0x1967b0730: ff 0f 5f d6 retab 0x1967b0734: f3 03 00 aa mov x19, x0 0x1967b0738: e0 c3 00 91 add x0, sp, #0x30 0x1967b073c: 01 01 80 52 mov w1, #0x8 0x1967b0740: e8 ae 66 94 bl __Block_object_dispose_stub 0x1967b0744: e0 03 13 aa mov x0, x19 0x1967b0748: fe ae 66 94 bl __Unwind_Resume_stub ```` ## File: code-excerpts/gen2-rtapat-member.txt ````text ___APSGetSupportsRTAPATFromClusterSummary_block_invoke: 0x1967b074c: 7f 23 03 d5 pacibsp 0x1967b0750: f4 4f be a9 stp x20, x19, [sp, #-0x20]! 0x1967b0754: fd 7b 01 a9 stp fp, lr, [sp, #0x10] 0x1967b0758: fd 43 00 91 add fp, sp, #0x10 0x1967b075c: f3 03 00 aa mov x19, x0 0x1967b0760: a1 b9 26 90 adrp x1, 0x1e3ee4000 0x1967b0764: 21 a0 2b 91 add x1, x1, #0xae8 ; "RTAPATAudioFeatureSupported" 0x1967b0768: e0 03 02 aa mov x0, x2 0x1967b076c: 02 00 80 d2 mov x2, #0 0x1967b0770: 78 f3 66 94 bl _CFDictionaryGetInt64_stub 0x1967b0774: 68 12 40 f9 ldr x8, [x19, #0x20] 0x1967b0778: 08 05 40 f9 ldr x8, [x8, #0x8] 0x1967b077c: 09 61 40 39 ldrb w9, [x8, #0x18] 0x1967b0780: 29 01 00 12 and w9, w9, #0x1 0x1967b0784: 1f 00 00 f1 cmp x0, #0 0x1967b0788: e9 03 89 1a csel w9, wzr, w9, eq 0x1967b078c: 09 61 00 39 strb w9, [x8, #0x18] 0x1967b0790: fd 7b 41 a9 ldp fp, lr, [sp, #0x10] 0x1967b0794: f4 4f c2 a8 ldp x20, x19, [sp], #0x20 0x1967b0798: ff 0f 5f d6 retab ```` ## File: code-excerpts/gen2-surround-matrix.txt ````text -[SACSurroundCalibration buildDistanceMatrixFromOnsetOffsets:roles:]: 0x100031e0c: c0 03 5f d6 ret ```` ## File: gen1-ota-metadata-excerpt.json ````json { "source": "AssetData/Info.plist", "source_sha256": "d740c36e596da8eec24ca2fc39517a7ae4cebad1d5eef76a72252c224d78ac4a", "selected_original_fields": { "ProductType": "AudioAccessory1,1", "HardwareModel": "B238aAP", "ProductVersion": "27.2", "Build": "24K5103f", "TargetUpdate": "24K5103f" } } ```` ## File: gen1-role-index.json ````json { "b238a_speaker_lowlatency_lt_free": "stereoleft", "b238a_speaker_lowlatency_rt.propstrip": "stereoright", "b238a_speaker_multichannel_lt_free": "stereoleft", "b238a_speaker_lowlatencystereo_rt_calibration": "stereoright", "b238a_speaker_multichannel_music_lt_free": "stereoleft", "b238a_speaker_multichannel_music_lt.propstrip": "stereoleft", "b238a_speaker_general_rt_free": "stereoright", "b238a_speaker_lowlatencystereo_rt_book": "stereoright", "b238a_speaker_general_lt_book": "stereoleft", "b238a_speaker_general_solo_book": "solo", "b238a_speaker_general_solo_free": "solo", "b238a_speaker_lowlatency_lt.propstrip": "stereoleft", "b238a_speaker_multichannel_lt_book": "stereoleft", "b238a_speaker_lowlatencystereo_solo_wall": "solo", "b238a_speaker_multichannel_lt_wall": "stereoleft", "b238a_speaker_multichannel_rt_free": "stereoright", "b238a_speaker_lowlatency_solo.propstrip": "solo", "b238a_speaker_lowlatencystereo_solo_calibration": "solo", "b238a_speaker_lowlatencystereo_lt_wall": "stereoleft", "b238a_speaker_lowlatency_lt_wall": "stereoleft", "b238a_speaker_lowlatencystereo_solo_free": "solo", "b238a_speaker_lowlatency_rt_free": "stereoright", "b238a_speaker_multichannel_music_rt_calibration": "stereoright", "b238a_speaker_multichannel_lt_calibration": "stereoleft", "b238a_speaker_multichannel_rt_book": "stereoright", "b238a_speaker_lowlatencystereo_lt_free": "stereoleft", "b238a_speaker_general_lt_wall": "stereoleft", "b238a_speaker_multichannel_solo.propstrip": "solo", "b238a_speaker_multichannel_rt_wall": "stereoright", "b238a_speaker_multichannel_solo_wall": "solo", "b238a_speaker_general_lt_free": "stereoleft", "b238a_speaker_multichannel_solo_book": "solo", "b238a_speaker_lowlatency_lt_book": "stereoleft", "b238a_speaker_multichannel_music_lt_calibration": "stereoleft", "b238a_speaker_multichannel_lt.propstrip": "stereoleft", "b238a_speaker_lowlatency_rt_wall": "stereoright", "b238a_speaker_general_solo_calibration": "solo", "b238a_speaker_multichannel_rt.propstrip": "stereoright", "b238a_speaker_multichannel_music_rt_book": "stereoright", "b238a_speaker_general_rt_calibration": "stereoright", "b238a_speaker_lowlatency_lt_calibration": "stereoleft", "b238a_speaker_multichannel_music_solo_calibration": "solo", "b238a_speaker_multichannel_music_solo_wall": "solo", "b238a_speaker_multichannel_music_solo.propstrip": "solo", "b238a_speaker_lowlatency_rt_calibration": "stereoright", "b238a_speaker_multichannel_rt_calibration": "stereoright", "b238a_speaker_multichannel_solo_calibration": "solo", "b238a_speaker_lowlatencystereo_lt_book": "stereoleft", "b238a_speaker_multichannel_music_lt_book": "stereoleft", "b238a_speaker_lowlatencystereo_lt_calibration": "stereoleft", "b238a_speaker_multichannel_solo_free": "solo", "b238a_speaker_lowlatencystereo_rt_wall": "stereoright", "b238a_speaker_lowlatency_rt_book": "stereoright", "b238a_speaker_multichannel_music_rt.propstrip": "stereoright", "b238a_speaker_general_rt_book": "stereoright", "b238a_speaker_lowlatencystereo_rt_free": "stereoright", "b238a_speaker_lowlatency_solo_free": "solo", "b238a_speaker_general_solo_wall": "solo", "b238a_speaker_multichannel_music_rt_wall": "stereoright", "b238a_speaker_lowlatency_solo_book": "solo", "b238a_speaker_multichannel_music_lt_wall": "stereoleft", "b238a_speaker_lowlatency_solo_calibration": "solo", "b238a_speaker_general_lt_calibration": "stereoleft", "b238a_speaker_lowlatency_solo_wall": "solo", "b238a_speaker_lowlatencystereo_solo_book": "solo", "b238a_speaker_multichannel_music_rt_free": "stereoright", "b238a_speaker_multichannel_music_solo_book": "solo", "b238a_speaker_multichannel_music_solo_free": "solo", "b238a_speaker_general_rt_wall": "stereoright" } ```` ## File: gen1-spatial-markers.txt ````text 0x18bc9390e: "AUSpatialMixerV2" image=libAudioDSP.dylib 0x18bc87afa: "ingestImmersiveRendererData" image=libAudioDSP.dylib 0x18bc904dc: "InitializeSurroundFilters" image=libAudioDSP.dylib 0x18bc904f6: "UpdateSurroundFilters" image=libAudioDSP.dylib 0x194974e86: "lowLatencyAudioSurroundReceiver" image=AirPlaySupport ```` ## File: gen2-extraction-log-excerpt.txt ````text • Found 'SoundAutoConfigStrips.plist' in post.bom (most likely in payloadv2 files) • Extracting from 'payload.051' -> 3.8 kB extracted/24K5103f__AudioAccessory6,1/Library/Audio/Tunings/AID12001/VAD/SoundAutoConfigStrips.plist ```` ## File: gen2-ota-info-tool-output.txt ````text [OTA Info] ========== Version = 27.2 BuildVersion = 24K5103f OS Type = Beta FileSystem = 141-69238-037.dmg RestoreRamDisk = [arm64eSURamDisk.dmg] RestoreVersion = 24.11.103.5.6,0 Devices ------- HomePod (2nd generation) > AudioAccessory6,1_B620AP_24K5103f - TimeStamp: 27 Sep 2026 19:11:44 PDT - KernelCache: kernelcache.release.b620 - CPU: S6/S7/S8 (ARMv8.4-A), ID: t8301 - BootLoaders * iBEC.b620.RELEASE.im4p * iBoot.b620.RELEASE.im4p * iBSS.b620.RELEASE.im4p * LLB.b620.RELEASE.im4p * sep-firmware.b620.RELEASE.im4p ```` ## File: gen2-role-index.json ````json { "speaker_multichannel_solo.propstrip": "solo", "speaker_rt_calibration_off_mled": "stereoright", "speaker_stereo_surround_spatialize_off_rear": [ "quad_rearleft", "quad_rearright" ], "speaker_multichannel_movie_ltrt": [ "stereoleft", "stereoright" ], "speaker_multichannel_ltrt.propstrip": [ "stereoleft", "stereoright", "quad_frontleft", "quad_frontright", "quad_rearleft", "quad_rearright" ], "speaker_sirioutput_surround_rear": [ "quad_rearleft", "quad_rearright" ], "speaker_stereo_lowlatency_free": [ "solo", "stereoleft", "stereoright" ], "speaker_multichannel_movie_solo": "solo", "volume_suv_rear_stereo": [ "quad_rearleft", "quad_rearright" ], "speaker_stereo_lowlatency_wall": [ "solo", "stereoleft", "stereoright" ], "speaker_stereo_calibration_on": [], "speaker_stereo_surround_spatialize_on": [ "quad_frontleft", "quad_frontright", "quad_rearleft", "quad_rearright" ], "speaker_calibration_on_mled": [ "solo", "stereoleft", "stereoright" ], "speaker_stereo_solo_free": "solo", "speaker_multichannel_calibration_on": [], "speaker_stereo_ltrt_free": [ "stereoleft", "stereoright" ], "speaker_multichannel_music_surround": [ "quad_frontleft", "quad_frontright", "quad_rearleft", "quad_rearright" ], "speaker_surround_rear": [ "quad_rearleft", "quad_rearright" ], "speaker_stereo_party_mode_on": [ "stereoleft", "stereoright" ], "speaker_sirioutput_party_mode_on": [ "stereoleft", "stereoright" ], "speaker_multichannel_party_mode_on": [ "stereoleft", "stereoright" ], "speaker_multichannel_movie_frontright": "quad_frontright", "speaker_stereo_solo_wall": "solo", "speaker_multichannel_movie_surround": [ "quad_frontleft", "quad_frontright", "quad_rearleft", "quad_rearright" ], "speaker_solo_calibration_off_mled": "solo", "speaker_stereo_ltrt_wall": [ "stereoleft", "stereoright" ], "speaker_multichannel_lowlatency_surround": [ "quad_frontleft", "quad_frontright", "quad_rearleft", "quad_rearright" ], "speaker_multichannel_movie_frontleft": "quad_frontleft", "speaker_stereo_surround_spatialize_off_front": [ "quad_frontleft", "quad_frontright" ], "volume_suv_front": [ "quad_frontleft", "quad_frontright" ], "volume_suv_rear_multichannel": [ "quad_rearleft", "quad_rearright" ], "speaker_local_systemsound_surround_rear": [ "quad_rearleft", "quad_rearright" ], "speaker_multichannel_music_ltrt": [ "stereoleft", "stereoright" ], "speaker_multichannel_lowlatency_solo": "solo", "speaker_multichannel_lowlatency_ltrt": [ "stereoleft", "stereoright" ], "speaker_multichannel_music_solo": "solo", "speaker_lt_calibration_off_mled": "stereoleft", "volume_forklift_front": [ "quad_frontleft", "quad_frontright" ], "speaker_multichannel_movie_rear": [ "quad_rearleft", "quad_rearright" ] } ```` ## File: gen2-spatial-markers.txt ````text 0x18d043dbe: "AUSpatialMixerV2" image=libAudioDSP.dylib 0x18d037faa: "ingestImmersiveRendererData" image=libAudioDSP.dylib 0x18d04098c: "InitializeSurroundFilters" image=libAudioDSP.dylib 0x18d0409a6: "UpdateSurroundFilters" image=libAudioDSP.dylib 0x1968129be: "lowLatencyAudioSurroundReceiver" image=AirPlaySupport ```` ## File: verify.py ````python """Verify the bundle, optionally against independently extracted source plists.""" import argparse from collections import Counter from hashlib import sha256 import json from pathlib import Path import plistlib ROOT = Path(__file__).resolve().parent def check(condition, message): if not condition: raise SystemExit("FAIL: " + message) def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--gen1-plist", type=Path) parser.add_argument("--gen2-plist", type=Path) args = parser.parse_args() manifest = json.loads((ROOT / "SHA256SUMS.json").read_text()) actual = {str(p.relative_to(ROOT)) for p in ROOT.rglob("*") if p.is_file() and p.name != "SHA256SUMS.json"} check(actual == set(manifest), "unexpected or missing files in bundle") for name, expected in manifest.items(): check(sha256((ROOT / name).read_bytes()).hexdigest() == expected, "hash mismatch: " + name) report = json.loads((ROOT / "comparison-excerpt.json").read_text()) quad = json.loads((ROOT / "gen2-quad-configurations.json").read_text()) check(len(quad) == 17, "quad entry count") for gen in ["gen1", "gen2"]: index = json.loads((ROOT / f"{gen}-role-index.json").read_text()) roles = Counter() for value in index.values(): roles.update(value if isinstance(value, list) else [value]) device = report["devices"][gen] check(dict(roles) == device["role_occurrences"], gen + " role counts") check(len(index) == device["configuration_entries"], gen + " entry count") quad_names = {k for k, v in index.items() if any(r.startswith("quad_") for r in (v if isinstance(v, list) else [v]))} check(len(quad_names) == device["quad_entries"], gen + " quad role count") if gen == "gen2": check(quad_names == set(quad), "quad entry names") check(all(v["role"] == index[k] for k, v in quad.items()), "quad role values") source = getattr(args, gen + "_plist") if source: data = source.read_bytes() check(sha256(data).hexdigest() == device["configuration_sha256"], gen + " source plist SHA256") original = plistlib.loads(data) check({k: v.get("role", []) for k, v in original.items()} == index, gen + " original role fields") if gen == "gen2": check({k: v for k, v in original.items() if "quad_" in json.dumps(v)} == quad, "exact original quad configurations") print("OK: bundle hashes, 69/39 entry counts, 0/17 quad entries and role fields.") if args.gen1_plist and args.gen2_plist: print("OK: both source plist SHA256 values, all role fields and all 17 complete quad entries independently matched.") else: print("Bundle consistency only. Supply BOTH --gen1-plist and --gen2-plist to check against original firmware resources.") if __name__ == "__main__": main() ````