Skip to content

Commit a272fd1

Browse files
authored
Merge pull request #704 from PetrGlad/out-stream-improvements
Better diagnostics when CPAL reports 0 buffer size in device config.
2 parents 496e122 + c8f2d56 commit a272fd1

File tree

2 files changed

+20
-7
lines changed

2 files changed

+20
-7
lines changed

src/common.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/// Stream sample rate (samples per second per channel).
1+
/// Stream sample rate (a frame rate or samples per second per channel).
22
pub type SampleRate = u32;
33

44
/// Number of channels in a stream.

src/stream.rs

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
1-
use std::io::{Read, Seek};
2-
use std::marker::Sync;
3-
use std::sync::Arc;
4-
use std::{error, fmt};
5-
61
use crate::common::{ChannelCount, SampleRate};
72
use crate::decoder;
83
use crate::mixer::{mixer, Mixer, MixerSource};
94
use crate::sink::Sink;
105
use cpal::traits::{DeviceTrait, HostTrait, StreamTrait};
116
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};
1211

1312
const HZ_44100: SampleRate = 44_100;
1413

@@ -212,7 +211,9 @@ fn clamp_supported_buffer_size(
212211
) -> BufferSize {
213212
match buffer_size {
214213
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)
216217
}
217218
SupportedBufferSize::Unknown => BufferSize::Default,
218219
}
@@ -321,10 +322,22 @@ impl error::Error for StreamError {
321322
}
322323

323324
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+
324336
fn open(
325337
device: &cpal::Device,
326338
config: &OutputStreamConfig,
327339
) -> Result<OutputStream, StreamError> {
340+
Self::validate_config(config);
328341
let (controller, source) = mixer(config.channel_count, config.sample_rate);
329342
Self::init_stream(device, config, source).and_then(|stream| {
330343
stream.play().map_err(StreamError::PlayStreamError)?;

0 commit comments

Comments
 (0)