|
1 |
| -use std::io::{Read, Seek}; |
2 |
| -use std::marker::Sync; |
3 |
| -use std::sync::Arc; |
4 |
| -use std::{error, fmt}; |
5 |
| - |
6 | 1 | use crate::common::{ChannelCount, SampleRate};
|
7 | 2 | use crate::decoder;
|
8 | 3 | use crate::mixer::{mixer, Mixer, MixerSource};
|
9 | 4 | use crate::sink::Sink;
|
10 | 5 | use cpal::traits::{DeviceTrait, HostTrait, StreamTrait};
|
11 | 6 | use cpal::{BufferSize, FrameCount, Sample, SampleFormat, StreamConfig, SupportedBufferSize};
|
| 7 | +use std::io::{Read, Seek}; |
| 8 | +use std::marker::Sync; |
| 9 | +use std::sync::Arc; |
| 10 | +use std::{error, fmt}; |
12 | 11 |
|
13 | 12 | const HZ_44100: SampleRate = 44_100;
|
14 | 13 |
|
@@ -212,7 +211,9 @@ fn clamp_supported_buffer_size(
|
212 | 211 | ) -> BufferSize {
|
213 | 212 | match buffer_size {
|
214 | 213 | SupportedBufferSize::Range { min, max } => {
|
215 |
| - BufferSize::Fixed(preferred_size.clamp(*min, *max)) |
| 214 | + let size = preferred_size.clamp(*min, *max); |
| 215 | + assert!(size > 0, "selected buffer size is greater than zero"); |
| 216 | + BufferSize::Fixed(size) |
216 | 217 | }
|
217 | 218 | SupportedBufferSize::Unknown => BufferSize::Default,
|
218 | 219 | }
|
@@ -321,10 +322,22 @@ impl error::Error for StreamError {
|
321 | 322 | }
|
322 | 323 |
|
323 | 324 | impl OutputStream {
|
| 325 | + fn validate_config(config: &OutputStreamConfig) { |
| 326 | + if let BufferSize::Fixed(sz) = config.buffer_size { |
| 327 | + assert!(sz > 0, "fixed buffer size is greater than zero"); |
| 328 | + } |
| 329 | + assert!(config.sample_rate > 0, "sample rate is greater than zero"); |
| 330 | + assert!( |
| 331 | + config.channel_count > 0, |
| 332 | + "channel number is greater than zero" |
| 333 | + ); |
| 334 | + } |
| 335 | + |
324 | 336 | fn open(
|
325 | 337 | device: &cpal::Device,
|
326 | 338 | config: &OutputStreamConfig,
|
327 | 339 | ) -> Result<OutputStream, StreamError> {
|
| 340 | + Self::validate_config(config); |
328 | 341 | let (controller, source) = mixer(config.channel_count, config.sample_rate);
|
329 | 342 | Self::init_stream(device, config, source).and_then(|stream| {
|
330 | 343 | stream.play().map_err(StreamError::PlayStreamError)?;
|
|
0 commit comments