🎤 Micdrop

Audio Output and Devices

Devices are listed and changed with the methods of Device management, micDevices, speakerDevices, changeMicDevice and changeSpeakerDevice. What a phone changes is what those lists hold.

Loudspeaker or earpiece

A phone has one decision to make about output: whether the voice comes out loud or against the ear. The two routes are what speakerDevices holds here, so the same code that picks an output in a browser works.

import {
EARPIECE_DEVICE,
Micdrop,
SPEAKER_DEVICE,
} from '@micdrop/react-native'
await Micdrop.changeSpeakerDevice(EARPIECE_DEVICE)
await Micdrop.changeSpeakerDevice(SPEAKER_DEVICE)

The current one is in the state:

const state = useMicdropState()
const onEarpiece = state.speakerDeviceId === EARPIECE_DEVICE
const handlePress = () =>
Micdrop.changeSpeakerDevice(onEarpiece ? SPEAKER_DEVICE : EARPIECE_DEVICE)

Headphones and Bluetooth are handled by the operating system: plugging them in moves the call over, whatever was chosen here.

Choosing the microphone

The inputs the OS reports are in the state, each with an id to hand back and a label to show, and the call can be moved to another one without interrupting it:

const state = useMicdropState()
state.micDevices.map((device) => (
<Button
key={device.id}
title={device.label}
onPress={() => Micdrop.changeMicDevice(device.id)}
/>
))

The list is filled once the call has started, since the audio session has to be active for the system to answer.

Echo

The audio session is configured as a voice call, which is what tells iOS and Android to apply echo cancellation. Without it, the microphone would hear the assistant and the call would interrupt itself.

On a device where cancellation is weak, turn interruption off so the microphone is ignored while the assistant speaks:

await Micdrop.start({
url: 'wss://example.com/call',
disableInterruption: true,
})