1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//! The `stream-wave-parser` is a crate that treats a stream from WAVE file.
//!
//! ```
//! # use stream_wave_parser::WaveStream;
//! # use futures_util::StreamExt as _;
//! #
//! use futures_util::stream::iter; // To create stream from `Vec<_>`.
//!
//! #[tokio::main]
//! async fn main() {
//! // create wave stream.
//! let chunks = create_sine_wave()
//! .chunks(256)
//! .map(|x| Ok(x.iter().cloned().collect::<Vec<_>>()))
//! .collect::<Vec<_>>();
//! let stream = iter(chunks);
//!
//! // read stream by `WaveStream`.
//! let mut stream = WaveStream::new(stream);
//! let spec = stream.spec().await.unwrap();
//! assert_eq!(spec.pcm_format, 1);
//! assert_eq!(spec.channels, 1);
//! assert_eq!(spec.sample_rate, 8000);
//! assert_eq!(spec.bits_per_sample, 16);
//!
//! let data_size = 16000; // 8000 samples x 2 Bytes (16 bits per sample)
//! let mut data = stream.into_data().await;
//! let mut size = 0;
//! while let Some(chunk) = data.next().await {
//! let chunk = chunk.unwrap();
//! size += chunk.len();
//! }
//! assert_eq!(data_size, size as u32);
//! }
//!
//! /// create sine wave (440 Hz 1 seconds)
//! fn create_sine_wave() -> Vec<u8> {
//! use std::f32::consts::PI;
//!
//! let data_chunk = (0..)
//! .enumerate()
//! .map(|(_, idx)| {
//! let t = idx as f32 / 8000.0;
//! let sample = (t * 440. * 2. * PI).sin();
//! ((sample * i16::MAX as f32) as i16).to_le_bytes()
//! })
//! .take(8000)
//! .flatten()
//! .collect::<Vec<u8>>();
//!
//! let mut wave = vec![];
//! let riff_length = ((data_chunk.len() + 36) as u32).to_le_bytes();
//! wave.extend(b"RIFF");
//! wave.extend(riff_length);
//! wave.extend(b"WAVE");
//! wave.extend(b"fmt ");
//! wave.extend(16u32.to_le_bytes()); // `fmt ` chunk size
//! wave.extend(1u16.to_le_bytes()); // PCM format
//! wave.extend(1u16.to_le_bytes()); // channels
//! wave.extend(8000u32.to_le_bytes()); // sample rate
//! wave.extend(16000u32.to_le_bytes()); // bit rate
//! wave.extend(2u16.to_le_bytes()); // block size
//! wave.extend(16u16.to_le_bytes()); // bits per sample
//!
//! wave.extend(b"data");
//! wave.extend((data_chunk.len() as u32).to_le_bytes());
//! wave.extend(data_chunk);
//!
//! wave
//! }
//! ```
pub use ;
pub use ;
pub use ;