create patches folder at root level of the project with this filename: expo-audio+0.4.6.patch
npm i patch-package --save-dev
update package.json
"postinstall": "patch-package"
content for expo-audio+0.4.6.patch file
diff --git a/node_modules/expo-audio/android/src/main/java/expo/modules/audio/AudioRecorder.kt b/node_modules/expo-audio/android/src/main/java/expo/modules/audio/AudioRecorder.kt
index 21245b9..a58cd99 100644
--- a/node_modules/expo-audio/android/src/main/java/expo/modules/audio/AudioRecorder.kt
+++ b/node_modules/expo-audio/android/src/main/java/expo/modules/audio/AudioRecorder.kt
@@ -168,7 +168,7 @@ class AudioRecorder(
putBoolean("isRecording", isRecording)
putLong("durationMillis", getAudioRecorderDurationMillis())
getAudioRecorderLevels()?.let {
- putInt("metering", it)
+ putDouble("metering", it.toDouble())
}
filePath?.let {
val path = Uri.fromFile(File(it)).toString()
diff --git a/node_modules/expo-audio/ios/AudioModule.swift b/node_modules/expo-audio/ios/AudioModule.swift
index 585bc88..e6ea689 100644
--- a/node_modules/expo-audio/ios/AudioModule.swift
+++ b/node_modules/expo-audio/ios/AudioModule.swift
@@ -201,6 +201,12 @@ public class AudioModule: Module {
let recordingDir = try recordingDirectory()
let avRecorder = AudioUtils.createRecorder(directory: recordingDir, with: options)
let recorder = AudioRecorder(avRecorder)
+
+ // Metering is now set in AudioUtils.createRecorder, no need to set it again
+
+ // Temporary debug logging
+ print("π€ AudioRecorder Constructor - isMeteringEnabled: \(options.isMeteringEnabled), recorder.ref.isMeteringEnabled: \(recorder.ref.isMeteringEnabled)")
+
AudioComponentRegistry.shared.add(recorder)
return recorder
diff --git a/node_modules/expo-audio/ios/AudioRecorder.swift b/node_modules/expo-audio/ios/AudioRecorder.swift
index 41ce4b6..d0ce5f9 100644
--- a/node_modules/expo-audio/ios/AudioRecorder.swift
+++ b/node_modules/expo-audio/ios/AudioRecorder.swift
@@ -48,15 +48,26 @@ class AudioRecorder: SharedRef<AVAudioRecorder>, RecordingResultHandler {
}
func prepare(options: RecordingOptions?) {
+ print("π€ AudioRecorder.prepare() called with options: \(options != nil ? "provided" : "nil")")
+
if let options {
+ // Store current metering setting before recreating recorder
+ let currentMeteringSetting = ref.isMeteringEnabled
+
ref = AudioUtils.createRecorder(directory: recordingDirectory, with: options)
ref.delegate = recordingDelegate
+
+ // Preserve metering setting from original configuration
+ ref.isMeteringEnabled = currentMeteringSetting
+ print("π€ Prepare: Created new recorder, preserved isMeteringEnabled: \(currentMeteringSetting)")
+ } else {
+ print("π€ Prepare: Using existing recorder, isMeteringEnabled: \(ref.isMeteringEnabled)")
}
- if let isMeteringEnabled = options?.isMeteringEnabled {
- ref.isMeteringEnabled = isMeteringEnabled
- }
+
ref.prepareToRecord()
isPrepared = true
+
+ print("π€ Prepare complete: isMeteringEnabled = \(ref.isMeteringEnabled)")
}
func startRecording() -> [String: Any] {
diff --git a/node_modules/expo-audio/ios/AudioRecords.swift b/node_modules/expo-audio/ios/AudioRecords.swift
index b793000..200152b 100644
--- a/node_modules/expo-audio/ios/AudioRecords.swift
+++ b/node_modules/expo-audio/ios/AudioRecords.swift
@@ -42,7 +42,7 @@ struct RecordingOptions: Record {
@Field var linearPCMBitDepth: Double?
@Field var linearPCMIsBigEndian: Bool?
@Field var linearPCMIsFloat: Bool?
- @Field var isMeteringEnabled: Bool = false
+ @Field var isMeteringEnabled: Bool = true
}
enum BitRateStrategy: String, Enumerable {
diff --git a/node_modules/expo-audio/ios/AudioUtils.swift b/node_modules/expo-audio/ios/AudioUtils.swift
index 7eb335a..366a6cf 100644
--- a/node_modules/expo-audio/ios/AudioUtils.swift
+++ b/node_modules/expo-audio/ios/AudioUtils.swift
@@ -74,7 +74,10 @@ struct AudioUtils {
if let directory {
let fileUrl = createRecordingUrl(from: directory, with: options)
do {
- return try AVAudioRecorder(url: fileUrl, settings: AudioUtils.createRecordingOptions(options))
+ let recorder = try AVAudioRecorder(url: fileUrl, settings: AudioUtils.createRecordingOptions(options))
+ // Always enable metering during creation to avoid prepare() issues
+ recorder.isMeteringEnabled = options.isMeteringEnabled ?? true // Default to true
+ return recorder
} catch {
return AVAudioRecorder()
}
diff --git a/node_modules/expo-audio/src/utils/options.ts b/node_modules/expo-audio/src/utils/options.ts
index 47e4d0e..b963daf 100644
--- a/node_modules/expo-audio/src/utils/options.ts
+++ b/node_modules/expo-audio/src/utils/options.ts
@@ -1,6 +1,6 @@
-import { Platform } from 'expo-modules-core';
+import { Platform } from "expo-modules-core";
-import { RecordingOptions } from '../Audio.types';
+import { RecordingOptions } from "../Audio.types";
export function createRecordingOptions(options: RecordingOptions) {
let commonOptions = {
@@ -8,15 +8,15 @@ export function createRecordingOptions(options: RecordingOptions) {
sampleRate: options.sampleRate,
numberOfChannels: options.numberOfChannels,
bitRate: options.bitRate,
- isMeteringEnabled: options.isMeteringEnabled ?? false,
+ isMeteringEnabled: options.isMeteringEnabled ?? true,
};
- if (Platform.OS === 'ios') {
+ if (Platform.OS === "ios") {
commonOptions = {
...commonOptions,
...options.ios,
};
- } else if (Platform.OS === 'android') {
+ } else if (Platform.OS === "android") {
commonOptions = {
...commonOptions,
...options.android,