Skip to content

Instantly share code, notes, and snippets.

@farzd
Last active June 13, 2025 08:00
Show Gist options
  • Save farzd/f2aef4ee55a45de873f6304639dfe447 to your computer and use it in GitHub Desktop.
Save farzd/f2aef4ee55a45de873f6304639dfe447 to your computer and use it in GitHub Desktop.
expo audio patch

create patches folder at root level of the project with this filename: expo-audio+0.4.6.patch image

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,

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment