Skip to main content

kithara_audio/
lib.rs

1//! # Kithara Audio
2//!
3//! Audio pipeline library with decoding, effects, and resampling.
4//!
5//! ## Architecture
6//!
7//! - [`Audio`] - Generic audio pipeline running in a separate thread
8//! - [`AudioConfig`] - Pipeline configuration
9//! - [`ResamplerQuality`] - Sample rate conversion quality
10//! - `Audio` also implements `rodio::Source` directly (requires `rodio` feature)
11//!
12//! ## Target API
13//!
14//! ```ignore
15//! use kithara_audio::{Audio, AudioConfig};
16//! use kithara_hls::{Hls, HlsConfig};
17//! use kithara_stream::Stream;
18//! use ringbuf::traits::Consumer;
19//!
20//! // HLS stream with decoding
21//! let config = AudioConfig::<Hls>::new(hls_config);
22//! let mut audio = Audio::<Stream<Hls>>::new(config).await?;
23//! sink.append(audio);  // rodio compatible
24//!
25//! // Or read PCM from channel directly
26//! while let Some(chunk) = audio.pcm_rx().try_pop() {
27//!     play_audio(chunk);
28//! }
29//!
30//! // Events via event_bus()
31//! let mut events = audio.event_bus().subscribe();
32//! while let Ok(event) = events.recv().await {
33//!     println!("Audio: {:?}", event);
34//! }
35//! ```
36
37#![forbid(unsafe_code)]
38
39mod audio;
40pub mod effects;
41#[cfg(any(test, feature = "mock"))]
42pub mod mock;
43mod pipeline;
44mod resampler;
45mod runtime;
46mod traits;
47pub(crate) mod worker;
48
49pub use audio::Audio;
50pub use effects::eq::{EqBandConfig, EqEffect, FilterKind, IsolatorEq, generate_log_spaced_bands};
51pub use pipeline::{
52    config::AudioConfig,
53    fetch::{EpochValidator, Fetch},
54    track_fsm::TrackPhaseTag,
55};
56pub use resampler::{ResamplerParams, ResamplerProcessor, ResamplerQuality};
57pub use traits::{
58    AudioEffect, ChunkOutcome, DecodeError, DecodeResult, PcmReader, PendingReason, ReadOutcome,
59    SeekOutcome,
60};
61pub use worker::{AudioWorkerSource, handle::AudioWorkerHandle, types::ServiceClass};