Skip to content

Commit 548d5ba

Browse files
feat: Improve device config selection for microphone feed (#1209)
1 parent 5638a95 commit 548d5ba

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

crates/recording/src/feeds/microphone.rs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use cap_media_info::{AudioInfo, ffmpeg_sample_format_for};
22
use cap_timestamp::Timestamp;
33
use cpal::{
44
Device, InputCallbackInfo, SampleFormat, StreamError, SupportedStreamConfig,
5+
SupportedStreamConfigRange,
56
traits::{DeviceTrait, HostTrait, StreamTrait},
67
};
78
use flume::TrySendError;
@@ -146,16 +147,25 @@ fn get_usable_device(device: Device) -> Option<(String, Device, SupportedStreamC
146147
.then(b.max_sample_rate().cmp(&a.max_sample_rate()))
147148
});
148149

149-
configs
150-
.into_iter()
151-
.filter(|c| c.min_sample_rate().0 <= 48000 && c.max_sample_rate().0 >= 48000)
152-
.find(|c| ffmpeg_sample_format_for(c.sample_format()).is_some())
150+
configs.into_iter().find_map(|config| {
151+
ffmpeg_sample_format_for(config.sample_format())
152+
.map(|_| config.with_sample_rate(select_sample_rate(&config)))
153+
})
153154
});
154155

155-
result.and_then(|config| {
156-
let final_config = config.with_sample_rate(cpal::SampleRate(48000));
157-
device.name().ok().map(|name| (name, device, final_config))
158-
})
156+
result.and_then(|config| device.name().ok().map(|name| (name, device, config)))
157+
}
158+
159+
fn select_sample_rate(config: &SupportedStreamConfigRange) -> cpal::SampleRate {
160+
const PREFERRED_RATES: [u32; 2] = [48_000, 44_100];
161+
162+
for rate in PREFERRED_RATES {
163+
if config.min_sample_rate().0 <= rate && config.max_sample_rate().0 >= rate {
164+
return cpal::SampleRate(rate);
165+
}
166+
}
167+
168+
cpal::SampleRate(config.max_sample_rate().0)
159169
}
160170

161171
#[derive(Reply)]

0 commit comments

Comments
 (0)