ape-decoder
Pure Rust decoder for Monkey's Audio (APE) lossless audio files.
Features
- Decode APE files to raw PCM audio
- All compression levels (Fast, Normal, High, Extra High, Insane)
- All bit depths (8, 16, 24, 32-bit) and channel layouts (mono, stereo, multichannel)
- Streaming frame-by-frame decode with iterator
- Sample-level seeking
- Multi-threaded parallel decoding
- Range decoding (decode a subset of samples)
- Progress callbacks with cancellation
- APEv2 tag read/write/remove
- ID3v2 tag parsing (v2.3 and v2.4)
- MD5 quick verification (no decompression needed)
- WAV header generation for APE-to-WAV export
- No unsafe code
Quick Start
use File;
use BufReader;
let file = open.unwrap;
let mut reader = new;
// Decode entire file to raw PCM bytes (little-endian, interleaved)
let pcm_data = decode.unwrap;
Streaming Decode
use ApeDecoder;
use File;
use BufReader;
let file = open.unwrap;
let mut decoder = new.unwrap;
// Access metadata
let info = decoder.info;
println!;
// Decode frame by frame
for frame_result in decoder.frames
Seeking
// Seek to a specific sample (returns frame index + skip offset)
let pos = decoder.seek?; // seek to 1 second
println!;
// Or seek and decode in one call
let pcm_from_1s = decoder.decode_from?;
Reading Tags
// APEv2 tags
if let Some = decoder.read_tag?
// ID3v2 tags (if present in file header)
if let Some = decoder.read_id3v2_tag?
Writing Tags
use ;
use OpenOptions;
let mut file = new.read.write.open?;
let mut tag = new;
tag.set;
tag.set;
tag.set;
tag.set;
write_tag?;
Parallel Decode
// Decode using 4 threads (output is byte-identical to single-threaded)
let pcm = decoder.decode_all_parallel?;
Range Decode
// Decode only samples 44100..88200 (1 second starting at 1s)
let pcm = decoder.decode_range?;
Progress Callback
let pcm = decoder.decode_all_with?;
APE to WAV Export
let header = decoder.wav_header_data
.map
.unwrap_or_else;
let pcm = decoder.decode_all?;
let mut wav = create?;
wav.write_all?;
wav.write_all?;
MD5 Verification
// Quick verify without decompressing (checks stored MD5 hash)
if decoder.verify_md5?
Supported Formats
| Bit Depth | Channels | Status |
|---|---|---|
| 8-bit | Mono/Stereo | Supported |
| 16-bit | Mono/Stereo/Multichannel | Supported |
| 24-bit | Mono/Stereo/Multichannel | Supported |
| 32-bit | Mono/Stereo | Supported |
All five compression levels: Fast (1000), Normal (2000), High (3000), Extra High (4000), Insane (5000).
Limitations
- Decode only (no encoder)
- Requires APE file version >= 3950 (files created by Monkey's Audio 3.95+)
License
Licensed under either of:
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT License (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Acknowledgments
Based on the Monkey's Audio SDK by Matthew T. Ashland, licensed under the 3-clause BSD license.