mirror of
https://github.com/iluvcapra/bwavfile.git
synced 2025-12-31 17:00:44 +00:00
72 lines
2.6 KiB
Markdown
72 lines
2.6 KiB
Markdown
[](LICENSE)
|
||
[](https://crates.io/crates/bwavfile/)
|
||

|
||
[](https://github.com/iluvcapra/bwavfile/actions?query=workflow%3ARust)
|
||
|
||
# bwavfile
|
||
Rust Wave File Reader/Writer with Broadcast-WAV, MBWF and RF64 Support
|
||
|
||
### Features
|
||
|
||
This is currently a work-in-progress! However many features presently work:
|
||
|
||
| Feature |Read |Write|
|
||
|---------------------------------------|:---:|:-----:|
|
||
| Standard .wav files | ☑️ | ☑ ️ |
|
||
| Transparent promotion to RF64/BW64 | ☑️ | |
|
||
| Unified interface for regular and extended Wave format | ☑️ | |
|
||
| Channel/speaker map metadata | ☑️ | ☑️ |
|
||
| Ambisonic B-format metadata | ☑️ | ☑️ |
|
||
| EBU Broadcast-WAVE metadata | ☑️ | ☑️ |
|
||
| Basic iXML/ADM metadata | ☑️ | |
|
||
| Enhanced iXML metadata support | | |
|
||
| Broadcast-WAVE Level overview `levl` metadata | | |
|
||
| Cue list metadata | ☑️ | |
|
||
| Sampler and instrument metadata | | |
|
||
| Enhanced Wave file form validation | ☑ ️ | |
|
||
|
||
|
||
## Use Examples
|
||
|
||
### Reading Audio Frames From a File
|
||
|
||
```rust
|
||
|
||
use bwavfile::WaveReader;
|
||
let mut r = WaveReader::open("tests/media/ff_silence.wav").unwrap();
|
||
|
||
let format = r.format().unwrap();
|
||
assert_eq!(format.sample_rate, 44100);
|
||
assert_eq!(format.channel_count, 1);
|
||
|
||
let mut buffer = format.create_frame_buffer();
|
||
let mut frame_reader = r.audio_frame_reader().unwrap();
|
||
|
||
let read = frame_reader.read_integer_frame(&mut buffer).unwrap();
|
||
|
||
assert_eq!(buffer, [0i32]);
|
||
assert_eq!(read, 1);
|
||
```
|
||
|
||
### Accessing Channel Descriptions
|
||
|
||
```rust
|
||
use bwavfile::{WaveReader, ChannelMask};
|
||
|
||
let mut f = WaveReader::open("tests/media/pt_24bit_51.wav").unwrap();
|
||
|
||
let chans = f.channels().unwrap();
|
||
assert_eq!(chans[0].index, 0);
|
||
assert_eq!(chans[0].speaker, ChannelMask::FrontLeft);
|
||
assert_eq!(chans[3].index, 3);
|
||
assert_eq!(chans[3].speaker, ChannelMask::LowFrequency);
|
||
assert_eq!(chans[4].speaker, ChannelMask::BackLeft);
|
||
```
|
||
|
||
## Note on Testing
|
||
|
||
All of the media for the integration tests is committed to the respository
|
||
in zipped form. Before you can run tests, you need to `cd` into the `tests`
|
||
directory and run the `create_test_media.sh` script. Note that one of the
|
||
test files (the RF64 test case) is over four gigs in size.
|