From 4318842c20cc07b7ab9c1962b097daa51b021db0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20S=C4=99k?= Date: Wed, 28 Jan 2026 18:00:56 +0100 Subject: [PATCH 1/8] fix: feat: wip: working on input selection and category fixes --- .../common-app/src/examples/Record/Record.tsx | 56 +++++++++++++++++-- apps/fabric-example/ios/Podfile.lock | 2 +- .../audiodocs/docs/system/audio-manager.mdx | 2 +- .../ios/audioapi/ios/AudioAPIModule.mm | 9 +++ .../audioapi/ios/system/AudioSessionManager.h | 3 + .../ios/system/AudioSessionManager.mm | 43 +++++++++++++- .../src/specs/NativeAudioAPIModule.ts | 1 + .../src/specs/NativeAudioAPIModule.web.ts | 2 + .../src/system/AudioManager.ts | 6 +- .../src/system/types.ts | 4 +- .../src/web-system/AudioManager.ts | 1 + 11 files changed, 119 insertions(+), 10 deletions(-) diff --git a/apps/common-app/src/examples/Record/Record.tsx b/apps/common-app/src/examples/Record/Record.tsx index 25d27442c..45377c3a4 100644 --- a/apps/common-app/src/examples/Record/Record.tsx +++ b/apps/common-app/src/examples/Record/Record.tsx @@ -1,11 +1,12 @@ -import React, { FC, useEffect, useState } from 'react'; +import React, { FC, useCallback, useEffect, useState } from 'react'; import { Alert, Text, View } from 'react-native'; import { AudioBuffer, + AudioDevicesInfo, AudioManager, } from 'react-native-audio-api'; -import { Button, Container } from '../../components'; +import { Button, Container, Select } from '../../components'; import { colors } from '../../styles'; import { audioContext, audioRecorder } from '../../singletons'; @@ -18,6 +19,11 @@ enum Status { } const Record: FC = () => { + const [currentInput, setCurrentInput] = useState(''); + const [currentOutput, setCurrentOutput] = useState(''); + const [availableDevices, setAvailableDevices] = + useState(null); + const [status, setStatus] = useState(Status.Idle); const [capturedBuffers, setCapturedBuffers] = useState([]); @@ -40,12 +46,14 @@ const Record: FC = () => { AudioManager.setAudioSessionOptions({ iosCategory: 'playAndRecord', - iosMode: 'default', - iosOptions: ['defaultToSpeaker', 'allowBluetoothA2DP'], + iosMode: 'voiceChat', + iosOptions: ['allowBluetoothHFP'], }); const success = await AudioManager.setAudioSessionActivity(true); + await updateDevices(); + if (!success) { Alert.alert( 'Audio Session Error', @@ -201,6 +209,34 @@ const Record: FC = () => { }; }, []); + const updateDevices = useCallback(async () => { + const devices = await AudioManager.getDevicesInfo(); + setAvailableDevices(devices); + + if (devices.currentInputs.length > 0) { + setCurrentInput(devices.currentInputs[0].uid); + } + + if (devices.currentOutputs.length > 0) { + setCurrentOutput(devices.currentOutputs[0].uid); + } + }, []); + + useEffect(() => { + updateDevices(); + }, [updateDevices]); + + console.log('Available devices:', availableDevices); + + const onSetCurrentInput = (deviceId: string) => { + AudioManager.setInputDevice(deviceId); + // TODO: implement setInputDevice when supported + }; + + const onSetCurrentOutput = (deviceId: string) => { + // TODO: implement setOutputDevice when supported + }; + return ( @@ -208,6 +244,18 @@ const Record: FC = () => { Status: {status} + + d.uid) || []} + /> + Echo