From 085c0e80f3076bb16d384a8c07495aa699782b09 Mon Sep 17 00:00:00 2001 From: Eugene Hauptmann Date: Thu, 6 Jun 2024 16:58:47 -0400 Subject: [PATCH 1/8] updatedbitflags an fixed Copy --- .github/workflows/coreaudio-rs.yml | 18 ++++++++++++++++++ Cargo.toml | 12 ++++++++---- src/audio_unit/audio_format.rs | 11 ++++++++++- src/audio_unit/mod.rs | 2 +- src/audio_unit/render_callback.rs | 2 +- 5 files changed, 38 insertions(+), 7 deletions(-) diff --git a/.github/workflows/coreaudio-rs.yml b/.github/workflows/coreaudio-rs.yml index 2889171f8..c70ad9f32 100644 --- a/.github/workflows/coreaudio-rs.yml +++ b/.github/workflows/coreaudio-rs.yml @@ -51,6 +51,24 @@ jobs: run: cargo install cargo-lipo - name: Build iphonesimulator feedback example run: cd examples/ios && xcodebuild ONLY_ACTIVE_ARCH=NO ARCHS=x86_64 -scheme coreaudio-ios-example -configuration Debug -derivedDataPath build -sdk iphonesimulator + + visionos-build: + runs-on: macOS-latest + steps: + - uses: actions/checkout@v4 + - name: Install LLVM and Clang + uses: KyleMayes/install-llvm-action@v2.0.2 + with: + version: "18.1.0" + - uses: dtolnay/rust-toolchain@nightly + with: + profile: minimal + - name: Add visionOS targets + run: rustup target add aarch64-apple-visionos + - name: Install cargo lipo + run: cargo install cargo-lipo + - name: Build xrsimulator feedback example + run: cd examples/ios && xcodebuild ONLY_ACTIVE_ARCH=NO ARCHS=aarch64 -scheme coreaudio-ios-example -configuration Debug -derivedDataPath build -sdk xrsimulator # Build the docs with all features to make sure docs.rs will work. macos-docs: diff --git a/Cargo.toml b/Cargo.toml index 8ce822e7a..d7d19e92a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ name = "coreaudio-rs" version = "0.12.0" authors = ["mitchmindtree ", "yupferris "] description = "A friendly rust interface for Apple's CoreAudio API." -keywords = ["core", "audio", "unit", "osx", "ios"] +keywords = ["core", "audio", "unit", "osx", "ios", "visionos"] readme = "README.md" license = "MIT/Apache-2.0" edition = '2018' @@ -22,11 +22,15 @@ open_al = ["coreaudio-sys/open_al"] core_midi = ["coreaudio-sys/core_midi"] [dependencies] -bitflags = "1.0" +bitflags = "2.5.0" coreaudio-sys = { version = "0.2", default-features = false } core-foundation-sys = "0.8.3" [package.metadata.docs.rs] all-features = true -default-target = "x86_64-apple-darwin" -targets = ["x86_64-apple-darwin", "x86_64-apple-ios"] +default-target = "aarch64-apple-darwin" +targets = ["x86_64-apple-darwin", "x86_64-apple-ios", "aarch64-apple-darwin", "aarch64-apple-ios", "aarch64-apple-visionos"] + +# TODO: remove this fix, once https://github.com/RustAudio/coreaudio-sys/pull/102 has been merged. +[patch.crates-io] +coreaudio-sys = { git = "https://github.com/eugenehp/coreaudio-sys.git", branch = "visionos" } \ No newline at end of file diff --git a/src/audio_unit/audio_format.rs b/src/audio_unit/audio_format.rs index 952d706bd..97b454a84 100644 --- a/src/audio_unit/audio_format.rs +++ b/src/audio_unit/audio_format.rs @@ -282,6 +282,8 @@ bitflags! { /// the **AudioFormat** type. /// /// Original documentation [here](https://developer.apple.com/library/mac/documentation/MusicAudio/Reference/CoreAudioDataTypesRef/#//apple_ref/doc/constant_group/AudioStreamBasicDescription_Flags). + #[derive(Copy, Clone, Debug)] + #[allow(non_camel_case_types)] pub struct StandardFlags: u32 { /// Set for floating point, clear for integer. /// @@ -335,7 +337,10 @@ bitflags! { /// have chosen to separate these for greater type safety and clearer compatibility with /// the **AudioFormat** type. /// - /// Original documentation [here](https://developer.apple.com/library/mac/documentation/MusicAudio/Reference/CoreAudioDataTypesRef/#//apple_ref/doc/constant_group/AudioStreamBasicDescription_Flags). + /// Original documentation [here](https://developer.apple.com/documentation/coreaudiotypes/1572097-audio_stream_basic_description_f). + /// + #[derive(Copy, Clone, Debug)] + #[allow(non_camel_case_types)] pub struct LinearPcmFlags: u32 { /// Synonmyn for the **IS_FLOAT** **StandardFlags**. /// @@ -399,6 +404,8 @@ bitflags! { /// the **AudioFormat** type. /// /// Original documentation [here](https://developer.apple.com/library/mac/documentation/MusicAudio/Reference/CoreAudioDataTypesRef/#//apple_ref/doc/constant_group/AudioStreamBasicDescription_Flags). + #[derive(Copy, Clone, Debug)] + #[allow(non_camel_case_types)] pub struct AppleLosslessFlags: u32 { /// Sourced from 16 bit native endian signed integer data. const BIT_16_SOURCE_DATA = 1; @@ -473,6 +480,8 @@ bitflags! { /// **Available** in OS X v10.0 and later. /// /// Original Documentation [here](https://developer.apple.com/library/mac/documentation/MusicAudio/Reference/CoreAudioDataTypesRef/#//apple_ref/doc/constant_group/Audio_Time_Stamp_Flags). + #[derive(Copy, Clone, Debug)] + #[allow(non_camel_case_types)] pub struct AudioTimeStampFlags: u32 { /// The sample frame time is valid. const SAMPLE_TIME_VALID = 1; diff --git a/src/audio_unit/mod.rs b/src/audio_unit/mod.rs index 05695f052..580e5f265 100644 --- a/src/audio_unit/mod.rs +++ b/src/audio_unit/mod.rs @@ -419,7 +419,7 @@ pub fn get_property( /// ---------- /// /// - **id**: The identifier of the property. -#[cfg(target_os = "ios")] +#[cfg(any(target_os = "ios", target_os = "visionos"))] pub fn audio_session_get_property(id: u32) -> Result { let mut size = ::std::mem::size_of::() as u32; unsafe { diff --git a/src/audio_unit/render_callback.rs b/src/audio_unit/render_callback.rs index 57c2628bf..d4fd86bf5 100644 --- a/src/audio_unit/render_callback.rs +++ b/src/audio_unit/render_callback.rs @@ -559,7 +559,7 @@ impl AudioUnit { let buffer_frame_size: u32 = self.get_property(id, Scope::Global, Element::Output)?; buffer_frame_size }; - #[cfg(target_os = "ios")] + #[cfg(any(target_os = "ios", target_os = "visionos"))] let mut buffer_frame_size: u32 = { let id = sys::kAudioSessionProperty_CurrentHardwareIOBufferDuration; let seconds: f32 = super::audio_session_get_property(id)?; From dc03f4daa9275346e230bc3bdd120aef17ffff2a Mon Sep 17 00:00:00 2001 From: Eugene Hauptmann Date: Thu, 6 Jun 2024 17:26:20 -0400 Subject: [PATCH 2/8] added examples to Cargo.toml --- Cargo.toml | 12 ++++++++++++ examples/sine_advanced.rs | 1 + 2 files changed, 13 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index d7d19e92a..9df51624e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,6 +31,18 @@ all-features = true default-target = "aarch64-apple-darwin" targets = ["x86_64-apple-darwin", "x86_64-apple-ios", "aarch64-apple-darwin", "aarch64-apple-ios", "aarch64-apple-visionos"] +[[example]] +name = "feedback_interleaved" + +[[example]] +name = "feedback" + +[[example]] +name = "sine_advanced" + +[[example]] +name = "sine" + # TODO: remove this fix, once https://github.com/RustAudio/coreaudio-sys/pull/102 has been merged. [patch.crates-io] coreaudio-sys = { git = "https://github.com/eugenehp/coreaudio-sys.git", branch = "visionos" } \ No newline at end of file diff --git a/examples/sine_advanced.rs b/examples/sine_advanced.rs index 8e2685538..fa2df89e5 100644 --- a/examples/sine_advanced.rs +++ b/examples/sine_advanced.rs @@ -21,6 +21,7 @@ const SAMPLE_FORMAT: SampleFormat = SampleFormat::F32; // type S = i8; const SAMPLE_FORMAT: SampleFormat = SampleFormat::I8; const SAMPLE_RATE: f64 = 44100.0; +// const SAMPLE_RATE: f64 = 48000.0; const INTERLEAVED: bool = true; From a66cc17e15c30d8cc360c8f66c8d9069d72425a3 Mon Sep 17 00:00:00 2001 From: Eugene Hauptmann Date: Sat, 8 Jun 2024 19:41:23 -0400 Subject: [PATCH 3/8] builds and plays on visionos, crashes UI --- .github/workflows/coreaudio-rs.yml | 8 +- .gitignore | 1 + Cargo.toml | 4 +- examples/feedback.rs | 5 + examples/ios/Cargo.lock | 434 ++++++++++++++++++ examples/ios/Cargo.toml | 4 + examples/ios/build_rust_deps.sh | 89 +++- .../project.pbxproj | 121 ++--- .../UserInterfaceState.xcuserstate | Bin 0 -> 31769 bytes .../xcschemes/xcschememanagement.plist | 19 + src/audio_unit/mod.rs | 2 + src/audio_unit/render_callback.rs | 2 +- 12 files changed, 596 insertions(+), 93 deletions(-) create mode 100644 examples/ios/Cargo.lock create mode 100644 examples/ios/coreaudio-ios-example.xcodeproj/project.xcworkspace/xcuserdata/eugene.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 examples/ios/coreaudio-ios-example.xcodeproj/xcuserdata/eugene.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/.github/workflows/coreaudio-rs.yml b/.github/workflows/coreaudio-rs.yml index c70ad9f32..291ecd79f 100644 --- a/.github/workflows/coreaudio-rs.yml +++ b/.github/workflows/coreaudio-rs.yml @@ -47,10 +47,8 @@ jobs: toolchain: stable - name: Add iOS targets run: rustup target add aarch64-apple-ios x86_64-apple-ios - - name: Install cargo lipo - run: cargo install cargo-lipo - name: Build iphonesimulator feedback example - run: cd examples/ios && xcodebuild ONLY_ACTIVE_ARCH=NO ARCHS=x86_64 -scheme coreaudio-ios-example -configuration Debug -derivedDataPath build -sdk iphonesimulator + run: cd examples/ios && xcodebuild ONLY_ACTIVE_ARCH=NO ARCHS=arm64 -scheme coreaudio-ios-example -configuration Debug -derivedDataPath build -sdk iphoneos visionos-build: runs-on: macOS-latest @@ -65,10 +63,8 @@ jobs: profile: minimal - name: Add visionOS targets run: rustup target add aarch64-apple-visionos - - name: Install cargo lipo - run: cargo install cargo-lipo - name: Build xrsimulator feedback example - run: cd examples/ios && xcodebuild ONLY_ACTIVE_ARCH=NO ARCHS=aarch64 -scheme coreaudio-ios-example -configuration Debug -derivedDataPath build -sdk xrsimulator + run: cd examples/ios && xcodebuild ONLY_ACTIVE_ARCH=NO ARCHS=arm64 -scheme coreaudio-ios-example -configuration Debug -derivedDataPath build -sdk xrsimulator # Build the docs with all features to make sure docs.rs will work. macos-docs: diff --git a/.gitignore b/.gitignore index 2cc3e6778..85f2fecca 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ target/ .cargo/ .DS_Store llvm/ +build diff --git a/Cargo.toml b/Cargo.toml index 9df51624e..0970aa56e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,6 +25,7 @@ core_midi = ["coreaudio-sys/core_midi"] bitflags = "2.5.0" coreaudio-sys = { version = "0.2", default-features = false } core-foundation-sys = "0.8.3" +avfaudio = "0.0.2" [package.metadata.docs.rs] all-features = true @@ -45,4 +46,5 @@ name = "sine" # TODO: remove this fix, once https://github.com/RustAudio/coreaudio-sys/pull/102 has been merged. [patch.crates-io] -coreaudio-sys = { git = "https://github.com/eugenehp/coreaudio-sys.git", branch = "visionos" } \ No newline at end of file +coreaudio-sys = { git = "https://github.com/eugenehp/coreaudio-sys.git", branch = "visionos" } +# coreaudio-sys = { path = "../coreaudio-sys" } diff --git a/examples/feedback.rs b/examples/feedback.rs index f40b80944..e214ba87b 100644 --- a/examples/feedback.rs +++ b/examples/feedback.rs @@ -5,6 +5,7 @@ extern crate coreaudio; use std::collections::VecDeque; use std::sync::{Arc, Mutex}; +use avfaudio::session::{AVAudioSession, Category}; use coreaudio::audio_unit::audio_format::LinearPcmFlags; use coreaudio::audio_unit::macos_helpers::{audio_unit_from_device_id, get_default_device_id}; use coreaudio::audio_unit::render_callback::{self, data}; @@ -20,6 +21,10 @@ const SAMPLE_FORMAT: SampleFormat = SampleFormat::F32; // type S = i8; const SAMPLE_FORMAT: SampleFormat = SampleFormat::I8; fn main() -> Result<(), coreaudio::Error> { + + let session = AVAudioSession::shared_instance(); + session.set_category(Category::play_and_record()); + let mut input_audio_unit = audio_unit_from_device_id(get_default_device_id(true).unwrap(), true)?; let mut output_audio_unit = diff --git a/examples/ios/Cargo.lock b/examples/ios/Cargo.lock new file mode 100644 index 000000000..f4b30694a --- /dev/null +++ b/examples/ios/Cargo.lock @@ -0,0 +1,434 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "avfaudio" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00f488019b88734f701d257e8665d382d2c9d86b1142d38b4f8977d059b23231" +dependencies = [ + "avfaudio2-sys", + "block", +] + +[[package]] +name = "avfaudio2-sys" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69ad67b63444645964f7e7e07d8d6519eda6c468c8f0f2f6c5c4f97c4f4c34b9" +dependencies = [ + "bindgen", + "block", + "objc", +] + +[[package]] +name = "bindgen" +version = "0.69.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +dependencies = [ + "bitflags", + "cexpr", + "clang-sys", + "itertools", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn", + "which", +] + +[[package]] +name = "bitflags" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "coreaudio-ios-example" +version = "0.1.0" +dependencies = [ + "coreaudio-rs", +] + +[[package]] +name = "coreaudio-rs" +version = "0.12.0" +dependencies = [ + "avfaudio", + "bitflags", + "core-foundation-sys", + "coreaudio-sys", +] + +[[package]] +name = "coreaudio-sys" +version = "0.2.15" +dependencies = [ + "bindgen", +] + +[[package]] +name = "either" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "libc" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libloading" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" +dependencies = [ + "cfg-if", + "windows-targets", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "prettyplease" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "syn" +version = "2.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" diff --git a/examples/ios/Cargo.toml b/examples/ios/Cargo.toml index c04bf362d..ff8bd7603 100644 --- a/examples/ios/Cargo.toml +++ b/examples/ios/Cargo.toml @@ -13,3 +13,7 @@ crate-type = ["staticlib"] [dependencies] coreaudio-rs = { path = "../.." } +# TODO: remove this fix, once https://github.com/RustAudio/coreaudio-sys/pull/102 has been merged. +[patch.crates-io] +coreaudio-sys = { git = "https://github.com/eugenehp/coreaudio-sys.git", branch = "visionos" } +# coreaudio-sys = { path = "../../../coreaudio-sys" } \ No newline at end of file diff --git a/examples/ios/build_rust_deps.sh b/examples/ios/build_rust_deps.sh index 024a42b28..9186fa9b0 100755 --- a/examples/ios/build_rust_deps.sh +++ b/examples/ios/build_rust_deps.sh @@ -1,9 +1,89 @@ -#!/bin/sh +#!/bin/bash set -e PATH=$PATH:$HOME/.cargo/bin +POSITIONAL_ARGS=() + +# ./build_rust_deps.sh --platform ${PLATFORM_DISPLAY_NAME:?} --sdk-root ${SDKROOT:?} --framework-search-paths "${FRAMEWORK_SEARCH_PATHS:?}" --header-search-paths "${HEADER_SEARCH_PATHS:?}" --gcc-preprocessor-definitions "${GCC_PREPROCESSOR_DEFINITIONS:-}" --configuration ${CONFIGURATION:?} ${FORCE_COLOR} ${ARCHS:?} + +# TODO: x86_64 crashes +# xcodebuild ONLY_ACTIVE_ARCH=NO ARCHS=x86_64 -scheme coreaudio-ios-example -configuration Debug -derivedDataPath build -sdk iphonesimulator + +# WORKS +# xcodebuild ONLY_ACTIVE_ARCH=NO ARCHS=arm64 -scheme coreaudio-ios-example -configuration Debug -derivedDataPath build -sdk iphoneos + +while [[ $# -gt 0 ]]; do + case $1 in + -p|--platform) + PLATFORM="$2" + shift # past argument + shift # past value + ;; + --root) + SRCROOT="$2" + shift # past argument + shift # past value + ;; + -s|--sdk-root) + SDKROOT="$2" + shift # past argument + shift # past value + ;; + --framework-search-paths) + FRAMEWORK_SEARCH_PATHS="$2" + shift # past argument + shift # past value + ;; + --header-search-paths) + HEADER_SEARCH_PATHS="$2" + shift # past argument + shift # past value + ;; + --gcc-preprocessor-definitions) + GCC_PREPROCESSOR_DEFINITIONS="$2" + shift # past argument + shift # past value + ;; + --configuration) + CONFIGURATION="$2" + shift # past argument + shift # past value + ;; + -*|--*) + echo "Unknown option $1" + exit 1 + ;; + *) + POSITIONAL_ARGS+=("$1") # save positional arg + shift # past argument + ;; + esac +done + +ARCH=$POSITIONAL_ARGS + +echo "SRCROOT $SRCROOT" +echo "PLATFORM $PLATFORM" +echo "SDKROOT $SDKROOT" +echo "FRAMEWORK_SEARCH_PATHS $FRAMEWORK_SEARCH_PATHS" +echo "HEADER_SEARCH_PATHS $HEADER_SEARCH_PATHS" +echo "GCC_PREPROCESSOR_DEFINITIONS $GCC_PREPROCESSOR_DEFINITIONS" +echo "CONFIGURATION $CONFIGURATION" +echo "ARCH $ARCH" +echo "POSITIONAL_ARGS $POSITIONAL_ARGS" + +PREFIX="aarch64" +SUFFIX=$([ "$ARCH" = "Simulator" ] && echo "-sim" || echo "") +PREFIX=$([ "$ARCH" = "arm64" ] && echo "aarch64" || echo $PREFIX) + +platform=$(tr '[:upper:]' '[:lower:]' <<<"$PLATFORM") +target="${PREFIX}-apple-${platform}${SUFFIX}" + +echo "TRIPLE $target" +COMMAND=$([ "$PLATFORM" = "visionOS" ] && echo "cargo +nightly build -Zbuild-std" || echo "cargo build") + if [[ -n "${DEVELOPER_SDK_DIR:-}" ]]; then # Assume we're in Xcode, which means we're probably cross-compiling. # In this case, we need to add an extra library search path for build scripts and proc-macros, @@ -12,9 +92,4 @@ if [[ -n "${DEVELOPER_SDK_DIR:-}" ]]; then export LIBRARY_PATH="${DEVELOPER_SDK_DIR}/MacOSX.sdk/usr/lib:${LIBRARY_PATH:-}" fi -# If you want your build to run faster, add a "--targets x86_64-apple-ios" for just using the ios simulator. -if [ -n ${IOS_TARGETS} ]; then - cargo lipo --targets ${IOS_TARGETS} -else - cargo lipo -fi +$COMMAND --target $target \ No newline at end of file diff --git a/examples/ios/coreaudio-ios-example.xcodeproj/project.pbxproj b/examples/ios/coreaudio-ios-example.xcodeproj/project.pbxproj index a706f377e..e5645b913 100644 --- a/examples/ios/coreaudio-ios-example.xcodeproj/project.pbxproj +++ b/examples/ios/coreaudio-ios-example.xcodeproj/project.pbxproj @@ -15,16 +15,6 @@ 57AB5B0B252769700040DE8C /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 57AB5B04252769700040DE8C /* AppDelegate.m */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - 57AB5AEE252766820040DE8C /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 57AB5AC2252762C00040DE8C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 57AB5AE9252766240040DE8C; - remoteInfo = cargo_ios; - }; -/* End PBXContainerItemProxy section */ - /* Begin PBXFileReference section */ 57AB5ACA252762C10040DE8C /* coreaudio-ios-example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "coreaudio-ios-example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 57AB5AF2252767460040DE8C /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; @@ -92,28 +82,12 @@ }; /* End PBXGroup section */ -/* Begin PBXLegacyTarget section */ - 57AB5AE9252766240040DE8C /* cargo_ios */ = { - isa = PBXLegacyTarget; - buildArgumentsString = build_rust_deps.sh; - buildConfigurationList = 57AB5AEA252766240040DE8C /* Build configuration list for PBXLegacyTarget "cargo_ios" */; - buildPhases = ( - ); - buildToolPath = /bin/sh; - buildWorkingDirectory = .; - dependencies = ( - ); - name = cargo_ios; - passBuildSettingsInEnvironment = 1; - productName = cargo_ios; - }; -/* End PBXLegacyTarget section */ - /* Begin PBXNativeTarget section */ 57AB5AC9252762C10040DE8C /* coreaudio-ios-example */ = { isa = PBXNativeTarget; buildConfigurationList = 57AB5AE3252762C30040DE8C /* Build configuration list for PBXNativeTarget "coreaudio-ios-example" */; buildPhases = ( + 44275A242C1510DC003B0C1C /* Build Rust Code */, 57AB5AC6252762C10040DE8C /* Sources */, 57AB5AC7252762C10040DE8C /* Frameworks */, 57AB5AC8252762C10040DE8C /* Resources */, @@ -121,7 +95,6 @@ buildRules = ( ); dependencies = ( - 57AB5AEF252766820040DE8C /* PBXTargetDependency */, ); name = "coreaudio-ios-example"; productName = "coreaudio-ios-example"; @@ -139,9 +112,6 @@ 57AB5AC9252762C10040DE8C = { CreatedOnToolsVersion = 12.0.1; }; - 57AB5AE9252766240040DE8C = { - CreatedOnToolsVersion = 12.0.1; - }; }; }; buildConfigurationList = 57AB5AC5252762C00040DE8C /* Build configuration list for PBXProject "coreaudio-ios-example" */; @@ -158,7 +128,6 @@ projectRoot = ""; targets = ( 57AB5AC9252762C10040DE8C /* coreaudio-ios-example */, - 57AB5AE9252766240040DE8C /* cargo_ios */, ); }; /* End PBXProject section */ @@ -175,6 +144,31 @@ }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + 44275A242C1510DC003B0C1C /* Build Rust Code */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Build Rust Code"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(SRCROOT)/target/aarch64-apple-ios/${CONFIGURATION}/coreaudio_ios_example.a", + "$(SRCROOT)/target/aarch64-apple-ios-sim/${CONFIGURATION}/coreaudio_ios_example.a", + "$(SRCROOT)/target/aarch64-apple-visionos/${CONFIGURATION}/coreaudio_ios_example.a", + "$(SRCROOT)/target/aarch64-apple-visionos-sim/${CONFIGURATION}/coreaudio_ios_example.a", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "./build_rust_deps.sh --root ${SRCROOT:?} --platform ${PLATFORM_DISPLAY_NAME:?} --sdk-root ${SDKROOT:?} --framework-search-paths \"${FRAMEWORK_SEARCH_PATHS:?}\" --header-search-paths \"${HEADER_SEARCH_PATHS:?}\" --gcc-preprocessor-definitions \"${GCC_PREPROCESSOR_DEFINITIONS:-}\" --configuration ${CONFIGURATION:?} ${ARCHS:?}\n"; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ 57AB5AC6252762C10040DE8C /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -188,14 +182,6 @@ }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - 57AB5AEF252766820040DE8C /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 57AB5AE9252766240040DE8C /* cargo_ios */; - targetProxy = 57AB5AEE252766820040DE8C /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin PBXVariantGroup section */ 57AB5AFF252769700040DE8C /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; @@ -333,18 +319,27 @@ buildSettings = { ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "ios-src/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - LIBRARY_SEARCH_PATHS = target/universal/debug; + LIBRARY_SEARCH_PATHS = ( + "target/aarch64-apple-ios/debug", + "target/aarch64-apple-ios-sim/debug", + "target/aarch64-apple-visionos/debug", + "target/aarch64-apple-visionos-sim/debug", + ); OTHER_LDFLAGS = "-lcoreaudio_ios_example"; OTHER_LIBTOOLFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = "coreaudio-rs.coreaudio-ios-example"; PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator xros xrsimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + TARGETED_DEVICE_FAMILY = "1,2,7"; }; name = Debug; }; @@ -353,43 +348,22 @@ buildSettings = { ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "ios-src/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - LIBRARY_SEARCH_PATHS = target/universal/release; + LIBRARY_SEARCH_PATHS = "target/aarch64-apple-ios/release"; OTHER_LDFLAGS = "-lcoreaudio_ios_example"; OTHER_LIBTOOLFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = "coreaudio-rs.coreaudio-ios-example"; PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 57AB5AEB252766240040DE8C /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - DEBUGGING_SYMBOLS = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - GCC_GENERATE_DEBUGGING_SYMBOLS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - OTHER_CFLAGS = ""; - OTHER_LDFLAGS = ""; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 57AB5AEC252766240040DE8C /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - OTHER_CFLAGS = ""; - OTHER_LDFLAGS = ""; - PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator xros xrsimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + TARGETED_DEVICE_FAMILY = "1,2,7"; }; name = Release; }; @@ -414,15 +388,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 57AB5AEA252766240040DE8C /* Build configuration list for PBXLegacyTarget "cargo_ios" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 57AB5AEB252766240040DE8C /* Debug */, - 57AB5AEC252766240040DE8C /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ }; rootObject = 57AB5AC2252762C00040DE8C /* Project object */; diff --git a/examples/ios/coreaudio-ios-example.xcodeproj/project.xcworkspace/xcuserdata/eugene.xcuserdatad/UserInterfaceState.xcuserstate b/examples/ios/coreaudio-ios-example.xcodeproj/project.xcworkspace/xcuserdata/eugene.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..3b50d6b6ee88cebbdd5882b5987fec71af120a8d GIT binary patch literal 31769 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 + + + + SchemeUserState + + cargo_ios.xcscheme_^#shared#^_ + + orderHint + 0 + + coreaudio-ios-example.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/src/audio_unit/mod.rs b/src/audio_unit/mod.rs index 580e5f265..b493a4dd8 100644 --- a/src/audio_unit/mod.rs +++ b/src/audio_unit/mod.rs @@ -426,6 +426,8 @@ pub fn audio_session_get_property(id: u32) -> Result { let mut data_uninit = ::std::mem::MaybeUninit::::uninit(); let data_ptr = data_uninit.as_mut_ptr() as *mut _ as *mut c_void; let size_ptr = &mut size as *mut _; + // https://developer.apple.com/documentation/audiotoolbox/1618433-audiosessiongetproperty + // deprecated try_os_status!(sys::AudioSessionGetProperty(id, size_ptr, data_ptr)); let data: T = data_uninit.assume_init(); Ok(data) diff --git a/src/audio_unit/render_callback.rs b/src/audio_unit/render_callback.rs index d4fd86bf5..7bdeeeb97 100644 --- a/src/audio_unit/render_callback.rs +++ b/src/audio_unit/render_callback.rs @@ -553,7 +553,7 @@ impl AudioUnit { // Pre-allocate a buffer list for input stream. // // First, get the current buffer size for pre-allocating the `AudioBuffer`s. - #[cfg(target_os = "macos")] + #[cfg(any(target_os = "macos"))] let mut buffer_frame_size: u32 = { let id = sys::kAudioDevicePropertyBufferFrameSize; let buffer_frame_size: u32 = self.get_property(id, Scope::Global, Element::Output)?; From 0df6c8727c19c8c32a200ebb70b3363e47cca083 Mon Sep 17 00:00:00 2001 From: Eugene Hauptmann Date: Sat, 8 Jun 2024 20:00:32 -0400 Subject: [PATCH 4/8] improve CI --- .github/workflows/coreaudio-rs.yml | 13 +++---------- examples/ios/Cargo.lock | 1 + examples/ios/build_rust_deps.sh | 3 +++ .../UserInterfaceState.xcuserstate | Bin 31769 -> 36269 bytes 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/.github/workflows/coreaudio-rs.yml b/.github/workflows/coreaudio-rs.yml index 291ecd79f..aa46c86b3 100644 --- a/.github/workflows/coreaudio-rs.yml +++ b/.github/workflows/coreaudio-rs.yml @@ -9,17 +9,14 @@ jobs: os: [macOS-latest] steps: - uses: actions/checkout@v4 - - name: Install LLVM and Clang - uses: KyleMayes/install-llvm-action@v2.0.2 - with: - version: "15.0" - uses: dtolnay/rust-toolchain@master with: toolchain: stable - name: cargo test run: cargo test --verbose - - name: Run sign example + - name: Run sine example run: cargo run --example sine + # TODO: These don't work as of 2020-12-06, but they should. # - name: cargo test - no features # run: cargo test --no-default-features --verbose @@ -48,16 +45,12 @@ jobs: - name: Add iOS targets run: rustup target add aarch64-apple-ios x86_64-apple-ios - name: Build iphonesimulator feedback example - run: cd examples/ios && xcodebuild ONLY_ACTIVE_ARCH=NO ARCHS=arm64 -scheme coreaudio-ios-example -configuration Debug -derivedDataPath build -sdk iphoneos + run: cd examples/ios && xcodebuild ONLY_ACTIVE_ARCH=NO ARCHS=arm64 -scheme coreaudio-ios-example -configuration Debug -derivedDataPath build -sdk iphonesimulator visionos-build: runs-on: macOS-latest steps: - uses: actions/checkout@v4 - - name: Install LLVM and Clang - uses: KyleMayes/install-llvm-action@v2.0.2 - with: - version: "18.1.0" - uses: dtolnay/rust-toolchain@nightly with: profile: minimal diff --git a/examples/ios/Cargo.lock b/examples/ios/Cargo.lock index f4b30694a..dd761fd3e 100644 --- a/examples/ios/Cargo.lock +++ b/examples/ios/Cargo.lock @@ -119,6 +119,7 @@ dependencies = [ [[package]] name = "coreaudio-sys" version = "0.2.15" +source = "git+https://github.com/eugenehp/coreaudio-sys.git?branch=visionos#17eaa7c2fb9b5cf81e3c09984c1c443c4b724635" dependencies = [ "bindgen", ] diff --git a/examples/ios/build_rust_deps.sh b/examples/ios/build_rust_deps.sh index 9186fa9b0..4c1c55c84 100755 --- a/examples/ios/build_rust_deps.sh +++ b/examples/ios/build_rust_deps.sh @@ -6,6 +6,9 @@ PATH=$PATH:$HOME/.cargo/bin POSITIONAL_ARGS=() +# cargo clean +# rm -rf build + # ./build_rust_deps.sh --platform ${PLATFORM_DISPLAY_NAME:?} --sdk-root ${SDKROOT:?} --framework-search-paths "${FRAMEWORK_SEARCH_PATHS:?}" --header-search-paths "${HEADER_SEARCH_PATHS:?}" --gcc-preprocessor-definitions "${GCC_PREPROCESSOR_DEFINITIONS:-}" --configuration ${CONFIGURATION:?} ${FORCE_COLOR} ${ARCHS:?} # TODO: x86_64 crashes diff --git a/examples/ios/coreaudio-ios-example.xcodeproj/project.xcworkspace/xcuserdata/eugene.xcuserdatad/UserInterfaceState.xcuserstate b/examples/ios/coreaudio-ios-example.xcodeproj/project.xcworkspace/xcuserdata/eugene.xcuserdatad/UserInterfaceState.xcuserstate index 3b50d6b6ee88cebbdd5882b5987fec71af120a8d..9adfc70e2d0cad2a15445c147a9d7a71dd5f3b48 100644 GIT binary patch delta 19508 zcmb8W2S60Z8#jD2yL)$gB1Pb^A_~$Et``L1sx(1G5TqPe>C!Z4Vsbk%#@LN#j5R8j z*fo|IHAaoGB=!=*rSOxzH@LO5ik%m#D7TrdyJ2MfSwU?Erp7K28x1S|#1z;f_8 zSOHdoRbVw(1J;6dU_ICXz5pA+Ca@W70bhcx;482VYzI5Q*I+032J8a6!5;7}*bBY` z`@nv102~D0gCD>l2RIClfTQ3TI1WyLli(CM4Sob?z*+DU_!;~H&Vlpb0=Nh+fy>|u zxC*X;U%?IV2e=I$fY0*2g4jV4Ccc^=qQ3#XoF?23J!<$umQdUC&9^Z3Y-e3!Rhd0I1kQ;3*cvP zDclTqz&&su+z)?%hu|@I9G-?h!gKH~N;vHfP@h&lr_>dS+Oea1i<`avErNlB~C9#(Hg4j;%A@&nL5J!n)#E--o z;uqo^ah^dtRAKIsS`dys)-FexBo$XHTH zipaiXJefqQ$^K+InL`dGb4fF4A+6;5~IiCE8oIp+_Cy|rMDdbdg8aba_ zL@p+mk;}LWIbO|mIA&E~N^*Jq zJCNO*9n216hqE2gYyn%u7PIAS1-maho}I*2v-NBPJC&Wr&SVc{4`FAs^Vq}KMQkJ6 z!nU$Y*=6i1_HcF`yPn;^9>pHRewU5d@3TK-k7rL}Pi9YNf6V@bJ&Qe;J&(PRy@W%d>J zZ|vXMx7dHM@3HT*AF&^^pR%8^|6#x45FC=j<8F^EqcNXA@@|XBTH5=Mcwn zf^(L0fpdj(opXzGhw~@rDd!cJ;?i6%ZYQokw;Q(?H;fy_6>+6p1vi1K<)&~mxmnyi zu90iwR&Z;%4cvFRh&!G;kvoO!%;eN&4!QI2%$34V7!9B~pz`e%3 z$-T$@llzqWg8Pc5=nk|G?eCzw(SdX?I*b<35?VzMq6gDi^bk6m&Y_3WxpW>qjLxTx zw4EMKSJO50+w?p182Vir(c|bT^i+Bl{VBbG{)}EoFQ%8$E9iCfM*3@dC;bh*i#|Xf zq`#++(8uXh^f~%GeSyAAU!xz>f6;%_Pw1!gGx|C0ctOA7K_129@;dN5c|N=dUL-Gy z7tIs!VtBDUAy32;^CUbePsWq;6g(wQ#f#%5@KSiGyfj`qZvZcYm&qH*%i$ICOguBs z!n5*hylP$zua-B0_W^Gl??c{r-bcI%yvf-i!$($Do?>-md9u7%-Yj1he`rRQ(~}(m zMr=~Dd%})iGdr2x%pPVh(~;Tlv~o{*8ChnQg=J;gSawzk(`%D~#>R0@+Wp>`O{txB z0kFf#^V{l}wB9=xNPrZ`fE*}*5~x5N=nLXO0_X=4K@v~{4bTD|&;tYL50XI&NCjyi z9Si^&AQKD(gTP>r1%`lZkOPK-T#yHbfqYN^3PBMtf?{9-W?%tUU;}ng0!l#{C$cVpc)W0pw^iLx;Wkg4!{5e-UnmB2Vfld5R3;OfeBzDV`eOjm9a5)ri3YF%9wJd zf~jPxnBhz{Q^V9Ubxb`of*HxY#WXOZn9CDH>493aK%waxZW-*^Kvza-}TxK3KpIN|s#w=tOF^ic- zW(l*DS;j19K4(@iE16ZyYGw_ymRZNFXErcjFdLao%w}c_^Ch#D`HI=bY&UvG)!8i7 zb=Ej1PaC3qeJR$+H6oo(BhVY9N`X`;lnYcUwN#)}$aNB_Mk*6(<*!FOSEPj4Utfw8 zYQ0jW)e2-niAo^V2*m=mT&WdkMG}orqLj&m8bzDYDveYrlj;NpnL#IzN_2VwUL4=7 zQ;5}am0luMi(Zd*?$Lzs+FY*e-|o^QvE5~C`@uuhE~?fxd_>uZ(Q(c_q5j;sdP}LT z%GPw@7gSSMU2e0Ch!eJ1;j{Kr7Pnt;LDQ72T3p>uiz2N|BG*X`0+~pT6`@vX1uC&Y zEKtamLa9b47wfcbbnbkR(vJB@+K_HWZ-tv%i>a=p+E`Xy|NqbN!i2V_)azvig-om! zNcD1wKq``8Q(`L$6e5jGtP&}-BE6)Ixc+G&j@Oq4sZ?RmD1-u$N-oC|s3iimMyV8t zr7EFFuUE-*THWi>LYYV+QOdOfiP)gPUZd6t)CQSOAd)F1daYD0(rWc>MjI3wwMM2F z=tV-AK&sHn1sd#k0+GL1qmT&Ya;aX`))2<_>PgVG(^f!xyBtn!s{^e}rBq4uI)P9v z#X3;v)B=sxpc3dbIRbs%=Mvc2;a?%nx>Dfm(#+P|IDvtHe^R zQucas=jf!i`c_MYB8^U~7Z{ZIKB?G%^)1&Z1bT^FCRb}kI5~*h-2A(`?aczAWUj^xk}&eQq-^ACBJ>%lIisdjY1(1 zX@uB*GND4CQR-d%izQ02Rw7l1+i;CtRVFfMu_`5EtRS4F@Mx_;U@(Z4I+akPF|^BD z|HQXjxu8AQV^iBvk0iHMh|-{vX|VI)2-ai1G}xt72F#&MB9-eU*r{adw%+@&eI$%C zw43@yyX2tI>UAm&b~uGth4Z{tA;WoICKhNVN}<@GRZAqIHWBMI>DvZ|K_ijsIdHc7xas{O{(xt-ob z5~T{eh)f_->#*KrI+Z}BR_HN9V(i>n?0rh@YeqB@u}Y136-Xqmq^iS-L5*{|Kqc3! zwGzB}Y7K3z-#59PqI|_|EhbY7B{-dl1WKtZW2m(_F0q{jLcLCA&}wjISG38vLbXAp z!?7w*Xtb^rpmwb+#s-w=@TOr9tAz&XYd)PtY3)}2pgkjh>f5SQCebVL)_`+Aj%l1F zanPx-=mLpKq|vBw^`KL=^}Fo$d+_zdwsUEv5{X8pRbjrA*uHvfB$Yz173fuJp$2DN z3C`AS*o;k*OZm>J-0Rv%A7{r`pa+%Z2kIWh7EOP^a z0SJ^MP=P?@rh$9`@PIKemgNP7tg}$$oDdM%MC>WWwyHPrbU=@n9uXsnvrFd)@BZ};1H)zmmm^mvnJqQ zdiu6ZFw`{xbI~>4dB1a@<2o#8beYN5@v8aHDQLv&6hjjXNwF*#8?ZZRXAnON`#Wx||_8XXmb7L?bM9 zdUfsQ56fW%tQ=N@RhBiPu55S-^E>mKGqLMXe^?D`^6_{>S*6XT(Iv1J);U*q?L)#5 zaHR8e*Judea>8!nR5%JuS`0@sH<|5j=YnJ4SXT6M>98++*$|pl0qNknVi9TWxnZ1I}VaFM&=t6Mn)xU>-7mE`gr{Z{W>5 za`L+C=-u#jufii~tvbIOft%a2Z?5*TQvhJ=}nQ+Xy!~ z$97-uc!~f-fMotcfWzPm76QbXc0RHNe(Cm+?aV*S-){eS*%V6fYuCa%;Wuy>^MrZE zym;*-Yk)Vl@l$4Ki%+x||3H)RpSz5oH8^(U@D{v{Q~Zw~oN)O8^NP9V3=2$Fp1~5G zWgUY*!xK2LW6Y*{8}{^=I$Nb_MA=(52Fn1LSIt&F4=-eAWMR)~gy)^h1M_{Zz-u^k z;Z+2v#qd`I*iP@BAzn9N>LTV+^DTeC+fHN80PGQWoP|BR7XObP@4@@<0epz{cn>~? zSaTf_;3Lo(0UB$u>Czv8fc9#90-rXi@dfZfz!!lIE=3~1V{)AnJ1fcv7S<#I2uKhJ zcp%_~fX{1X-Xl10VAI5&%=tofO^wc0X)7^}u*Fol)kk!2sTEDB1f!?c#XjX{pKSD@|fDisx$_hmw z821tIe+YyjAjeGM-xQlx=iujjLIYD56Iuj9T-LzJnlQlBr9^)s+4UEJJ_z9ZT|b#i z-aPLv?(iZqiNP#>BQcN|gg`g~5sgF^F$4k3UJMiKtj_J>yrGQjPUH~Zjfu^+S65o=i&_$4x@~yLh|>QJ@C>+?b&QyV9W#TN3O6z5 zaB#Z}+1C}^=kWST{}bJb#EjahCYW85G%>Xe54i21ZI_&J$Ny(MyR7 z#6{u~aT$RO1Tqo8!8~Xwah13Ryouis7>vMBW+(#1P9`!b@;33nb;}*%E^&{zk3bdz z*xj=c$XUt?!O{LJD-=gqt}DIWj2s*Df}~i{D~OlGKg27NMFJ9%1W6)*2jn3z3;`Su z1qc)(fTO{Qaa(249!cEtjaIKEAb$!-Xko#}#Z31m+&sgVpKvCmr&C~e*0$Ph9d zhYs0?3?*?`TM@7!U|&L9V11a->^10 z7_W^LSnXQ7hKbEf(dnCAFgR(<<#t@;k%e!Xpa@S;j6j`hf_mq^m=FhPBkNhwYe_p< zLY9(cWI0(uR+3fZaI%`LA#2Gx1V$q876J_jj6z^E0&gSm4gzBkco%{95Ww-uAb{4A zBgm2DTVw<9AxD#MlkbpY$OiH~(&5Ua?<4Rrg5Myx2OAsiMesWW_anToLCzk8w1Ki^LjHOSGw_!oNGk7HuyR>KG6xq ziZ=KrH$K^!)(-#5jZbyXY=`f3sHG{jBI^#SWk<|(+JFB!dtxaEcsKjceViM$P2Eqc-66s$%_cgem(XIdELd^Rq`77 zEBPDwI|6eMz_yr&zi2zu$X@N8d6#a!aN%C(5 z7BiPllh1ISjH_kxIr)NINdA*ok4po~h_Y(z_)8FI#P&j9MX-85&pFxOnBnG*0u+fK zStv+hWh_NtStCVJYy_4g@cE1gElG8xJe|WMf~X~w7v=4&j7aQ6b)x*RKoqWBRxPHm ztE_hJjF32}u2i>nf>VK1kV|l^=y8iFoF>+_3QmPkvAB+)`cR=%7!^)MP?1y=6-^1K z7zEZMumOQD5ZH*oCImJkumyoH5!i~rSF0#ta~(lRDH$bag-}YD_itl5c4{spzDD4C z1b%QOnL|yL#2^Y64vVS&2yAy(5>zU#B&amtKX4t0uO(T^<4MkuV0(;w35mW(XbPX#caN^vJ3yDUmm@*--2Z3*$0#z3kWpAn`TV^ez zs&K}j%Bc#f5`pg!*oVOWCDd@Df~rB_04^vHILO2ryssya*}!*U%!LPh^V+AQBxTa+LV-7-T^JEFx1$l`hmhJL5aZOM#@ALV~#Li&P#cn z9n=KsJ6801?>K5AIhUGDO`)bz)2Qjx$J7kUNzS1@A*NEFQnRT!)Ld#FHJ@5QeMT*$ z7Ez0-M(hMjsb$o1>T_xZwUSyzt)|vcYpHeAdTImp1+|gdL~W+FP+wA8sjsMQ)OKnI z^){IEwQL0>=?Ji2#nAGYI^Iz%K}#M*s&0&Ni2ua?w=;enkLB z1b))Jg#ZqKy9nS7?jZt?5WrFV1c7G=yg=X|1X&2;Cn*v^HiBFPc?fzS=!u{=f}Ifb zLy(VPX9T+<*xi9(Ac8>%_C_!S!B7Ol5sXAI8bR!PINwb`P>7%yK`G9LE;a3=_EQI_ zgVgub57Z&*Fm;4FN*$w)QzxjC)G6vT^&@qLI!paT{Y?EroukfE7pRNWCF(MDg}O>z zqkg4+qkgBZQ#Yua)Gg`{%5j^zL*1qBQTM3_)I;h|>Jjyr`iuITdO|&=o>9-K7t~7% zizG)-iC`jvIt29y8W2oFFde}G2xcIdiExb%vk}Zea43Q}<>w(d48eQ^3lJs1=2-*=WL9i0RDg=jDAXty!2n0tW_!fer5qulLcMu$d;JXOEhu~NQKR|FCf*&F{ z9>K{7PD5}yf_QtGfuIw?nF!87a4v%L5L|@dVuT+y!`q~PHsMag$DDWK+oW?g*NvZW z$`cH)(>%MQ8$acon$UK9CpZ41^K3gjz>S}E2K8$@zPlU$*;&>O@8!nNIXAY$L*4iV z=ks=WlpDX~)Frl^U+BiKIH$D3Wp4bM^GrKD&W-=(?3vVdo-FA&EH-67KxgDPC#veF;Y=;-R@jsn`nzr+p-S}f? zNjtp6jsJ~#YCFEtjX!lhZHL#o@#jwb@}>>{Z@KZ8&bivQ^StB6UpcR}!5x2RJj^;a|J)F3#EQ@I7w4oAXLL ze7_s-;fzdfJO3d!-qTs%4nOY3aY57$|Iv*HJE@em^Zeq*`#3Y&;g{TanDf(i_^)m} z!g;wJe$$OdIU`cr&VSd93!HWB@IT#ntaC>@{D~VEImxuP^SpH95@)DH?)SRbCN)u1am@My)P?9HMr*l6Po%DoKQ|!VQUB6b;}YAg|jB$riAONc~B%L z%IM9bhvceS}$_aIT^2M?MZ_YS+D(UmP_s-E!LUi;Dl&kmo{S0=X}<>+`q(ba=3bqoRgf>Z=f}ie&YPnO5&VDu((D2 z7hUSVgrMn7>Nj(KZ&Cka1kJDA?uJYKmKOE@!ExZ|@WxrD)$Q(b?zgV@Fa1B_{Pka? zXPg)RLE^Hw_+6DdlW}ommbwMtvatYM2TmnrZ<63GF0QMa9q1*3<*gEMyLMWmB#IZV083@+bxx?Q? za$xu8)^SI?iRL1W;=bKV;^M~#M~hVNHF*z$%$uaz%Eb>A&1MNe5Vd9>?nf@Oyx(G$ zNt_UehQLpBt!A0Zo!+|Kzr>!&#qY%0?#QnVHkUj9zetO?jsHbj&RxNZcCxJON*Dm*^OSVZZvTbV$4E&JVD%;oGZ(3R5?m}>iYq=)< z;|BC%?p_3^zG=N5Upq)}8wWYeeN#Gfr7Z4A?tf)7?oZs;*{n&w*q$vecaeL!mA`-K z{#Wkr|3$jRz1>RU-a+_%WphWCd*3D00|aNiNvJ=$Pnwm8<1ZG$PhWe;GnW=;w`lPt z-ku2W*Gi;W^y_Tao=KWbb6Yw27s-S6Y$egSUYqY`lJ4ZdT++B;Tks|>pU}9I(Co&T zsn1$XO?P)OxzNod-P2|2E^SI2x;Ongnf;5Ea5}P;6-;upseb4fTG*D>mL#R+m;@i= zp6y~!4(K%4_}4gY6RCH zh@E@gD%!vb33avE=+x$yb#w-9vcdK4mvs=g=9*vD!LOTIY?*X{OIx_>u)*D8ql^FZ zWu4or=n}ddx2fn-x(wmA5Zu&ASJ1dcfn#X9Gc`9QoUWxu;%*sTN7vIM5Zr>`mk4fM zLR8QV^e9)W41R^+Hr$O{s|t2r$Q{O|-(z{v4%`~UZ`hi8W%Tfb?Vh;BRB`qs| zNKbIBJRW!L;0{;Ujwo_I$F2q%+=&}#u6KjDfhKU#eP+{h zS^UK`?t$!DOyeHNZYMn~+JQSE-!@g%bR)e4SJ@f(Q|d;#5x@F##U8y3Yl!8;K-@`h z&gAq;dNsD33tLQM&F^b*z4iEgSkuUsPX_2s^j4Q9Hq%>Ztb+px9z^i_CG=PHHhMdP zKOlG9elIex%PJ zcmlzbjr33S&j_AE@HAemkJGDw11>oO3S`7pM(xZlOvrAz^H&-thtKKX=-=t<^bPtZ zeT)7BK|Bqv#eYH&Px1?bxTre+Iemw|OW&jK(+}u}^q&Y`KoB#F%d5)>;sW+6g4Z@( zC|CjL3>aZ_dP=Zmnu)I#Z9xVPUo-faj=g;Hw0(hNy zU3gu2-FV#*{0+h15xkDz4Fqo@cnd+Shua9=LGbP>Rw%D03kM>vH!qkM!t28e<%Qwb zO7I@zh5Os^K7tPre25@c%OhOnJa!`EVf@vxS6NMI^>AB#S=C7V9Yl3qE8-kj9O}$1 z3~^+e>Z;`U^Dp0jjT9+jWI1I6U3U*_{zoK_7B@LCuW!=_P%Sd`<7x40M_wW?iKpgi z5X4#gDT2=se7=;YxrEciJ!=0I6{sXAEME7`g2n75t;#MXnbja>7 zy2Jbq%Q|f6u&u+f4re-Cb9A`f;i(7oAU)U~To0ayuZO=!fJYaPZXP{6q#ns0CXX>5 z6Feq*O!AoGG0S6~$Cn;^J@$JX^f=^k#N(L9EssAtdUx#9(XZq89Zz4kJg0ju z@ND#4>bcx=wdY#T^`2jN9`QWqdBgLb=L63_Js*3%@chRM_g=h6uV62wmqX`O;8o?- z;Pt-O6t8JsAA32yKJjYw`rK=S*G8|+USE3c^7`KEkk>V@+g|^8Q{JB50p79RQtxzc zt9O<6RBxyEX76p@+r1BXANM}#ecJns_fOteysvrx=6&7!ruQE{(1-66>yzqZ^QrS0 z>C@ozw$B)!_k8B~H2UoF+2ga}T>D?l;=+9lv+|9Dc}etlw0>>3%c(X8O(Yo9#E(ZzoX?_QON4^)|hwsbx=Lhh+@VoJQ@O$!m@q_t&_+k7AeiYv!;K%Ys zd-i)34gAskclht}9el(e%OA%d&!51b#Gk^S#{Zb_~uz`TI(1OD#Zr*l?k)cHW?$6bQE z4C>3*R5;~v312K8|C zSli=VARVX(v;{f?_XOVS*`sG#&(S?U@A+d85hMyS22Bat5p=UxKrekSM}4owy^i&I z**mItUhna}xAeZ&`;Xu*!Tp0r1}_Od5&SAd5RxA=ue?9!l*EI7&pu(EHJEB82*+h zEIceSEIBMYY*<)9SW%cI%obJ>R^|vpVN1d`gdGU`KI~A~k+5T7C&EsJ{TOyO?B}p^ zVHd(4h5Z%wBZ683g?D*2=@&44wr-%hu4L_8@?!ffB41lM-c%Lp%HNr z{Uh=thDX#y)J41#F+O5)#O#PA5z8XBN1TfIJ>qd>$H<___{e_vgAq-nF47R09O)Pn zIWBTyW^RN7qGv5IrUOtLUB4H=-Xz zKZ^b<`iX!NbQ1Up_=3)Yu7d7@KtYs1;1I+L@b~uu{PD1$uOL%k6VzjDp0%H6#m!Y;xx`_fsy+k3RFj107D>8_Z zMX90zqD&DIO%#1Bnko8JG}j@TFIp*DBU&%|LbOYCSaeKuLUc-WPIN=`hv<&zo|q%{ z69_$Tol@qO{1;=jaC#V^FKBv3+0xRMT%AW5*Kk0eYI zA&Hj6O7K}8iCm(T#7Txq-jd9fd@Z>wWlJNaDbiBuIO$aB$5O{k=`86&=?dv;={o5b z(#_H@rC&+6OAkm7OOHuUO3zAvkzSBqlD?4jlts%#_?vr$EMAr<)5vtPfik1aEUT8i zB^xapBXh_;lueLLmQ9m=EZZ)-E$=Aj%Y)@|xk|2)r^qwpL*-U^gZypzSovi69QkMR z#qy={mGU(X`Fi;m@~!gy^6T=O^4s#e@(1!q^1tLyQxvllUnn*!wkm#7{Gzy^ zxU9IQ_+4>B@rUBBlB1-R9!gK8x3ZJcUm2)$1S><85y~i~QW>X=SN2n;DF-Msm4lSS zlqJe?WtFlWL2Yw8xahdp zIB}ddP9N7lE+sB4Za`dS+@QFuxa_#Gahu{U_x0)<*SEay{Jw|!{?zwe--~^(^!>H( z?|q-e6Y<>m4)LDx-tj%+L*m2YBjW|}(s)I@Dn35GUwnFeUVLTz$oTi;C&W*VpB6tO zeop-S_|M`O$1jOr6TdBfd;E_0o$Pq>wEC*gj=!-U5PPZFLd{L>HgBl~gs z(T;u{`i1t>_8Zu*rr)RiR`%Q9@0WfL5<4XJNF110l30^CF7czpNr_VvKTe#P_-W$Y z#080q5|<<{OWc^aIdN;^_9Wk=prqbOeUieH8k5#1eUY>|X=~C`HCxS9cTjt(wd#TD z!Rl;vu6l}ku6n+Dp}J9hR{g8`clAy6ZA~vtjK-nT#A^~Y8jW6)tjW^kX!0}#8l%Rn zv1%GM=e1q5q1p&-v^G{N)=IT%twxKFn`j4Xv$eU}d~K1oSX-qXrF}>Ho)&38(2m#6 z(0-zwt(~X+OuJaSM0-jHbt0WfH%Yflw?p@x?ttzG-C^AY-F4k9-5uS1-JiM_4n3{+ z)cffD^j-Ab^*!~y^x^tgd`75HZ`XgQpQ2x@->W~aKczpT|5<-tf6+h~xCVa%-wXm(O@>%45fw&!*D~bVT56VVX|SWVY*?4;S!v7$up8aO`e;)Ah|JlS@MeHRmt0uzfRtlyg&J1@{h^q zlP@J-P5v$UcJjUChslqV|4xZWNlmFw8Iv+0Wq!)SlocskQVymZN;#c!#*uO@Y~&osmoJWrmjg{pSm%1OX^ptJ5s+% z-IMxV>VecBQjeq_Pd$}-CiUmk^Qo6oucrQ%dL#9Z)VrwkYhOAAcvl@^i~mKK@j5TpsyBx&+ARa$)7rnE29wxxZYwkz%1w0&s@ z(+;H_O*@fxI_+%QFKHLjE~i~f`#tSu+U>M^X%EvLr#(q~p7u{VNGH=d>Adug>E7wS z>HPFA>D|+NruR4x-_^z`)1^ug)b>AC6o=|zro zQ@SO+CcQ3wWcsM|wdvc_zfRwk{_Ozv0N(-r13C}rHeld@!U4ts<^i?=a|e7rVC8@{ z1J)1tb-;rGe-8L-z|)MFjJ_EO8A%!1j8PfmGR9|2%$Sn#ZN{;T6B(y7&SrXKcFF9P z8JO8CGbhuMY0E6ltjJuHxi)is=Elq|nYS|k&U8G@e3AKTpmd;mpmv~PV9LPv22L6{ zW#III&VdI9{y6aLz+VPl7}RM{&q2Kgg$xQCR4}M)P{p9(gK7sYAGB%EmO)<)+A-+< zpqGPQ4TgiM!EuB84^A1JJ~(sm2ZKKz>>NC6@SMR%2cH{!VesX_*RsO0q*?MTRaSgf zZPt5POxD<}53_bSvJPhbkaZ;M_z-GHry+hr0)})Qk~yScNYN0}5bKaRLzWL&F=X|S zbwjQVxj*FLkjF!wWDBz6vg5N8vo+Zb*&k$om^~qTa`v9=quIx^Pi3FU>5$Vor)y4+ zoS>ZS9CMB}rzEF5XJO8ooOL;0H$87g-Y0pp^N!^Gl6OAuQr^{J0mDLug$|1t7Cp=~Z1}L6 zVfDk_8n$}aSHrds+c|9au*dl@pLFDN@_G4*`RVx?`GfL@cS7i1I+Eie|C z3v30$3&s?TEtpu~ELc;pso-$I)q;Bk4+|a_JSliy@UoCyNEdn(dKLy3h8BhwIwA_A z3u6o83;PwS3$=ymg#!z-3X2OZh4#X-!pg$oh3^!;SBMHfC>&onp>S5=oWl8q3kw?y zmlm!q+)%iwa7*D2g+~gH6&^1t9p zXq;l4W}I(aXlyhtGp;bMGHx|)H|{jCiWe2Hbrf$X-c2uR6(^}JZ(@xVa(?Qc=(=pR|(Mb2oFKImj$93(XR<+^jP9HS5g%&8g;ev&n2V+s!5Ba&wjW zZS%Wk#yr;iq4^{8C+6AadFIc|i_J^S8_b)`Uz)d>zcznkK4d;>K4Cs>K5PEj{JZ(4 z`L_9<`Jwrd1z1Rjg=67aI$FFeoh{ugftDbP%%Zf!S^8S~S=5#c%OFdZrNCmem@U{%DoveOVe`{xJH*2^x$||rrc6dc=C%ddhmn`m^<% z^@jBi>s{*u>m%!5Hp0fX(KZj8m(9l(XzOJQv4zLW!r|@a&7qz zTam58Hr!TY8*Lk7bJ!-^rrBoLKC#WV&9!}QTV-2o+hE&d+hY6Hw$FCZcF1gA$E~nYFF6f>dZ&$SP; zm)OhgRrVTty?vzpefv23NA^i}$5i`t`vUt$`xg6G_8s!%uphA>xBq6p zVZUX+ZNF=OV1H!)%l^dv-2T%3s-$~K-x6a9Dp^)?sN`O$XQ`kxwKS_Vr!=oLztmb< zRa#S8U;0+*=+bveKPsJ4I=$3cI=ggU>1U;jO81stF1=IwsPymBXQeO8$TE(jj91pN z%&SaTW-gmlHnVJT+2*pXWxLCclwB^nR(8MaaoLly=jE(&qMTjMEe|LUDUT?RE{`pj zmMhBR%Hzw^%5%%}%ZtiQ<<@e0`H1q#Gt^9uZ-{sHBUsgC+6`TrQMaK&7icS@hii(Pv6^kpDSFEg9Q}IQ` z=8CNq+bZ@}oU8b?;&#R3iYJwzl3Ural3&@gvUg={rLU}SQdPxQ^{Z-dRBf($ zFueQlyx|*%Ul{)T@O#4_4u4)vR&%PotGiTpukKSFQ!T2FtJYQ>J8QVst;8EP<^=iX!VKe)759If2qDueYyH- z^_?2BrbmsuCZ(phW@L?{W@gQrnr~{3*E)P^18N1e(%Qt@VeUbuo3qx`aAiUH`h&x&d`V z>W0=0t1GNC)_qj>W!=@fKkDw(J*x-xWId;zSMO8rS07N{wZ40OpZe%}S%a>jf5VWB z22+Ezp`@X_p{k*#p}v7>7~Ak+!-R&(4bvKCG|X(+)^KqYca(Tk-%+|z14a#O?%m?! RwM~C`Q=0#6`8lfo{{U`p^V|Rc delta 16244 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 Date: Sat, 8 Jun 2024 20:04:17 -0400 Subject: [PATCH 5/8] add/remove targets --- .github/workflows/coreaudio-rs.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/coreaudio-rs.yml b/.github/workflows/coreaudio-rs.yml index aa46c86b3..17de3ecc7 100644 --- a/.github/workflows/coreaudio-rs.yml +++ b/.github/workflows/coreaudio-rs.yml @@ -43,7 +43,7 @@ jobs: with: toolchain: stable - name: Add iOS targets - run: rustup target add aarch64-apple-ios x86_64-apple-ios + run: rustup target add aarch64-apple-ios aarch64-apple-ios-sim x86_64-apple-ios x86_64-apple-ios-sim - name: Build iphonesimulator feedback example run: cd examples/ios && xcodebuild ONLY_ACTIVE_ARCH=NO ARCHS=arm64 -scheme coreaudio-ios-example -configuration Debug -derivedDataPath build -sdk iphonesimulator @@ -54,8 +54,6 @@ jobs: - uses: dtolnay/rust-toolchain@nightly with: profile: minimal - - name: Add visionOS targets - run: rustup target add aarch64-apple-visionos - name: Build xrsimulator feedback example run: cd examples/ios && xcodebuild ONLY_ACTIVE_ARCH=NO ARCHS=arm64 -scheme coreaudio-ios-example -configuration Debug -derivedDataPath build -sdk xrsimulator From 052f541c66456cbd5258986fb80f129f2f7372d9 Mon Sep 17 00:00:00 2001 From: Eugene Hauptmann Date: Sat, 8 Jun 2024 20:05:09 -0400 Subject: [PATCH 6/8] comment out sine run on CI --- .github/workflows/coreaudio-rs.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/coreaudio-rs.yml b/.github/workflows/coreaudio-rs.yml index 17de3ecc7..d2345c183 100644 --- a/.github/workflows/coreaudio-rs.yml +++ b/.github/workflows/coreaudio-rs.yml @@ -14,8 +14,10 @@ jobs: toolchain: stable - name: cargo test run: cargo test --verbose - - name: Run sine example - run: cargo run --example sine + + # TODO: don't run on CI, it loops. Works fine locally. + # - name: Run sine example + # run: cargo run --example sine # TODO: These don't work as of 2020-12-06, but they should. # - name: cargo test - no features From 460eea142048dc2190140e49cf5ccc3985227804 Mon Sep 17 00:00:00 2001 From: Eugene Hauptmann Date: Sat, 8 Jun 2024 20:08:39 -0400 Subject: [PATCH 7/8] added Xcode_15.4 --- .github/workflows/coreaudio-rs.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/coreaudio-rs.yml b/.github/workflows/coreaudio-rs.yml index d2345c183..7cc426698 100644 --- a/.github/workflows/coreaudio-rs.yml +++ b/.github/workflows/coreaudio-rs.yml @@ -45,7 +45,7 @@ jobs: with: toolchain: stable - name: Add iOS targets - run: rustup target add aarch64-apple-ios aarch64-apple-ios-sim x86_64-apple-ios x86_64-apple-ios-sim + run: rustup target add aarch64-apple-ios aarch64-apple-ios-sim x86_64-apple-ios - name: Build iphonesimulator feedback example run: cd examples/ios && xcodebuild ONLY_ACTIVE_ARCH=NO ARCHS=arm64 -scheme coreaudio-ios-example -configuration Debug -derivedDataPath build -sdk iphonesimulator @@ -56,6 +56,9 @@ jobs: - uses: dtolnay/rust-toolchain@nightly with: profile: minimal + # select Xcode with visionOS support that has xrsimulator SDK installed + - name: Install Xcode Command Line Tools + run: sudo xcode-select --switch /Applications/Xcode_15.4.app/Contents/Developer - name: Build xrsimulator feedback example run: cd examples/ios && xcodebuild ONLY_ACTIVE_ARCH=NO ARCHS=arm64 -scheme coreaudio-ios-example -configuration Debug -derivedDataPath build -sdk xrsimulator From e93d97dab0172ef0e2d3507c4cb34599491ae2c1 Mon Sep 17 00:00:00 2001 From: Eugene Hauptmann Date: Sat, 8 Jun 2024 20:11:05 -0400 Subject: [PATCH 8/8] add rust-src component to rust nightly toolchain --- .github/workflows/coreaudio-rs.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/coreaudio-rs.yml b/.github/workflows/coreaudio-rs.yml index 7cc426698..163306367 100644 --- a/.github/workflows/coreaudio-rs.yml +++ b/.github/workflows/coreaudio-rs.yml @@ -53,9 +53,11 @@ jobs: runs-on: macOS-latest steps: - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@nightly + - uses: dtolnay/rust-toolchain@master with: profile: minimal + toolchain: nightly + components: rust-src # select Xcode with visionOS support that has xrsimulator SDK installed - name: Install Xcode Command Line Tools run: sudo xcode-select --switch /Applications/Xcode_15.4.app/Contents/Developer