[![Crates.io](https://img.shields.io/crates/l/bwavfile)](LICENSE)
[![Crates.io](https://img.shields.io/crates/v/bwavfile)](https://crates.io/crates/bwavfile/)
![GitHub last commit](https://img.shields.io/github/last-commit/iluvcapra/bwavfile)
[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/iluvcapra/bwavfile/rust.yml?branch=master)](https://github.com/iluvcapra/bwavfile/actions?query=workflow%3ARust)

# bwavfile
Wave File Reader/Writer library in Rust, with Broadcast-WAV, RF64 and production metadata support


## Features

__bwavfile__ provides a reader `WaveReader` and writer type `WaveWriter` for 
reading and creating new wave audio files.

`WaveReader` and `WaveWriter` support:
  * A unified interface for standard RIFF and RF64/BW64 64-bit Wave files.
  * When using `WaveWriter`, wave files are transparently upgraded from RIFF
    to RF64 when required.
  * Unpacked reading and writing of Integer PCM and IEEE float audio data 
    formats.
  * A unified interface for standard `WaveFormat` and extended `WaveFormatEx`
    wave data format.

The library has extensive metadata support, with emphasis on film and video 
production metadata:
  * Broadcast-Wave metadata extension, including long description, originator, 
		SMPTE UMID and coding history.
  * Reading and writing of embedded iXML and axml/ADM metadata.
  * Reading and writing of timed cues and and timed cue regions.
  * Multichannel, surround, and ambisonic audio data description including 
    surround channel maps, ADM `AudioTrackFormat`, `AudioChannelFormatRef` and 
    `AudioPackRef` data structures.


## Feature Roadmap

Some features that may be included in the future include:
  * Broadcast-Wave `levl` waveform overview data reading and writing.
  * Sampler and Instrument metadata.
  * Performance improvements.


## Use Examples

  * [blits](examples/blits.rs) shows how to use `WaveWriter` to create a new
    file with BLITS alignment tones.
  * [wave-inter](examples/wave-inter.rs) uses `WaveReader` and `WaveWriter` to
    interleave several input Wave files into a single polyphonic Wave file.
  * [wave-deinter](examples/wave-deinter.rs) uses `WaveReader` and `WaveWriter`
    to de-interleave an input Wave file into several monoarual Wave files.

## 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.

[rf64test]: https://github.com/iluvcapra/bwavfile/blob/1f8542a7efb481da076120bf8107032c5b48889d/src/wavewriter.rs#L399
