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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
//! # audio-file
//!
//! A simple library to read and write audio files on your disk.
//!
//! The library can read many formats and can write only to wav files.
//!
//! ## Quick Start
//!
//! ### Read Audio
//!
//! You can read most common audio formats. The default feature set enables all available codecs.
//!
//! ```rust
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
//! let audio = audio_file::read::<f32>("test_data/test_1ch.wav", audio_file::ReadConfig::default())?;
//! let sample_rate = audio.sample_rate;
//! let num_channels = audio.num_channels;
//! let samples = &audio.samples_interleaved;
//! # Ok(())
//! # }
//! ```
//!
//! With `audio-blocks`, you can read straight into an `AudioBlock`, which adds simple channel-based read helpers:
//!
//! ```rust
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
//! let (block, sample_rate) = audio_file::read_block::<f32>("test_data/test_1ch.wav", audio_file::ReadConfig::default())?;
//! # Ok(())
//! # }
//! ```
//!
//! ### Write Audio
//!
//! You can only write wav files. The `audio_file::write` function expects interleaved samples.
//!
//! ```rust
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
//! let samples = [0.0, 1.0, 0.0, 1.0, 0.0, 1.0]; // interleaved
//! let num_channels = 2;
//! let sample_rate = 48000;
//! audio_file::write(
//! "tmp.wav",
//! &samples,
//! num_channels,
//! sample_rate,
//! audio_file::WriteConfig::default(),
//! )?;
//! # Ok(())
//! # }
//! ```
//!
//! With the `audio-blocks` feature you can write any audio layout, e.g.:
//!
//! ```rust
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
//! # use audio_file::*;
//! let sample_rate = 48000;
//!
//! let block = InterleavedView::from_slice(&[0.0, 1.0, 0.0, 1.0, 0.0, 1.0], 2);
//! audio_file::write_block("tmp.wav", block, sample_rate, audio_file::WriteConfig::default())?;
//!
//! let block = SequentialView::from_slice(&[0.0, 0.0, 0.0, 1.0, 1.0, 1.0], 2);
//! audio_file::write_block("tmp.wav", block, sample_rate, audio_file::WriteConfig::default())?;
//! # Ok(())
//! # }
//! ```
//!
//! ## Supported Input Codecs
//!
//! Default features enable all codecs (including royalty-encumbered formats) via `all-codecs`.
//! To opt out, disable default features and enable only what you need.
//!
//! | Format | Feature Flag |
//! |--------|--------------|
//! | AAC | `aac` |
//! | ADPCM | `adpcm` |
//! | ALAC | `alac` |
//! | FLAC | `flac` |
//! | CAF | `caf` |
//! | ISO MP4 | `isomp4` |
//! | Matroska (MKV) | `mkv` |
//! | MP1 | `mp1` |
//! | MP2 | `mp2` |
//! | MP3 | `mp3` |
//! | Ogg | `ogg` |
//! | PCM | `pcm` |
//! | AIFF | `aiff` |
//! | Vorbis | `vorbis` |
//! | WAV | `wav` |
//!
//! Feature flags:
//!
//! - `all-codecs` enables all Symphonia codecs (this is the default).
//! - `audio-blocks` enables `read_block` and `write_block`.
//! - Individual codec flags (above) enable specific formats.
//!
//!
//! ## Read and Write Options
//!
//! ### Reading
//!
//! When reading a file you can specify the following things:
//!
//! - Start and stop in frames or time
//! - Start channel and number of channels
//! - Optional resampling
//!
//! The crate will try to decode and store only the parts that you selected.
//!
//! ### Writing
//!
//! For writing audio you can select from the following sample formats:
//!
//! | Format | Description |
//! |--------|-------------|
//! | `Int8` | 8-bit integer |
//! | `Int16` | 16-bit integer (default) |
//! | `Int32` | 32-bit integer |
//! | `Float32` | 32-bit float |
//!
//! `Int16` is the default, for broader compatibility.
//!
//! ### Some example configs:
//!
//! - resample to 22.05 kHz while reading
//!
//! ```rust
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
//! let audio = audio_file::read::<f32>(
//! "test_data/test_1ch.wav",
//! audio_file::ReadConfig {
//! sample_rate: Some(22_050),
//! ..Default::default()
//! },
//! )?;
//! # Ok(())
//! # }
//! ```
//!
//! - read the first 0.5 seconds
//!
//! ```rust
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
//! # use std::time::Duration;
//! let audio = audio_file::read::<f32>(
//! "test_data/test_1ch.wav",
//! audio_file::ReadConfig {
//! stop: audio_file::Position::Time(Duration::from_secs_f32(0.5)),
//! ..Default::default()
//! },
//! )?;
//! # Ok(())
//! # }
//! ```
//!
//! - read from frame 300 to 400
//!
//! ```rust
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
//! # use audio_file::*;
//! let audio = audio_file::read::<f32>(
//! "test_data/test_1ch.wav",
//! audio_file::ReadConfig {
//! start: audio_file::Position::Frame(300),
//! stop: audio_file::Position::Frame(400),
//! ..Default::default()
//! },
//! )?;
//! # Ok(())
//! # }
//! ```
//!
//! - read only the first two channels
//!
//! ```rust
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
//! # use audio_file::*;
//! let audio = audio_file::read::<f32>(
//! "test_data/test_4ch.wav",
//! audio_file::ReadConfig {
//! num_channels: Some(2),
//! ..Default::default()
//! },
//! )?;
//! # Ok(())
//! # }
//! ```
//!
//! - skip the first channel, reading channel 2 and 3
//!
//! ```rust
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
//! let audio = audio_file::read::<f32>(
//! "test_data/test_4ch.wav",
//! audio_file::ReadConfig {
//! start_channel: Some(1),
//! num_channels: Some(2),
//! ..Default::default()
//! },
//! )?;
//! # Ok(())
//! # }
//! ```
//!
//! - write audio samples in `Float32`
//!
//! ```rust
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
//! # let samples_interleaved: Vec<f32> = vec![];
//! # let num_channels = 2u16;
//! # let sample_rate = 48000u32;
//! audio_file::write(
//! "tmp.wav",
//! &samples_interleaved,
//! num_channels,
//! sample_rate,
//! audio_file::WriteConfig {
//! sample_format: audio_file::SampleFormat::Float32,
//! },
//! )?;
//! # Ok(())
//! # }
//! ```
pub use *;
pub use read_block;
pub use ;
pub use write_block;
pub use ;