use std::io::{Read, Seek};
use crate::{
Metadata,
error::Result,
input::{EncodePcmStream, PcmSpec},
read::{DecodePcmStream, FlacReader},
};
use super::verify::VerifyingPcmStream;
pub struct FlacRecompressSource<S> {
metadata: Metadata,
stream: VerifyingPcmStream<S>,
}
impl<S> FlacRecompressSource<S>
where
S: DecodePcmStream,
{
#[must_use]
pub fn new(metadata: Metadata, stream: S, expected_streaminfo_md5: [u8; 16]) -> Self {
Self {
metadata,
stream: VerifyingPcmStream::new(stream, expected_streaminfo_md5),
}
}
#[must_use]
pub fn spec(&self) -> PcmSpec {
self.stream.spec()
}
#[must_use]
pub fn metadata(&self) -> &Metadata {
&self.metadata
}
pub fn set_metadata(&mut self, metadata: Metadata) {
self.metadata = metadata;
}
#[must_use]
pub fn with_metadata(mut self, metadata: Metadata) -> Self {
self.metadata = metadata;
self
}
#[must_use]
pub fn total_samples(&self) -> u64 {
self.stream.spec().total_samples
}
pub fn set_threads(&mut self, threads: usize) {
self.stream.set_threads(threads);
}
pub(super) fn into_encode_parts(self) -> (Metadata, VerifyingPcmStream<S>) {
(self.metadata, self.stream)
}
}
impl<R: Read + Seek> FlacRecompressSource<crate::read::FlacPcmStream<R>> {
#[must_use]
pub(crate) fn from_reader(reader: FlacReader<R>) -> Self {
let (metadata, stream_info, _spec, stream) = reader.into_session_parts();
Self::new(metadata, stream, stream_info.md5)
}
}
impl<S> EncodePcmStream for FlacRecompressSource<S>
where
S: DecodePcmStream,
{
fn spec(&self) -> PcmSpec {
self.stream.spec()
}
fn read_chunk(&mut self, max_frames: usize, output: &mut Vec<i32>) -> Result<usize> {
self.stream.read_chunk(max_frames, output)
}
}