diff --git a/packages/react-native-vision-camera/ios/Hybrid Objects/HybridCameraSession.swift b/packages/react-native-vision-camera/ios/Hybrid Objects/HybridCameraSession.swift index 664d1c8d36..f06d05ea2a 100644 --- a/packages/react-native-vision-camera/ios/Hybrid Objects/HybridCameraSession.swift +++ b/packages/react-native-vision-camera/ios/Hybrid Objects/HybridCameraSession.swift @@ -34,7 +34,7 @@ final class HybridCameraSession: HybridCameraSessionSpec { } // pragma MARK: Configuration - func configure(connections: [CameraSessionConnection], config: CameraSessionConfiguration?) + func configure(connections: [CameraSessionConnection], config: CameraSessionConfiguration) -> Promise<[any HybridCameraControllerSpec]> { return Promise.parallel(Self.queue) { @@ -90,19 +90,8 @@ final class HybridCameraSession: HybridCameraSessionSpec { } self.session.automaticallyConfiguresCaptureDeviceForWideColor = !hasCustomDynamicRangeConstraint - // Haptics and System Sounds Playback - if let allowHapticsAndSystemSoundsPlayback = config?.allowHapticsAndSystemSoundsPlayback { - let audioSession = AVAudioSession.sharedInstance() - if audioSession.allowHapticsAndSystemSoundsDuringRecording != allowHapticsAndSystemSoundsPlayback { - try audioSession.setAllowHapticsAndSystemSoundsDuringRecording(allowHapticsAndSystemSoundsPlayback) - } - } - // Background Audio Playback - if #available(iOS 18.0, *) { - if let allowBackgroundAudioPlayback = config?.allowBackgroundAudioPlayback { - self.session.configuresApplicationAudioSessionToMixWithOthers = allowBackgroundAudioPlayback - } - } + // Audio Session configuration + try self.configureAudioSession(config: config) // Return CameraControllers per connection to adjust camera settings (focus, etc) return try connections.map { connection in @@ -207,6 +196,32 @@ final class HybridCameraSession: HybridCameraSessionSpec { } } } + + private func configureAudioSession(config: CameraSessionConfiguration) throws { + switch config.audioConfiguration { + case .first(let automaticConfig): + // Automatic + self.session.automaticallyConfiguresApplicationAudioSession = true + if #available(iOS 18.0, *) { + if self.session.configuresApplicationAudioSessionToMixWithOthers != automaticConfig.allowBackgroundAudioPlayback { + self.session.configuresApplicationAudioSessionToMixWithOthers = automaticConfig.allowBackgroundAudioPlayback + } + } + case .second(let manualConfig): + // Manual + self.session.automaticallyConfiguresApplicationAudioSession = false + let audioSession = AVAudioSession.sharedInstance() + let category: AVAudioSession.Category = manualConfig.allowBackgroundAudioPlayback ? .playAndRecord : .record + try audioSession.setCategory(category, + mode: .videoRecording, + options: [.allowAirPlay]) + if audioSession.allowHapticsAndSystemSoundsDuringRecording != manualConfig.allowHapticsAndSystemSoundsPlayback { + try audioSession.setAllowHapticsAndSystemSoundsDuringRecording(manualConfig.allowHapticsAndSystemSoundsPlayback) + } + case .none: + // No config set + } + } // pragma MARK: Start/Stop func start() -> Promise { diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/VisionCamera+autolinking.cmake b/packages/react-native-vision-camera/nitrogen/generated/android/VisionCamera+autolinking.cmake index 4dcb7a1d87..7af0fabf3c 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/VisionCamera+autolinking.cmake +++ b/packages/react-native-vision-camera/nitrogen/generated/android/VisionCamera+autolinking.cmake @@ -108,6 +108,7 @@ target_sources( ../nitrogen/generated/android/c++/JHybridRecorderSpec.cpp ../nitrogen/generated/android/c++/JHybridCameraSessionSpec.cpp ../nitrogen/generated/android/c++/JCameraDeviceOrPosition.cpp + ../nitrogen/generated/android/c++/JVariant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration.cpp ../nitrogen/generated/android/c++/JHybridCameraSessionConfigSpec.cpp ../nitrogen/generated/android/c++/JHybridFrameConverterSpec.cpp ../nitrogen/generated/android/c++/JHybridFrameRendererViewSpec.cpp diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JAutomaticAudioSessionConfiguration.hpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JAutomaticAudioSessionConfiguration.hpp new file mode 100644 index 0000000000..a4702b8a0d --- /dev/null +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JAutomaticAudioSessionConfiguration.hpp @@ -0,0 +1,57 @@ +/// +/// JAutomaticAudioSessionConfiguration.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © Marc Rousavy @ Margelo +/// + +#pragma once + +#include +#include "AutomaticAudioSessionConfiguration.hpp" + + + +namespace margelo::nitro::camera { + + using namespace facebook; + + /** + * The C++ JNI bridge between the C++ struct "AutomaticAudioSessionConfiguration" and the Kotlin data class "AutomaticAudioSessionConfiguration". + */ + struct JAutomaticAudioSessionConfiguration final: public jni::JavaClass { + public: + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/camera/AutomaticAudioSessionConfiguration;"; + + public: + /** + * Convert this Java/Kotlin-based struct to the C++ struct AutomaticAudioSessionConfiguration by copying all values to C++. + */ + [[maybe_unused]] + [[nodiscard]] + AutomaticAudioSessionConfiguration toCpp() const { + static const auto clazz = javaClassStatic(); + static const auto fieldAllowBackgroundAudioPlayback = clazz->getField("allowBackgroundAudioPlayback"); + jboolean allowBackgroundAudioPlayback = this->getFieldValue(fieldAllowBackgroundAudioPlayback); + return AutomaticAudioSessionConfiguration( + static_cast(allowBackgroundAudioPlayback) + ); + } + + public: + /** + * Create a Java/Kotlin-based struct by copying all values from the given C++ struct to Java. + */ + [[maybe_unused]] + static jni::local_ref fromCpp(const AutomaticAudioSessionConfiguration& value) { + using JSignature = JAutomaticAudioSessionConfiguration(jboolean); + static const auto clazz = javaClassStatic(); + static const auto create = clazz->getStaticMethod("fromCpp"); + return create( + clazz, + value.allowBackgroundAudioPlayback + ); + } + }; + +} // namespace margelo::nitro::camera diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JCameraSessionConfiguration.hpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JCameraSessionConfiguration.hpp index f83ed63463..176f169149 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JCameraSessionConfiguration.hpp +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JCameraSessionConfiguration.hpp @@ -10,7 +10,13 @@ #include #include "CameraSessionConfiguration.hpp" +#include "AutomaticAudioSessionConfiguration.hpp" +#include "JAutomaticAudioSessionConfiguration.hpp" +#include "JManualAudioSessionConfiguration.hpp" +#include "JVariant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration.hpp" +#include "ManualAudioSessionConfiguration.hpp" #include +#include namespace margelo::nitro::camera { @@ -31,13 +37,10 @@ namespace margelo::nitro::camera { [[nodiscard]] CameraSessionConfiguration toCpp() const { static const auto clazz = javaClassStatic(); - static const auto fieldAllowHapticsAndSystemSoundsPlayback = clazz->getField("allowHapticsAndSystemSoundsPlayback"); - jni::local_ref allowHapticsAndSystemSoundsPlayback = this->getFieldValue(fieldAllowHapticsAndSystemSoundsPlayback); - static const auto fieldAllowBackgroundAudioPlayback = clazz->getField("allowBackgroundAudioPlayback"); - jni::local_ref allowBackgroundAudioPlayback = this->getFieldValue(fieldAllowBackgroundAudioPlayback); + static const auto fieldAudioConfiguration = clazz->getField("audioConfiguration"); + jni::local_ref audioConfiguration = this->getFieldValue(fieldAudioConfiguration); return CameraSessionConfiguration( - allowHapticsAndSystemSoundsPlayback != nullptr ? std::make_optional(static_cast(allowHapticsAndSystemSoundsPlayback->value())) : std::nullopt, - allowBackgroundAudioPlayback != nullptr ? std::make_optional(static_cast(allowBackgroundAudioPlayback->value())) : std::nullopt + audioConfiguration != nullptr ? std::make_optional(audioConfiguration->toCpp()) : std::nullopt ); } @@ -47,13 +50,12 @@ namespace margelo::nitro::camera { */ [[maybe_unused]] static jni::local_ref fromCpp(const CameraSessionConfiguration& value) { - using JSignature = JCameraSessionConfiguration(jni::alias_ref, jni::alias_ref); + using JSignature = JCameraSessionConfiguration(jni::alias_ref); static const auto clazz = javaClassStatic(); static const auto create = clazz->getStaticMethod("fromCpp"); return create( clazz, - value.allowHapticsAndSystemSoundsPlayback.has_value() ? jni::JBoolean::valueOf(value.allowHapticsAndSystemSoundsPlayback.value()) : nullptr, - value.allowBackgroundAudioPlayback.has_value() ? jni::JBoolean::valueOf(value.allowBackgroundAudioPlayback.value()) : nullptr + value.audioConfiguration.has_value() ? JVariant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration::fromCpp(value.audioConfiguration.value()) : nullptr ); } }; diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraSessionSpec.cpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraSessionSpec.cpp index 28013c89eb..acfdf2dc81 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraSessionSpec.cpp +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraSessionSpec.cpp @@ -55,6 +55,10 @@ namespace margelo::nitro::camera { enum class PixelFormat; } namespace margelo::nitro::camera { class HybridCameraSessionConfigSpec; } // Forward declaration of `CameraSessionConfiguration` to properly resolve imports. namespace margelo::nitro::camera { struct CameraSessionConfiguration; } +// Forward declaration of `AutomaticAudioSessionConfiguration` to properly resolve imports. +namespace margelo::nitro::camera { struct AutomaticAudioSessionConfiguration; } +// Forward declaration of `ManualAudioSessionConfiguration` to properly resolve imports. +namespace margelo::nitro::camera { struct ManualAudioSessionConfiguration; } // Forward declaration of `InterruptionReason` to properly resolve imports. namespace margelo::nitro::camera { enum class InterruptionReason; } @@ -119,6 +123,11 @@ namespace margelo::nitro::camera { enum class InterruptionReason; } #include "JHybridCameraSessionConfigSpec.hpp" #include "CameraSessionConfiguration.hpp" #include "JCameraSessionConfiguration.hpp" +#include "AutomaticAudioSessionConfiguration.hpp" +#include "ManualAudioSessionConfiguration.hpp" +#include "JVariant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration.hpp" +#include "JAutomaticAudioSessionConfiguration.hpp" +#include "JManualAudioSessionConfiguration.hpp" #include #include "JFunc_void_std__exception_ptr.hpp" #include "InterruptionReason.hpp" @@ -162,7 +171,7 @@ namespace margelo::nitro::camera { } // Methods - std::shared_ptr>>> JHybridCameraSessionSpec::configure(const std::vector& connections, const std::optional& config) { + std::shared_ptr>>> JHybridCameraSessionSpec::configure(const std::vector& connections, const CameraSessionConfiguration& config) { static const auto method = _javaPart->javaClassStatic()->getMethod(jni::alias_ref> /* connections */, jni::alias_ref /* config */)>("configure"); auto __result = method(_javaPart, [&](auto&& __input) { size_t __size = __input.size(); @@ -173,7 +182,7 @@ namespace margelo::nitro::camera { __array->setElement(__i, *__elementJni); } return __array; - }(connections), config.has_value() ? JCameraSessionConfiguration::fromCpp(config.value()) : nullptr); + }(connections), JCameraSessionConfiguration::fromCpp(config)); return [&]() { auto __promise = Promise>>::create(); __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& __boxedResult) { diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraSessionSpec.hpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraSessionSpec.hpp index 23bb626f59..1b33c49a11 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraSessionSpec.hpp +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraSessionSpec.hpp @@ -54,7 +54,7 @@ namespace margelo::nitro::camera { public: // Methods - std::shared_ptr>>> configure(const std::vector& connections, const std::optional& config) override; + std::shared_ptr>>> configure(const std::vector& connections, const CameraSessionConfiguration& config) override; std::shared_ptr> start() override; std::shared_ptr> stop() override; ListenerSubscription addOnStartedListener(const std::function& onStarted) override; diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JManualAudioSessionConfiguration.hpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JManualAudioSessionConfiguration.hpp new file mode 100644 index 0000000000..59a84c7323 --- /dev/null +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JManualAudioSessionConfiguration.hpp @@ -0,0 +1,61 @@ +/// +/// JManualAudioSessionConfiguration.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © Marc Rousavy @ Margelo +/// + +#pragma once + +#include +#include "ManualAudioSessionConfiguration.hpp" + + + +namespace margelo::nitro::camera { + + using namespace facebook; + + /** + * The C++ JNI bridge between the C++ struct "ManualAudioSessionConfiguration" and the Kotlin data class "ManualAudioSessionConfiguration". + */ + struct JManualAudioSessionConfiguration final: public jni::JavaClass { + public: + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/camera/ManualAudioSessionConfiguration;"; + + public: + /** + * Convert this Java/Kotlin-based struct to the C++ struct ManualAudioSessionConfiguration by copying all values to C++. + */ + [[maybe_unused]] + [[nodiscard]] + ManualAudioSessionConfiguration toCpp() const { + static const auto clazz = javaClassStatic(); + static const auto fieldAllowHapticsAndSystemSoundsPlayback = clazz->getField("allowHapticsAndSystemSoundsPlayback"); + jboolean allowHapticsAndSystemSoundsPlayback = this->getFieldValue(fieldAllowHapticsAndSystemSoundsPlayback); + static const auto fieldAllowBackgroundAudioPlayback = clazz->getField("allowBackgroundAudioPlayback"); + jboolean allowBackgroundAudioPlayback = this->getFieldValue(fieldAllowBackgroundAudioPlayback); + return ManualAudioSessionConfiguration( + static_cast(allowHapticsAndSystemSoundsPlayback), + static_cast(allowBackgroundAudioPlayback) + ); + } + + public: + /** + * Create a Java/Kotlin-based struct by copying all values from the given C++ struct to Java. + */ + [[maybe_unused]] + static jni::local_ref fromCpp(const ManualAudioSessionConfiguration& value) { + using JSignature = JManualAudioSessionConfiguration(jboolean, jboolean); + static const auto clazz = javaClassStatic(); + static const auto create = clazz->getStaticMethod("fromCpp"); + return create( + clazz, + value.allowHapticsAndSystemSoundsPlayback, + value.allowBackgroundAudioPlayback + ); + } + }; + +} // namespace margelo::nitro::camera diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JVariant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration.cpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JVariant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration.cpp new file mode 100644 index 0000000000..f8c0ae0005 --- /dev/null +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JVariant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration.cpp @@ -0,0 +1,26 @@ +/// +/// JVariant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration.cpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © Marc Rousavy @ Margelo +/// + +#include "JVariant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration.hpp" + +namespace margelo::nitro::camera { + /** + * Converts JVariant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration to std::variant + */ + std::variant JVariant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration::toCpp() const { + if (isInstanceOf(JVariant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration_impl::First::javaClassStatic())) { + // It's a `AutomaticAudioSessionConfiguration` + auto jniValue = static_cast(this)->getValue(); + return jniValue->toCpp(); + } else if (isInstanceOf(JVariant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration_impl::Second::javaClassStatic())) { + // It's a `ManualAudioSessionConfiguration` + auto jniValue = static_cast(this)->getValue(); + return jniValue->toCpp(); + } + throw std::invalid_argument("Variant is unknown Kotlin instance!"); + } +} // namespace margelo::nitro::camera diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JVariant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration.hpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JVariant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration.hpp new file mode 100644 index 0000000000..fe91d1d737 --- /dev/null +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JVariant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration.hpp @@ -0,0 +1,71 @@ +/// +/// JVariant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © Marc Rousavy @ Margelo +/// + +#pragma once + +#include +#include + +#include "AutomaticAudioSessionConfiguration.hpp" +#include "ManualAudioSessionConfiguration.hpp" +#include +#include "JAutomaticAudioSessionConfiguration.hpp" +#include "JManualAudioSessionConfiguration.hpp" + +namespace margelo::nitro::camera { + + using namespace facebook; + + /** + * The C++ JNI bridge between the C++ std::variant and the Java class "Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration". + */ + class JVariant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration: public jni::JavaClass { + public: + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/camera/Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration;"; + + static jni::local_ref create_0(jni::alias_ref value) { + static const auto method = javaClassStatic()->getStaticMethod)>("create"); + return method(javaClassStatic(), value); + } + static jni::local_ref create_1(jni::alias_ref value) { + static const auto method = javaClassStatic()->getStaticMethod)>("create"); + return method(javaClassStatic(), value); + } + + static jni::local_ref fromCpp(const std::variant& variant) { + switch (variant.index()) { + case 0: return create_0(JAutomaticAudioSessionConfiguration::fromCpp(std::get<0>(variant))); + case 1: return create_1(JManualAudioSessionConfiguration::fromCpp(std::get<1>(variant))); + default: throw std::invalid_argument("Variant holds unknown index! (" + std::to_string(variant.index()) + ")"); + } + } + + [[nodiscard]] std::variant toCpp() const; + }; + + namespace JVariant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration_impl { + class First final: public jni::JavaClass { + public: + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/camera/Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration$First;"; + + [[nodiscard]] jni::local_ref getValue() const { + static const auto field = javaClassStatic()->getField("value"); + return getFieldValue(field); + } + }; + + class Second final: public jni::JavaClass { + public: + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/camera/Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration$Second;"; + + [[nodiscard]] jni::local_ref getValue() const { + static const auto field = javaClassStatic()->getField("value"); + return getFieldValue(field); + } + }; + } // namespace JVariant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration_impl +} // namespace margelo::nitro::camera diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/kotlin/com/margelo/nitro/camera/AutomaticAudioSessionConfiguration.kt b/packages/react-native-vision-camera/nitrogen/generated/android/kotlin/com/margelo/nitro/camera/AutomaticAudioSessionConfiguration.kt new file mode 100644 index 0000000000..58c05685e8 --- /dev/null +++ b/packages/react-native-vision-camera/nitrogen/generated/android/kotlin/com/margelo/nitro/camera/AutomaticAudioSessionConfiguration.kt @@ -0,0 +1,51 @@ +/// +/// AutomaticAudioSessionConfiguration.kt +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © Marc Rousavy @ Margelo +/// + +package com.margelo.nitro.camera + +import androidx.annotation.Keep +import com.facebook.proguard.annotations.DoNotStrip +import java.util.Objects + + +/** + * Represents the JavaScript object/struct "AutomaticAudioSessionConfiguration". + */ +@DoNotStrip +@Keep +data class AutomaticAudioSessionConfiguration( + @DoNotStrip + @Keep + val allowBackgroundAudioPlayback: Boolean +) { + /* primary constructor */ + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is AutomaticAudioSessionConfiguration) return false + return Objects.deepEquals(this.allowBackgroundAudioPlayback, other.allowBackgroundAudioPlayback) + } + + override fun hashCode(): Int { + return arrayOf( + allowBackgroundAudioPlayback + ).contentDeepHashCode() + } + + companion object { + /** + * Constructor called from C++ + */ + @DoNotStrip + @Keep + @Suppress("unused") + @JvmStatic + private fun fromCpp(allowBackgroundAudioPlayback: Boolean): AutomaticAudioSessionConfiguration { + return AutomaticAudioSessionConfiguration(allowBackgroundAudioPlayback) + } + } +} diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/kotlin/com/margelo/nitro/camera/CameraSessionConfiguration.kt b/packages/react-native-vision-camera/nitrogen/generated/android/kotlin/com/margelo/nitro/camera/CameraSessionConfiguration.kt index 471fc882ff..1242d84055 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/kotlin/com/margelo/nitro/camera/CameraSessionConfiguration.kt +++ b/packages/react-native-vision-camera/nitrogen/generated/android/kotlin/com/margelo/nitro/camera/CameraSessionConfiguration.kt @@ -20,24 +20,19 @@ import java.util.Objects data class CameraSessionConfiguration( @DoNotStrip @Keep - val allowHapticsAndSystemSoundsPlayback: Boolean?, - @DoNotStrip - @Keep - val allowBackgroundAudioPlayback: Boolean? + val audioConfiguration: Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration? ) { /* primary constructor */ override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is CameraSessionConfiguration) return false - return Objects.deepEquals(this.allowHapticsAndSystemSoundsPlayback, other.allowHapticsAndSystemSoundsPlayback) - && Objects.deepEquals(this.allowBackgroundAudioPlayback, other.allowBackgroundAudioPlayback) + return Objects.deepEquals(this.audioConfiguration, other.audioConfiguration) } override fun hashCode(): Int { return arrayOf( - allowHapticsAndSystemSoundsPlayback, - allowBackgroundAudioPlayback + audioConfiguration ).contentDeepHashCode() } @@ -49,8 +44,8 @@ data class CameraSessionConfiguration( @Keep @Suppress("unused") @JvmStatic - private fun fromCpp(allowHapticsAndSystemSoundsPlayback: Boolean?, allowBackgroundAudioPlayback: Boolean?): CameraSessionConfiguration { - return CameraSessionConfiguration(allowHapticsAndSystemSoundsPlayback, allowBackgroundAudioPlayback) + private fun fromCpp(audioConfiguration: Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration?): CameraSessionConfiguration { + return CameraSessionConfiguration(audioConfiguration) } } } diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/kotlin/com/margelo/nitro/camera/HybridCameraSessionSpec.kt b/packages/react-native-vision-camera/nitrogen/generated/android/kotlin/com/margelo/nitro/camera/HybridCameraSessionSpec.kt index 49560f087b..712af0592c 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/kotlin/com/margelo/nitro/camera/HybridCameraSessionSpec.kt +++ b/packages/react-native-vision-camera/nitrogen/generated/android/kotlin/com/margelo/nitro/camera/HybridCameraSessionSpec.kt @@ -34,7 +34,7 @@ abstract class HybridCameraSessionSpec: HybridObject() { // Methods @DoNotStrip @Keep - abstract fun configure(connections: Array, config: CameraSessionConfiguration?): Promise> + abstract fun configure(connections: Array, config: CameraSessionConfiguration): Promise> @DoNotStrip @Keep diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/kotlin/com/margelo/nitro/camera/ManualAudioSessionConfiguration.kt b/packages/react-native-vision-camera/nitrogen/generated/android/kotlin/com/margelo/nitro/camera/ManualAudioSessionConfiguration.kt new file mode 100644 index 0000000000..cb40df930e --- /dev/null +++ b/packages/react-native-vision-camera/nitrogen/generated/android/kotlin/com/margelo/nitro/camera/ManualAudioSessionConfiguration.kt @@ -0,0 +1,56 @@ +/// +/// ManualAudioSessionConfiguration.kt +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © Marc Rousavy @ Margelo +/// + +package com.margelo.nitro.camera + +import androidx.annotation.Keep +import com.facebook.proguard.annotations.DoNotStrip +import java.util.Objects + + +/** + * Represents the JavaScript object/struct "ManualAudioSessionConfiguration". + */ +@DoNotStrip +@Keep +data class ManualAudioSessionConfiguration( + @DoNotStrip + @Keep + val allowHapticsAndSystemSoundsPlayback: Boolean, + @DoNotStrip + @Keep + val allowBackgroundAudioPlayback: Boolean +) { + /* primary constructor */ + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is ManualAudioSessionConfiguration) return false + return Objects.deepEquals(this.allowHapticsAndSystemSoundsPlayback, other.allowHapticsAndSystemSoundsPlayback) + && Objects.deepEquals(this.allowBackgroundAudioPlayback, other.allowBackgroundAudioPlayback) + } + + override fun hashCode(): Int { + return arrayOf( + allowHapticsAndSystemSoundsPlayback, + allowBackgroundAudioPlayback + ).contentDeepHashCode() + } + + companion object { + /** + * Constructor called from C++ + */ + @DoNotStrip + @Keep + @Suppress("unused") + @JvmStatic + private fun fromCpp(allowHapticsAndSystemSoundsPlayback: Boolean, allowBackgroundAudioPlayback: Boolean): ManualAudioSessionConfiguration { + return ManualAudioSessionConfiguration(allowHapticsAndSystemSoundsPlayback, allowBackgroundAudioPlayback) + } + } +} diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/kotlin/com/margelo/nitro/camera/Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration.kt b/packages/react-native-vision-camera/nitrogen/generated/android/kotlin/com/margelo/nitro/camera/Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration.kt new file mode 100644 index 0000000000..66c7abb960 --- /dev/null +++ b/packages/react-native-vision-camera/nitrogen/generated/android/kotlin/com/margelo/nitro/camera/Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration.kt @@ -0,0 +1,62 @@ +/// +/// Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration.kt +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © Marc Rousavy @ Margelo +/// + +package com.margelo.nitro.camera + +import com.facebook.proguard.annotations.DoNotStrip + + +/** + * Represents the TypeScript variant "AutomaticAudioSessionConfiguration | ManualAudioSessionConfiguration". + */ +@Suppress("ClassName") +@DoNotStrip +sealed class Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration { + @DoNotStrip + data class First(@DoNotStrip val value: AutomaticAudioSessionConfiguration): Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration() + @DoNotStrip + data class Second(@DoNotStrip val value: ManualAudioSessionConfiguration): Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration() + + inline fun asType(): T? { + return when (this) { + is First -> (value) as? T + is Second -> (value) as? T + } + } + inline fun isType(): Boolean { + return asType() != null + } + inline fun match(first: (AutomaticAudioSessionConfiguration) -> R, second: (ManualAudioSessionConfiguration) -> R): R { + return when (this) { + is First -> first(value) + is Second -> second(value) + } + } + + val isFirst: Boolean + get() = this is First + val isSecond: Boolean + get() = this is Second + + fun asFirstOrNull(): AutomaticAudioSessionConfiguration? { + val value = (this as? First)?.value ?: return null + return value + } + fun asSecondOrNull(): ManualAudioSessionConfiguration? { + val value = (this as? Second)?.value ?: return null + return value + } + + companion object { + @JvmStatic + @DoNotStrip + fun create(value: AutomaticAudioSessionConfiguration): Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration = First(value) + @JvmStatic + @DoNotStrip + fun create(value: ManualAudioSessionConfiguration): Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration = Second(value) + } +} diff --git a/packages/react-native-vision-camera/nitrogen/generated/ios/VisionCamera-Swift-Cxx-Bridge.hpp b/packages/react-native-vision-camera/nitrogen/generated/ios/VisionCamera-Swift-Cxx-Bridge.hpp index 9cbee63205..9887dc1819 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/ios/VisionCamera-Swift-Cxx-Bridge.hpp +++ b/packages/react-native-vision-camera/nitrogen/generated/ios/VisionCamera-Swift-Cxx-Bridge.hpp @@ -10,14 +10,14 @@ // Forward declarations of C++ defined types // Forward declaration of `ArrayBufferHolder` to properly resolve imports. namespace NitroModules { class ArrayBufferHolder; } +// Forward declaration of `AutomaticAudioSessionConfiguration` to properly resolve imports. +namespace margelo::nitro::camera { struct AutomaticAudioSessionConfiguration; } // Forward declaration of `BinnedConstraint` to properly resolve imports. namespace margelo::nitro::camera { struct BinnedConstraint; } // Forward declaration of `CameraOrientation` to properly resolve imports. namespace margelo::nitro::camera { enum class CameraOrientation; } // Forward declaration of `CameraOutputConfiguration` to properly resolve imports. namespace margelo::nitro::camera { struct CameraOutputConfiguration; } -// Forward declaration of `CameraSessionConfiguration` to properly resolve imports. -namespace margelo::nitro::camera { struct CameraSessionConfiguration; } // Forward declaration of `CameraSessionConnection` to properly resolve imports. namespace margelo::nitro::camera { struct CameraSessionConnection; } // Forward declaration of `CapturePhotoSettings` to properly resolve imports. @@ -118,6 +118,8 @@ namespace margelo::nitro::camera { class HybridZoomGestureControllerSpec; } namespace margelo::nitro::camera { enum class InterruptionReason; } // Forward declaration of `ListenerSubscription` to properly resolve imports. namespace margelo::nitro::camera { struct ListenerSubscription; } +// Forward declaration of `ManualAudioSessionConfiguration` to properly resolve imports. +namespace margelo::nitro::camera { struct ManualAudioSessionConfiguration; } // Forward declaration of `MediaType` to properly resolve imports. namespace margelo::nitro::camera { enum class MediaType; } // Forward declaration of `MeteringMode` to properly resolve imports. @@ -254,10 +256,10 @@ namespace VisionCamera { class HybridTapToFocusGestureControllerSpec_cxx; } namespace VisionCamera { class HybridZoomGestureControllerSpec_cxx; } // Include C++ defined types +#include "AutomaticAudioSessionConfiguration.hpp" #include "BinnedConstraint.hpp" #include "CameraOrientation.hpp" #include "CameraOutputConfiguration.hpp" -#include "CameraSessionConfiguration.hpp" #include "CameraSessionConnection.hpp" #include "CapturePhotoSettings.hpp" #include "ColorRange.hpp" @@ -307,6 +309,7 @@ namespace VisionCamera { class HybridZoomGestureControllerSpec_cxx; } #include "HybridZoomGestureControllerSpec.hpp" #include "InterruptionReason.hpp" #include "ListenerSubscription.hpp" +#include "ManualAudioSessionConfiguration.hpp" #include "MediaType.hpp" #include "MeteringMode.hpp" #include "MirrorMode.hpp" @@ -2707,18 +2710,47 @@ namespace margelo::nitro::camera::bridge::swift { return vector; } - // pragma MARK: std::optional + // pragma MARK: std::variant /** - * Specialized version of `std::optional`. + * Wrapper struct for `std::variant`. + * std::variant cannot be used in Swift because of a Swift bug. + * Not even specializing it works. So we create a wrapper struct. + */ + struct std__variant_AutomaticAudioSessionConfiguration__ManualAudioSessionConfiguration_ final { + std::variant variant; + std__variant_AutomaticAudioSessionConfiguration__ManualAudioSessionConfiguration_(std::variant variant): variant(variant) { } + operator std::variant() const noexcept { + return variant; + } + inline size_t index() const noexcept { + return variant.index(); + } + inline AutomaticAudioSessionConfiguration get_0() const noexcept { + return std::get<0>(variant); + } + inline ManualAudioSessionConfiguration get_1() const noexcept { + return std::get<1>(variant); + } + }; + inline std__variant_AutomaticAudioSessionConfiguration__ManualAudioSessionConfiguration_ create_std__variant_AutomaticAudioSessionConfiguration__ManualAudioSessionConfiguration_(const AutomaticAudioSessionConfiguration& value) noexcept { + return std__variant_AutomaticAudioSessionConfiguration__ManualAudioSessionConfiguration_(value); + } + inline std__variant_AutomaticAudioSessionConfiguration__ManualAudioSessionConfiguration_ create_std__variant_AutomaticAudioSessionConfiguration__ManualAudioSessionConfiguration_(const ManualAudioSessionConfiguration& value) noexcept { + return std__variant_AutomaticAudioSessionConfiguration__ManualAudioSessionConfiguration_(value); + } + + // pragma MARK: std::optional> + /** + * Specialized version of `std::optional>`. */ - using std__optional_CameraSessionConfiguration_ = std::optional; - inline std::optional create_std__optional_CameraSessionConfiguration_(const CameraSessionConfiguration& value) noexcept { - return std::optional(value); + using std__optional_std__variant_AutomaticAudioSessionConfiguration__ManualAudioSessionConfiguration__ = std::optional>; + inline std::optional> create_std__optional_std__variant_AutomaticAudioSessionConfiguration__ManualAudioSessionConfiguration__(const std::variant& value) noexcept { + return std::optional>(value); } - inline bool has_value_std__optional_CameraSessionConfiguration_(const std::optional& optional) noexcept { + inline bool has_value_std__optional_std__variant_AutomaticAudioSessionConfiguration__ManualAudioSessionConfiguration__(const std::optional>& optional) noexcept { return optional.has_value(); } - inline CameraSessionConfiguration get_std__optional_CameraSessionConfiguration_(const std::optional& optional) noexcept { + inline std::variant get_std__optional_std__variant_AutomaticAudioSessionConfiguration__ManualAudioSessionConfiguration__(const std::optional>& optional) noexcept { return optional.value(); } diff --git a/packages/react-native-vision-camera/nitrogen/generated/ios/VisionCamera-Swift-Cxx-Umbrella.hpp b/packages/react-native-vision-camera/nitrogen/generated/ios/VisionCamera-Swift-Cxx-Umbrella.hpp index 14418805ee..de9f004ed3 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/ios/VisionCamera-Swift-Cxx-Umbrella.hpp +++ b/packages/react-native-vision-camera/nitrogen/generated/ios/VisionCamera-Swift-Cxx-Umbrella.hpp @@ -10,6 +10,8 @@ // Forward declarations of C++ defined types // Forward declaration of `AutoFocusSystem` to properly resolve imports. namespace margelo::nitro::camera { enum class AutoFocusSystem; } +// Forward declaration of `AutomaticAudioSessionConfiguration` to properly resolve imports. +namespace margelo::nitro::camera { struct AutomaticAudioSessionConfiguration; } // Forward declaration of `BinnedConstraint` to properly resolve imports. namespace margelo::nitro::camera { struct BinnedConstraint; } // Forward declaration of `BoundingBox` to properly resolve imports. @@ -144,6 +146,8 @@ namespace margelo::nitro::camera { class HybridZoomGestureControllerSpec; } namespace margelo::nitro::camera { enum class InterruptionReason; } // Forward declaration of `ListenerSubscription` to properly resolve imports. namespace margelo::nitro::camera { struct ListenerSubscription; } +// Forward declaration of `ManualAudioSessionConfiguration` to properly resolve imports. +namespace margelo::nitro::camera { struct ManualAudioSessionConfiguration; } // Forward declaration of `MediaType` to properly resolve imports. namespace margelo::nitro::camera { enum class MediaType; } // Forward declaration of `MeteringMode` to properly resolve imports. @@ -235,6 +239,7 @@ namespace margelo::nitro::camera { struct WhiteBalanceTemperatureAndTint; } // Include C++ defined types #include "AutoFocusSystem.hpp" +#include "AutomaticAudioSessionConfiguration.hpp" #include "BinnedConstraint.hpp" #include "BoundingBox.hpp" #include "CameraControllerConfiguration.hpp" @@ -301,6 +306,7 @@ namespace margelo::nitro::camera { struct WhiteBalanceTemperatureAndTint; } #include "HybridZoomGestureControllerSpec.hpp" #include "InterruptionReason.hpp" #include "ListenerSubscription.hpp" +#include "ManualAudioSessionConfiguration.hpp" #include "MediaType.hpp" #include "MeteringMode.hpp" #include "MirrorMode.hpp" diff --git a/packages/react-native-vision-camera/nitrogen/generated/ios/c++/HybridCameraSessionSpecSwift.hpp b/packages/react-native-vision-camera/nitrogen/generated/ios/c++/HybridCameraSessionSpecSwift.hpp index 74b2ed6d66..455222a6fe 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/ios/c++/HybridCameraSessionSpecSwift.hpp +++ b/packages/react-native-vision-camera/nitrogen/generated/ios/c++/HybridCameraSessionSpecSwift.hpp @@ -58,6 +58,10 @@ namespace margelo::nitro::camera { enum class PixelFormat; } namespace margelo::nitro::camera { class HybridCameraSessionConfigSpec; } // Forward declaration of `CameraSessionConfiguration` to properly resolve imports. namespace margelo::nitro::camera { struct CameraSessionConfiguration; } +// Forward declaration of `AutomaticAudioSessionConfiguration` to properly resolve imports. +namespace margelo::nitro::camera { struct AutomaticAudioSessionConfiguration; } +// Forward declaration of `ManualAudioSessionConfiguration` to properly resolve imports. +namespace margelo::nitro::camera { struct ManualAudioSessionConfiguration; } // Forward declaration of `ListenerSubscription` to properly resolve imports. namespace margelo::nitro::camera { struct ListenerSubscription; } // Forward declaration of `InterruptionReason` to properly resolve imports. @@ -92,6 +96,8 @@ namespace margelo::nitro::camera { enum class InterruptionReason; } #include "HybridCameraSessionConfigSpec.hpp" #include #include "CameraSessionConfiguration.hpp" +#include "AutomaticAudioSessionConfiguration.hpp" +#include "ManualAudioSessionConfiguration.hpp" #include "ListenerSubscription.hpp" #include #include "InterruptionReason.hpp" @@ -148,8 +154,8 @@ namespace margelo::nitro::camera { public: // Methods - inline std::shared_ptr>>> configure(const std::vector& connections, const std::optional& config) override { - auto __result = _swiftPart.configure(connections, config); + inline std::shared_ptr>>> configure(const std::vector& connections, const CameraSessionConfiguration& config) override { + auto __result = _swiftPart.configure(connections, std::forward(config)); if (__result.hasError()) [[unlikely]] { std::rethrow_exception(__result.error()); } diff --git a/packages/react-native-vision-camera/nitrogen/generated/ios/swift/AutomaticAudioSessionConfiguration.swift b/packages/react-native-vision-camera/nitrogen/generated/ios/swift/AutomaticAudioSessionConfiguration.swift new file mode 100644 index 0000000000..d7ba8affa6 --- /dev/null +++ b/packages/react-native-vision-camera/nitrogen/generated/ios/swift/AutomaticAudioSessionConfiguration.swift @@ -0,0 +1,29 @@ +/// +/// AutomaticAudioSessionConfiguration.swift +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © Marc Rousavy @ Margelo +/// + +import NitroModules + +/** + * Represents an instance of `AutomaticAudioSessionConfiguration`, backed by a C++ struct. + */ +public typealias AutomaticAudioSessionConfiguration = margelo.nitro.camera.AutomaticAudioSessionConfiguration + +public extension AutomaticAudioSessionConfiguration { + private typealias bridge = margelo.nitro.camera.bridge.swift + + /** + * Create a new instance of `AutomaticAudioSessionConfiguration`. + */ + init(allowBackgroundAudioPlayback: Bool) { + self.init(allowBackgroundAudioPlayback) + } + + @inline(__always) + var allowBackgroundAudioPlayback: Bool { + return self.__allowBackgroundAudioPlayback + } +} diff --git a/packages/react-native-vision-camera/nitrogen/generated/ios/swift/CameraSessionConfiguration.swift b/packages/react-native-vision-camera/nitrogen/generated/ios/swift/CameraSessionConfiguration.swift index 9fe665f236..b46a8ca0c6 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/ios/swift/CameraSessionConfiguration.swift +++ b/packages/react-native-vision-camera/nitrogen/generated/ios/swift/CameraSessionConfiguration.swift @@ -18,16 +18,17 @@ public extension CameraSessionConfiguration { /** * Create a new instance of `CameraSessionConfiguration`. */ - init(allowHapticsAndSystemSoundsPlayback: Bool?, allowBackgroundAudioPlayback: Bool?) { - self.init({ () -> bridge.std__optional_bool_ in - if let __unwrappedValue = allowHapticsAndSystemSoundsPlayback { - return bridge.create_std__optional_bool_(__unwrappedValue) - } else { - return .init() - } - }(), { () -> bridge.std__optional_bool_ in - if let __unwrappedValue = allowBackgroundAudioPlayback { - return bridge.create_std__optional_bool_(__unwrappedValue) + init(audioConfiguration: Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration?) { + self.init({ () -> bridge.std__optional_std__variant_AutomaticAudioSessionConfiguration__ManualAudioSessionConfiguration__ in + if let __unwrappedValue = audioConfiguration { + return bridge.create_std__optional_std__variant_AutomaticAudioSessionConfiguration__ManualAudioSessionConfiguration__({ () -> bridge.std__variant_AutomaticAudioSessionConfiguration__ManualAudioSessionConfiguration_ in + switch __unwrappedValue { + case .first(let __value): + return bridge.create_std__variant_AutomaticAudioSessionConfiguration__ManualAudioSessionConfiguration_(__value) + case .second(let __value): + return bridge.create_std__variant_AutomaticAudioSessionConfiguration__ManualAudioSessionConfiguration_(__value) + } + }().variant) } else { return .init() } @@ -35,23 +36,23 @@ public extension CameraSessionConfiguration { } @inline(__always) - var allowHapticsAndSystemSoundsPlayback: Bool? { - return { () -> Bool? in - if bridge.has_value_std__optional_bool_(self.__allowHapticsAndSystemSoundsPlayback) { - let __unwrapped = bridge.get_std__optional_bool_(self.__allowHapticsAndSystemSoundsPlayback) - return __unwrapped - } else { - return nil - } - }() - } - - @inline(__always) - var allowBackgroundAudioPlayback: Bool? { - return { () -> Bool? in - if bridge.has_value_std__optional_bool_(self.__allowBackgroundAudioPlayback) { - let __unwrapped = bridge.get_std__optional_bool_(self.__allowBackgroundAudioPlayback) - return __unwrapped + var audioConfiguration: Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration? { + return { () -> Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration? in + if bridge.has_value_std__optional_std__variant_AutomaticAudioSessionConfiguration__ManualAudioSessionConfiguration__(self.__audioConfiguration) { + let __unwrapped = bridge.get_std__optional_std__variant_AutomaticAudioSessionConfiguration__ManualAudioSessionConfiguration__(self.__audioConfiguration) + return { () -> Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration in + let __variant = bridge.std__variant_AutomaticAudioSessionConfiguration__ManualAudioSessionConfiguration_(__unwrapped) + switch __variant.index() { + case 0: + let __actual = __variant.get_0() + return .first(__actual) + case 1: + let __actual = __variant.get_1() + return .second(__actual) + default: + fatalError("Variant can never have index \(__variant.index())!") + } + }() } else { return nil } diff --git a/packages/react-native-vision-camera/nitrogen/generated/ios/swift/HybridCameraSessionSpec.swift b/packages/react-native-vision-camera/nitrogen/generated/ios/swift/HybridCameraSessionSpec.swift index a17534c5a6..6ba5e8f735 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/ios/swift/HybridCameraSessionSpec.swift +++ b/packages/react-native-vision-camera/nitrogen/generated/ios/swift/HybridCameraSessionSpec.swift @@ -13,7 +13,7 @@ public protocol HybridCameraSessionSpec_protocol: HybridObject { var isRunning: Bool { get } // Methods - func configure(connections: [CameraSessionConnection], config: CameraSessionConfiguration?) throws -> Promise<[(any HybridCameraControllerSpec)]> + func configure(connections: [CameraSessionConnection], config: CameraSessionConfiguration) throws -> Promise<[(any HybridCameraControllerSpec)]> func start() throws -> Promise func stop() throws -> Promise func addOnStartedListener(onStarted: @escaping () -> Void) throws -> ListenerSubscription diff --git a/packages/react-native-vision-camera/nitrogen/generated/ios/swift/HybridCameraSessionSpec_cxx.swift b/packages/react-native-vision-camera/nitrogen/generated/ios/swift/HybridCameraSessionSpec_cxx.swift index 7786b87201..a26d70f2ab 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/ios/swift/HybridCameraSessionSpec_cxx.swift +++ b/packages/react-native-vision-camera/nitrogen/generated/ios/swift/HybridCameraSessionSpec_cxx.swift @@ -130,9 +130,9 @@ open class HybridCameraSessionSpec_cxx { // Methods @inline(__always) - public final func configure(connections: bridge.std__vector_CameraSessionConnection_, config: bridge.std__optional_CameraSessionConfiguration_) -> bridge.Result_std__shared_ptr_Promise_std__vector_std__shared_ptr_HybridCameraControllerSpec_____ { + public final func configure(connections: bridge.std__vector_CameraSessionConnection_, config: CameraSessionConfiguration) -> bridge.Result_std__shared_ptr_Promise_std__vector_std__shared_ptr_HybridCameraControllerSpec_____ { do { - let __result = try self.__implementation.configure(connections: connections.map({ __item in __item }), config: config.value) + let __result = try self.__implementation.configure(connections: connections.map({ __item in __item }), config: config) let __resultCpp = { () -> bridge.std__shared_ptr_Promise_std__vector_std__shared_ptr_HybridCameraControllerSpec____ in let __promise = bridge.create_std__shared_ptr_Promise_std__vector_std__shared_ptr_HybridCameraControllerSpec____() let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_std__vector_std__shared_ptr_HybridCameraControllerSpec____(__promise) diff --git a/packages/react-native-vision-camera/nitrogen/generated/ios/swift/ManualAudioSessionConfiguration.swift b/packages/react-native-vision-camera/nitrogen/generated/ios/swift/ManualAudioSessionConfiguration.swift new file mode 100644 index 0000000000..375cb30425 --- /dev/null +++ b/packages/react-native-vision-camera/nitrogen/generated/ios/swift/ManualAudioSessionConfiguration.swift @@ -0,0 +1,34 @@ +/// +/// ManualAudioSessionConfiguration.swift +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © Marc Rousavy @ Margelo +/// + +import NitroModules + +/** + * Represents an instance of `ManualAudioSessionConfiguration`, backed by a C++ struct. + */ +public typealias ManualAudioSessionConfiguration = margelo.nitro.camera.ManualAudioSessionConfiguration + +public extension ManualAudioSessionConfiguration { + private typealias bridge = margelo.nitro.camera.bridge.swift + + /** + * Create a new instance of `ManualAudioSessionConfiguration`. + */ + init(allowHapticsAndSystemSoundsPlayback: Bool, allowBackgroundAudioPlayback: Bool) { + self.init(allowHapticsAndSystemSoundsPlayback, allowBackgroundAudioPlayback) + } + + @inline(__always) + var allowHapticsAndSystemSoundsPlayback: Bool { + return self.__allowHapticsAndSystemSoundsPlayback + } + + @inline(__always) + var allowBackgroundAudioPlayback: Bool { + return self.__allowBackgroundAudioPlayback + } +} diff --git a/packages/react-native-vision-camera/nitrogen/generated/ios/swift/Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration.swift b/packages/react-native-vision-camera/nitrogen/generated/ios/swift/Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration.swift new file mode 100644 index 0000000000..fa1c4cf940 --- /dev/null +++ b/packages/react-native-vision-camera/nitrogen/generated/ios/swift/Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration.swift @@ -0,0 +1,30 @@ +/// +/// Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration.swift +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © Marc Rousavy @ Margelo +/// + + + +/** + * An Swift enum with associated values representing a Variant/Union type. + * JS type: `struct | struct` + */ +@frozen +public indirect enum Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration { + case first(AutomaticAudioSessionConfiguration) + case second(ManualAudioSessionConfiguration) +} + +public extension Variant_AutomaticAudioSessionConfiguration_ManualAudioSessionConfiguration { + func asType(_ type: T.Type = T.self) -> T? { + switch self { + case .first(let value): return value as? T + case .second(let value): return value as? T + } + } + func isType(_ type: T.Type = T.self) -> Bool { + return self.asType(type) != nil + } +} diff --git a/packages/react-native-vision-camera/nitrogen/generated/shared/c++/AutomaticAudioSessionConfiguration.hpp b/packages/react-native-vision-camera/nitrogen/generated/shared/c++/AutomaticAudioSessionConfiguration.hpp new file mode 100644 index 0000000000..094bd5fbd3 --- /dev/null +++ b/packages/react-native-vision-camera/nitrogen/generated/shared/c++/AutomaticAudioSessionConfiguration.hpp @@ -0,0 +1,83 @@ +/// +/// AutomaticAudioSessionConfiguration.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + + + + + +namespace margelo::nitro::camera { + + /** + * A struct which can be represented as a JavaScript object (AutomaticAudioSessionConfiguration). + */ + struct AutomaticAudioSessionConfiguration final { + public: + bool allowBackgroundAudioPlayback SWIFT_PRIVATE; + + public: + AutomaticAudioSessionConfiguration() = default; + explicit AutomaticAudioSessionConfiguration(bool allowBackgroundAudioPlayback): allowBackgroundAudioPlayback(allowBackgroundAudioPlayback) {} + + public: + friend bool operator==(const AutomaticAudioSessionConfiguration& lhs, const AutomaticAudioSessionConfiguration& rhs) = default; + }; + +} // namespace margelo::nitro::camera + +namespace margelo::nitro { + + // C++ AutomaticAudioSessionConfiguration <> JS AutomaticAudioSessionConfiguration (object) + template <> + struct JSIConverter final { + static inline margelo::nitro::camera::AutomaticAudioSessionConfiguration fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return margelo::nitro::camera::AutomaticAudioSessionConfiguration( + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "allowBackgroundAudioPlayback"))) + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const margelo::nitro::camera::AutomaticAudioSessionConfiguration& arg) { + jsi::Object obj(runtime); + obj.setProperty(runtime, PropNameIDCache::get(runtime, "allowBackgroundAudioPlayback"), JSIConverter::toJSI(runtime, arg.allowBackgroundAudioPlayback)); + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + if (!nitro::isPlainObject(runtime, obj)) { + return false; + } + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "allowBackgroundAudioPlayback")))) return false; + return true; + } + }; + +} // namespace margelo::nitro diff --git a/packages/react-native-vision-camera/nitrogen/generated/shared/c++/CameraSessionConfiguration.hpp b/packages/react-native-vision-camera/nitrogen/generated/shared/c++/CameraSessionConfiguration.hpp index c123f12147..059d480bab 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/shared/c++/CameraSessionConfiguration.hpp +++ b/packages/react-native-vision-camera/nitrogen/generated/shared/c++/CameraSessionConfiguration.hpp @@ -28,8 +28,14 @@ #error NitroModules cannot be found! Are you sure you installed NitroModules properly? #endif +// Forward declaration of `AutomaticAudioSessionConfiguration` to properly resolve imports. +namespace margelo::nitro::camera { struct AutomaticAudioSessionConfiguration; } +// Forward declaration of `ManualAudioSessionConfiguration` to properly resolve imports. +namespace margelo::nitro::camera { struct ManualAudioSessionConfiguration; } - +#include "AutomaticAudioSessionConfiguration.hpp" +#include "ManualAudioSessionConfiguration.hpp" +#include #include namespace margelo::nitro::camera { @@ -39,12 +45,11 @@ namespace margelo::nitro::camera { */ struct CameraSessionConfiguration final { public: - std::optional allowHapticsAndSystemSoundsPlayback SWIFT_PRIVATE; - std::optional allowBackgroundAudioPlayback SWIFT_PRIVATE; + std::optional> audioConfiguration SWIFT_PRIVATE; public: CameraSessionConfiguration() = default; - explicit CameraSessionConfiguration(std::optional allowHapticsAndSystemSoundsPlayback, std::optional allowBackgroundAudioPlayback): allowHapticsAndSystemSoundsPlayback(allowHapticsAndSystemSoundsPlayback), allowBackgroundAudioPlayback(allowBackgroundAudioPlayback) {} + explicit CameraSessionConfiguration(std::optional> audioConfiguration): audioConfiguration(audioConfiguration) {} public: friend bool operator==(const CameraSessionConfiguration& lhs, const CameraSessionConfiguration& rhs) = default; @@ -60,14 +65,12 @@ namespace margelo::nitro { static inline margelo::nitro::camera::CameraSessionConfiguration fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { jsi::Object obj = arg.asObject(runtime); return margelo::nitro::camera::CameraSessionConfiguration( - JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "allowHapticsAndSystemSoundsPlayback"))), - JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "allowBackgroundAudioPlayback"))) + JSIConverter>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "audioConfiguration"))) ); } static inline jsi::Value toJSI(jsi::Runtime& runtime, const margelo::nitro::camera::CameraSessionConfiguration& arg) { jsi::Object obj(runtime); - obj.setProperty(runtime, PropNameIDCache::get(runtime, "allowHapticsAndSystemSoundsPlayback"), JSIConverter>::toJSI(runtime, arg.allowHapticsAndSystemSoundsPlayback)); - obj.setProperty(runtime, PropNameIDCache::get(runtime, "allowBackgroundAudioPlayback"), JSIConverter>::toJSI(runtime, arg.allowBackgroundAudioPlayback)); + obj.setProperty(runtime, PropNameIDCache::get(runtime, "audioConfiguration"), JSIConverter>>::toJSI(runtime, arg.audioConfiguration)); return obj; } static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { @@ -78,8 +81,7 @@ namespace margelo::nitro { if (!nitro::isPlainObject(runtime, obj)) { return false; } - if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "allowHapticsAndSystemSoundsPlayback")))) return false; - if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "allowBackgroundAudioPlayback")))) return false; + if (!JSIConverter>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "audioConfiguration")))) return false; return true; } }; diff --git a/packages/react-native-vision-camera/nitrogen/generated/shared/c++/HybridCameraSessionSpec.hpp b/packages/react-native-vision-camera/nitrogen/generated/shared/c++/HybridCameraSessionSpec.hpp index c7e8cb51f3..0013b10ec4 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/shared/c++/HybridCameraSessionSpec.hpp +++ b/packages/react-native-vision-camera/nitrogen/generated/shared/c++/HybridCameraSessionSpec.hpp @@ -30,7 +30,6 @@ namespace margelo::nitro::camera { enum class InterruptionReason; } #include #include "CameraSessionConnection.hpp" #include "CameraSessionConfiguration.hpp" -#include #include "ListenerSubscription.hpp" #include #include @@ -67,7 +66,7 @@ namespace margelo::nitro::camera { public: // Methods - virtual std::shared_ptr>>> configure(const std::vector& connections, const std::optional& config) = 0; + virtual std::shared_ptr>>> configure(const std::vector& connections, const CameraSessionConfiguration& config) = 0; virtual std::shared_ptr> start() = 0; virtual std::shared_ptr> stop() = 0; virtual ListenerSubscription addOnStartedListener(const std::function& onStarted) = 0; diff --git a/packages/react-native-vision-camera/nitrogen/generated/shared/c++/ManualAudioSessionConfiguration.hpp b/packages/react-native-vision-camera/nitrogen/generated/shared/c++/ManualAudioSessionConfiguration.hpp new file mode 100644 index 0000000000..8b3702a62e --- /dev/null +++ b/packages/react-native-vision-camera/nitrogen/generated/shared/c++/ManualAudioSessionConfiguration.hpp @@ -0,0 +1,87 @@ +/// +/// ManualAudioSessionConfiguration.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + + + + + +namespace margelo::nitro::camera { + + /** + * A struct which can be represented as a JavaScript object (ManualAudioSessionConfiguration). + */ + struct ManualAudioSessionConfiguration final { + public: + bool allowHapticsAndSystemSoundsPlayback SWIFT_PRIVATE; + bool allowBackgroundAudioPlayback SWIFT_PRIVATE; + + public: + ManualAudioSessionConfiguration() = default; + explicit ManualAudioSessionConfiguration(bool allowHapticsAndSystemSoundsPlayback, bool allowBackgroundAudioPlayback): allowHapticsAndSystemSoundsPlayback(allowHapticsAndSystemSoundsPlayback), allowBackgroundAudioPlayback(allowBackgroundAudioPlayback) {} + + public: + friend bool operator==(const ManualAudioSessionConfiguration& lhs, const ManualAudioSessionConfiguration& rhs) = default; + }; + +} // namespace margelo::nitro::camera + +namespace margelo::nitro { + + // C++ ManualAudioSessionConfiguration <> JS ManualAudioSessionConfiguration (object) + template <> + struct JSIConverter final { + static inline margelo::nitro::camera::ManualAudioSessionConfiguration fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return margelo::nitro::camera::ManualAudioSessionConfiguration( + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "allowHapticsAndSystemSoundsPlayback"))), + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "allowBackgroundAudioPlayback"))) + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const margelo::nitro::camera::ManualAudioSessionConfiguration& arg) { + jsi::Object obj(runtime); + obj.setProperty(runtime, PropNameIDCache::get(runtime, "allowHapticsAndSystemSoundsPlayback"), JSIConverter::toJSI(runtime, arg.allowHapticsAndSystemSoundsPlayback)); + obj.setProperty(runtime, PropNameIDCache::get(runtime, "allowBackgroundAudioPlayback"), JSIConverter::toJSI(runtime, arg.allowBackgroundAudioPlayback)); + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + if (!nitro::isPlainObject(runtime, obj)) { + return false; + } + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "allowHapticsAndSystemSoundsPlayback")))) return false; + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "allowBackgroundAudioPlayback")))) return false; + return true; + } + }; + +} // namespace margelo::nitro diff --git a/packages/react-native-vision-camera/src/hooks/internal/useCameraController.ts b/packages/react-native-vision-camera/src/hooks/internal/useCameraController.ts index db662056bf..3a4312e324 100644 --- a/packages/react-native-vision-camera/src/hooks/internal/useCameraController.ts +++ b/packages/react-native-vision-camera/src/hooks/internal/useCameraController.ts @@ -36,8 +36,7 @@ export function useCameraController( mirrorMode = 'auto', constraints = [], onSessionConfigSelected, - allowBackgroundAudioPlayback, - allowHapticsAndSystemSoundsPlayback, + audioConfiguration, getInitialExposureBias, onError, onConfigured, @@ -68,6 +67,11 @@ export function useCameraController( ...stableOutputs.map((o) => ({ resolutionBias: o })), ] }, [JSON.stringify(constraints), stableOutputs]) + // biome-ignore lint/correctness/useExhaustiveDependencies: It's an inline object, we have to deep memo it. + const stableAudioConfiguration = useMemo( + () => audioConfiguration, + [JSON.stringify(audioConfiguration)], + ) // This effect re-configures the CameraSession and returns a `controller`. // This is expensive and should only be done if any inputs change. @@ -85,7 +89,9 @@ export function useCameraController( try { if (device == null) { // No device, configure with empty devices - session.configure([], {}) + session.configure([], { + audioConfiguration: stableAudioConfiguration, + }) setController(undefined) } else { // Device + outputs - configure session @@ -104,9 +110,7 @@ export function useCameraController( }, ], { - allowBackgroundAudioPlayback: allowBackgroundAudioPlayback, - allowHapticsAndSystemSoundsPlayback: - allowHapticsAndSystemSoundsPlayback, + audioConfiguration: stableAudioConfiguration, }, ) if (isCanceled) { @@ -130,8 +134,7 @@ export function useCameraController( device, mirrorMode, session, - allowBackgroundAudioPlayback, - allowHapticsAndSystemSoundsPlayback, + stableAudioConfiguration, stableOutputs, stableOnConfigured, stableGetInitialExposureBias, diff --git a/packages/react-native-vision-camera/src/hooks/internal/useCameraSession.ts b/packages/react-native-vision-camera/src/hooks/internal/useCameraSession.ts index 366b90c2d1..cbd26fbeab 100644 --- a/packages/react-native-vision-camera/src/hooks/internal/useCameraSession.ts +++ b/packages/react-native-vision-camera/src/hooks/internal/useCameraSession.ts @@ -41,7 +41,7 @@ export function useCameraSession({ return () => { // remove all connections session?.stop() - session?.configure([]) + session?.configure([], {}) } }, [session]) diff --git a/packages/react-native-vision-camera/src/hooks/useCamera.ts b/packages/react-native-vision-camera/src/hooks/useCamera.ts index f59b586324..3c1a5ac821 100644 --- a/packages/react-native-vision-camera/src/hooks/useCamera.ts +++ b/packages/react-native-vision-camera/src/hooks/useCamera.ts @@ -244,8 +244,7 @@ export function useCamera({ onSessionConfigSelected, mirrorMode, onConfigured, - allowBackgroundAudioPlayback, - allowHapticsAndSystemSoundsPlayback, + audioConfiguration, orientationSource = 'device', onStarted, onStopped, @@ -306,8 +305,7 @@ export function useCamera({ getInitialZoom: () => getAnimatableNumberInitialValue(zoom), constraints: constraints, onSessionConfigSelected: onSessionConfigSelected, - allowBackgroundAudioPlayback: allowBackgroundAudioPlayback, - allowHapticsAndSystemSoundsPlayback: allowHapticsAndSystemSoundsPlayback, + audioConfiguration: audioConfiguration, onError: onError, }) diff --git a/packages/react-native-vision-camera/src/specs/session/CameraSession.nitro.ts b/packages/react-native-vision-camera/src/specs/session/CameraSession.nitro.ts index 02f4cd26a0..8147e4ee59 100644 --- a/packages/react-native-vision-camera/src/specs/session/CameraSession.nitro.ts +++ b/packages/react-native-vision-camera/src/specs/session/CameraSession.nitro.ts @@ -236,7 +236,7 @@ export interface CameraSession */ configure( connections: CameraSessionConnection[], - config?: CameraSessionConfiguration, + config: CameraSessionConfiguration, ): Promise /** diff --git a/packages/react-native-vision-camera/src/specs/session/CameraSessionConfiguration.ts b/packages/react-native-vision-camera/src/specs/session/CameraSessionConfiguration.ts index 22fbab7710..c9c285ed5c 100644 --- a/packages/react-native-vision-camera/src/specs/session/CameraSessionConfiguration.ts +++ b/packages/react-native-vision-camera/src/specs/session/CameraSessionConfiguration.ts @@ -1,9 +1,25 @@ import type { CameraSession } from './CameraSession.nitro' -/** - * Configuration for a {@linkcode CameraSession}. - */ -export interface CameraSessionConfiguration { +interface AutomaticAudioSessionConfiguration { + /** + * If enabled, the device may play background audio, + * possibly from another app (e.g. Apple Music) while + * the {@linkcode CameraSession} is active. + * + * If disabled (the default), any playing audio will be + * stopped while the {@linkcode CameraSession} is active. + * + * @note If {@linkcode allowBackgroundAudioPlayback} is true, + * background audio may also be captured in Video recordings. + * + * @default false + * @platform iOS + */ + allowBackgroundAudioPlayback: boolean +} + +interface ManualAudioSessionConfiguration + extends AutomaticAudioSessionConfiguration { /** * If enabled, the device may play haptics/vibrations * and system sounds during while the {@linkcode CameraSession} @@ -21,20 +37,30 @@ export interface CameraSessionConfiguration { * @default false * @platform iOS */ - allowHapticsAndSystemSoundsPlayback?: boolean + allowHapticsAndSystemSoundsPlayback: boolean +} + +type AudioConfiguration = + | AutomaticAudioSessionConfiguration + | ManualAudioSessionConfiguration + +/** + * Configuration for a {@linkcode CameraSession}. + */ +export interface CameraSessionConfiguration { /** - * If enabled, the device may play background audio, - * possibly from another app (e.g. Apple Music) while - * the {@linkcode CameraSession} is active. + * Configures the Audio Session. * - * If disabled (the default), any playing audio will be - * stopped while the {@linkcode CameraSession} is active. - * - * @note If {@linkcode allowBackgroundAudioPlayback} is true, - * background audio may also be captured in Video recordings. - * - * @default false - * @platform iOS + * - When set to an {@linkcode AutomaticAudioSessionConfiguration}, + * the Audio Session will be automatically configured by the + * Camera Session, and applies any flags set in + * {@linkcode AutomaticAudioSessionConfiguration}. + * - When set to a {@linkcode ManualAudioSessionConfiguration}, + * the Audio Session will be manually configured by + * VisionCamera, and requires more configuration. + * - When left at `undefined`, the Audio Session will not be configured + * by VisionCamera at all. This is ideal if you want to configure + * your Audio Session fully yourself, for example via expo-audio. */ - allowBackgroundAudioPlayback?: boolean + audioConfiguration?: AudioConfiguration }