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
#![warn(missing_docs)]
//! 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
//! }
//! ```
mod error;
mod wave;
pub use error::{Error, Result};
pub use wave::{WaveSpec, WaveStream};