Skip to main content

Device Management

Select and manage microphone and speaker devices for optimal audio quality and user preference.

Quick Start

Access available devices and change them using MicdropClient methods:

import { Micdrop } from '@micdrop/client'

// Get available devices
console.log('Microphones:', Micdrop.micDevices)
console.log('Speakers:', Micdrop.speakerDevices)

// Change devices
await Micdrop.changeMicDevice('mic-device-id')
await Micdrop.changeSpeakerDevice('speaker-device-id')

Device Listing

Get Available Microphones

// Access microphone devices
const micDevices = Micdrop.micDevices

micDevices.forEach((device) => {
console.log('Mic:', device.label || 'Unknown Device')
console.log('ID:', device.deviceId)
console.log('Group:', device.groupId)
})

// Current microphone device
console.log('Current mic:', Micdrop.micDeviceId)

Get Available Speakers

// Access speaker devices
const speakerDevices = Micdrop.speakerDevices

speakerDevices.forEach((device) => {
console.log('Speaker:', device.label || 'Unknown Device')
console.log('ID:', device.deviceId)
console.log('Group:', device.groupId)
})

// Current speaker device
console.log('Current speaker:', Micdrop.speakerDeviceId)

Device Selection

Change Microphone

Switch to a different microphone device:

// Change microphone by device ID
const newMicId = Micdrop.micDevices[1].deviceId
await Micdrop.changeMicDevice(newMicId)

Change Speaker

Switch to a different speaker/headphone device:

// Change speaker by device ID
const newSpeakerId = Micdrop.speakerDevices[1].deviceId
await Micdrop.changeSpeakerDevice(newSpeakerId)

Device Persistence

Selected devices are automatically persisted in localStorage.

React Device Component

import { useState } from 'react'
import { Micdrop } from '@micdrop/client'
import { useMicdropState } from '@micdrop/react'

function DeviceSettings() {
const state = useMicdropState()
const [changing, setChanging] = useState(false)

const changeMic = async (deviceId: string) => {
setChanging(true)
try {
await Micdrop.changeMicDevice(deviceId)
} finally {
setChanging(false)
}
}

const changeSpeaker = async (deviceId: string) => {
setChanging(true)
try {
await Micdrop.changeSpeakerDevice(deviceId)
} finally {
setChanging(false)
}
}

return (
<div className="device-settings">
<div className="device-group">
<label>Microphone:</label>
<select
value={state.micDeviceId || ''}
onChange={(e) => changeMic(e.target.value)}
disabled={changing}
>
{state.micDevices.map((device) => (
<option key={device.deviceId} value={device.deviceId}>
{device.label || 'Unknown Microphone'}
</option>
))}
</select>
</div>

<div className="device-group">
<label>Speaker:</label>
<select
value={state.speakerDeviceId || ''}
onChange={(e) => changeSpeaker(e.target.value)}
disabled={changing}
>
{state.speakerDevices.map((device) => (
<option key={device.deviceId} value={device.deviceId}>
{device.label || 'Unknown Speaker'}
</option>
))}
</select>
</div>
</div>
)
}

Device Testing

Test Microphone

Monitor microphone input levels to verify the selected device is working correctly.

Using Mic Analyzer (Vanilla JavaScript)

import { Mic } from '@micdrop/client'

// Listen to microphone volume changes
const onMicVolumeChange = (volume: number) => {
console.log('Microphone volume:', volume, 'dB')
// Update your UI with the volume level
updateMicVolumeIndicator(volume)
}

// Start listening to volume events
Mic.analyser.on('volume', onMicVolumeChange)

// Stop listening (cleanup)
Mic.analyser.off('volume', onMicVolumeChange)

Using React Hook

import { useMicVolume } from '@micdrop/react'

function MicVolumeIndicator() {
const { micVolume } = useMicVolume()
const volume = Math.max(0, micVolume + 100) // Convert dB to percentage

return (
<div className="mic-volume-container">
<label>Microphone Level:</label>
<div
className="volume-bar"
style={{
background: `linear-gradient(
to right,
#00bb00,
#00bb00 ${volume}%,
#ccc ${volume}%,
#ccc 100%
)`,
width: '100%',
height: '16px',
borderRadius: '8px',
transition: 'all 0.1s',
}}
/>
<span>{micVolume.toFixed(1)} dB</span>
</div>
)
}

This provides real-time visual feedback of microphone input levels, helping users verify their microphone is working and adjust VAD thresholds appropriately.

Example: MicVolume component

Learn more: Mic utility class

Test Speaker

Monitor speaker output levels and test audio playback to verify the selected device is working correctly.

Using Speaker Analyzer (Vanilla JavaScript)

import { Speaker } from '@micdrop/client'

// Listen to speaker volume changes
const onSpeakerVolumeChange = (volume: number) => {
console.log('Speaker volume:', volume, 'dB')
// Update your UI with the volume level
updateSpeakerVolumeIndicator(volume)
}

// Start listening to volume events
Speaker.analyser.on('volume', onSpeakerVolumeChange)

// Stop listening (cleanup)
Speaker.analyser.off('volume', onSpeakerVolumeChange)

Using React Hook

import { useSpeakerVolume } from '@micdrop/react'

function SpeakerVolumeIndicator() {
const { speakerVolume } = useSpeakerVolume()
const volume = Math.max(0, speakerVolume + 100) // Convert dB to percentage

return (
<div className="speaker-volume-container">
<label>Speaker Level:</label>
<div
className="volume-bar"
style={{
background: `linear-gradient(
to right,
#0066cc,
#0066cc ${volume}%,
#ccc ${volume}%,
#ccc 100%
)`,
width: '100%',
height: '16px',
borderRadius: '8px',
transition: 'all 0.1s',
}}
/>
<span>{speakerVolume.toFixed(1)} dB</span>
</div>
)
}

Example: SpeakerTestButton component

Learn more: Speaker utility class