# rift-media
<p align="center">
<a href="https://github.com/infinityabundance/riftd">
<img src="https://raw.githubusercontent.com/infinityabundance/riftd/main/assets/riftd.svg" alt="riftd" width="80">
</a>
</p>
<p align="center">
<a href="https://crates.io/crates/rift-media"><img src="https://img.shields.io/crates/v/rift-media.svg" alt="crates.io"></a>
<a href="https://docs.rs/rift-media"><img src="https://docs.rs/rift-media/badge.svg" alt="docs.rs"></a>
<a href="https://github.com/infinityabundance/riftd/blob/main/LICENSE-MIT"><img src="https://img.shields.io/badge/license-MIT%2FApache--2.0-blue.svg" alt="License"></a>
<a href="https://doi.org/10.5281/zenodo.18528430"><img src="https://zenodo.org/badge/DOI/10.5281/zenodo.18528430.svg" alt="DOI"></a>
</p>
<p align="center">
Audio capture, playback, and Opus codec for the <a href="https://github.com/infinityabundance/riftd">riftd</a> P2P protocol.
</p>
---
Part of the [riftd](https://github.com/infinityabundance/riftd) project — serverless P2P voice + text chat over UDP.
## What's in this crate?
`rift-media` handles everything audio:
- **Audio Capture** — Cross-platform microphone input via cpal
- **Audio Playback** — Cross-platform speaker output via cpal
- **Opus Codec** — High-quality, low-latency voice encoding
- **VAD** — Voice activity detection to reduce bandwidth
- **Level Metering** — Audio level detection for UI indicators
- **Quality Presets** — Low/medium/high bitrate configurations
## Usage
```rust
use rift_media::{AudioConfig, OpusEncoder, OpusDecoder, AudioCapture};
let config = AudioConfig::default();
// Encoding
let mut encoder = OpusEncoder::new(&config)?;
let encoded = encoder.encode_f32(&samples, &mut output)?;
// Decoding
let mut decoder = OpusDecoder::new(&config)?;
let decoded = decoder.decode_f32(&encoded, &mut output)?;
// Capture from microphone
let capture = AudioCapture::new(&config)?;