# AIFC
[![Cross-platform tests](https://github.com/karip/aifc/actions/workflows/cross-test.yml/badge.svg)](https://github.com/karip/aifc/actions/workflows/cross-test.yml)
Rust library to read and write AIFF and AIFF-C (AIFC) audio format.
Features:
- reading AIFF and AIFF-C
- writing AIFF and AIFF-C
- no heap memory allocations
- no unsafe code
- no panicking
- supports uncompressed integer and floating point samples
- supports compression types: μ-law, A-law and IMA ADPCM ("ima4")
- supports audio files up to 4 gigabytes
Out of scope:
- conversion between different sample formats (e.g., i16 to f32). There's
[so many ways](https://web.archive.org/web/20240224192658/http://blog.bjornroche.com/2009/12/int-float-int-its-jungle-out-there.html)
to do the conversion that it's better that this crate doesn't do it.
## Usage
Reading AIFF/AIFF-C file:
```rust, no_run
let mut stream = std::io::BufReader::new(std::fs::File::open("test.aiff").expect("Open failed"));
let mut reader = aifc::AifcReader::new(&mut stream).expect("Can't create reader");
let info = reader.read_info().expect("Can't read header");
for sample in reader.samples().expect("Can't iterate samples") {
println!("Got sample {:?}", sample.expect("Sample read error"));
}
```
Writing AIFF-C file with the default 2 channels, 16 bits/sample and sample rate 44100:
```rust, no_run
let mut stream = std::io::BufWriter::new(std::fs::File::create("test.aiff").expect("Open failed"));
let info = aifc::AifcWriteInfo::default();
let mut writer = aifc::AifcWriter::new(&mut stream, &info).expect("Can't create writer");
writer.write_samples_i16(&[ 1, 2, 3, 4 ]).expect("Can't write samples");
writer.finalize().expect("Can't finalize");
```
See [the AIFC API documentation](https://docs.rs/aifc/) for details.
## Examples
A simple AIFF player using `aifc::AifcReader` and [tinyaudio](https://crates.io/crates/tinyaudio):
```sh
cd examples/aifc-tinyaudio
cargo run filename.aiff
```
## Testing
[Toisto AIFF Test Suite](https://github.com/karip/toisto-aiff-test-suite) is a submodule and
needs to be fetched before running the tests.
```sh
cd aifc
git submodule update --init
./tools/test.sh
```
The test should end with `--- All tests OK.`.
Performance testing:
```sh
cargo bench
```
There is a GitHub Action called "Cross-platform tests" (cross-test.yml), which automatically
runs `./tools/test.sh` for little-endian 64-bit x64_86 and big-endian 32-bit PowerPC.
## References
- [Wikipedia: AIFF file format](https://en.wikipedia.org/wiki/Audio_Interchange_File_Format)
- [AIFF/AIFF-C Specifications](https://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/AIFF/AIFF.html)
## License
Licensed under either of Apache License, Version
2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
dual licensed as above, without any additional terms or conditions.