Mac changes (Changes needed to enable MacOS for distribution)#405
Mac changes (Changes needed to enable MacOS for distribution)#405shubhammalhotra28 merged 2 commits intomainfrom
Conversation
|
@coderabbitai please do a review |
There was a problem hiding this comment.
Important
Looks good to me! 👍
Reviewed everything up to 30ec6d1 in 11 seconds. Click for details.
- Reviewed
200lines of code in3files - Skipped
0files when reviewing. - Skipped posting
0draft comments. View those below. - Modify your settings and rules to customize what types of comments Ellipsis leaves. And don't forget to react with 👍 or 👎 to teach Ellipsis.
Workflow ID: wflow_t2MMcq5yWWurkn55
You can customize by changing your verbosity settings, reacting with 👍 or 👎, replying to comments, or adding code review rules.
|
@greptile please do a review |
📝 WalkthroughWalkthroughThe PR switches the Swift package from remote-binary usage to local XCFrameworks by default, updates iOS project build architecture and linking configurations, and improves macOS audio capture reliability through new error handling and device validation logic. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
🧠 Learnings used✅ Actions performedReview triggered.
|
| // | ||
| // ============================================================================= | ||
| let useLocalBinaries = false // Toggle: true for local dev, false for release | ||
| let useLocalBinaries = true // Toggle: true for local dev, false for release |
There was a problem hiding this comment.
Setting useLocalBinaries = true breaks SPM distribution for external consumers. This was intentionally set to false in commit 4d34930. If this change is for local development only, it should not be committed to the main branch.
| let useLocalBinaries = true // Toggle: true for local dev, false for release | |
| let useLocalBinaries = false // Toggle: true for local dev, false for release |
Prompt To Fix With AI
This is a comment left during a code review.
Path: Package.swift
Line: 40
Comment:
Setting `useLocalBinaries = true` breaks SPM distribution for external consumers. This was intentionally set to `false` in commit 4d349301. If this change is for local development only, it should not be committed to the main branch.
```suggestion
let useLocalBinaries = false // Toggle: true for local dev, false for release
```
How can I resolve this? If you propose a fix, please make it concise.| .product(name: "Sentry", package: "sentry-cocoa"), | ||
| .product(name: "StableDiffusion", package: "ml-stable-diffusion"), | ||
| "CRACommons", | ||
| "RACommonsBinary", |
There was a problem hiding this comment.
RACommonsBinary is already added as a dependency to the CRACommons target (line 94). Adding it again to the RunAnywhere target creates a duplicate dependency that may cause linking issues.
| "RACommonsBinary", | |
| "CRACommons", |
Prompt To Fix With AI
This is a comment left during a code review.
Path: Package.swift
Line: 134
Comment:
`RACommonsBinary` is already added as a dependency to the `CRACommons` target (line 94). Adding it again to the `RunAnywhere` target creates a duplicate dependency that may cause linking issues.
```suggestion
"CRACommons",
```
How can I resolve this? If you propose a fix, please make it concise.| "RABackendONNXBinary", | ||
| "ONNXRuntimeBinary", |
There was a problem hiding this comment.
RABackendONNXBinary and ONNXRuntimeBinary are already added as dependencies to the ONNXBackend target (line 114). Adding them again to the ONNXRuntime target creates duplicate dependencies.
| "RABackendONNXBinary", | |
| "ONNXRuntimeBinary", | |
| "ONNXBackend", |
Prompt To Fix With AI
This is a comment left during a code review.
Path: Package.swift
Line: 154-155
Comment:
`RABackendONNXBinary` and `ONNXRuntimeBinary` are already added as dependencies to the `ONNXBackend` target (line 114). Adding them again to the `ONNXRuntime` target creates duplicate dependencies.
```suggestion
"ONNXBackend",
```
How can I resolve this? If you propose a fix, please make it concise.| dependencies: [ | ||
| "RunAnywhere", | ||
| "LlamaCPPBackend", | ||
| "RABackendLlamaCPPBinary", |
There was a problem hiding this comment.
RABackendLlamaCPPBinary is already added as a dependency to the LlamaCPPBackend target (line 104). Adding it again to the LlamaCPPRuntime target creates a duplicate dependency.
| "RABackendLlamaCPPBinary", | |
| "LlamaCPPBackend", |
Prompt To Fix With AI
This is a comment left during a code review.
Path: Package.swift
Line: 176
Comment:
`RABackendLlamaCPPBinary` is already added as a dependency to the `LlamaCPPBackend` target (line 104). Adding it again to the `LlamaCPPRuntime` target creates a duplicate dependency.
```suggestion
"LlamaCPPBackend",
```
How can I resolve this? If you propose a fix, please make it concise.| isa = XCBuildConfiguration; | ||
| buildSettings = { | ||
| ALWAYS_SEARCH_USER_PATHS = NO; | ||
| ARCHS = arm64; |
There was a problem hiding this comment.
Restricting to arm64 only excludes Intel Macs - consider using ARCHS = "$(ARCHS_STANDARD)" to support both Apple Silicon and Intel Macs unless there's a specific reason to exclude Intel
Prompt To Fix With AI
This is a comment left during a code review.
Path: examples/ios/RunAnywhereAI/RunAnywhereAI.xcodeproj/project.pbxproj
Line: 415
Comment:
Restricting to `arm64` only excludes Intel Macs - consider using `ARCHS = "$(ARCHS_STANDARD)"` to support both Apple Silicon and Intel Macs unless there's a specific reason to exclude Intel
How can I resolve this? If you propose a fix, please make it concise.There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
Package.swift (1)
130-144:⚠️ Potential issue | 🟡 Minor
RACommonsBinary,ONNXRuntimeBinary, andRABackendLlamaCPPBinaryare transitive dependencies—direct listings are redundant.
CRACommonsdeclares["RACommonsBinary"]as its dependency;RunAnywheredoes not need to list it again.ONNXBackenddeclares["RABackendONNXBinary", "ONNXRuntimeBinary"];ONNXRuntimeshould not duplicate these.LlamaCPPBackenddeclares["RABackendLlamaCPPBinary"];LlamaCPPRuntimeshould not duplicate it.SPM properly propagates binary target linkage through intermediate targets. These direct references add noise and create unnecessary coupling. Remove them unless there is a specific workaround reason that should be documented in a code comment.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@Package.swift` around lines 130 - 144, The Package.swift currently lists transitive binary targets directly—remove the redundant direct references to RACommonsBinary from the RunAnywhere target, ONNXRuntimeBinary (and RABackendONNXBinary if duplicated) from the ONNXRuntime target, and RABackendLlamaCPPBinary from the LlamaCPPRuntime target so those binaries are only declared by their intermediate targets (CRACommons, ONNXBackend, LlamaCPPBackend) and SPM can propagate linkage; update the targets' dependency arrays (e.g., the RunAnywhere target, ONNXRuntime target, and LlamaCPPRuntime target) to drop those binary names and, if you believe a workaround is required, leave a short in-code comment explaining why the transitive declaration must be bypassed.
🧹 Nitpick comments (2)
sdk/runanywhere-swift/Sources/RunAnywhere/Features/STT/Services/AudioCaptureManager.swift (2)
188-192:converter.reset()is applied unconditionally — comment could clarify this is intentional.The reset is called on all platforms, but the comment only mentions macOS. This is actually a good approach (safe no-op elsewhere, prevents future surprises), but a one-word tweak to the comment would reduce confusion for future readers.
✏️ Suggested comment tweak
- // The input block returns .endOfStream after providing one buffer. - // On macOS the converter stays in that "finished" state across calls, - // producing empty output for every subsequent buffer. Resetting before - // each conversion clears the state so the next buffer is processed. + // The input block returns .endOfStream after providing one buffer. + // On macOS the converter stays in that "finished" state across calls, + // producing empty output for every subsequent buffer. Resetting before + // each conversion clears the state so the next buffer is processed + // correctly. This is a no-op on platforms unaffected by the issue.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@sdk/runanywhere-swift/Sources/RunAnywhere/Features/STT/Services/AudioCaptureManager.swift` around lines 188 - 192, Update the comment above converter.reset() in AudioCaptureManager.swift to state that the reset is intentionally applied on all platforms (it's required on macOS to clear the converter's finished state and is a safe no-op on others), so future readers understand this is deliberate; reference the converter.reset() call and the surrounding conversion logic in the AudioCaptureManager class when editing the comment.
32-32: Consider adopting@MainActorisolation for Swift 6 strict concurrency.
AudioCaptureManagerpublishes@Publishedproperties and mutates them viaDispatchQueue.main.async. Under Swift 6 strict concurrency checking, this class would benefit from@MainActorisolation, which would make the main-actor requirement compile-time enforced rather than convention-based. This isn't urgent for this PR but worth noting given the guideline. As per coding guidelines: "Use the latest Swift 6 APIs always".🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@sdk/runanywhere-swift/Sources/RunAnywhere/Features/STT/Services/AudioCaptureManager.swift` at line 32, AudioCaptureManager currently updates `@Published` properties via DispatchQueue.main.async which is fragile under Swift 6 strict concurrency; annotate the class with `@MainActor` to give it main-actor isolation so property publishes and mutations are compile-time enforced, then remove or simplify explicit DispatchQueue.main.async calls inside methods that mutate the `@Published` properties (or mark any intentionally off-main methods as nonisolated if needed), referencing the AudioCaptureManager class and its `@Published` properties to locate where to apply the annotation and adjust async dispatches.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@examples/ios/RunAnywhereAI/RunAnywhereAI.xcodeproj/project.pbxproj`:
- Line 544: The Release build config sets OTHER_LDFLAGS = "-all_load" which both
omits $(inherited) and is missing from the Debug config; update the Release
entry for OTHER_LDFLAGS to include inherited flags (e.g. OTHER_LDFLAGS =
"$(inherited) -all_load";) and add the same OTHER_LDFLAGS = "$(inherited)
-all_load"; line to the Debug target config (the config block identified by
5480A2132E2F250400337F2F) so Debug/Release are consistent and
project-level/xcconfig flags are preserved.
In `@Package.swift`:
- Line 40: The package currently sets useLocalBinaries = true which causes
binaryTargets() to emit path-based .binaryTarget entries that break external SPM
consumers; change useLocalBinaries to false and update binaryTargets() to return
the released .binaryTarget entries (URL + checksum) used for published releases
instead of local path-based targets (refer to the useLocalBinaries flag and
binaryTargets() function in Package.swift), and ensure this flag is false (and
the remote .binaryTarget values present) before creating a release tag.
---
Outside diff comments:
In `@Package.swift`:
- Around line 130-144: The Package.swift currently lists transitive binary
targets directly—remove the redundant direct references to RACommonsBinary from
the RunAnywhere target, ONNXRuntimeBinary (and RABackendONNXBinary if
duplicated) from the ONNXRuntime target, and RABackendLlamaCPPBinary from the
LlamaCPPRuntime target so those binaries are only declared by their intermediate
targets (CRACommons, ONNXBackend, LlamaCPPBackend) and SPM can propagate
linkage; update the targets' dependency arrays (e.g., the RunAnywhere target,
ONNXRuntime target, and LlamaCPPRuntime target) to drop those binary names and,
if you believe a workaround is required, leave a short in-code comment
explaining why the transitive declaration must be bypassed.
---
Nitpick comments:
In
`@sdk/runanywhere-swift/Sources/RunAnywhere/Features/STT/Services/AudioCaptureManager.swift`:
- Around line 188-192: Update the comment above converter.reset() in
AudioCaptureManager.swift to state that the reset is intentionally applied on
all platforms (it's required on macOS to clear the converter's finished state
and is a safe no-op on others), so future readers understand this is deliberate;
reference the converter.reset() call and the surrounding conversion logic in the
AudioCaptureManager class when editing the comment.
- Line 32: AudioCaptureManager currently updates `@Published` properties via
DispatchQueue.main.async which is fragile under Swift 6 strict concurrency;
annotate the class with `@MainActor` to give it main-actor isolation so property
publishes and mutations are compile-time enforced, then remove or simplify
explicit DispatchQueue.main.async calls inside methods that mutate the
`@Published` properties (or mark any intentionally off-main methods as nonisolated
if needed), referencing the AudioCaptureManager class and its `@Published`
properties to locate where to apply the annotation and adjust async dispatches.
| "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; | ||
| MACOSX_DEPLOYMENT_TARGET = 15.5; | ||
| MARKETING_VERSION = 0.17.2; | ||
| OTHER_LDFLAGS = "-all_load"; |
There was a problem hiding this comment.
-all_load is Release-only and is missing $(inherited) — both can cause hidden issues.
Two concerns:
-
Debug/Release asymmetry:
OTHER_LDFLAGS = "-all_load"is present only in the Release target config but absent from the Debug config (line 469 block). Duplicate-symbol linker errors caused by-all_loadwill surface only in Release, making them much harder to reproduce and debug. Likewise, code paths reachable only because-all_loadforces extra object files into the binary will silently be absent in Debug builds. -
Missing
$(inherited): The bare string value overwrites anyOTHER_LDFLAGSinjected by xcconfig files or the project level. Adding$(inherited)preserves those flags.
🔧 Suggested fix
- OTHER_LDFLAGS = "-all_load";
+ OTHER_LDFLAGS = (
+ "-all_load",
+ "$(inherited)",
+ );And add the matching entry to the Debug target config (5480A2132E2F250400337F2F, around line 480):
+ OTHER_LDFLAGS = (
+ "-all_load",
+ "$(inherited)",
+ );🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@examples/ios/RunAnywhereAI/RunAnywhereAI.xcodeproj/project.pbxproj` at line
544, The Release build config sets OTHER_LDFLAGS = "-all_load" which both omits
$(inherited) and is missing from the Debug config; update the Release entry for
OTHER_LDFLAGS to include inherited flags (e.g. OTHER_LDFLAGS = "$(inherited)
-all_load";) and add the same OTHER_LDFLAGS = "$(inherited) -all_load"; line to
the Debug target config (the config block identified by
5480A2132E2F250400337F2F) so Debug/Release are consistent and
project-level/xcconfig flags are preserved.
| // | ||
| // ============================================================================= | ||
| let useLocalBinaries = false // Toggle: true for local dev, false for release | ||
| let useLocalBinaries = true // Toggle: true for local dev, false for release |
There was a problem hiding this comment.
useLocalBinaries = true will break all external SPM consumers when this is merged.
The in-file comment explicitly documents the intent:
true→ local development only (requiressdk/runanywhere-swift/Binaries/to be present locally)false→ external users via SPM; no setup needed
When SPM resolves a package dependency, it clones the whole repository, performs a checkout on the specified ref, and searches for the binary artifact there. With useLocalBinaries = true, the binaryTargets() function returns path-based targets like:
.binaryTarget(name: "RACommonsBinary",
path: "sdk/runanywhere-swift/Binaries/RACommons.xcframework")Those Binaries/ directories are generated by the local setup script and are not committed to the repository. Any consumer who adds the package via:
.package(url: "https://github.com/RunanywhereAI/runanywhere-sdks", from: "0.17.0")…will immediately fail package resolution with "target path not found" on the missing XCFramework directories.
This flag must be reset to false before the release tag is cut.
🔧 Fix
-let useLocalBinaries = true // Toggle: true for local dev, false for release
+let useLocalBinaries = false // Toggle: true for local dev, false for release🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@Package.swift` at line 40, The package currently sets useLocalBinaries = true
which causes binaryTargets() to emit path-based .binaryTarget entries that break
external SPM consumers; change useLocalBinaries to false and update
binaryTargets() to return the released .binaryTarget entries (URL + checksum)
used for published releases instead of local path-based targets (refer to the
useLocalBinaries flag and binaryTargets() function in Package.swift), and ensure
this flag is false (and the remote .binaryTarget values present) before creating
a release tag.
📝 WalkthroughWalkthroughThis PR switches the Swift package to use local XCFrameworks for development by toggling the Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~22 minutes Possibly related PRs
Suggested labels
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 3❌ Failed checks (3 inconclusive)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
examples/ios/RunAnywhereAI/RunAnywhereAI.xcodeproj/project.pbxproj (1)
411-415:⚠️ Potential issue | 🟡 Minor
ARCHS = arm64is set at the project level only for Release, not Debug.The project-level Release config (line 415) adds
ARCHS = arm64, but the project-level Debug config (lines 348–410) does not. While the target-level configs both specifyARCHS = arm64(lines 469, 514), the project-level asymmetry is unexpected. If any target doesn't overrideARCHS, it will behave differently between Debug and Release.For consistency, add
ARCHS = arm64to the project-level Debug config as well.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@examples/ios/RunAnywhereAI/RunAnywhereAI.xcodeproj/project.pbxproj` around lines 411 - 415, Project-level Debug XCBuildConfiguration is missing the ARCHS = arm64 setting that the Release configuration has; update the project-level Debug buildSettings (the XCBuildConfiguration block for Debug) to include ARCHS = arm64 so Debug and Release are symmetric with the project-level buildSettings and match the target-level ARCHS overrides (the target XCBuildConfiguration blocks that currently specify ARCHS = arm64).
🧹 Nitpick comments (1)
sdk/runanywhere-swift/Sources/RunAnywhere/Features/STT/Services/AudioCaptureManager.swift (1)
80-80: Consider@Sendableannotation for the closure parameter.
onAudioDatais invoked from the audio engine's tap callback (background thread) and dispatched to main. Under Swift 6 strict concurrency checking, an@escapingclosure crossing isolation boundaries without@Sendablewill produce warnings/errors. Since the coding guideline requires the latest Swift 6 APIs, marking this@Sendablewould future-proof the API.- public func startRecording(onAudioData: `@escaping` (Data) -> Void) throws { + public func startRecording(onAudioData: `@escaping` `@Sendable` (Data) -> Void) throws {🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@sdk/runanywhere-swift/Sources/RunAnywhere/Features/STT/Services/AudioCaptureManager.swift` at line 80, The startRecording API accepts an escaping closure that will be invoked from an audio engine callback on background threads; update the declaration of public func startRecording(onAudioData: `@escaping` (Data) -> Void) throws to require a `@Sendable` closure (i.e., onAudioData: `@Sendable` `@escaping` (Data) -> Void) so it is safe to cross concurrency boundaries under Swift 6; update any internal call sites or stored properties that capture the closure to preserve the `@Sendable` signature and adjust call-site captures if needed.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Outside diff comments:
In `@examples/ios/RunAnywhereAI/RunAnywhereAI.xcodeproj/project.pbxproj`:
- Around line 411-415: Project-level Debug XCBuildConfiguration is missing the
ARCHS = arm64 setting that the Release configuration has; update the
project-level Debug buildSettings (the XCBuildConfiguration block for Debug) to
include ARCHS = arm64 so Debug and Release are symmetric with the project-level
buildSettings and match the target-level ARCHS overrides (the target
XCBuildConfiguration blocks that currently specify ARCHS = arm64).
---
Duplicate comments:
In `@examples/ios/RunAnywhereAI/RunAnywhereAI.xcodeproj/project.pbxproj`:
- Line 544: The Release build config currently sets OTHER_LDFLAGS = "-all_load"
which both overwrites inherited flags and introduces Release-only linker
behavior; update the Release configuration to prepend $(inherited) and include
-all_load as needed (e.g., OTHER_LDFLAGS = $(inherited) "-all_load") and ensure
Debug does NOT include "-all_load" (or explicitly uses $(inherited) without
-all_load) so inherited xcconfig/project flags are preserved and -all_load
remains Release-only; locate the OTHER_LDFLAGS entry in the project.pbxproj for
the Release configuration to apply this change.
In `@Package.swift`:
- Line 40: The package-level toggle useLocalBinaries in Package.swift is
currently true and must be set to false before merging because local Binaries/
paths break SPM resolution for external consumers; update the literal assignment
of useLocalBinaries to false in Package.swift (and verify there are no other
occurrences of this flag left true) so the package references the
remote/packaged binaries instead of local paths.
---
Nitpick comments:
In
`@sdk/runanywhere-swift/Sources/RunAnywhere/Features/STT/Services/AudioCaptureManager.swift`:
- Line 80: The startRecording API accepts an escaping closure that will be
invoked from an audio engine callback on background threads; update the
declaration of public func startRecording(onAudioData: `@escaping` (Data) -> Void)
throws to require a `@Sendable` closure (i.e., onAudioData: `@Sendable` `@escaping`
(Data) -> Void) so it is safe to cross concurrency boundaries under Swift 6;
update any internal call sites or stored properties that capture the closure to
preserve the `@Sendable` signature and adjust call-site captures if needed.
|
Looks good to merge. Also, its preferred if someone wants to run local for testing purpose, they'd be using build scripts. |
|
@vaibhav936 FYI |
Mac changes (Changes needed to enable MacOS for distribution)
Changes needed to enable MacOS for distribution
Important
Enable MacOS support for distribution by updating package dependencies, Xcode project settings, and handling audio input in
AudioCaptureManager.swift.useLocalBinariestotrueinPackage.swiftfor local development.RACommonsBinary,RABackendONNXBinary,ONNXRuntimeBinary, andRABackendLlamaCPPBinaryinPackage.swift.ARCHStoarm64inproject.pbxprojfor Debug and Release configurations.OTHER_LDFLAGS = "-all_load"andINFOPLIST_KEY_LSApplicationCategoryTypeinproject.pbxproj.AudioCaptureManager.swift, handle MacOS audio input by preparingAVAudioEngineand checkinginputFormatvalidity.AudioCaptureError.noInputDeviceto handle cases with no valid audio input device.This description was created by
for 30ec6d1. You can customize this summary. It will automatically update as commits are pushed.
Summary by CodeRabbit
New Features
Bug Fixes
Chores
Greptile Summary
This PR adds MacOS support to the Swift SDK, including proper audio input handling and Xcode project configuration. However, it introduces critical issues in
Package.swiftthat will break SPM distribution for external consumers.Major changes:
AudioCaptureManager.swiftwith properAVAudioEngine.prepare()call and input device validationarm64architecture, app category type, and-all_loadlinker flaguseLocalBinaries = trueinPackage.swift, which breaks SPM distribution (was intentionally set tofalsein commit 4d34930)RunAnywhere,ONNXRuntime,LlamaCPPRuntime) that are already dependencies of their respective header targetsThe
AudioCaptureManager.swiftchanges are excellent - they properly handle MacOS's lack ofAVAudioSessionby callingengine.prepare()before reading input format, and add proper error handling for missing audio input devices. Theconverter.reset()call is also a good fix for MacOS-specific converter state issues.The Xcode project changes are appropriate for MacOS distribution, though restricting to
arm64only will exclude Intel Macs.The
Package.swiftchanges must be reverted before merging - theuseLocalBinariestoggle should remainfalsefor distribution, and the duplicate binary dependencies will cause linking issues.Confidence Score: 1/5
useLocalBinaries = truechange and duplicate binary dependencies in Package.swift will break the SDK for all external consumers using Swift Package Manager. While the AudioCaptureManager.swift changes are excellent, the Package.swift issues make this unsafe to merge as-isImportant Files Changed
useLocalBinariestotrueand adds binary dependencies to runtime targets - breaks SPM distribution for external consumersarm64, adds app category type, and includes-all_loadlinker flag for MacOS distributionAVAudioEngineinitialization and error handling for missing input devicesLast reviewed commit: 30ec6d1