use tokio::io::AsyncReadExt; use pmoflac::{ decode_ogg_opus_stream, encode_flac_stream, EncoderOptions, PcmFormat, StreamInfo, }; const TEST_OPUS: &str = "test_data/music_orig.opus"; #[tokio::test] async fn decode_ogg_opus_produces_pcm() -> Result<(), Box> { let file = tokio::fs::File::open(TEST_OPUS).await?; let mut stream = decode_ogg_opus_stream(file).await?; let info: StreamInfo = stream.info().clone(); assert_eq!(info.sample_rate, 48_000); assert_eq!(info.bits_per_sample, 16); assert!(info.channels > 0); let mut pcm = Vec::new(); stream.read_to_end(&mut pcm).await?; assert!(!pcm.is_empty()); let frame_width = info.channels as usize * info.bytes_per_sample(); assert_eq!(pcm.len() % frame_width, 0, "PCM data should align on frame"); stream.wait().await?; Ok(()) } #[tokio::test] async fn opus_pcm_can_be_encoded_to_flac() -> Result<(), Box> { let file = tokio::fs::File::open(TEST_OPUS).await?; let stream = decode_ogg_opus_stream(file).await?; let (info, reader) = stream.into_parts(); let format = PcmFormat { sample_rate: info.sample_rate, channels: info.channels, bits_per_sample: info.bits_per_sample, }; let mut flac = encode_flac_stream(reader, format, EncoderOptions::default()).await?; let mut encoded = Vec::new(); flac.read_to_end(&mut encoded).await?; assert!(!encoded.is_empty()); assert!( encoded.starts_with(b"fLaC"), "Encoded data should start with FLAC marker" ); flac.wait().await?; Ok(()) }