1#![allow(dead_code)]
2#![allow(non_snake_case)]
3
4use std::fmt::Debug;
5
6use xlaw::{PcmXLawEncoder, XLaw};
7use io_utils::Writer;
8use audioutils::{sample_conv, sample_conv_batch, stereo_conv, stereos_conv};
9use sampletypes::{SampleType, i24, u24};
10use crate::adpcm;
11use crate::errors::AudioWriteError;
12use crate::format_specs::format_tags::*;
13use crate::format_specs::guids::*;
14use crate::wavcore::{ExtensibleData, FmtChunk, FmtExtension};
15use crate::wavcore::{Spec, WaveSampleType};
16
17pub trait EncoderToImpl: Debug {
21 fn get_channels(&self) -> u16;
22 fn get_max_channels(&self) -> u16;
23 fn get_bitrate(&self) -> u32;
24 fn new_fmt_chunk(&mut self) -> Result<FmtChunk, AudioWriteError>;
25 fn update_fmt_chunk(&self, fmt: &mut FmtChunk) -> Result<(), AudioWriteError>;
26 fn begin_encoding(&mut self) -> Result<(), AudioWriteError>;
27 fn finish(&mut self) -> Result<(), AudioWriteError>;
28
29 fn write_interleaved_samples__i8(&mut self, samples: &[i8 ]) -> Result<(), AudioWriteError>;
31 fn write_interleaved_samples_i16(&mut self, samples: &[i16]) -> Result<(), AudioWriteError>;
32 fn write_interleaved_samples_i24(&mut self, samples: &[i24]) -> Result<(), AudioWriteError>;
33 fn write_interleaved_samples_i32(&mut self, samples: &[i32]) -> Result<(), AudioWriteError>;
34 fn write_interleaved_samples_i64(&mut self, samples: &[i64]) -> Result<(), AudioWriteError>;
35 fn write_interleaved_samples__u8(&mut self, samples: &[u8 ]) -> Result<(), AudioWriteError>;
36 fn write_interleaved_samples_u16(&mut self, samples: &[u16]) -> Result<(), AudioWriteError>;
37 fn write_interleaved_samples_u24(&mut self, samples: &[u24]) -> Result<(), AudioWriteError>;
38 fn write_interleaved_samples_u32(&mut self, samples: &[u32]) -> Result<(), AudioWriteError>;
39 fn write_interleaved_samples_u64(&mut self, samples: &[u64]) -> Result<(), AudioWriteError>;
40 fn write_interleaved_samples_f32(&mut self, samples: &[f32]) -> Result<(), AudioWriteError>;
41 fn write_interleaved_samples_f64(&mut self, samples: &[f64]) -> Result<(), AudioWriteError>;
42
43 fn write_frame__i8(&mut self, frame: &[i8 ]) -> Result<(), AudioWriteError> {self.write_interleaved_samples__i8(&audioutils::frames_to_interleaved_samples(&[frame.to_vec()])?)}
45 fn write_frame_i16(&mut self, frame: &[i16]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i16(&audioutils::frames_to_interleaved_samples(&[frame.to_vec()])?)}
46 fn write_frame_i24(&mut self, frame: &[i24]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i24(&audioutils::frames_to_interleaved_samples(&[frame.to_vec()])?)}
47 fn write_frame_i32(&mut self, frame: &[i32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i32(&audioutils::frames_to_interleaved_samples(&[frame.to_vec()])?)}
48 fn write_frame_i64(&mut self, frame: &[i64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i64(&audioutils::frames_to_interleaved_samples(&[frame.to_vec()])?)}
49 fn write_frame__u8(&mut self, frame: &[u8 ]) -> Result<(), AudioWriteError> {self.write_interleaved_samples__u8(&audioutils::frames_to_interleaved_samples(&[frame.to_vec()])?)}
50 fn write_frame_u16(&mut self, frame: &[u16]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u16(&audioutils::frames_to_interleaved_samples(&[frame.to_vec()])?)}
51 fn write_frame_u24(&mut self, frame: &[u24]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u24(&audioutils::frames_to_interleaved_samples(&[frame.to_vec()])?)}
52 fn write_frame_u32(&mut self, frame: &[u32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u32(&audioutils::frames_to_interleaved_samples(&[frame.to_vec()])?)}
53 fn write_frame_u64(&mut self, frame: &[u64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u64(&audioutils::frames_to_interleaved_samples(&[frame.to_vec()])?)}
54 fn write_frame_f32(&mut self, frame: &[f32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f32(&audioutils::frames_to_interleaved_samples(&[frame.to_vec()])?)}
55 fn write_frame_f64(&mut self, frame: &[f64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f64(&audioutils::frames_to_interleaved_samples(&[frame.to_vec()])?)}
56
57 fn write_frames__i8(&mut self, frames: &[Vec<i8 >]) -> Result<(), AudioWriteError> {self.write_interleaved_samples__i8(&audioutils::frames_to_interleaved_samples(frames)?)}
59 fn write_frames_i16(&mut self, frames: &[Vec<i16>]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i16(&audioutils::frames_to_interleaved_samples(frames)?)}
60 fn write_frames_i24(&mut self, frames: &[Vec<i24>]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i24(&audioutils::frames_to_interleaved_samples(frames)?)}
61 fn write_frames_i32(&mut self, frames: &[Vec<i32>]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i32(&audioutils::frames_to_interleaved_samples(frames)?)}
62 fn write_frames_i64(&mut self, frames: &[Vec<i64>]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i64(&audioutils::frames_to_interleaved_samples(frames)?)}
63 fn write_frames__u8(&mut self, frames: &[Vec<u8 >]) -> Result<(), AudioWriteError> {self.write_interleaved_samples__u8(&audioutils::frames_to_interleaved_samples(frames)?)}
64 fn write_frames_u16(&mut self, frames: &[Vec<u16>]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u16(&audioutils::frames_to_interleaved_samples(frames)?)}
65 fn write_frames_u24(&mut self, frames: &[Vec<u24>]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u24(&audioutils::frames_to_interleaved_samples(frames)?)}
66 fn write_frames_u32(&mut self, frames: &[Vec<u32>]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u32(&audioutils::frames_to_interleaved_samples(frames)?)}
67 fn write_frames_u64(&mut self, frames: &[Vec<u64>]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u64(&audioutils::frames_to_interleaved_samples(frames)?)}
68 fn write_frames_f32(&mut self, frames: &[Vec<f32>]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f32(&audioutils::frames_to_interleaved_samples(frames)?)}
69 fn write_frames_f64(&mut self, frames: &[Vec<f64>]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f64(&audioutils::frames_to_interleaved_samples(frames)?)}
70
71 fn write_mono__i8(&mut self, sample: i8 ) -> Result<(), AudioWriteError> {self.write_interleaved_samples__i8(&(0..self.get_channels()).map(|_|sample).collect::<Vec<i8 >>())}
73 fn write_mono_i16(&mut self, sample: i16) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i16(&(0..self.get_channels()).map(|_|sample).collect::<Vec<i16>>())}
74 fn write_mono_i24(&mut self, sample: i24) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i24(&(0..self.get_channels()).map(|_|sample).collect::<Vec<i24>>())}
75 fn write_mono_i32(&mut self, sample: i32) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i32(&(0..self.get_channels()).map(|_|sample).collect::<Vec<i32>>())}
76 fn write_mono_i64(&mut self, sample: i64) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i64(&(0..self.get_channels()).map(|_|sample).collect::<Vec<i64>>())}
77 fn write_mono__u8(&mut self, sample: u8 ) -> Result<(), AudioWriteError> {self.write_interleaved_samples__u8(&(0..self.get_channels()).map(|_|sample).collect::<Vec<u8 >>())}
78 fn write_mono_u16(&mut self, sample: u16) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u16(&(0..self.get_channels()).map(|_|sample).collect::<Vec<u16>>())}
79 fn write_mono_u24(&mut self, sample: u24) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u24(&(0..self.get_channels()).map(|_|sample).collect::<Vec<u24>>())}
80 fn write_mono_u32(&mut self, sample: u32) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u32(&(0..self.get_channels()).map(|_|sample).collect::<Vec<u32>>())}
81 fn write_mono_u64(&mut self, sample: u64) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u64(&(0..self.get_channels()).map(|_|sample).collect::<Vec<u64>>())}
82 fn write_mono_f32(&mut self, sample: f32) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f32(&(0..self.get_channels()).map(|_|sample).collect::<Vec<f32>>())}
83 fn write_mono_f64(&mut self, sample: f64) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f64(&(0..self.get_channels()).map(|_|sample).collect::<Vec<f64>>())}
84
85 fn write_mono_channel__i8(&mut self, monos: &[i8 ]) -> Result<(), AudioWriteError> {self.write_interleaved_samples__i8(&monos.iter().map(|mono|(0..self.get_channels()).map(|_|*mono).collect::<Vec<i8 >>()).collect::<Vec<Vec<i8 >>>().into_iter().flatten().collect::<Vec<i8 >>())}
87 fn write_mono_channel_i16(&mut self, monos: &[i16]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i16(&monos.iter().map(|mono|(0..self.get_channels()).map(|_|*mono).collect::<Vec<i16>>()).collect::<Vec<Vec<i16>>>().into_iter().flatten().collect::<Vec<i16>>())}
88 fn write_mono_channel_i24(&mut self, monos: &[i24]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i24(&monos.iter().map(|mono|(0..self.get_channels()).map(|_|*mono).collect::<Vec<i24>>()).collect::<Vec<Vec<i24>>>().into_iter().flatten().collect::<Vec<i24>>())}
89 fn write_mono_channel_i32(&mut self, monos: &[i32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i32(&monos.iter().map(|mono|(0..self.get_channels()).map(|_|*mono).collect::<Vec<i32>>()).collect::<Vec<Vec<i32>>>().into_iter().flatten().collect::<Vec<i32>>())}
90 fn write_mono_channel_i64(&mut self, monos: &[i64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i64(&monos.iter().map(|mono|(0..self.get_channels()).map(|_|*mono).collect::<Vec<i64>>()).collect::<Vec<Vec<i64>>>().into_iter().flatten().collect::<Vec<i64>>())}
91 fn write_mono_channel__u8(&mut self, monos: &[u8 ]) -> Result<(), AudioWriteError> {self.write_interleaved_samples__u8(&monos.iter().map(|mono|(0..self.get_channels()).map(|_|*mono).collect::<Vec<u8 >>()).collect::<Vec<Vec<u8 >>>().into_iter().flatten().collect::<Vec<u8 >>())}
92 fn write_mono_channel_u16(&mut self, monos: &[u16]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u16(&monos.iter().map(|mono|(0..self.get_channels()).map(|_|*mono).collect::<Vec<u16>>()).collect::<Vec<Vec<u16>>>().into_iter().flatten().collect::<Vec<u16>>())}
93 fn write_mono_channel_u24(&mut self, monos: &[u24]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u24(&monos.iter().map(|mono|(0..self.get_channels()).map(|_|*mono).collect::<Vec<u24>>()).collect::<Vec<Vec<u24>>>().into_iter().flatten().collect::<Vec<u24>>())}
94 fn write_mono_channel_u32(&mut self, monos: &[u32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u32(&monos.iter().map(|mono|(0..self.get_channels()).map(|_|*mono).collect::<Vec<u32>>()).collect::<Vec<Vec<u32>>>().into_iter().flatten().collect::<Vec<u32>>())}
95 fn write_mono_channel_u64(&mut self, monos: &[u64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u64(&monos.iter().map(|mono|(0..self.get_channels()).map(|_|*mono).collect::<Vec<u64>>()).collect::<Vec<Vec<u64>>>().into_iter().flatten().collect::<Vec<u64>>())}
96 fn write_mono_channel_f32(&mut self, monos: &[f32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f32(&monos.iter().map(|mono|(0..self.get_channels()).map(|_|*mono).collect::<Vec<f32>>()).collect::<Vec<Vec<f32>>>().into_iter().flatten().collect::<Vec<f32>>())}
97 fn write_mono_channel_f64(&mut self, monos: &[f64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f64(&monos.iter().map(|mono|(0..self.get_channels()).map(|_|*mono).collect::<Vec<f64>>()).collect::<Vec<Vec<f64>>>().into_iter().flatten().collect::<Vec<f64>>())}
98
99 fn write_dual_sample__i8(&mut self, mono1: i8 , mono2: i8 ) -> Result<(), AudioWriteError> {self.write_interleaved_samples__i8(&[mono1, mono2])}
101 fn write_dual_sample_i16(&mut self, mono1: i16, mono2: i16) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i16(&[mono1, mono2])}
102 fn write_dual_sample_i24(&mut self, mono1: i24, mono2: i24) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i24(&[mono1, mono2])}
103 fn write_dual_sample_i32(&mut self, mono1: i32, mono2: i32) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i32(&[mono1, mono2])}
104 fn write_dual_sample_i64(&mut self, mono1: i64, mono2: i64) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i64(&[mono1, mono2])}
105 fn write_dual_sample__u8(&mut self, mono1: u8 , mono2: u8 ) -> Result<(), AudioWriteError> {self.write_interleaved_samples__u8(&[mono1, mono2])}
106 fn write_dual_sample_u16(&mut self, mono1: u16, mono2: u16) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u16(&[mono1, mono2])}
107 fn write_dual_sample_u24(&mut self, mono1: u24, mono2: u24) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u24(&[mono1, mono2])}
108 fn write_dual_sample_u32(&mut self, mono1: u32, mono2: u32) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u32(&[mono1, mono2])}
109 fn write_dual_sample_u64(&mut self, mono1: u64, mono2: u64) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u64(&[mono1, mono2])}
110 fn write_dual_sample_f32(&mut self, mono1: f32, mono2: f32) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f32(&[mono1, mono2])}
111 fn write_dual_sample_f64(&mut self, mono1: f64, mono2: f64) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f64(&[mono1, mono2])}
112
113 fn write_dual_monos__i8(&mut self, mono1: &[i8 ], mono2: &[i8 ]) -> Result<(), AudioWriteError> {self.write_interleaved_samples__i8(&audioutils::monos_to_interleaved_samples(&[mono1.to_vec(), mono2.to_vec()])?)}
115 fn write_dual_monos_i16(&mut self, mono1: &[i16], mono2: &[i16]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i16(&audioutils::monos_to_interleaved_samples(&[mono1.to_vec(), mono2.to_vec()])?)}
116 fn write_dual_monos_i24(&mut self, mono1: &[i24], mono2: &[i24]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i24(&audioutils::monos_to_interleaved_samples(&[mono1.to_vec(), mono2.to_vec()])?)}
117 fn write_dual_monos_i32(&mut self, mono1: &[i32], mono2: &[i32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i32(&audioutils::monos_to_interleaved_samples(&[mono1.to_vec(), mono2.to_vec()])?)}
118 fn write_dual_monos_i64(&mut self, mono1: &[i64], mono2: &[i64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i64(&audioutils::monos_to_interleaved_samples(&[mono1.to_vec(), mono2.to_vec()])?)}
119 fn write_dual_monos__u8(&mut self, mono1: &[u8 ], mono2: &[u8 ]) -> Result<(), AudioWriteError> {self.write_interleaved_samples__u8(&audioutils::monos_to_interleaved_samples(&[mono1.to_vec(), mono2.to_vec()])?)}
120 fn write_dual_monos_u16(&mut self, mono1: &[u16], mono2: &[u16]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u16(&audioutils::monos_to_interleaved_samples(&[mono1.to_vec(), mono2.to_vec()])?)}
121 fn write_dual_monos_u24(&mut self, mono1: &[u24], mono2: &[u24]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u24(&audioutils::monos_to_interleaved_samples(&[mono1.to_vec(), mono2.to_vec()])?)}
122 fn write_dual_monos_u32(&mut self, mono1: &[u32], mono2: &[u32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u32(&audioutils::monos_to_interleaved_samples(&[mono1.to_vec(), mono2.to_vec()])?)}
123 fn write_dual_monos_u64(&mut self, mono1: &[u64], mono2: &[u64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u64(&audioutils::monos_to_interleaved_samples(&[mono1.to_vec(), mono2.to_vec()])?)}
124 fn write_dual_monos_f32(&mut self, mono1: &[f32], mono2: &[f32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f32(&audioutils::monos_to_interleaved_samples(&[mono1.to_vec(), mono2.to_vec()])?)}
125 fn write_dual_monos_f64(&mut self, mono1: &[f64], mono2: &[f64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f64(&audioutils::monos_to_interleaved_samples(&[mono1.to_vec(), mono2.to_vec()])?)}
126
127 fn write_monos__i8(&mut self, monos_array: &[Vec<i8 >]) -> Result<(), AudioWriteError> {self.write_interleaved_samples__i8(&audioutils::monos_to_interleaved_samples(monos_array)?)}
129 fn write_monos_i16(&mut self, monos_array: &[Vec<i16>]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i16(&audioutils::monos_to_interleaved_samples(monos_array)?)}
130 fn write_monos_i24(&mut self, monos_array: &[Vec<i24>]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i24(&audioutils::monos_to_interleaved_samples(monos_array)?)}
131 fn write_monos_i32(&mut self, monos_array: &[Vec<i32>]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i32(&audioutils::monos_to_interleaved_samples(monos_array)?)}
132 fn write_monos_i64(&mut self, monos_array: &[Vec<i64>]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i64(&audioutils::monos_to_interleaved_samples(monos_array)?)}
133 fn write_monos__u8(&mut self, monos_array: &[Vec<u8 >]) -> Result<(), AudioWriteError> {self.write_interleaved_samples__u8(&audioutils::monos_to_interleaved_samples(monos_array)?)}
134 fn write_monos_u16(&mut self, monos_array: &[Vec<u16>]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u16(&audioutils::monos_to_interleaved_samples(monos_array)?)}
135 fn write_monos_u24(&mut self, monos_array: &[Vec<u24>]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u24(&audioutils::monos_to_interleaved_samples(monos_array)?)}
136 fn write_monos_u32(&mut self, monos_array: &[Vec<u32>]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u32(&audioutils::monos_to_interleaved_samples(monos_array)?)}
137 fn write_monos_u64(&mut self, monos_array: &[Vec<u64>]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u64(&audioutils::monos_to_interleaved_samples(monos_array)?)}
138 fn write_monos_f32(&mut self, monos_array: &[Vec<f32>]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f32(&audioutils::monos_to_interleaved_samples(monos_array)?)}
139 fn write_monos_f64(&mut self, monos_array: &[Vec<f64>]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f64(&audioutils::monos_to_interleaved_samples(monos_array)?)}
140
141 fn write_stereo__i8(&mut self, stereo: (i8 , i8 )) -> Result<(), AudioWriteError> {self.write_interleaved_samples__i8(&[stereo.0, stereo.1])}
143 fn write_stereo_i16(&mut self, stereo: (i16, i16)) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i16(&[stereo.0, stereo.1])}
144 fn write_stereo_i24(&mut self, stereo: (i24, i24)) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i24(&[stereo.0, stereo.1])}
145 fn write_stereo_i32(&mut self, stereo: (i32, i32)) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i32(&[stereo.0, stereo.1])}
146 fn write_stereo_i64(&mut self, stereo: (i64, i64)) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i64(&[stereo.0, stereo.1])}
147 fn write_stereo__u8(&mut self, stereo: (u8 , u8 )) -> Result<(), AudioWriteError> {self.write_interleaved_samples__u8(&[stereo.0, stereo.1])}
148 fn write_stereo_u16(&mut self, stereo: (u16, u16)) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u16(&[stereo.0, stereo.1])}
149 fn write_stereo_u24(&mut self, stereo: (u24, u24)) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u24(&[stereo.0, stereo.1])}
150 fn write_stereo_u32(&mut self, stereo: (u32, u32)) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u32(&[stereo.0, stereo.1])}
151 fn write_stereo_u64(&mut self, stereo: (u64, u64)) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u64(&[stereo.0, stereo.1])}
152 fn write_stereo_f32(&mut self, stereo: (f32, f32)) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f32(&[stereo.0, stereo.1])}
153 fn write_stereo_f64(&mut self, stereo: (f64, f64)) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f64(&[stereo.0, stereo.1])}
154
155 fn write_stereos__i8(&mut self, stereos: &[(i8 , i8 )]) -> Result<(), AudioWriteError> {self.write_interleaved_samples__i8(&audioutils::stereos_to_interleaved_samples(stereos))}
157 fn write_stereos_i16(&mut self, stereos: &[(i16, i16)]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i16(&audioutils::stereos_to_interleaved_samples(stereos))}
158 fn write_stereos_i24(&mut self, stereos: &[(i24, i24)]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i24(&audioutils::stereos_to_interleaved_samples(stereos))}
159 fn write_stereos_i32(&mut self, stereos: &[(i32, i32)]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i32(&audioutils::stereos_to_interleaved_samples(stereos))}
160 fn write_stereos_i64(&mut self, stereos: &[(i64, i64)]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_i64(&audioutils::stereos_to_interleaved_samples(stereos))}
161 fn write_stereos__u8(&mut self, stereos: &[(u8 , u8 )]) -> Result<(), AudioWriteError> {self.write_interleaved_samples__u8(&audioutils::stereos_to_interleaved_samples(stereos))}
162 fn write_stereos_u16(&mut self, stereos: &[(u16, u16)]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u16(&audioutils::stereos_to_interleaved_samples(stereos))}
163 fn write_stereos_u24(&mut self, stereos: &[(u24, u24)]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u24(&audioutils::stereos_to_interleaved_samples(stereos))}
164 fn write_stereos_u32(&mut self, stereos: &[(u32, u32)]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u32(&audioutils::stereos_to_interleaved_samples(stereos))}
165 fn write_stereos_u64(&mut self, stereos: &[(u64, u64)]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_u64(&audioutils::stereos_to_interleaved_samples(stereos))}
166 fn write_stereos_f32(&mut self, stereos: &[(f32, f32)]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f32(&audioutils::stereos_to_interleaved_samples(stereos))}
167 fn write_stereos_f64(&mut self, stereos: &[(f64, f64)]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f64(&audioutils::stereos_to_interleaved_samples(stereos))}
168}
169
170#[derive(Debug, Clone, Copy)]
172pub struct DummyEncoder;
173
174impl EncoderToImpl for DummyEncoder {
176 fn get_channels(&self) -> u16 {
177 panic!("Encoder creation failed.");
178 }
179
180 fn get_max_channels(&self) -> u16 {
181 panic!("Encoder creation failed.");
182 }
183
184 fn get_bitrate(&self) -> u32 {
185 panic!("Encoder creation failed.");
186 }
187
188 fn begin_encoding(&mut self) -> Result<(), AudioWriteError> {
189 panic!("Encoder creation failed.");
190 }
191
192 fn new_fmt_chunk(&mut self) -> Result<FmtChunk, AudioWriteError> {
193 panic!("Encoder creation failed.");
194 }
195
196 fn update_fmt_chunk(&self, _fmt: &mut FmtChunk) -> Result<(), AudioWriteError> {
197 panic!("Encoder creation failed.");
198 }
199
200 fn finish(&mut self) -> Result<(), AudioWriteError> {
201 panic!("Encoder creation failed.");
202 }
203
204 fn write_interleaved_samples_f32(&mut self, _samples: &[f32]) -> Result<(), AudioWriteError> {
205 panic!("Encoder creation failed.");
206 }
207
208 fn write_interleaved_samples__i8(&mut self, samples: &[i8 ]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f32(&sample_conv(samples))}
209 fn write_interleaved_samples_i16(&mut self, samples: &[i16]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f32(&sample_conv(samples))}
210 fn write_interleaved_samples_i24(&mut self, samples: &[i24]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f32(&sample_conv(samples))}
211 fn write_interleaved_samples_i32(&mut self, samples: &[i32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f32(&sample_conv(samples))}
212 fn write_interleaved_samples_i64(&mut self, samples: &[i64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f32(&sample_conv(samples))}
213 fn write_interleaved_samples__u8(&mut self, samples: &[u8 ]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f32(&sample_conv(samples))}
214 fn write_interleaved_samples_u16(&mut self, samples: &[u16]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f32(&sample_conv(samples))}
215 fn write_interleaved_samples_u24(&mut self, samples: &[u24]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f32(&sample_conv(samples))}
216 fn write_interleaved_samples_u32(&mut self, samples: &[u32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f32(&sample_conv(samples))}
217 fn write_interleaved_samples_u64(&mut self, samples: &[u64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f32(&sample_conv(samples))}
218 fn write_interleaved_samples_f64(&mut self, samples: &[f64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples_f32(&sample_conv(samples))}
219}
220
221#[derive(Debug)]
224pub struct Encoder<'a> {
225 encoder: Box<dyn EncoderToImpl + 'a>,
226}
227
228impl Default for Encoder<'_> {
229 fn default() -> Self {
230 Self::new(DummyEncoder)
231 }
232}
233
234impl<'a> Encoder<'a> {
235 pub fn new<T>(encoder: T) -> Self
236 where
237 T: EncoderToImpl + 'a,
238 {
239 Self {
240 encoder: Box::new(encoder),
241 }
242 }
243
244 pub fn get_channels(&self) -> u16 {
245 self.encoder.get_channels()
246 }
247
248 pub fn get_max_channels(&self) -> u16 {
249 self.encoder.get_max_channels()
250 }
251
252 pub fn begin_encoding(&mut self) -> Result<(), AudioWriteError> {
253 self.encoder.begin_encoding()
254 }
255
256 pub fn new_fmt_chunk(&mut self) -> Result<FmtChunk, AudioWriteError> {
257 self.encoder.new_fmt_chunk()
258 }
259
260 pub fn get_bitrate(&self) -> u32 {
261 self.encoder.get_bitrate()
262 }
263
264 pub fn update_fmt_chunk(&self, fmt: &mut FmtChunk) -> Result<(), AudioWriteError> {
265 self.encoder.update_fmt_chunk(fmt)
266 }
267
268 pub fn finish(&mut self) -> Result<(), AudioWriteError> {
269 self.encoder.finish()
270 }
271
272 pub fn write_interleaved_samples<S>(&mut self, samples: &[S]) -> Result<(), AudioWriteError>
274 where
275 S: SampleType,
276 {
277 match S::TYPE_NAME {
278 "i8" => self.encoder.write_interleaved_samples__i8(&sample_conv(samples)),
279 "i16" => self.encoder.write_interleaved_samples_i16(&sample_conv(samples)),
280 "i24" => self.encoder.write_interleaved_samples_i24(&sample_conv(samples)),
281 "i32" => self.encoder.write_interleaved_samples_i32(&sample_conv(samples)),
282 "i64" => self.encoder.write_interleaved_samples_i64(&sample_conv(samples)),
283 "u8" => self.encoder.write_interleaved_samples__u8(&sample_conv(samples)),
284 "u16" => self.encoder.write_interleaved_samples_u16(&sample_conv(samples)),
285 "u24" => self.encoder.write_interleaved_samples_u24(&sample_conv(samples)),
286 "u32" => self.encoder.write_interleaved_samples_u32(&sample_conv(samples)),
287 "u64" => self.encoder.write_interleaved_samples_u64(&sample_conv(samples)),
288 "f32" => self.encoder.write_interleaved_samples_f32(&sample_conv(samples)),
289 "f64" => self.encoder.write_interleaved_samples_f64(&sample_conv(samples)),
290 other => Err(AudioWriteError::InvalidArguments(format!(
291 "Bad sample type: {}",
292 other
293 ))),
294 }
295 }
296
297 pub fn write_frame<S>(&mut self, frame: &[S]) -> Result<(), AudioWriteError>
299 where
300 S: SampleType,
301 {
302 match S::TYPE_NAME {
303 "i8" => self.encoder.write_frame__i8(&sample_conv(frame)),
304 "i16" => self.encoder.write_frame_i16(&sample_conv(frame)),
305 "i24" => self.encoder.write_frame_i24(&sample_conv(frame)),
306 "i32" => self.encoder.write_frame_i32(&sample_conv(frame)),
307 "i64" => self.encoder.write_frame_i64(&sample_conv(frame)),
308 "u8" => self.encoder.write_frame__u8(&sample_conv(frame)),
309 "u16" => self.encoder.write_frame_u16(&sample_conv(frame)),
310 "u24" => self.encoder.write_frame_u24(&sample_conv(frame)),
311 "u32" => self.encoder.write_frame_u32(&sample_conv(frame)),
312 "u64" => self.encoder.write_frame_u64(&sample_conv(frame)),
313 "f32" => self.encoder.write_frame_f32(&sample_conv(frame)),
314 "f64" => self.encoder.write_frame_f64(&sample_conv(frame)),
315 other => Err(AudioWriteError::InvalidArguments(format!(
316 "Bad sample type: {}",
317 other
318 ))),
319 }
320 }
321
322 pub fn write_frames<S>(&mut self, frames: &[Vec<S>]) -> Result<(), AudioWriteError>
324 where
325 S: SampleType,
326 {
327 match S::TYPE_NAME {
328 "i8" => self.encoder.write_frames__i8(&sample_conv_batch(frames)),
329 "i16" => self.encoder.write_frames_i16(&sample_conv_batch(frames)),
330 "i24" => self.encoder.write_frames_i24(&sample_conv_batch(frames)),
331 "i32" => self.encoder.write_frames_i32(&sample_conv_batch(frames)),
332 "i64" => self.encoder.write_frames_i64(&sample_conv_batch(frames)),
333 "u8" => self.encoder.write_frames__u8(&sample_conv_batch(frames)),
334 "u16" => self.encoder.write_frames_u16(&sample_conv_batch(frames)),
335 "u24" => self.encoder.write_frames_u24(&sample_conv_batch(frames)),
336 "u32" => self.encoder.write_frames_u32(&sample_conv_batch(frames)),
337 "u64" => self.encoder.write_frames_u64(&sample_conv_batch(frames)),
338 "f32" => self.encoder.write_frames_f32(&sample_conv_batch(frames)),
339 "f64" => self.encoder.write_frames_f64(&sample_conv_batch(frames)),
340 other => Err(AudioWriteError::InvalidArguments(format!(
341 "Bad sample type: {}",
342 other
343 ))),
344 }
345 }
346
347 pub fn write_sample<S>(&mut self, mono: S) -> Result<(), AudioWriteError>
349 where
350 S: SampleType,
351 {
352 match S::TYPE_NAME {
353 "i8" => self.encoder.write_mono__i8(mono.to_i8 ()),
354 "i16" => self.encoder.write_mono_i16(mono.to_i16()),
355 "i24" => self.encoder.write_mono_i24(mono.to_i24()),
356 "i32" => self.encoder.write_mono_i32(mono.to_i32()),
357 "i64" => self.encoder.write_mono_i64(mono.to_i64()),
358 "u8" => self.encoder.write_mono__u8(mono.to_u8 ()),
359 "u16" => self.encoder.write_mono_u16(mono.to_u16()),
360 "u24" => self.encoder.write_mono_u24(mono.to_u24()),
361 "u32" => self.encoder.write_mono_u32(mono.to_u32()),
362 "u64" => self.encoder.write_mono_u64(mono.to_u64()),
363 "f32" => self.encoder.write_mono_f32(mono.to_f32()),
364 "f64" => self.encoder.write_mono_f64(mono.to_f64()),
365 other => Err(AudioWriteError::InvalidArguments(format!(
366 "Bad sample type: {}",
367 other
368 ))),
369 }
370 }
371
372 pub fn write_mono<S>(&mut self, monos: S) -> Result<(), AudioWriteError>
374 where
375 S: SampleType,
376 {
377 match S::TYPE_NAME {
378 "i8" => self.encoder.write_mono__i8(monos.as_i8 ()),
379 "i16" => self.encoder.write_mono_i16(monos.as_i16()),
380 "i24" => self.encoder.write_mono_i24(monos.as_i24()),
381 "i32" => self.encoder.write_mono_i32(monos.as_i32()),
382 "i64" => self.encoder.write_mono_i64(monos.as_i64()),
383 "u8" => self.encoder.write_mono__u8(monos.as_u8 ()),
384 "u16" => self.encoder.write_mono_u16(monos.as_u16()),
385 "u24" => self.encoder.write_mono_u24(monos.as_u24()),
386 "u32" => self.encoder.write_mono_u32(monos.as_u32()),
387 "u64" => self.encoder.write_mono_u64(monos.as_u64()),
388 "f32" => self.encoder.write_mono_f32(monos.as_f32()),
389 "f64" => self.encoder.write_mono_f64(monos.as_f64()),
390 other => Err(AudioWriteError::InvalidArguments(format!(
391 "Bad sample type: {}",
392 other
393 ))),
394 }
395 }
396
397 pub fn write_mono_channel<S>(&mut self, monos: &[S]) -> Result<(), AudioWriteError>
399 where
400 S: SampleType,
401 {
402 match S::TYPE_NAME {
403 "i8" => self.encoder.write_mono_channel__i8(&sample_conv(monos)),
404 "i16" => self.encoder.write_mono_channel_i16(&sample_conv(monos)),
405 "i24" => self.encoder.write_mono_channel_i24(&sample_conv(monos)),
406 "i32" => self.encoder.write_mono_channel_i32(&sample_conv(monos)),
407 "i64" => self.encoder.write_mono_channel_i64(&sample_conv(monos)),
408 "u8" => self.encoder.write_mono_channel__u8(&sample_conv(monos)),
409 "u16" => self.encoder.write_mono_channel_u16(&sample_conv(monos)),
410 "u24" => self.encoder.write_mono_channel_u24(&sample_conv(monos)),
411 "u32" => self.encoder.write_mono_channel_u32(&sample_conv(monos)),
412 "u64" => self.encoder.write_mono_channel_u64(&sample_conv(monos)),
413 "f32" => self.encoder.write_mono_channel_f32(&sample_conv(monos)),
414 "f64" => self.encoder.write_mono_channel_f64(&sample_conv(monos)),
415 other => Err(AudioWriteError::InvalidArguments(format!(
416 "Bad sample type: {}",
417 other
418 ))),
419 }
420 }
421
422 pub fn write_dual_mono<S>(&mut self, mono1: S, mono2: S) -> Result<(), AudioWriteError>
424 where
425 S: SampleType,
426 {
427 match S::TYPE_NAME {
428 "i8" => self.encoder.write_dual_sample__i8(mono1.to_i8 (), mono2.to_i8 ()),
429 "i16" => self.encoder.write_dual_sample_i16(mono1.to_i16(), mono2.to_i16()),
430 "i24" => self.encoder.write_dual_sample_i24(mono1.to_i24(), mono2.to_i24()),
431 "i32" => self.encoder.write_dual_sample_i32(mono1.to_i32(), mono2.to_i32()),
432 "i64" => self.encoder.write_dual_sample_i64(mono1.to_i64(), mono2.to_i64()),
433 "u8" => self.encoder.write_dual_sample__u8(mono1.to_u8 (), mono2.to_u8 ()),
434 "u16" => self.encoder.write_dual_sample_u16(mono1.to_u16(), mono2.to_u16()),
435 "u24" => self.encoder.write_dual_sample_u24(mono1.to_u24(), mono2.to_u24()),
436 "u32" => self.encoder.write_dual_sample_u32(mono1.to_u32(), mono2.to_u32()),
437 "u64" => self.encoder.write_dual_sample_u64(mono1.to_u64(), mono2.to_u64()),
438 "f32" => self.encoder.write_dual_sample_f32(mono1.to_f32(), mono2.to_f32()),
439 "f64" => self.encoder.write_dual_sample_f64(mono1.to_f64(), mono2.to_f64()),
440 other => Err(AudioWriteError::InvalidArguments(format!(
441 "Bad sample type: {}",
442 other
443 ))),
444 }
445 }
446
447 pub fn write_dual_monos<S>(&mut self, mono1: &[S], mono2: &[S]) -> Result<(), AudioWriteError>
449 where
450 S: SampleType,
451 {
452 match S::TYPE_NAME {
453 "i8" => self.encoder.write_dual_monos__i8(&sample_conv(mono1), &sample_conv(mono2)),
454 "i16" => self.encoder.write_dual_monos_i16(&sample_conv(mono1), &sample_conv(mono2)),
455 "i24" => self.encoder.write_dual_monos_i24(&sample_conv(mono1), &sample_conv(mono2)),
456 "i32" => self.encoder.write_dual_monos_i32(&sample_conv(mono1), &sample_conv(mono2)),
457 "i64" => self.encoder.write_dual_monos_i64(&sample_conv(mono1), &sample_conv(mono2)),
458 "u8" => self.encoder.write_dual_monos__u8(&sample_conv(mono1), &sample_conv(mono2)),
459 "u16" => self.encoder.write_dual_monos_u16(&sample_conv(mono1), &sample_conv(mono2)),
460 "u24" => self.encoder.write_dual_monos_u24(&sample_conv(mono1), &sample_conv(mono2)),
461 "u32" => self.encoder.write_dual_monos_u32(&sample_conv(mono1), &sample_conv(mono2)),
462 "u64" => self.encoder.write_dual_monos_u64(&sample_conv(mono1), &sample_conv(mono2)),
463 "f32" => self.encoder.write_dual_monos_f32(&sample_conv(mono1), &sample_conv(mono2)),
464 "f64" => self.encoder.write_dual_monos_f64(&sample_conv(mono1), &sample_conv(mono2)),
465 other => Err(AudioWriteError::InvalidArguments(format!(
466 "Bad sample type: {}",
467 other
468 ))),
469 }
470 }
471
472 pub fn write_monos<S>(&mut self, monos: &[Vec<S>]) -> Result<(), AudioWriteError>
474 where
475 S: SampleType,
476 {
477 match S::TYPE_NAME {
478 "i8" => self.encoder.write_monos__i8(&sample_conv_batch(monos)),
479 "i16" => self.encoder.write_monos_i16(&sample_conv_batch(monos)),
480 "i24" => self.encoder.write_monos_i24(&sample_conv_batch(monos)),
481 "i32" => self.encoder.write_monos_i32(&sample_conv_batch(monos)),
482 "i64" => self.encoder.write_monos_i64(&sample_conv_batch(monos)),
483 "u8" => self.encoder.write_monos__u8(&sample_conv_batch(monos)),
484 "u16" => self.encoder.write_monos_u16(&sample_conv_batch(monos)),
485 "u24" => self.encoder.write_monos_u24(&sample_conv_batch(monos)),
486 "u32" => self.encoder.write_monos_u32(&sample_conv_batch(monos)),
487 "u64" => self.encoder.write_monos_u64(&sample_conv_batch(monos)),
488 "f32" => self.encoder.write_monos_f32(&sample_conv_batch(monos)),
489 "f64" => self.encoder.write_monos_f64(&sample_conv_batch(monos)),
490 other => Err(AudioWriteError::InvalidArguments(format!(
491 "Bad sample type: {}",
492 other
493 ))),
494 }
495 }
496
497 pub fn write_stereo<S>(&mut self, stereo: (S, S)) -> Result<(), AudioWriteError>
499 where
500 S: SampleType,
501 {
502 match S::TYPE_NAME {
503 "i8" => self.encoder.write_stereo__i8(stereo_conv(stereo)),
504 "i16" => self.encoder.write_stereo_i16(stereo_conv(stereo)),
505 "i24" => self.encoder.write_stereo_i24(stereo_conv(stereo)),
506 "i32" => self.encoder.write_stereo_i32(stereo_conv(stereo)),
507 "i64" => self.encoder.write_stereo_i64(stereo_conv(stereo)),
508 "u8" => self.encoder.write_stereo__u8(stereo_conv(stereo)),
509 "u16" => self.encoder.write_stereo_u16(stereo_conv(stereo)),
510 "u24" => self.encoder.write_stereo_u24(stereo_conv(stereo)),
511 "u32" => self.encoder.write_stereo_u32(stereo_conv(stereo)),
512 "u64" => self.encoder.write_stereo_u64(stereo_conv(stereo)),
513 "f32" => self.encoder.write_stereo_f32(stereo_conv(stereo)),
514 "f64" => self.encoder.write_stereo_f64(stereo_conv(stereo)),
515 other => Err(AudioWriteError::InvalidArguments(format!(
516 "Bad sample type: {}",
517 other
518 ))),
519 }
520 }
521
522 pub fn write_stereos<S>(&mut self, stereos: &[(S, S)]) -> Result<(), AudioWriteError>
524 where
525 S: SampleType,
526 {
527 match S::TYPE_NAME {
528 "i8" => self.encoder.write_stereos__i8(&stereos_conv(stereos)),
529 "i16" => self.encoder.write_stereos_i16(&stereos_conv(stereos)),
530 "i24" => self.encoder.write_stereos_i24(&stereos_conv(stereos)),
531 "i32" => self.encoder.write_stereos_i32(&stereos_conv(stereos)),
532 "i64" => self.encoder.write_stereos_i64(&stereos_conv(stereos)),
533 "u8" => self.encoder.write_stereos__u8(&stereos_conv(stereos)),
534 "u16" => self.encoder.write_stereos_u16(&stereos_conv(stereos)),
535 "u24" => self.encoder.write_stereos_u24(&stereos_conv(stereos)),
536 "u32" => self.encoder.write_stereos_u32(&stereos_conv(stereos)),
537 "u64" => self.encoder.write_stereos_u64(&stereos_conv(stereos)),
538 "f32" => self.encoder.write_stereos_f32(&stereos_conv(stereos)),
539 "f64" => self.encoder.write_stereos_f64(&stereos_conv(stereos)),
540 other => Err(AudioWriteError::InvalidArguments(format!(
541 "Bad sample type: {}",
542 other
543 ))),
544 }
545 }
546}
547
548#[derive(Debug, Clone, Copy)]
551struct PcmEncoderFrom<S>
552where
553 S: SampleType,
554{
555 write_fn: fn(&mut dyn Writer, frame: &[S]) -> Result<(), AudioWriteError>,
556}
557
558impl<S> PcmEncoderFrom<S>
559where
560 S: SampleType,
561{
562 pub fn new(target_sample: WaveSampleType) -> Result<Self, AudioWriteError> {
563 use WaveSampleType::{F32, F64, S8, S16, S24, S32, S64, U8, U16, U24, U32, U64};
564 Ok(Self {
565 write_fn: match target_sample {
566 S8 => Self::write_sample_to::<i8 >,
567 S16 => Self::write_sample_to::<i16>,
568 S24 => Self::write_sample_to::<i24>,
569 S32 => Self::write_sample_to::<i32>,
570 S64 => Self::write_sample_to::<i64>,
571 U8 => Self::write_sample_to::<u8 >,
572 U16 => Self::write_sample_to::<u16>,
573 U24 => Self::write_sample_to::<u24>,
574 U32 => Self::write_sample_to::<u32>,
575 U64 => Self::write_sample_to::<u64>,
576 F32 => Self::write_sample_to::<f32>,
577 F64 => Self::write_sample_to::<f64>,
578 other => {
579 return Err(AudioWriteError::InvalidArguments(format!(
580 "Unknown target sample type: \"{:?}\"",
581 other
582 )));
583 }
584 },
585 })
586 }
587
588 fn write_sample_to<T>(writer: &mut dyn Writer, frame: &[S]) -> Result<(), AudioWriteError>
591 where
592 T: SampleType,
593 {
594 for sample in frame.iter() {
595 T::scale_from(*sample).write_le(writer)?;
596 }
597 Ok(())
598 }
599
600 pub fn write_frame(
601 &mut self,
602 writer: &mut dyn Writer,
603 frame: &[S],
604 ) -> Result<(), AudioWriteError> {
605 (self.write_fn)(writer, frame)
606 }
607
608 pub fn write_frames(
609 &mut self,
610 writer: &mut dyn Writer,
611 frames: &[Vec<S>],
612 ) -> Result<(), AudioWriteError> {
613 for frame in frames.iter() {
614 (self.write_fn)(writer, frame)?;
615 }
616 Ok(())
617 }
618
619 pub fn write_interleaved_samples(
620 &mut self,
621 writer: &mut dyn Writer,
622 samples: &[S],
623 ) -> Result<(), AudioWriteError> {
624 (self.write_fn)(writer, samples)
625 }
626}
627
628#[derive(Debug)]
630pub struct PcmEncoder<'a> {
631 spec: Spec,
632 sample_type: WaveSampleType,
633 writer: &'a mut dyn Writer,
634 writer_from__i8: PcmEncoderFrom< i8>,
635 writer_from_i16: PcmEncoderFrom<i16>,
636 writer_from_i24: PcmEncoderFrom<i24>,
637 writer_from_i32: PcmEncoderFrom<i32>,
638 writer_from_i64: PcmEncoderFrom<i64>,
639 writer_from__u8: PcmEncoderFrom< u8>,
640 writer_from_u16: PcmEncoderFrom<u16>,
641 writer_from_u24: PcmEncoderFrom<u24>,
642 writer_from_u32: PcmEncoderFrom<u32>,
643 writer_from_u64: PcmEncoderFrom<u64>,
644 writer_from_f32: PcmEncoderFrom<f32>,
645 writer_from_f64: PcmEncoderFrom<f64>,
646}
647
648impl<'a> PcmEncoder<'a> {
649 pub fn new(writer: &'a mut dyn Writer, spec: Spec) -> Result<Self, AudioWriteError> {
651 if !spec.is_channel_mask_valid() {
652 return Err(AudioWriteError::InvalidArguments(format!(
653 "Number of bits of channel mask 0x{:08x} does not match {} channels",
654 spec.channel_mask, spec.channels
655 )));
656 }
657 let target_sample = spec.get_sample_type();
658 Ok(Self {
659 spec,
660 sample_type: target_sample,
661 writer,
662 writer_from__i8: PcmEncoderFrom::< i8>::new(target_sample)?,
663 writer_from_i16: PcmEncoderFrom::<i16>::new(target_sample)?,
664 writer_from_i24: PcmEncoderFrom::<i24>::new(target_sample)?,
665 writer_from_i32: PcmEncoderFrom::<i32>::new(target_sample)?,
666 writer_from_i64: PcmEncoderFrom::<i64>::new(target_sample)?,
667 writer_from__u8: PcmEncoderFrom::< u8>::new(target_sample)?,
668 writer_from_u16: PcmEncoderFrom::<u16>::new(target_sample)?,
669 writer_from_u24: PcmEncoderFrom::<u24>::new(target_sample)?,
670 writer_from_u32: PcmEncoderFrom::<u32>::new(target_sample)?,
671 writer_from_u64: PcmEncoderFrom::<u64>::new(target_sample)?,
672 writer_from_f32: PcmEncoderFrom::<f32>::new(target_sample)?,
673 writer_from_f64: PcmEncoderFrom::<f64>::new(target_sample)?,
674 })
675 }
676}
677
678impl EncoderToImpl for PcmEncoder<'_> {
679 fn get_channels(&self) -> u16 {
680 self.spec.channels
681 }
682
683 fn get_max_channels(&self) -> u16 {
684 18
685 }
686
687 fn begin_encoding(&mut self) -> Result<(), AudioWriteError> {
688 Ok(())
689 }
690
691 fn new_fmt_chunk(&mut self) -> Result<FmtChunk, AudioWriteError> {
692 use WaveSampleType::{F32, F64, S8, S16, S24, S32, S64, U8, U16, U24, U32, U64, Unknown};
693 let bytes_per_sample = self.spec.bits_per_sample / 8;
694 let byte_rate = self.spec.sample_rate * self.spec.channels as u32 * bytes_per_sample as u32;
695 let extensible = match self.spec.channel_mask {
696 0 => None,
697 channel_mask => Some(FmtExtension::new_extensible(ExtensibleData {
698 valid_bits_per_sample: self.spec.bits_per_sample,
699 channel_mask,
700 sub_format: match self.sample_type {
701 U8 | S16 | S24 | S32 | S64 => GUID_PCM_FORMAT,
702 F32 | F64 => GUID_IEEE_FLOAT_FORMAT,
703 other => {
704 return Err(AudioWriteError::Unsupported(format!(
705 "\"{:?}\" was given for the extensible format PCM to specify the sample format",
706 other
707 )));
708 }
709 },
710 })),
711 };
712 Ok(FmtChunk {
713 format_tag: if extensible.is_some() {
714 FORMAT_TAG_EXTENSIBLE
715 } else {
716 match self.sample_type {
717 S8 | U16 | U24 | U32 | U64 => {
718 return Err(AudioWriteError::Unsupported(format!(
719 "PCM format does not support {} samples.",
720 self.sample_type
721 )));
722 }
723 U8 | S16 | S24 | S32 | S64 => FORMAT_TAG_PCM,
724 F32 | F64 => FORMAT_TAG_PCM_IEEE,
725 Unknown => panic!("Can't encode \"Unknown\" format to PCM."),
726 }
727 },
728 channels: self.spec.channels,
729 sample_rate: self.spec.sample_rate,
730 byte_rate,
731 block_align: bytes_per_sample * self.spec.channels,
732 bits_per_sample: self.spec.bits_per_sample,
733 extension: extensible,
734 })
735 }
736
737 fn get_bitrate(&self) -> u32 {
738 self.spec.channels as u32 * self.spec.sample_rate * self.sample_type.sizeof() as u32 * 8
739 }
740
741 fn update_fmt_chunk(&self, _fmt: &mut FmtChunk) -> Result<(), AudioWriteError> {
742 Ok(())
743 }
744
745 fn finish(&mut self) -> Result<(), AudioWriteError> {
746 Ok(self.writer.flush()?)
747 }
748
749 fn write_interleaved_samples__i8(&mut self, samples: &[i8 ]) -> Result<(), AudioWriteError> {self.writer_from__i8.write_interleaved_samples(self.writer, samples)}
750 fn write_interleaved_samples_i16(&mut self, samples: &[i16]) -> Result<(), AudioWriteError> {self.writer_from_i16.write_interleaved_samples(self.writer, samples)}
751 fn write_interleaved_samples_i24(&mut self, samples: &[i24]) -> Result<(), AudioWriteError> {self.writer_from_i24.write_interleaved_samples(self.writer, samples)}
752 fn write_interleaved_samples_i32(&mut self, samples: &[i32]) -> Result<(), AudioWriteError> {self.writer_from_i32.write_interleaved_samples(self.writer, samples)}
753 fn write_interleaved_samples_i64(&mut self, samples: &[i64]) -> Result<(), AudioWriteError> {self.writer_from_i64.write_interleaved_samples(self.writer, samples)}
754 fn write_interleaved_samples__u8(&mut self, samples: &[u8 ]) -> Result<(), AudioWriteError> {self.writer_from__u8.write_interleaved_samples(self.writer, samples)}
755 fn write_interleaved_samples_u16(&mut self, samples: &[u16]) -> Result<(), AudioWriteError> {self.writer_from_u16.write_interleaved_samples(self.writer, samples)}
756 fn write_interleaved_samples_u24(&mut self, samples: &[u24]) -> Result<(), AudioWriteError> {self.writer_from_u24.write_interleaved_samples(self.writer, samples)}
757 fn write_interleaved_samples_u32(&mut self, samples: &[u32]) -> Result<(), AudioWriteError> {self.writer_from_u32.write_interleaved_samples(self.writer, samples)}
758 fn write_interleaved_samples_u64(&mut self, samples: &[u64]) -> Result<(), AudioWriteError> {self.writer_from_u64.write_interleaved_samples(self.writer, samples)}
759 fn write_interleaved_samples_f32(&mut self, samples: &[f32]) -> Result<(), AudioWriteError> {self.writer_from_f32.write_interleaved_samples(self.writer, samples)}
760 fn write_interleaved_samples_f64(&mut self, samples: &[f64]) -> Result<(), AudioWriteError> {self.writer_from_f64.write_interleaved_samples(self.writer, samples)}
761}
762
763#[derive(Debug)]
765pub struct AdpcmEncoderWrap<'a, E>
766where
767 E: adpcm::AdpcmEncoder,
768{
769 writer: &'a mut dyn Writer,
770 channels: u16,
771 sample_rate: u32,
772 bytes_written: u64,
773 encoder: E,
774 nibbles: Vec<u8>,
775}
776
777const MAX_BUFFER_USAGE: usize = 1024;
778
779impl<'a, E> AdpcmEncoderWrap<'a, E>
780where
781 E: adpcm::AdpcmEncoder,
782{
783 pub fn new(writer: &'a mut dyn Writer, spec: Spec) -> Result<Self, AudioWriteError> {
784 Ok(Self {
785 writer,
786 channels: spec.channels,
787 sample_rate: spec.sample_rate,
788 bytes_written: 0,
789 encoder: E::new(spec.channels)?,
790 nibbles: Vec::<u8>::with_capacity(MAX_BUFFER_USAGE),
791 })
792 }
793
794 fn flush_buffers(&mut self) -> Result<(), AudioWriteError> {
795 self.writer.write_all(&self.nibbles)?;
796
797 self.nibbles = Vec::<u8>::with_capacity(MAX_BUFFER_USAGE);
800 Ok(())
801 }
802
803 pub fn write_interleaved_samples(&mut self, samples: &[i16]) -> Result<(), AudioWriteError> {
804 let mut iter = samples.iter().copied();
805 self.encoder.encode(
806 || -> Option<i16> { iter.next() },
807 |byte: u8| {
808 self.nibbles.push(byte);
809 },
810 )?;
811 if self.nibbles.len() >= MAX_BUFFER_USAGE {
812 self.flush_buffers()?;
813 }
814 Ok(())
815 }
816
817 pub fn write_stereos(&mut self, stereos: &[(i16, i16)]) -> Result<(), AudioWriteError> {
818 if self.channels != 2 {
819 return Err(AudioWriteError::Unsupported(format!(
820 "This encoder only accepts {} channel audio data",
821 self.channels
822 )));
823 }
824 let mut iter = audioutils::stereos_to_interleaved_samples(stereos).into_iter();
825 self.encoder.encode(
826 || -> Option<i16> { iter.next() },
827 |byte: u8| {
828 self.nibbles.push(byte);
829 },
830 )?;
831 if self.nibbles.len() >= MAX_BUFFER_USAGE {
832 self.flush_buffers()?;
833 }
834 Ok(())
835 }
836}
837
838impl<E> EncoderToImpl for AdpcmEncoderWrap<'_, E>
839where
840 E: adpcm::AdpcmEncoder,
841{
842 fn get_channels(&self) -> u16 {
843 self.channels
844 }
845
846 fn get_max_channels(&self) -> u16 {
847 2
848 }
849
850 fn begin_encoding(&mut self) -> Result<(), AudioWriteError> {
851 Ok(())
852 }
853
854 fn new_fmt_chunk(&mut self) -> Result<FmtChunk, AudioWriteError> {
855 Ok(self
856 .encoder
857 .new_fmt_chunk(self.channels, self.sample_rate, 4)?)
858 }
859
860 fn get_bitrate(&self) -> u32 {
861 self.sample_rate * self.channels as u32 * 4
862 }
863
864 fn update_fmt_chunk(&self, fmt: &mut FmtChunk) -> Result<(), AudioWriteError> {
865 Ok(self.encoder.modify_fmt_chunk(fmt)?)
866 }
867
868 fn finish(&mut self) -> Result<(), AudioWriteError> {
869 self.encoder.flush(|nibble: u8| {
870 self.nibbles.push(nibble);
871 })?;
872 self.flush_buffers()?;
873 Ok(self.writer.flush()?)
874 }
875
876 fn write_interleaved_samples__i8(&mut self, samples: &[i8 ]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
877 fn write_interleaved_samples_i16(&mut self, samples: &[i16]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
878 fn write_interleaved_samples_i24(&mut self, samples: &[i24]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
879 fn write_interleaved_samples_i32(&mut self, samples: &[i32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
880 fn write_interleaved_samples_i64(&mut self, samples: &[i64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
881 fn write_interleaved_samples__u8(&mut self, samples: &[u8 ]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
882 fn write_interleaved_samples_u16(&mut self, samples: &[u16]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
883 fn write_interleaved_samples_u24(&mut self, samples: &[u24]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
884 fn write_interleaved_samples_u32(&mut self, samples: &[u32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
885 fn write_interleaved_samples_u64(&mut self, samples: &[u64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
886 fn write_interleaved_samples_f32(&mut self, samples: &[f32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
887 fn write_interleaved_samples_f64(&mut self, samples: &[f64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
888
889 fn write_stereos__i8(&mut self, stereos: &[(i8 , i8 )]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
890 fn write_stereos_i16(&mut self, stereos: &[(i16, i16)]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
891 fn write_stereos_i24(&mut self, stereos: &[(i24, i24)]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
892 fn write_stereos_i32(&mut self, stereos: &[(i32, i32)]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
893 fn write_stereos_i64(&mut self, stereos: &[(i64, i64)]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
894 fn write_stereos__u8(&mut self, stereos: &[(u8 , u8 )]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
895 fn write_stereos_u16(&mut self, stereos: &[(u16, u16)]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
896 fn write_stereos_u24(&mut self, stereos: &[(u24, u24)]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
897 fn write_stereos_u32(&mut self, stereos: &[(u32, u32)]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
898 fn write_stereos_u64(&mut self, stereos: &[(u64, u64)]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
899 fn write_stereos_f32(&mut self, stereos: &[(f32, f32)]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
900 fn write_stereos_f64(&mut self, stereos: &[(f64, f64)]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
901}
902
903#[derive(Debug)]
905pub struct PcmXLawEncoderWrap<'a> {
906 writer: &'a mut dyn Writer,
907 enc: PcmXLawEncoder,
908 channels: u16,
909 sample_rate: u32,
910}
911
912impl<'a> PcmXLawEncoderWrap<'a> {
913 pub fn new(writer: &'a mut dyn Writer, spec: Spec, which_law: XLaw) -> Self {
914 Self {
915 writer,
916 enc: PcmXLawEncoder::new(which_law),
917 channels: spec.channels,
918 sample_rate: spec.sample_rate,
919 }
920 }
921
922 pub fn write_interleaved_samples(&mut self, samples: &[i16]) -> Result<(), AudioWriteError> {
923 self.writer.write_all(
924 &samples
925 .iter()
926 .map(|sample| -> u8 { self.enc.encode(*sample) })
927 .collect::<Vec<u8>>(),
928 )?;
929 Ok(())
930 }
931}
932
933impl EncoderToImpl for PcmXLawEncoderWrap<'_> {
934 fn get_channels(&self) -> u16 {
935 self.channels
936 }
937
938 fn get_max_channels(&self) -> u16 {
939 2
940 }
941
942 fn begin_encoding(&mut self) -> Result<(), AudioWriteError> {
943 Ok(())
944 }
945
946 fn new_fmt_chunk(&mut self) -> Result<FmtChunk, AudioWriteError> {
947 let bits_per_sample = 8u16;
948 let block_align = self.channels;
949 Ok(FmtChunk {
950 format_tag: match self.enc.get_which_law() {
951 XLaw::ALaw => FORMAT_TAG_ALAW,
952 XLaw::MuLaw => FORMAT_TAG_MULAW,
953 },
954 channels: self.channels,
955 sample_rate: self.sample_rate,
956 byte_rate: self.sample_rate * bits_per_sample as u32 * self.channels as u32 / 8,
957 block_align,
958 bits_per_sample,
959 extension: None,
960 })
961 }
962
963 fn get_bitrate(&self) -> u32 {
964 self.sample_rate * self.channels as u32 * 8
965 }
966
967 fn update_fmt_chunk(&self, _fmt: &mut FmtChunk) -> Result<(), AudioWriteError> {
968 Ok(())
969 }
970
971 fn finish(&mut self) -> Result<(), AudioWriteError> {
972 Ok(self.writer.flush()?)
973 }
974
975 fn write_interleaved_samples__i8(&mut self, samples: &[i8 ]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
976 fn write_interleaved_samples_i16(&mut self, samples: &[i16]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
977 fn write_interleaved_samples_i24(&mut self, samples: &[i24]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
978 fn write_interleaved_samples_i32(&mut self, samples: &[i32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
979 fn write_interleaved_samples_i64(&mut self, samples: &[i64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
980 fn write_interleaved_samples__u8(&mut self, samples: &[u8 ]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
981 fn write_interleaved_samples_u16(&mut self, samples: &[u16]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
982 fn write_interleaved_samples_u24(&mut self, samples: &[u24]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
983 fn write_interleaved_samples_u32(&mut self, samples: &[u32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
984 fn write_interleaved_samples_u64(&mut self, samples: &[u64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
985 fn write_interleaved_samples_f32(&mut self, samples: &[f32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
986 fn write_interleaved_samples_f64(&mut self, samples: &[f64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
987}
988
989pub mod mp3 {
991 #[derive(Debug, Clone, Copy, PartialEq)]
993 #[repr(u8)]
994 pub enum Mp3Channels {
995 Mono = 3,
997
998 Stereo = 0,
1000
1001 JointStereo = 1,
1003
1004 DualChannel = 2,
1006
1007 NotSet = 4,
1009 }
1010
1011 #[derive(Debug, Clone, Copy, PartialEq)]
1013 #[repr(u8)]
1014 pub enum Mp3Quality {
1015 Best = 0,
1016 SecondBest = 1,
1017 NearBest = 2,
1018 VeryNice = 3,
1019 Nice = 4,
1020 Good = 5,
1021 Decent = 6,
1022 Ok = 7,
1023 SecondWorst = 8,
1024 Worst = 9,
1025 }
1026
1027 #[derive(Debug, Clone, Copy, PartialEq)]
1030 #[repr(u16)]
1031 pub enum Mp3Bitrate {
1032 Kbps8 = 8,
1033 Kbps16 = 16,
1034 Kbps24 = 24,
1035 Kbps32 = 32,
1036 Kbps40 = 40,
1037 Kbps48 = 48,
1038
1039 Kbps64 = 64,
1041 Kbps80 = 80,
1042 Kbps96 = 96,
1043 Kbps112 = 112,
1044
1045 Kbps128 = 128,
1047 Kbps160 = 160,
1048 Kbps192 = 192,
1049 Kbps224 = 224,
1050
1051 Kbps256 = 256,
1053
1054 Kbps320 = 320,
1056 }
1057
1058 #[derive(Debug, Clone, Copy, PartialEq)]
1060 #[repr(u8)]
1061 pub enum Mp3VbrMode {
1062 Off = 0,
1064
1065 Mt = 1,
1066 Rh = 2,
1067 Abr = 3,
1068
1069 Mtrh = 4,
1071 }
1072
1073 const ID3_FIELD_LENGTH: usize = 250;
1074
1075 #[derive(Debug, Clone, PartialEq)]
1076 pub struct Mp3Id3Tag {
1077 pub title: [u8; ID3_FIELD_LENGTH],
1078 pub artist: [u8; ID3_FIELD_LENGTH],
1079 pub album: [u8; ID3_FIELD_LENGTH],
1080 pub album_art: [u8; ID3_FIELD_LENGTH],
1081 pub year: [u8; ID3_FIELD_LENGTH],
1082 pub comment: [u8; ID3_FIELD_LENGTH],
1083 }
1084
1085 #[derive(Debug, Clone, PartialEq)]
1087 pub struct Mp3EncoderOptions {
1088 pub channels: Mp3Channels,
1090
1091 pub quality: Mp3Quality,
1093
1094 pub bitrate: Mp3Bitrate,
1096
1097 pub vbr_mode: Mp3VbrMode,
1099
1100 pub id3tag: Option<Mp3Id3Tag>,
1102 }
1103
1104 impl Mp3EncoderOptions {
1105 pub fn new() -> Self {
1106 Self {
1107 channels: Mp3Channels::NotSet,
1108 quality: Mp3Quality::Best,
1109 bitrate: Mp3Bitrate::Kbps320,
1110 vbr_mode: Mp3VbrMode::Off,
1111 id3tag: None,
1112 }
1113 }
1114
1115 pub fn new_mono() -> Self {
1116 Self {
1117 channels: Mp3Channels::Mono,
1118 quality: Mp3Quality::Best,
1119 bitrate: Mp3Bitrate::Kbps320,
1120 vbr_mode: Mp3VbrMode::Off,
1121 id3tag: None,
1122 }
1123 }
1124
1125 pub fn new_stereo() -> Self {
1126 Self {
1127 channels: Mp3Channels::JointStereo,
1128 quality: Mp3Quality::Best,
1129 bitrate: Mp3Bitrate::Kbps320,
1130 vbr_mode: Mp3VbrMode::Off,
1131 id3tag: None,
1132 }
1133 }
1134
1135 pub fn get_channels(&self) -> u16 {
1136 match self.channels {
1137 Mp3Channels::Mono => 1,
1138 Mp3Channels::Stereo | Mp3Channels::DualChannel | Mp3Channels::JointStereo => 2,
1139 Mp3Channels::NotSet => 0,
1140 }
1141 }
1142
1143 pub fn get_bitrate(&self) -> u32 {
1144 self.bitrate as u32 * 1000
1145 }
1146 }
1147
1148 impl Default for Mp3EncoderOptions {
1149 fn default() -> Self {
1150 Self::new()
1151 }
1152 }
1153
1154 #[cfg(feature = "mp3enc")]
1155 use super::EncoderToImpl;
1156
1157 #[cfg(feature = "mp3enc")]
1158 pub mod impl_mp3 {
1159 use super::*;
1160 use crate::errors::AudioWriteError;
1161 use crate::io_utils::Writer;
1162 use crate::audioutils::{self, sample_conv, stereos_conv};
1163 use crate::wavcore::format_tags::*;
1164 use crate::wavcore::{FmtChunk, FmtExtension, Mp3Data, Spec};
1165 use crate::{SampleType, i24, u24};
1166 use std::{
1167 any::type_name,
1168 fmt::{self, Debug, Formatter},
1169 ops::DerefMut,
1170 sync::{Arc, Mutex},
1171 };
1172
1173 use mp3lame_encoder::{Bitrate, Id3Tag, Mode, Quality, VbrMode};
1174 use mp3lame_encoder::{Builder, DualPcm, Encoder, FlushNoGap, MonoPcm};
1175
1176 const MAX_SAMPLES_TO_ENCODE: usize = 1024;
1177
1178 #[derive(Clone)]
1179 pub struct SharedMp3Encoder(Arc<Mutex<Encoder>>);
1180
1181 impl SharedMp3Encoder {
1182 pub fn new(encoder: Encoder) -> Self {
1183 Self(Arc::new(Mutex::new(encoder)))
1184 }
1185
1186 pub fn escorted_encode<T, F, E>(&self, mut action: F) -> Result<T, E>
1187 where
1188 F: FnMut(&mut Encoder) -> Result<T, E>,
1189 {
1190 let mut guard = self.0.lock().unwrap();
1191 let encoder = guard.deref_mut();
1192 (action)(encoder)
1193 }
1194 }
1195
1196 impl Mp3Channels {
1197 pub fn to_lame_mode(&self) -> Mode {
1198 match self {
1199 Self::Mono => Mode::Mono,
1200 Self::Stereo => Mode::Stereo,
1201 Self::JointStereo => Mode::JointStereo,
1202 Self::DualChannel => Mode::DaulChannel,
1203 Self::NotSet => Mode::NotSet,
1204 }
1205 }
1206 }
1207
1208 impl Mp3Quality {
1209 pub fn to_lame_quality(&self) -> Quality {
1210 match self {
1211 Self::Best => Quality::Best,
1212 Self::SecondBest => Quality::SecondBest,
1213 Self::NearBest => Quality::NearBest,
1214 Self::VeryNice => Quality::VeryNice,
1215 Self::Nice => Quality::Nice,
1216 Self::Good => Quality::Good,
1217 Self::Decent => Quality::Decent,
1218 Self::Ok => Quality::Ok,
1219 Self::SecondWorst => Quality::SecondWorst,
1220 Self::Worst => Quality::Worst,
1221 }
1222 }
1223 }
1224
1225 impl Mp3Bitrate {
1226 pub fn to_lame_bitrate(&self) -> Bitrate {
1227 match self {
1228 Self::Kbps8 => Bitrate::Kbps8,
1229 Self::Kbps16 => Bitrate::Kbps16,
1230 Self::Kbps24 => Bitrate::Kbps24,
1231 Self::Kbps32 => Bitrate::Kbps32,
1232 Self::Kbps40 => Bitrate::Kbps40,
1233 Self::Kbps48 => Bitrate::Kbps48,
1234 Self::Kbps64 => Bitrate::Kbps64,
1235 Self::Kbps80 => Bitrate::Kbps80,
1236 Self::Kbps96 => Bitrate::Kbps96,
1237 Self::Kbps112 => Bitrate::Kbps112,
1238 Self::Kbps128 => Bitrate::Kbps128,
1239 Self::Kbps160 => Bitrate::Kbps160,
1240 Self::Kbps192 => Bitrate::Kbps192,
1241 Self::Kbps224 => Bitrate::Kbps224,
1242 Self::Kbps256 => Bitrate::Kbps256,
1243 Self::Kbps320 => Bitrate::Kbps320,
1244 }
1245 }
1246 }
1247
1248 impl Mp3VbrMode {
1249 pub fn to_lame_vbr_mode(&self) -> VbrMode {
1250 match self {
1251 Self::Off => VbrMode::Off,
1252 Self::Mt => VbrMode::Mt,
1253 Self::Rh => VbrMode::Rh,
1254 Self::Abr => VbrMode::Abr,
1255 Self::Mtrh => VbrMode::Mtrh,
1256 }
1257 }
1258 }
1259
1260 #[derive(Clone)]
1261 pub struct Mp3EncoderLameOptions {
1262 channels: Mode,
1263 quality: Quality,
1264 bitrate: Bitrate,
1265 vbr_mode: VbrMode,
1266 id3tag: Option<Mp3Id3Tag>,
1267 }
1268
1269 impl Mp3EncoderOptions {
1270 pub fn to_lame_options(&self) -> Mp3EncoderLameOptions {
1271 Mp3EncoderLameOptions {
1272 channels: self.channels.to_lame_mode(),
1273 quality: self.quality.to_lame_quality(),
1274 bitrate: self.bitrate.to_lame_bitrate(),
1275 vbr_mode: self.vbr_mode.to_lame_vbr_mode(),
1276 id3tag: self.id3tag.clone(),
1277 }
1278 }
1279 }
1280
1281 #[derive(Debug)]
1282 pub struct Mp3Encoder<'a, S>
1283 where
1284 S: SampleType,
1285 {
1286 channels: u16,
1287 sample_rate: u32,
1288 bitrate: u32,
1289 encoder: SharedMp3Encoder,
1290 options: Mp3EncoderOptions,
1291 buffers: ChannelBuffers<'a, S>,
1292 }
1293
1294 impl<'a, S> Mp3Encoder<'a, S>
1295 where
1296 S: SampleType,
1297 {
1298 pub fn new(
1299 writer: &'a mut dyn Writer,
1300 spec: Spec,
1301 mp3_options: &Mp3EncoderOptions,
1302 ) -> Result<Self, AudioWriteError> {
1303 if spec.channels != mp3_options.get_channels() {
1304 return Err(AudioWriteError::InvalidArguments(format!(
1305 "The number of channels from `spec` is {}, but from `mp3_options` is {}",
1306 spec.channels,
1307 mp3_options.get_channels()
1308 )));
1309 }
1310
1311 let mp3_builder = Builder::new();
1312 let mut mp3_builder = match mp3_builder {
1313 Some(mp3_builder) => mp3_builder,
1314 None => {
1315 return Err(AudioWriteError::OtherReason(
1316 "`lame_init()` somehow failed.".to_owned(),
1317 ));
1318 }
1319 };
1320 let options = mp3_options.to_lame_options();
1321
1322 mp3_builder.set_mode(options.channels)?;
1323 mp3_builder.set_sample_rate(spec.sample_rate)?;
1324 mp3_builder.set_brate(options.bitrate)?;
1325 mp3_builder.set_quality(options.quality)?;
1326 mp3_builder.set_vbr_mode(options.vbr_mode)?;
1327
1328 match options.vbr_mode {
1329 VbrMode::Off => mp3_builder.set_to_write_vbr_tag(false)?,
1330 _ => {
1331 mp3_builder.set_to_write_vbr_tag(true)?;
1332 mp3_builder.set_vbr_quality(options.quality)?;
1333 }
1334 }
1335
1336 if let Some(id3tag) = options.id3tag {
1337 mp3_builder.set_id3_tag(Id3Tag {
1338 title: &id3tag.title,
1339 artist: &id3tag.artist,
1340 album: &id3tag.album,
1341 album_art: &id3tag.album_art,
1342 year: &id3tag.year,
1343 comment: &id3tag.comment,
1344 })?;
1345 }
1346
1347 let encoder = SharedMp3Encoder::new(mp3_builder.build()?);
1348
1349 let channels = mp3_options.get_channels();
1350 Ok(Self {
1351 channels,
1352 sample_rate: spec.sample_rate,
1353 bitrate: mp3_options.get_bitrate(),
1354 encoder: encoder.clone(),
1355 options: mp3_options.clone(),
1356 buffers: match channels {
1357 1 | 2 => ChannelBuffers::<'a, S>::new(
1358 writer,
1359 encoder.clone(),
1360 MAX_SAMPLES_TO_ENCODE,
1361 channels,
1362 )?,
1363 o => {
1364 return Err(AudioWriteError::Unsupported(format!(
1365 "Bad channel number: {o}"
1366 )));
1367 }
1368 },
1369 })
1370 }
1371
1372 pub fn write_interleaved_samples<T>(&mut self, samples: &[T]) -> Result<(), AudioWriteError>
1373 where
1374 T: SampleType,
1375 {
1376 if self.buffers.is_full() {
1377 self.buffers.flush()?;
1378 }
1379 match self.channels {
1380 1 => self.buffers.add_mono_channel(&sample_conv::<T, S>(samples)),
1381 2 => self
1382 .buffers
1383 .add_stereos(&audioutils::interleaved_samples_to_stereos(
1384 &sample_conv::<T, S>(samples),
1385 )?),
1386 o => Err(AudioWriteError::Unsupported(format!(
1387 "Bad channels number: {o}"
1388 ))),
1389 }
1390 }
1391
1392 pub fn write_stereos<T>(&mut self, stereos: &[(T, T)]) -> Result<(), AudioWriteError>
1393 where
1394 T: SampleType,
1395 {
1396 if self.buffers.is_full() {
1397 self.buffers.flush()?;
1398 }
1399 match self.channels {
1400 1 => self
1401 .buffers
1402 .add_mono_channel(&audioutils::stereos_to_mono_channel(&stereos_conv::<T, S>(stereos))),
1403 2 => self.buffers.add_stereos(&stereos_conv::<T, S>(stereos)),
1404 o => Err(AudioWriteError::InvalidArguments(format!(
1405 "Bad channels number: {o}"
1406 ))),
1407 }
1408 }
1409
1410 pub fn write_dual_monos<T>(
1411 &mut self,
1412 mono_l: &[T],
1413 mono_r: &[T],
1414 ) -> Result<(), AudioWriteError>
1415 where
1416 T: SampleType,
1417 {
1418 if self.buffers.is_full() {
1419 self.buffers.flush()?;
1420 }
1421 match self.channels {
1422 1 => self
1423 .buffers
1424 .add_mono_channel(&sample_conv::<T, S>(&audioutils::dual_monos_to_monos(&(
1425 mono_l.to_vec(),
1426 mono_r.to_vec(),
1427 ))?)),
1428 2 => self
1429 .buffers
1430 .add_dual_monos(&sample_conv::<T, S>(mono_l), &sample_conv::<T, S>(mono_r)),
1431 o => Err(AudioWriteError::InvalidArguments(format!(
1432 "Bad channels number: {o}"
1433 ))),
1434 }
1435 }
1436
1437 pub fn finish(&mut self) -> Result<(), AudioWriteError> {
1438 self.buffers.finish()
1439 }
1440 }
1441
1442 #[derive(Debug, Clone)]
1443 enum Channels<S>
1444 where
1445 S: SampleType,
1446 {
1447 Mono(Vec<S>),
1448 Stereo((Vec<S>, Vec<S>)),
1449 }
1450
1451 struct ChannelBuffers<'a, S>
1452 where
1453 S: SampleType,
1454 {
1455 writer: &'a mut dyn Writer,
1456 encoder: SharedMp3Encoder,
1457 channels: Channels<S>,
1458 max_frames: usize,
1459 }
1460
1461 impl<S> Channels<S>
1462 where
1463 S: SampleType,
1464 {
1465 pub fn new_mono(max_frames: usize) -> Self {
1466 Self::Mono(Vec::<S>::with_capacity(max_frames))
1467 }
1468 pub fn new_stereo(max_frames: usize) -> Self {
1469 Self::Stereo((
1470 Vec::<S>::with_capacity(max_frames),
1471 Vec::<S>::with_capacity(max_frames),
1472 ))
1473 }
1474 pub fn add_mono(&mut self, frame: S) {
1475 match self {
1476 Self::Mono(m) => m.push(frame),
1477 Self::Stereo((l, r)) => {
1478 l.push(frame);
1479 r.push(frame);
1480 }
1481 }
1482 }
1483 pub fn add_stereo(&mut self, frame: (S, S)) {
1484 match self {
1485 Self::Mono(m) => m.push(S::average(frame.0, frame.1)),
1486 Self::Stereo((l, r)) => {
1487 l.push(frame.0);
1488 r.push(frame.1);
1489 }
1490 }
1491 }
1492 pub fn add_mono_channel(&mut self, frames: &[S]) {
1493 match self {
1494 Self::Mono(m) => m.extend(frames),
1495 Self::Stereo((l, r)) => {
1496 l.extend(frames);
1497 r.extend(frames);
1498 }
1499 }
1500 }
1501 pub fn add_stereos(&mut self, frames: &[(S, S)]) {
1502 match self {
1503 Self::Mono(m) => m.extend(audioutils::stereos_to_mono_channel(frames)),
1504 Self::Stereo((l, r)) => {
1505 let (il, ir) = audioutils::stereos_to_dual_monos(frames);
1506 l.extend(il);
1507 r.extend(ir);
1508 }
1509 }
1510 }
1511 pub fn add_dual_monos(
1512 &mut self,
1513 monos_l: &[S],
1514 monos_r: &[S],
1515 ) -> Result<(), AudioWriteError> {
1516 match self {
1517 Self::Mono(m) => m.extend(audioutils::dual_monos_to_monos(&(
1518 monos_l.to_vec(),
1519 monos_r.to_vec(),
1520 ))?),
1521 Self::Stereo((l, r)) => {
1522 if monos_l.len() != monos_r.len() {
1523 return Err(AudioWriteError::ChannelsNotInSameSize);
1524 }
1525 l.extend(monos_l);
1526 r.extend(monos_r);
1527 }
1528 }
1529 Ok(())
1530 }
1531 pub fn len(&self) -> usize {
1532 match self {
1533 Self::Mono(m) => m.len(),
1534 Self::Stereo((l, r)) => {
1535 assert_eq!(l.len(), r.len());
1536 l.len()
1537 }
1538 }
1539 }
1540 pub fn is_empty(&self) -> bool {
1541 match self {
1542 Self::Mono(m) => m.is_empty(),
1543 Self::Stereo((l, r)) => l.is_empty() && r.is_empty(),
1544 }
1545 }
1546 pub fn get_channels(&self) -> u16 {
1547 match self {
1548 Self::Mono(_) => 1,
1549 Self::Stereo(_) => 2,
1550 }
1551 }
1552 pub fn clear(&mut self, max_frames: usize) {
1553 match self {
1554 Self::Mono(m) => *m = Vec::<S>::with_capacity(max_frames),
1555 Self::Stereo(s) => {
1556 *s = (
1557 Vec::<S>::with_capacity(max_frames),
1558 Vec::<S>::with_capacity(max_frames),
1559 )
1560 }
1561 }
1562 }
1563 }
1564
1565 impl<'a, S> ChannelBuffers<'a, S>
1566 where
1567 S: SampleType,
1568 {
1569 pub fn new(
1570 writer: &'a mut dyn Writer,
1571 encoder: SharedMp3Encoder,
1572 max_frames: usize,
1573 channels: u16,
1574 ) -> Result<Self, AudioWriteError> {
1575 Ok(Self {
1576 writer,
1577 encoder,
1578 channels: match channels {
1579 1 => Channels::<S>::new_mono(max_frames),
1580 2 => Channels::<S>::new_stereo(max_frames),
1581 o => {
1582 return Err(AudioWriteError::InvalidArguments(format!(
1583 "Invalid channels: {o}. Only 1 and 2 are accepted."
1584 )));
1585 }
1586 },
1587 max_frames,
1588 })
1589 }
1590
1591 pub fn is_full(&self) -> bool {
1592 self.channels.len() >= self.max_frames
1593 }
1594
1595 pub fn add_mono_channel(&mut self, monos: &[S]) -> Result<(), AudioWriteError> {
1596 self.channels.add_mono_channel(monos);
1597 if self.is_full() {
1598 self.flush()?;
1599 }
1600 Ok(())
1601 }
1602
1603 pub fn add_stereos(&mut self, stereos: &[(S, S)]) -> Result<(), AudioWriteError> {
1604 self.channels.add_stereos(stereos);
1605 if self.is_full() {
1606 self.flush()?;
1607 }
1608 Ok(())
1609 }
1610
1611 pub fn add_dual_monos(
1612 &mut self,
1613 monos_l: &[S],
1614 monos_r: &[S],
1615 ) -> Result<(), AudioWriteError> {
1616 self.channels.add_dual_monos(monos_l, monos_r)?;
1617 if self.is_full() {
1618 self.flush()?;
1619 }
1620 Ok(())
1621 }
1622
1623 fn channel_to_type<T>(mono: &[S]) -> Vec<T>
1624 where
1625 T: SampleType,
1626 {
1627 mono.iter().map(|s| T::scale_from(*s)).collect()
1628 }
1629
1630 fn encode_to_vec(
1631 &self,
1632 encoder: &mut Encoder,
1633 out_buf: &mut Vec<u8>,
1634 ) -> Result<usize, AudioWriteError> {
1635 match &self.channels {
1637 Channels::Mono(pcm) => {
1638 match std::any::type_name::<S>() {
1639 "i16" => Ok(encoder.encode_to_vec(MonoPcm(&Self::channel_to_type::<i16>(pcm)), out_buf)?),
1640 "u16" => Ok(encoder.encode_to_vec(MonoPcm(&Self::channel_to_type::<u16>(pcm)), out_buf)?),
1641 "i32" => Ok(encoder.encode_to_vec(MonoPcm(&Self::channel_to_type::<i32>(pcm)), out_buf)?),
1642 "f32" => Ok(encoder.encode_to_vec(MonoPcm(&Self::channel_to_type::<f32>(pcm)), out_buf)?),
1643 "f64" => Ok(encoder.encode_to_vec(MonoPcm(&Self::channel_to_type::<f64>(pcm)), out_buf)?),
1644 "i8" => Ok(encoder.encode_to_vec(MonoPcm(&Self::channel_to_type::<i16>(pcm)), out_buf)?),
1645 "u8" => Ok(encoder.encode_to_vec(MonoPcm(&Self::channel_to_type::<u16>(pcm)), out_buf)?),
1646 "i24" | "u24" | "u32" => Ok(encoder.encode_to_vec(MonoPcm(&Self::channel_to_type::<i32>(pcm)), out_buf)?),
1647 other => Err(AudioWriteError::Unsupported(format!("\"{other}\""))),
1648 }
1649 },
1650 Channels::Stereo(pcm) => {
1651 match std::any::type_name::<S>() {
1652 "i16" => Ok(encoder.encode_to_vec(DualPcm{left: &Self::channel_to_type::<i16>(&pcm.0), right: &Self::channel_to_type::<i16>(&pcm.1)}, out_buf)?),
1653 "u16" => Ok(encoder.encode_to_vec(DualPcm{left: &Self::channel_to_type::<u16>(&pcm.0), right: &Self::channel_to_type::<u16>(&pcm.1)}, out_buf)?),
1654 "i32" => Ok(encoder.encode_to_vec(DualPcm{left: &Self::channel_to_type::<i32>(&pcm.0), right: &Self::channel_to_type::<i32>(&pcm.1)}, out_buf)?),
1655 "f32" => Ok(encoder.encode_to_vec(DualPcm{left: &Self::channel_to_type::<f32>(&pcm.0), right: &Self::channel_to_type::<f32>(&pcm.1)}, out_buf)?),
1656 "f64" => Ok(encoder.encode_to_vec(DualPcm{left: &Self::channel_to_type::<f64>(&pcm.0), right: &Self::channel_to_type::<f64>(&pcm.1)}, out_buf)?),
1657 "i8" => Ok(encoder.encode_to_vec(DualPcm{left: &Self::channel_to_type::<i16>(&pcm.0), right: &Self::channel_to_type::<i16>(&pcm.1)}, out_buf)?),
1658 "u8" => Ok(encoder.encode_to_vec(DualPcm{left: &Self::channel_to_type::<u16>(&pcm.0), right: &Self::channel_to_type::<u16>(&pcm.1)}, out_buf)?),
1659 "i24" | "u24" | "u32" => Ok(encoder.encode_to_vec(DualPcm{left: &Self::channel_to_type::<i32>(&pcm.0), right: &Self::channel_to_type::<i32>(&pcm.1)}, out_buf)?),
1660 other => Err(AudioWriteError::Unsupported(format!("\"{other}\""))),
1661 }
1662 },
1663 }
1664 }
1665
1666 pub fn flush(&mut self) -> Result<(), AudioWriteError> {
1667 if self.channels.is_empty() {
1668 return Ok(());
1669 }
1670 let to_save = self.encoder.escorted_encode(
1671 |encoder| -> Result<Vec<u8>, AudioWriteError> {
1672 let mut to_save = Vec::<u8>::with_capacity(
1673 mp3lame_encoder::max_required_buffer_size(self.channels.len()),
1674 );
1675 self.encode_to_vec(encoder, &mut to_save)?;
1676 Ok(to_save)
1677 },
1678 )?;
1679 self.writer.write_all(&to_save)?;
1680 self.channels.clear(self.max_frames);
1681 Ok(())
1682 }
1683
1684 pub fn finish(&mut self) -> Result<(), AudioWriteError> {
1685 self.flush()?;
1686 self.encoder
1687 .escorted_encode(|encoder| -> Result<(), AudioWriteError> {
1688 let mut to_save = Vec::<u8>::with_capacity(
1689 mp3lame_encoder::max_required_buffer_size(self.max_frames),
1690 );
1691 encoder.flush_to_vec::<FlushNoGap>(&mut to_save)?;
1692 self.writer.write_all(&to_save)?;
1693 Ok(())
1694 })?;
1695 self.channels.clear(self.max_frames);
1696 Ok(())
1697 }
1698 }
1699
1700 impl<S> EncoderToImpl for Mp3Encoder<'_, S>
1701 where
1702 S: SampleType,
1703 {
1704 fn get_channels(&self) -> u16 {
1705 self.channels
1706 }
1707
1708 fn get_max_channels(&self) -> u16 {
1709 2
1710 }
1711
1712 fn begin_encoding(&mut self) -> Result<(), AudioWriteError> {
1713 Ok(())
1714 }
1715
1716 fn new_fmt_chunk(&mut self) -> Result<FmtChunk, AudioWriteError> {
1717 Ok(FmtChunk {
1718 format_tag: FORMAT_TAG_MP3,
1719 channels: self.channels,
1720 sample_rate: self.sample_rate,
1721 byte_rate: self.bitrate / 8,
1722 block_align: if self.sample_rate <= 28000 {
1723 576
1724 } else {
1725 576 * 2
1726 },
1727 bits_per_sample: 0,
1728 extension: Some(FmtExtension::new_mp3(Mp3Data::new(
1729 self.bitrate,
1730 self.sample_rate,
1731 ))),
1732 })
1733 }
1734
1735 fn get_bitrate(&self) -> u32 {
1736 self.bitrate * self.channels as u32
1737 }
1738
1739 fn update_fmt_chunk(&self, _fmt: &mut FmtChunk) -> Result<(), AudioWriteError> {
1740 Ok(())
1741 }
1742
1743 fn finish(&mut self) -> Result<(), AudioWriteError> {
1744 self.finish()
1745 }
1746
1747 fn write_interleaved_samples__i8(&mut self, samples: &[i8 ]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(samples)}
1748 fn write_interleaved_samples_i16(&mut self, samples: &[i16]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(samples)}
1749 fn write_interleaved_samples_i24(&mut self, samples: &[i24]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(samples)}
1750 fn write_interleaved_samples_i32(&mut self, samples: &[i32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(samples)}
1751 fn write_interleaved_samples_i64(&mut self, samples: &[i64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(samples)}
1752 fn write_interleaved_samples__u8(&mut self, samples: &[u8 ]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(samples)}
1753 fn write_interleaved_samples_u16(&mut self, samples: &[u16]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(samples)}
1754 fn write_interleaved_samples_u24(&mut self, samples: &[u24]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(samples)}
1755 fn write_interleaved_samples_u32(&mut self, samples: &[u32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(samples)}
1756 fn write_interleaved_samples_u64(&mut self, samples: &[u64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(samples)}
1757 fn write_interleaved_samples_f32(&mut self, samples: &[f32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(samples)}
1758 fn write_interleaved_samples_f64(&mut self, samples: &[f64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(samples)}
1759
1760 fn write_stereos__i8(&mut self, stereos: &[(i8 , i8 )]) -> Result<(), AudioWriteError> {self.write_stereos(stereos)}
1761 fn write_stereos_i16(&mut self, stereos: &[(i16, i16)]) -> Result<(), AudioWriteError> {self.write_stereos(stereos)}
1762 fn write_stereos_i24(&mut self, stereos: &[(i24, i24)]) -> Result<(), AudioWriteError> {self.write_stereos(stereos)}
1763 fn write_stereos_i32(&mut self, stereos: &[(i32, i32)]) -> Result<(), AudioWriteError> {self.write_stereos(stereos)}
1764 fn write_stereos_i64(&mut self, stereos: &[(i64, i64)]) -> Result<(), AudioWriteError> {self.write_stereos(stereos)}
1765 fn write_stereos__u8(&mut self, stereos: &[(u8 , u8 )]) -> Result<(), AudioWriteError> {self.write_stereos(stereos)}
1766 fn write_stereos_u16(&mut self, stereos: &[(u16, u16)]) -> Result<(), AudioWriteError> {self.write_stereos(stereos)}
1767 fn write_stereos_u24(&mut self, stereos: &[(u24, u24)]) -> Result<(), AudioWriteError> {self.write_stereos(stereos)}
1768 fn write_stereos_u32(&mut self, stereos: &[(u32, u32)]) -> Result<(), AudioWriteError> {self.write_stereos(stereos)}
1769 fn write_stereos_u64(&mut self, stereos: &[(u64, u64)]) -> Result<(), AudioWriteError> {self.write_stereos(stereos)}
1770 fn write_stereos_f32(&mut self, stereos: &[(f32, f32)]) -> Result<(), AudioWriteError> {self.write_stereos(stereos)}
1771 fn write_stereos_f64(&mut self, stereos: &[(f64, f64)]) -> Result<(), AudioWriteError> {self.write_stereos(stereos)}
1772
1773 fn write_dual_monos__i8(&mut self, mono1: &[i8 ], mono2: &[i8 ]) -> Result<(), AudioWriteError> {self.write_dual_monos(mono1, mono2)}
1774 fn write_dual_monos_i16(&mut self, mono1: &[i16], mono2: &[i16]) -> Result<(), AudioWriteError> {self.write_dual_monos(mono1, mono2)}
1775 fn write_dual_monos_i24(&mut self, mono1: &[i24], mono2: &[i24]) -> Result<(), AudioWriteError> {self.write_dual_monos(mono1, mono2)}
1776 fn write_dual_monos_i32(&mut self, mono1: &[i32], mono2: &[i32]) -> Result<(), AudioWriteError> {self.write_dual_monos(mono1, mono2)}
1777 fn write_dual_monos_i64(&mut self, mono1: &[i64], mono2: &[i64]) -> Result<(), AudioWriteError> {self.write_dual_monos(mono1, mono2)}
1778 fn write_dual_monos__u8(&mut self, mono1: &[u8 ], mono2: &[u8 ]) -> Result<(), AudioWriteError> {self.write_dual_monos(mono1, mono2)}
1779 fn write_dual_monos_u16(&mut self, mono1: &[u16], mono2: &[u16]) -> Result<(), AudioWriteError> {self.write_dual_monos(mono1, mono2)}
1780 fn write_dual_monos_u24(&mut self, mono1: &[u24], mono2: &[u24]) -> Result<(), AudioWriteError> {self.write_dual_monos(mono1, mono2)}
1781 fn write_dual_monos_u32(&mut self, mono1: &[u32], mono2: &[u32]) -> Result<(), AudioWriteError> {self.write_dual_monos(mono1, mono2)}
1782 fn write_dual_monos_u64(&mut self, mono1: &[u64], mono2: &[u64]) -> Result<(), AudioWriteError> {self.write_dual_monos(mono1, mono2)}
1783 fn write_dual_monos_f32(&mut self, mono1: &[f32], mono2: &[f32]) -> Result<(), AudioWriteError> {self.write_dual_monos(mono1, mono2)}
1784 fn write_dual_monos_f64(&mut self, mono1: &[f64], mono2: &[f64]) -> Result<(), AudioWriteError> {self.write_dual_monos(mono1, mono2)}
1785 }
1786
1787 impl Debug for SharedMp3Encoder {
1788 fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
1789 fmt.debug_struct("SharedMp3Encoder").finish_non_exhaustive()
1790 }
1791 }
1792
1793 impl<S> Debug for ChannelBuffers<'_, S>
1794 where
1795 S: SampleType,
1796 {
1797 fn fmt(&self, fmt: &mut Formatter) -> fmt::Result {
1798 fmt.debug_struct(&format!("ChannelBuffers<{}>", type_name::<S>()))
1799 .field("encoder", &self.encoder)
1800 .field(
1801 "channels",
1802 &format_args!(
1803 "{}",
1804 match self.channels {
1805 Channels::Mono(_) => "Mono",
1806 Channels::Stereo(_) => "Stereo",
1807 }
1808 ),
1809 )
1810 .field("max_frames", &self.max_frames)
1811 .finish()
1812 }
1813 }
1814
1815 impl From<mp3lame_encoder::BuildError> for AudioWriteError {
1816 fn from(err: mp3lame_encoder::BuildError) -> Self {
1817 match err {
1818 mp3lame_encoder::BuildError::Generic => Self::OtherReason("Generic error".to_owned()),
1819 mp3lame_encoder::BuildError::NoMem => Self::OtherReason("No enough memory".to_owned()),
1820 mp3lame_encoder::BuildError::BadBRate => Self::InvalidInput("Bad bit rate".to_owned()),
1821 mp3lame_encoder::BuildError::BadSampleFreq => Self::InvalidInput("Bad sample rate".to_owned()),
1822 mp3lame_encoder::BuildError::InternalError => Self::OtherReason("Internal error".to_owned()),
1823 mp3lame_encoder::BuildError::Other(c_int) => Self::OtherReason(format!("Other lame error code: {c_int}")),
1824 }
1825 }
1826 }
1827
1828 impl From<mp3lame_encoder::Id3TagError> for AudioWriteError {
1829 fn from(err: mp3lame_encoder::Id3TagError) -> Self {
1830 match err {
1831 mp3lame_encoder::Id3TagError::AlbumArtOverflow => {
1832 Self::BufferIsFull("Specified Id3 tag buffer exceed limit of 128kb".to_owned())
1833 }
1834 }
1835 }
1836 }
1837
1838 impl From<mp3lame_encoder::EncodeError> for AudioWriteError {
1839 fn from(err: mp3lame_encoder::EncodeError) -> Self {
1840 match err {
1841 mp3lame_encoder::EncodeError::BufferTooSmall => Self::BufferIsFull("Buffer is too small".to_owned()),
1842 mp3lame_encoder::EncodeError::NoMem => Self::OtherReason("No enough memory".to_owned()),
1843 mp3lame_encoder::EncodeError::InvalidState => Self::OtherReason("Invalid state".to_owned()),
1844 mp3lame_encoder::EncodeError::PsychoAcoustic => Self::OtherReason("Psycho acoustic problems".to_owned()),
1845 mp3lame_encoder::EncodeError::Other(c_int) => Self::OtherReason(format!("Other lame error code: {c_int}")),
1846 }
1847 }
1848 }
1849 }
1850
1851 #[cfg(feature = "mp3enc")]
1852 pub use impl_mp3::*;
1853}
1854
1855pub use mp3::{Mp3Bitrate, Mp3Channels, Mp3EncoderOptions, Mp3Quality, Mp3VbrMode};
1856
1857pub mod opus {
1859 const OPUS_ALLOWED_SAMPLE_RATES: [u32; 5] = [8000, 12000, 16000, 24000, 48000];
1860 const OPUS_MIN_SAMPLE_RATE: u32 = 8000;
1861 const OPUS_MAX_SAMPLE_RATE: u32 = 48000;
1862
1863 #[derive(Debug, Clone, Copy, PartialEq)]
1867 #[repr(u32)]
1868 pub enum OpusEncoderSampleDuration {
1869 MilliSec2_5,
1870 MilliSec5,
1871 MilliSec10,
1872 MilliSec20,
1873 MilliSec40,
1874 MilliSec60,
1875 }
1876
1877 #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
1879 pub enum OpusBitrate {
1880 Bits(i32),
1881 Max,
1882 Auto,
1883 }
1884
1885 impl OpusEncoderSampleDuration {
1886 pub fn get_num_samples(&self, channels: u16, sample_rate: u32) -> usize {
1887 let ms_m_10 = match self {
1888 Self::MilliSec2_5 => 25,
1889 Self::MilliSec5 => 50,
1890 Self::MilliSec10 => 100,
1891 Self::MilliSec20 => 200,
1892 Self::MilliSec40 => 400,
1893 Self::MilliSec60 => 600,
1894 };
1895 (sample_rate as usize * ms_m_10 as usize) * channels as usize / 10000
1896 }
1897 }
1898
1899 #[derive(Debug, Clone, Copy, PartialEq)]
1901 pub struct OpusEncoderOptions {
1902 pub bitrate: OpusBitrate,
1904
1905 pub encode_vbr: bool,
1907
1908 pub samples_cache_duration: OpusEncoderSampleDuration,
1911 }
1912
1913 impl OpusEncoderOptions {
1914 pub fn new() -> Self {
1915 Self {
1916 bitrate: OpusBitrate::Max,
1917 encode_vbr: false,
1918 samples_cache_duration: OpusEncoderSampleDuration::MilliSec60,
1919 }
1920 }
1921
1922 pub fn get_allowed_sample_rates(&self) -> [u32; OPUS_ALLOWED_SAMPLE_RATES.len()] {
1923 OPUS_ALLOWED_SAMPLE_RATES
1924 }
1925
1926 pub fn get_rounded_up_sample_rate(&self, sample_rate: u32) -> u32 {
1927 if sample_rate <= OPUS_MIN_SAMPLE_RATE {
1928 OPUS_MIN_SAMPLE_RATE
1929 } else if sample_rate >= OPUS_MAX_SAMPLE_RATE {
1930 OPUS_MAX_SAMPLE_RATE
1931 } else {
1932 for (l, h) in OPUS_ALLOWED_SAMPLE_RATES[..OPUS_ALLOWED_SAMPLE_RATES.len() - 1]
1933 .iter()
1934 .zip(OPUS_ALLOWED_SAMPLE_RATES[1..].iter())
1935 {
1936 if sample_rate > *l && sample_rate <= *h {
1937 return *h;
1938 }
1939 }
1940 OPUS_MAX_SAMPLE_RATE
1941 }
1942 }
1943 }
1944
1945 impl Default for OpusEncoderOptions {
1946 fn default() -> Self {
1947 Self::new()
1948 }
1949 }
1950
1951 #[cfg(feature = "opus")]
1952 use super::EncoderToImpl;
1953
1954 #[cfg(feature = "opus")]
1955 pub mod impl_opus {
1956 use std::{
1957 fmt::{self, Debug, Formatter},
1958 mem,
1959 };
1960
1961 use super::*;
1962 use crate::errors::AudioWriteError;
1963 use crate::io_utils::Writer;
1964 use crate::audioutils::sample_conv;
1965 use crate::wavcore::format_tags::*;
1966 use crate::wavcore::{FmtChunk, Spec};
1967 use crate::{i24, u24};
1968
1969 use opus::{self, Application, Bitrate, Channels, Encoder, ErrorCode};
1970
1971 impl OpusBitrate {
1972 pub fn to_opus_bitrate(&self) -> Bitrate {
1973 match self {
1974 Self::Bits(bitrate) => Bitrate::Bits(*bitrate),
1975 Self::Max => Bitrate::Max,
1976 Self::Auto => Bitrate::Auto,
1977 }
1978 }
1979 }
1980
1981 pub struct OpusEncoder<'a> {
1982 writer: &'a mut dyn Writer,
1983 encoder: Encoder,
1984 channels: u16,
1985 sample_rate: u32,
1986 cache_duration: OpusEncoderSampleDuration,
1987 num_samples_per_encode: usize,
1988 sample_cache: Vec<f32>,
1989 samples_written: u64,
1990 bytes_written: u64,
1991 }
1992
1993 impl<'a> OpusEncoder<'a> {
1994 pub fn new(
1995 writer: &'a mut dyn Writer,
1996 spec: Spec,
1997 options: &OpusEncoderOptions,
1998 ) -> Result<Self, AudioWriteError> {
1999 let mut opus_channels = Channels::Mono;
2000 unsafe { *(&mut opus_channels as *mut Channels as usize as *mut u8) = spec.channels as u8;
2002 };
2003 if !OPUS_ALLOWED_SAMPLE_RATES.contains(&spec.sample_rate) {
2004 return Err(AudioWriteError::InvalidArguments(format!(
2005 "Bad sample rate: {} for the opus encoder. The sample rate must be one of {}",
2006 spec.sample_rate,
2007 OPUS_ALLOWED_SAMPLE_RATES
2008 .iter()
2009 .map(|s| { format!("{s}") })
2010 .collect::<Vec<String>>()
2011 .join(", ")
2012 )));
2013 }
2014 let mut encoder =
2015 Encoder::new(spec.sample_rate, opus_channels, Application::Audio)?;
2016 encoder.set_bitrate(options.bitrate.to_opus_bitrate())?;
2017 encoder.set_vbr(options.encode_vbr)?;
2018 let num_samples_per_encode = options
2019 .samples_cache_duration
2020 .get_num_samples(spec.channels, spec.sample_rate);
2021 Ok(Self {
2022 writer,
2023 encoder,
2024 channels: spec.channels,
2025 sample_rate: spec.sample_rate,
2026 cache_duration: options.samples_cache_duration,
2027 num_samples_per_encode,
2028 sample_cache: Vec::<f32>::new(),
2029 samples_written: 0,
2030 bytes_written: 0,
2031 })
2032 }
2033
2034 pub fn set_cache_duration(
2035 &mut self,
2036 samples_cache_duration: OpusEncoderSampleDuration,
2037 ) {
2038 self.cache_duration = samples_cache_duration;
2039 self.num_samples_per_encode =
2040 samples_cache_duration.get_num_samples(self.channels, self.sample_rate);
2041 }
2042
2043 pub fn write_interleaved_samples(&mut self, samples: &[f32]) -> Result<(), AudioWriteError> {
2044 self.sample_cache.extend(samples);
2045 let mut cached_length = self.sample_cache.len();
2046 let mut iter = mem::take(&mut self.sample_cache).into_iter();
2047 while cached_length >= self.num_samples_per_encode {
2048 let samples_to_write: Vec<f32> =
2050 iter.by_ref().take(self.num_samples_per_encode).collect();
2051 if samples_to_write.is_empty() {
2052 break;
2053 }
2054
2055 let mut buf = vec![0u8; self.num_samples_per_encode];
2057
2058 let size = self.encoder.encode_float(&samples_to_write, &mut buf)?;
2060 assert_eq!(size, buf.len());
2061 self.writer.write_all(&buf)?;
2062
2063 cached_length -= self.num_samples_per_encode;
2065 self.samples_written += self.num_samples_per_encode as u64;
2066 self.bytes_written += buf.len() as u64;
2067 }
2068 self.sample_cache = iter.collect();
2069 Ok(())
2070 }
2071
2072 pub fn flush(&mut self) -> Result<(), AudioWriteError> {
2073 if !self.sample_cache.is_empty() {
2074 let pad = (self.num_samples_per_encode
2075 - self.sample_cache.len() % self.num_samples_per_encode)
2076 % self.num_samples_per_encode;
2077
2078 self.write_interleaved_samples(&vec![0.0f32; pad])?;
2080 }
2081 Ok(())
2082 }
2083 }
2084
2085 impl Debug for OpusEncoder<'_> {
2086 fn fmt(&self, fmt: &mut Formatter) -> fmt::Result {
2087 fmt.debug_struct("OpusEncoder")
2088 .field("writer", &self.writer)
2089 .field("encoder", &self.encoder)
2090 .field("channels", &self.channels)
2091 .field("sample_rate", &self.sample_rate)
2092 .field("cache_duration", &self.cache_duration)
2093 .field("num_samples_per_encode", &self.num_samples_per_encode)
2094 .field(
2095 "sample_cache",
2096 &format_args!("[f32; {}]", self.sample_cache.len()),
2097 )
2098 .field("samples_written", &self.samples_written)
2099 .field("bytes_written", &self.bytes_written)
2100 .finish()
2101 }
2102 }
2103
2104 impl EncoderToImpl for OpusEncoder<'_> {
2105 fn get_channels(&self) -> u16 {
2106 self.channels
2107 }
2108
2109 fn get_max_channels(&self) -> u16 {
2110 255
2111 }
2112
2113 fn begin_encoding(&mut self) -> Result<(), AudioWriteError> {
2114 Ok(())
2115 }
2116
2117 fn get_bitrate(&self) -> u32 {
2118 if self.samples_written != 0 {
2119 (self.sample_rate as u64 * self.bytes_written / self.samples_written
2120 * self.channels as u64
2121 * 8) as u32
2122 } else {
2123 self.sample_rate * self.channels as u32 * 8 }
2125 }
2126
2127 fn new_fmt_chunk(&mut self) -> Result<FmtChunk, AudioWriteError> {
2128 Ok(FmtChunk {
2129 format_tag: FORMAT_TAG_OPUS,
2130 channels: self.channels,
2131 sample_rate: self.sample_rate,
2132 byte_rate: self.get_bitrate() / 8,
2133 block_align: self.num_samples_per_encode as u16,
2134 bits_per_sample: 0,
2135 extension: None,
2136 })
2137 }
2138
2139 fn update_fmt_chunk(&self, fmt: &mut FmtChunk) -> Result<(), AudioWriteError> {
2140 fmt.byte_rate = self.get_bitrate() / 8;
2141 fmt.block_align = self.num_samples_per_encode as u16;
2142 Ok(())
2143 }
2144
2145 fn finish(&mut self) -> Result<(), AudioWriteError> {
2146 self.flush()?;
2147 self.writer.flush()?;
2148 Ok(())
2149 }
2150
2151 fn write_interleaved_samples__i8(&mut self, samples: &[i8 ]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2152 fn write_interleaved_samples_i16(&mut self, samples: &[i16]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2153 fn write_interleaved_samples_i24(&mut self, samples: &[i24]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2154 fn write_interleaved_samples_i32(&mut self, samples: &[i32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2155 fn write_interleaved_samples_i64(&mut self, samples: &[i64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2156 fn write_interleaved_samples__u8(&mut self, samples: &[u8 ]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2157 fn write_interleaved_samples_u16(&mut self, samples: &[u16]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2158 fn write_interleaved_samples_u24(&mut self, samples: &[u24]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2159 fn write_interleaved_samples_u32(&mut self, samples: &[u32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2160 fn write_interleaved_samples_u64(&mut self, samples: &[u64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2161 fn write_interleaved_samples_f32(&mut self, samples: &[f32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2162 fn write_interleaved_samples_f64(&mut self, samples: &[f64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2163 }
2164
2165
2166 impl From<opus::Error> for AudioWriteError {
2167 fn from(err: opus::Error) -> Self {
2168 match err.code() {
2169 ErrorCode::BadArg => Self::InvalidArguments(format!("On calling `{}`: {}", err.function(), err.description())),
2170 ErrorCode::BufferTooSmall => Self::BufferIsFull(format!("On calling `{}`: {}", err.function(), err.description())),
2171 ErrorCode::InternalError => Self::OtherReason(format!("On calling `{}`: {}", err.function(), err.description())),
2172 ErrorCode::InvalidPacket => Self::InvalidData(format!("On calling `{}`: {}", err.function(), err.description())),
2173 ErrorCode::Unimplemented => Self::Unimplemented(format!("On calling `{}`: {}", err.function(), err.description())),
2174 ErrorCode::InvalidState => Self::OtherReason(format!("On calling `{}`: {}", err.function(), err.description())),
2175 ErrorCode::AllocFail => Self::OtherReason(format!("On calling `{}`: {}", err.function(), err.description())),
2176 ErrorCode::Unknown => Self::OtherReason(format!("On calling `{}`: {}", err.function(), err.description())),
2177 }
2178 }
2179 }
2180
2181 }
2182
2183 #[cfg(feature = "opus")]
2184 pub use impl_opus::*;
2185}
2186
2187pub use opus::{OpusBitrate, OpusEncoderOptions, OpusEncoderSampleDuration};
2188
2189#[cfg(feature = "flac")]
2191pub mod flac_enc {
2192 use std::{
2193 borrow::Cow,
2194 io::{self, ErrorKind, Seek, SeekFrom, Write},
2195 };
2196
2197 use super::EncoderToImpl;
2198
2199 use crate::errors::{AudioWriteError, IOErrorInfo};
2200 use crate::io_utils::Writer;
2201 use crate::audioutils::{sample_conv, sample_conv_batch, stereos_conv};
2202 use crate::wavcore::format_tags::*;
2203 use crate::wavcore::{FmtChunk, ListChunk, get_listinfo_flacmeta};
2204 use crate::{i24, u24};
2205 use flac::{FlacEncoderParams, FlacEncoderUnmovable};
2206
2207 #[derive(Debug)]
2208 pub struct FlacEncoderWrap<'a> {
2209 encoder: Box<FlacEncoderUnmovable<'a, &'a mut dyn Writer>>,
2210 params: FlacEncoderParams,
2211 write_offset: u64,
2212 frames_written: u64,
2213 bytes_written: Box<u64>,
2214 }
2215
2216 impl<'a> FlacEncoderWrap<'a> {
2217 pub fn new(
2218 writer: &'a mut dyn Writer,
2219 params: &FlacEncoderParams,
2220 ) -> Result<Self, AudioWriteError> {
2221 let write_offset = writer.stream_position()?;
2222 let mut bytes_written = Box::new(0u64);
2223 let bytes_written_ptr = (&mut *bytes_written) as *mut u64;
2224 Ok(Self {
2226 encoder: Box::new(FlacEncoderUnmovable::new(
2227 writer,
2228 Box::new(
2229 move |writer: &mut &'a mut dyn Writer, data: &[u8]| -> io::Result<()> {
2230 unsafe { *bytes_written_ptr += data.len() as u64 };
2231 writer.write_all(data)
2232 },
2233 ),
2234 Box::new(
2235 move |writer: &mut &'a mut dyn Writer, position: u64| -> io::Result<()> {
2236 writer.seek(SeekFrom::Start(write_offset + position))?;
2237 Ok(())
2238 },
2239 ),
2240 Box::new(move |writer: &mut &'a mut dyn Writer| -> io::Result<u64> {
2241 Ok(write_offset + writer.stream_position()?)
2242 }),
2243 params,
2244 )?),
2245 params: *params,
2246 write_offset,
2247 frames_written: 0,
2248 bytes_written,
2249 })
2250 }
2251
2252 #[inline(always)]
2254 fn fit_32bit_to_bps(&self, sample: i32) -> i32 {
2255 sample >> (32 - self.params.bits_per_sample)
2256 }
2257
2258 fn fit_samples_to_bps<'b>(&self, samples: &'b [i32]) -> Cow<'b, [i32]> {
2260 if self.params.bits_per_sample == 32 {
2261 Cow::Borrowed(samples)
2262 } else {
2263 Cow::Owned(
2264 samples
2265 .iter()
2266 .map(|sample| self.fit_32bit_to_bps(*sample))
2267 .collect(),
2268 )
2269 }
2270 }
2271
2272 fn fit_stereos_to_bps<'b>(&self, stereos: &'b [(i32, i32)]) -> Cow<'b, [(i32, i32)]> {
2274 if self.params.bits_per_sample == 32 {
2275 Cow::Borrowed(stereos)
2276 } else {
2277 Cow::Owned(
2278 stereos
2279 .iter()
2280 .map(|(l, r)| (self.fit_32bit_to_bps(*l), self.fit_32bit_to_bps(*r)))
2281 .collect::<Vec<(i32, i32)>>(),
2282 )
2283 }
2284 }
2285
2286 fn fit_2d_to_bps<'b>(&self, two_d: &'b [Vec<i32>]) -> Cow<'b, [Vec<i32>]> {
2288 if self.params.bits_per_sample == 32 {
2289 Cow::Borrowed(two_d)
2290 } else {
2291 Cow::Owned(
2292 two_d
2293 .iter()
2294 .map(|mono| self.fit_samples_to_bps(mono).to_vec())
2295 .collect(),
2296 )
2297 }
2298 }
2299
2300 fn check_channels(&self, channels: u16) -> Result<(), AudioWriteError> {
2301 if channels != self.params.channels {
2302 Err(AudioWriteError::WrongChannels(format!(
2303 "The encoder channels is {} but {channels} channels audio data are asked to be written.",
2304 self.params.channels
2305 )))
2306 } else {
2307 Ok(())
2308 }
2309 }
2310
2311 #[inline(always)]
2312 pub fn get_channels(&self) -> u16 {
2313 self.params.channels
2314 }
2315
2316 #[inline(always)]
2317 pub fn get_sample_rate(&self) -> u32 {
2318 self.params.sample_rate
2319 }
2320
2321 #[cfg(feature = "id3")]
2322 pub fn inherit_metadata_from_id3(
2323 &mut self,
2324 id3_tag: &id3::Tag,
2325 ) -> Result<(), AudioWriteError> {
2326 Ok(self.encoder.inherit_metadata_from_id3(id3_tag)?)
2327 }
2328
2329 pub fn inherit_metadata_from_list(
2330 &mut self,
2331 list_chunk: &ListChunk,
2332 ) -> Result<(), AudioWriteError> {
2333 match list_chunk {
2334 ListChunk::Info(list) => {
2335 for (list_key, flac_key) in get_listinfo_flacmeta().iter() {
2336 if let Some(data) = list.get(list_key.to_owned()) {
2337 self.encoder.insert_comments(flac_key, data).unwrap();
2338 }
2339 }
2340 }
2341 ListChunk::Adtl(_) => {
2342 eprintln!("Don't have `INFO` data in the WAV file `LIST` chunk.");
2343 }
2344 }
2345
2346 Ok(())
2347 }
2348
2349 pub fn write_interleaved_samples(
2350 &mut self,
2351 samples: &[i32],
2352 ) -> Result<(), AudioWriteError> {
2353 match self
2354 .encoder
2355 .write_interleaved_samples(&self.fit_samples_to_bps(samples))
2356 {
2357 Ok(_) => {
2358 self.frames_written += samples.len() as u64 / self.get_channels() as u64;
2359 Ok(())
2360 }
2361 Err(e) => Err(AudioWriteError::from(e)),
2362 }
2363 }
2364
2365 pub fn write_mono_channel(&mut self, monos: &[i32]) -> Result<(), AudioWriteError> {
2366 match self
2367 .encoder
2368 .write_mono_channel(&self.fit_samples_to_bps(monos))
2369 {
2370 Ok(_) => {
2371 self.frames_written += monos.len() as u64;
2372 Ok(())
2373 }
2374 Err(e) => Err(AudioWriteError::from(e)),
2375 }
2376 }
2377
2378 pub fn write_stereos(&mut self, stereos: &[(i32, i32)]) -> Result<(), AudioWriteError> {
2379 match self
2380 .encoder
2381 .write_stereos(&self.fit_stereos_to_bps(stereos))
2382 {
2383 Ok(_) => {
2384 self.frames_written += stereos.len() as u64;
2385 Ok(())
2386 }
2387 Err(e) => Err(AudioWriteError::from(e)),
2388 }
2389 }
2390
2391 pub fn write_monos(&mut self, monos: &[Vec<i32>]) -> Result<(), AudioWriteError> {
2392 match self.encoder.write_monos(&self.fit_2d_to_bps(monos)) {
2393 Ok(_) => {
2394 self.frames_written += monos[0].len() as u64;
2395 Ok(())
2396 }
2397 Err(e) => Err(AudioWriteError::from(e)),
2398 }
2399 }
2400
2401 pub fn write_frames(&mut self, frames: &[Vec<i32>]) -> Result<(), AudioWriteError> {
2402 match self.encoder.write_frames(&self.fit_2d_to_bps(frames)) {
2403 Ok(_) => {
2404 self.frames_written += frames.len() as u64;
2405 Ok(())
2406 }
2407 Err(e) => Err(AudioWriteError::from(e)),
2408 }
2409 }
2410 }
2411
2412 impl EncoderToImpl for FlacEncoderWrap<'_> {
2413 fn get_channels(&self) -> u16 {
2414 self.params.channels
2415 }
2416
2417 fn get_max_channels(&self) -> u16 {
2418 8
2419 }
2420
2421 fn begin_encoding(&mut self) -> Result<(), AudioWriteError> {
2422 self.encoder.initialize()?;
2423 Ok(())
2424 }
2425
2426 fn get_bitrate(&self) -> u32 {
2427 if self.frames_written != 0 {
2428 (*self.bytes_written * self.get_sample_rate() as u64 * 8 / self.frames_written)
2429 as u32
2430 } else {
2431 self.get_sample_rate() * self.get_channels() as u32 * 8 }
2433 }
2434
2435 fn new_fmt_chunk(&mut self) -> Result<FmtChunk, AudioWriteError> {
2436 Ok(FmtChunk {
2437 format_tag: FORMAT_TAG_FLAC,
2438 channels: self.get_channels(),
2439 sample_rate: self.get_sample_rate(),
2440 byte_rate: self.get_bitrate() / 8,
2441 block_align: 1,
2442 bits_per_sample: 0,
2443 extension: None,
2444 })
2445 }
2446
2447 fn update_fmt_chunk(&self, fmt: &mut FmtChunk) -> Result<(), AudioWriteError> {
2448 fmt.byte_rate = self.get_bitrate() / 8;
2449 Ok(())
2450 }
2451
2452 fn finish(&mut self) -> Result<(), AudioWriteError> {
2453 Ok(self.encoder.finish()?)
2454 }
2455
2456 fn write_interleaved_samples__i8(&mut self, samples: &[i8 ]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2457 fn write_interleaved_samples_i16(&mut self, samples: &[i16]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2458 fn write_interleaved_samples_i24(&mut self, samples: &[i24]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2459 fn write_interleaved_samples_i32(&mut self, samples: &[i32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2460 fn write_interleaved_samples_i64(&mut self, samples: &[i64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2461 fn write_interleaved_samples__u8(&mut self, samples: &[u8 ]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2462 fn write_interleaved_samples_u16(&mut self, samples: &[u16]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2463 fn write_interleaved_samples_u24(&mut self, samples: &[u24]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2464 fn write_interleaved_samples_u32(&mut self, samples: &[u32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2465 fn write_interleaved_samples_u64(&mut self, samples: &[u64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2466 fn write_interleaved_samples_f32(&mut self, samples: &[f32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2467 fn write_interleaved_samples_f64(&mut self, samples: &[f64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
2468
2469 fn write_mono_channel__i8(&mut self, monos: &[i8 ]) -> Result<(), AudioWriteError> {self.write_mono_channel(&sample_conv(monos))}
2470 fn write_mono_channel_i16(&mut self, monos: &[i16]) -> Result<(), AudioWriteError> {self.write_mono_channel(&sample_conv(monos))}
2471 fn write_mono_channel_i24(&mut self, monos: &[i24]) -> Result<(), AudioWriteError> {self.write_mono_channel(&sample_conv(monos))}
2472 fn write_mono_channel_i32(&mut self, monos: &[i32]) -> Result<(), AudioWriteError> {self.write_mono_channel(&sample_conv(monos))}
2473 fn write_mono_channel_i64(&mut self, monos: &[i64]) -> Result<(), AudioWriteError> {self.write_mono_channel(&sample_conv(monos))}
2474 fn write_mono_channel__u8(&mut self, monos: &[u8 ]) -> Result<(), AudioWriteError> {self.write_mono_channel(&sample_conv(monos))}
2475 fn write_mono_channel_u16(&mut self, monos: &[u16]) -> Result<(), AudioWriteError> {self.write_mono_channel(&sample_conv(monos))}
2476 fn write_mono_channel_u24(&mut self, monos: &[u24]) -> Result<(), AudioWriteError> {self.write_mono_channel(&sample_conv(monos))}
2477 fn write_mono_channel_u32(&mut self, monos: &[u32]) -> Result<(), AudioWriteError> {self.write_mono_channel(&sample_conv(monos))}
2478 fn write_mono_channel_u64(&mut self, monos: &[u64]) -> Result<(), AudioWriteError> {self.write_mono_channel(&sample_conv(monos))}
2479 fn write_mono_channel_f32(&mut self, monos: &[f32]) -> Result<(), AudioWriteError> {self.write_mono_channel(&sample_conv(monos))}
2480 fn write_mono_channel_f64(&mut self, monos: &[f64]) -> Result<(), AudioWriteError> {self.write_mono_channel(&sample_conv(monos))}
2481
2482 fn write_stereos__i8(&mut self, stereos: &[(i8 , i8 )]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
2483 fn write_stereos_i16(&mut self, stereos: &[(i16, i16)]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
2484 fn write_stereos_i24(&mut self, stereos: &[(i24, i24)]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
2485 fn write_stereos_i32(&mut self, stereos: &[(i32, i32)]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
2486 fn write_stereos_i64(&mut self, stereos: &[(i64, i64)]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
2487 fn write_stereos__u8(&mut self, stereos: &[(u8 , u8 )]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
2488 fn write_stereos_u16(&mut self, stereos: &[(u16, u16)]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
2489 fn write_stereos_u24(&mut self, stereos: &[(u24, u24)]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
2490 fn write_stereos_u32(&mut self, stereos: &[(u32, u32)]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
2491 fn write_stereos_u64(&mut self, stereos: &[(u64, u64)]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
2492 fn write_stereos_f32(&mut self, stereos: &[(f32, f32)]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
2493 fn write_stereos_f64(&mut self, stereos: &[(f64, f64)]) -> Result<(), AudioWriteError> {self.write_stereos(&stereos_conv(stereos))}
2494
2495 fn write_monos__i8(&mut self, monos_array: &[Vec<i8 >]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
2496 fn write_monos_i16(&mut self, monos_array: &[Vec<i16>]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
2497 fn write_monos_i24(&mut self, monos_array: &[Vec<i24>]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
2498 fn write_monos_i32(&mut self, monos_array: &[Vec<i32>]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
2499 fn write_monos_i64(&mut self, monos_array: &[Vec<i64>]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
2500 fn write_monos__u8(&mut self, monos_array: &[Vec<u8 >]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
2501 fn write_monos_u16(&mut self, monos_array: &[Vec<u16>]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
2502 fn write_monos_u24(&mut self, monos_array: &[Vec<u24>]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
2503 fn write_monos_u32(&mut self, monos_array: &[Vec<u32>]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
2504 fn write_monos_u64(&mut self, monos_array: &[Vec<u64>]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
2505 fn write_monos_f32(&mut self, monos_array: &[Vec<f32>]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
2506 fn write_monos_f64(&mut self, monos_array: &[Vec<f64>]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
2507
2508 fn write_frames__i8(&mut self, frames: &[Vec<i8 >]) -> Result<(), AudioWriteError> {self.write_frames(&sample_conv_batch(frames))}
2509 fn write_frames_i16(&mut self, frames: &[Vec<i16>]) -> Result<(), AudioWriteError> {self.write_frames(&sample_conv_batch(frames))}
2510 fn write_frames_i24(&mut self, frames: &[Vec<i24>]) -> Result<(), AudioWriteError> {self.write_frames(&sample_conv_batch(frames))}
2511 fn write_frames_i32(&mut self, frames: &[Vec<i32>]) -> Result<(), AudioWriteError> {self.write_frames(&sample_conv_batch(frames))}
2512 fn write_frames_i64(&mut self, frames: &[Vec<i64>]) -> Result<(), AudioWriteError> {self.write_frames(&sample_conv_batch(frames))}
2513 fn write_frames__u8(&mut self, frames: &[Vec<u8 >]) -> Result<(), AudioWriteError> {self.write_frames(&sample_conv_batch(frames))}
2514 fn write_frames_u16(&mut self, frames: &[Vec<u16>]) -> Result<(), AudioWriteError> {self.write_frames(&sample_conv_batch(frames))}
2515 fn write_frames_u24(&mut self, frames: &[Vec<u24>]) -> Result<(), AudioWriteError> {self.write_frames(&sample_conv_batch(frames))}
2516 fn write_frames_u32(&mut self, frames: &[Vec<u32>]) -> Result<(), AudioWriteError> {self.write_frames(&sample_conv_batch(frames))}
2517 fn write_frames_u64(&mut self, frames: &[Vec<u64>]) -> Result<(), AudioWriteError> {self.write_frames(&sample_conv_batch(frames))}
2518 fn write_frames_f32(&mut self, frames: &[Vec<f32>]) -> Result<(), AudioWriteError> {self.write_frames(&sample_conv_batch(frames))}
2519 fn write_frames_f64(&mut self, frames: &[Vec<f64>]) -> Result<(), AudioWriteError> {self.write_frames(&sample_conv_batch(frames))}
2520 }
2521
2522 impl From<flac::FlacEncoderError> for AudioWriteError {
2523 fn from(err: flac::FlacEncoderError) -> Self {
2524 let err_code = err.code;
2525 let err_func = err.function;
2526 let err_desc = err.message;
2527 use flac::FlacEncoderErrorCode::*;
2528 let err_code = flac::FlacEncoderErrorCode::from(err_code);
2529 let err_string = format!("On function `{err_func}`: {err_desc}: {err_code}");
2530 match err_code {
2531 StreamEncoderOk => Self::OtherReason(err_string),
2532 StreamEncoderUninitialized => Self::OtherReason(err_string),
2533 StreamEncoderOggError => Self::OtherReason(err_string),
2534 StreamEncoderVerifyDecoderError => Self::OtherReason(err_string),
2535 StreamEncoderVerifyMismatchInAudioData => Self::OtherReason(err_string),
2536 StreamEncoderClientError => Self::OtherReason(err_string),
2537 StreamEncoderIOError => Self::IOError(IOErrorInfo::new(ErrorKind::Other, err_string)),
2538 StreamEncoderFramingError => Self::InvalidInput(err_string),
2539 StreamEncoderMemoryAllocationError => Self::OtherReason(err_string),
2540 }
2541 }
2542 }
2543
2544 impl From<flac::FlacEncoderInitError> for AudioWriteError {
2545 fn from(err: flac::FlacEncoderInitError) -> Self {
2546 let err_code = err.code;
2547 let err_func = err.function;
2548 let err_desc = err.message;
2549 use flac::FlacEncoderInitErrorCode::*;
2550 let err_code = flac::FlacEncoderInitErrorCode::from(err_code);
2551 let err_string = format!("On function `{err_func}`: {err_desc}: {err_code}");
2552 match err_code {
2553 StreamEncoderInitStatusOk => Self::OtherReason(err_string),
2554 StreamEncoderInitStatusEncoderError => Self::OtherReason(err_string),
2555 StreamEncoderInitStatusUnsupportedContainer => Self::OtherReason(err_string),
2556 StreamEncoderInitStatusInvalidCallbacks => Self::InvalidArguments(err_string),
2557 StreamEncoderInitStatusInvalidNumberOfChannels => Self::InvalidArguments(err_string),
2558 StreamEncoderInitStatusInvalidBitsPerSample => Self::InvalidArguments(err_string),
2559 StreamEncoderInitStatusInvalidSampleRate => Self::InvalidArguments(err_string),
2560 StreamEncoderInitStatusInvalidBlockSize => Self::InvalidArguments(err_string),
2561 StreamEncoderInitStatusInvalidMaxLpcOrder => Self::InvalidArguments(err_string),
2562 StreamEncoderInitStatusInvalidQlpCoeffPrecision => Self::InvalidArguments(err_string),
2563 StreamEncoderInitStatusBlockSizeTooSmallForLpcOrder => Self::BufferIsFull(err_string),
2564 StreamEncoderInitStatusNotStreamable => Self::OtherReason(err_string),
2565 StreamEncoderInitStatusInvalidMetadata => Self::InvalidInput(err_string),
2566 StreamEncoderInitStatusAlreadyInitialized => Self::InvalidArguments(err_string),
2567 }
2568 }
2569 }
2570
2571 impl From<flac::FlacDecoderError> for AudioWriteError {
2572 fn from(err: flac::FlacDecoderError) -> Self {
2573 let err_code = err.code;
2574 let err_func = err.function;
2575 let err_desc = err.message;
2576 use flac::FlacDecoderErrorCode::*;
2577 let err_code = flac::FlacDecoderErrorCode::from(err_code);
2578 let err_string = format!("On function `{err_func}`: {err_desc}: {err_code}");
2579 match err_code {
2580 StreamDecoderSearchForMetadata => Self::OtherReason(err_string),
2581 StreamDecoderReadMetadata => Self::OtherReason(err_string),
2582 StreamDecoderSearchForFrameSync => Self::OtherReason(err_string),
2583 StreamDecoderReadFrame => Self::OtherReason(err_string),
2584 StreamDecoderEndOfStream => Self::OtherReason(err_string),
2585 StreamDecoderOggError => Self::OtherReason(err_string),
2586 StreamDecoderSeekError => Self::OtherReason(err_string),
2587 StreamDecoderAborted => Self::OtherReason(err_string),
2588 StreamDecoderMemoryAllocationError => Self::OtherReason(err_string),
2589 StreamDecoderUninitialized => Self::InvalidArguments(err_string),
2590 }
2591 }
2592 }
2593
2594 impl From<flac::FlacDecoderInitError> for AudioWriteError {
2595 fn from(err: flac::FlacDecoderInitError) -> Self {
2596 let err_code = err.code;
2597 let err_func = err.function;
2598 let err_desc = err.message;
2599 use flac::FlacDecoderInitErrorCode::*;
2600 let err_code = flac::FlacDecoderInitErrorCode::from(err_code);
2601 let err_string = format!("On function `{err_func}`: {err_desc}: {err_code}");
2602 match err_code {
2603 StreamDecoderInitStatusOk => Self::OtherReason(err_string),
2604 StreamDecoderInitStatusUnsupportedContainer => Self::Unsupported(err_string),
2605 StreamDecoderInitStatusInvalidCallbacks => Self::InvalidArguments(err_string),
2606 StreamDecoderInitStatusMemoryAllocationError => Self::OtherReason(err_string),
2607 StreamDecoderInitStatusErrorOpeningFile => {
2608 Self::IOError(IOErrorInfo::new(ErrorKind::Other, err_string))
2609 }
2610 StreamDecoderInitStatusAlreadyInitialized => Self::InvalidArguments(err_string),
2611 }
2612 }
2613 }
2614
2615 impl From<&dyn flac::FlacError> for AudioWriteError {
2616 fn from(err: &dyn flac::FlacError) -> Self {
2617 let err_code = err.get_code();
2618 let err_func = err.get_function();
2619 let err_desc = err.get_message();
2620 if let Some(encoder_err) = err.as_any().downcast_ref::<flac::FlacEncoderError>() {
2621 AudioWriteError::from(*encoder_err)
2622 } else if let Some(encoder_err) = err.as_any().downcast_ref::<flac::FlacEncoderInitError>()
2623 {
2624 AudioWriteError::from(*encoder_err)
2625 } else if let Some(decoder_err) = err.as_any().downcast_ref::<flac::FlacDecoderError>() {
2626 AudioWriteError::from(*decoder_err)
2627 } else if let Some(decoder_err) = err.as_any().downcast_ref::<flac::FlacDecoderInitError>()
2628 {
2629 AudioWriteError::from(*decoder_err)
2630 } else {
2631 Self::OtherReason(format!(
2632 "Unknown error type from `flac::FlacError`: `{err_func}`: {err_code}: {err_desc}"
2633 ))
2634 }
2635 }
2636 }
2637}
2638
2639pub mod oggvorbis_enc {
2643 #[derive(Debug, Clone, Copy, Default, PartialEq)]
2645 pub enum OggVorbisMode {
2646 #[default]
2648 OriginalStreamCompatible = 1,
2649
2650 HaveIndependentHeader = 2,
2653
2654 HaveNoCodebookHeader = 3,
2659
2660 NakedVorbis = 4
2666 }
2667
2668 #[derive(Debug, Clone, Copy, Default, PartialEq)]
2670 pub struct OggVorbisEncoderParams {
2671 pub mode: OggVorbisMode,
2673
2674 pub channels: u16,
2676
2677 pub sample_rate: u32,
2679
2680 pub stream_serial: Option<i32>,
2682
2683 pub bitrate: Option<OggVorbisBitrateStrategy>,
2685
2686 pub minimum_page_data_size: Option<u16>,
2691 }
2692
2693 #[derive(Debug, Clone, Copy, PartialEq)]
2695 pub enum OggVorbisBitrateStrategy {
2696 Vbr(u32),
2701
2702 QualityVbr(f32),
2709
2710 Abr(u32),
2714
2715 ConstrainedAbr(u32),
2721 }
2722
2723 #[cfg(any(feature = "vorbis", feature = "oggvorbis"))]
2724 use super::EncoderToImpl;
2725
2726 #[cfg(any(feature = "vorbis", feature = "oggvorbis"))]
2727 mod impl_vorbis {
2728 use std::{
2729 collections::BTreeMap,
2730 fmt::{self, Debug, Formatter},
2731 io::{Seek, Write, ErrorKind},
2732 num::NonZero,
2733 };
2734
2735 use super::*;
2736 use ogg::OggPacket;
2737 use vorbis_rs::*;
2738
2739 use crate::errors::{AudioWriteError, IOErrorInfo};
2740 use crate::io_utils::{Reader, Writer, ReadWrite, CursorVecU8, SharedMultistreamIO, StreamType};
2741 use crate::audioutils::{self, sample_conv, sample_conv_batch};
2742 use crate::chunks::{FmtChunk, ext::{FmtExtension, VorbisHeaderData, OggVorbisData, OggVorbisWithHeaderData}};
2743 use crate::format_specs::format_tags::*;
2744 use crate::{i24, u24};
2745
2746 type SharedAlterIO<'a> = SharedMultistreamIO<Box<dyn Reader>, &'a mut dyn Writer, &'a mut dyn ReadWrite>;
2747 type SharedIO<'a> = StreamType<Box<dyn Reader>, &'a mut dyn Writer, &'a mut dyn ReadWrite>;
2748
2749 impl OggVorbisBitrateStrategy {
2750 fn is_vbr(&self) -> bool {
2751 match self {
2752 Self::Vbr(_) => true,
2753 Self::QualityVbr(_) => true,
2754 Self::Abr(_) => false,
2755 Self::ConstrainedAbr(_) => false,
2756 }
2757 }
2758
2759 fn get_bitrate(&self, channels: u16, sample_rate: u32) -> Result<u32, AudioWriteError> {
2760 match self {
2761 Self::Vbr(bitrate) => Ok(*bitrate),
2762 Self::QualityVbr(quality) => {
2763 let quality = ((quality * 10.0) as i32).clamp(0, 10);
2764 match sample_rate {
2765 48000 => {
2766 Ok([
2767 [64000, 80000, 96000, 112000, 128000, 160000, 192000, 240000, 256000, 350000, 450000],
2768 [48000, 64000, 72000, 80000, 88000, 96000, 112000, 128000, 144000, 192000, 256000],
2769 ][channels as usize][quality as usize])
2770 }
2771 44100 => {
2772 Ok([
2773 [64000, 80000, 96000, 112000, 128000, 160000, 192000, 240000, 256000, 350000, 450000],
2774 [48000, 64000, 72000, 80000, 88000, 96000, 112000, 128000, 144000, 192000, 256000],
2775 ][channels as usize][quality as usize])
2776 }
2777 22050 => {
2778 Ok([
2779 [56000, 72000, 80000, 88000, 96000, 112000, 144000, 176000, 192000, 256000, 320000],
2780 [36000, 42000, 48000, 52000, 56000, 64000, 80000, 88000, 96000, 128000, 168000],
2781 ][channels as usize][quality as usize])
2782 }
2783 11025 => {
2784 Ok([
2785 [36000, 44000, 50000, 52000, 56000, 64000, 80000, 96000, 112000, 144000, 168000],
2786 [22000, 26000, 28000, 30000, 32000, 34000, 40000, 48000, 56000, 72000, 88000],
2787 ][channels as usize][quality as usize])
2788 }
2789 o => Err(AudioWriteError::InvalidArguments(format!("Invalid sample rate {o}. For Vorbis encoding, sample rate must be 48000, 44100, 22050, 11025."))),
2790 }
2791 },
2792 Self::Abr(bitrate) => Ok(*bitrate),
2793 Self::ConstrainedAbr(bitrate) => Ok(*bitrate),
2794 }
2795 }
2796 }
2797
2798 impl From<OggVorbisBitrateStrategy> for VorbisBitrateManagementStrategy {
2799 fn from(val: OggVorbisBitrateStrategy) -> Self {
2801 match val {
2802 OggVorbisBitrateStrategy::Vbr(bitrate) => VorbisBitrateManagementStrategy::Vbr {
2803 target_bitrate: NonZero::new(bitrate).unwrap(),
2804 },
2805 OggVorbisBitrateStrategy::QualityVbr(quality) => VorbisBitrateManagementStrategy::QualityVbr {
2806 target_quality: quality,
2807 },
2808 OggVorbisBitrateStrategy::Abr(bitrate) => VorbisBitrateManagementStrategy::Abr {
2809 average_bitrate: NonZero::new(bitrate).unwrap(),
2810 },
2811 OggVorbisBitrateStrategy::ConstrainedAbr(bitrate) => VorbisBitrateManagementStrategy::ConstrainedAbr {
2812 maximum_bitrate: NonZero::new(bitrate).unwrap(),
2813 },
2814 }
2815 }
2816 }
2817
2818 impl From<VorbisBitrateManagementStrategy> for OggVorbisBitrateStrategy {
2819 fn from(vbms: VorbisBitrateManagementStrategy) -> Self {
2821 match vbms {
2822 VorbisBitrateManagementStrategy::Vbr{target_bitrate} => Self::Vbr(target_bitrate.into()),
2823 VorbisBitrateManagementStrategy::QualityVbr{target_quality} => Self::QualityVbr(target_quality),
2824 VorbisBitrateManagementStrategy::Abr{average_bitrate} => Self::Abr(average_bitrate.into()),
2825 VorbisBitrateManagementStrategy::ConstrainedAbr{maximum_bitrate} => Self::ConstrainedAbr(maximum_bitrate.into()),
2826 }
2827 }
2828 }
2829
2830 impl Default for OggVorbisBitrateStrategy {
2831 fn default() -> Self {
2832 Self::QualityVbr(1.0)
2833 }
2834 }
2835
2836 pub enum OggVorbisEncoderOrBuilder<'a> {
2838 Builder {
2840 builder: VorbisEncoderBuilder<SharedAlterIO<'a>>,
2842
2843 metadata: BTreeMap<String, String>,
2845 },
2846
2847 Encoder(VorbisEncoder<SharedAlterIO<'a>>),
2849
2850 Finished,
2852 }
2853
2854 impl Debug for OggVorbisEncoderOrBuilder<'_> {
2855 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
2856 match self {
2857 Self::Builder {
2858 builder: _,
2859 metadata,
2860 } => write!(
2861 f,
2862 "Builder(builder: VorbisEncoderBuilder<WriteBridge>, metadata: {:?})",
2863 metadata
2864 ),
2865 Self::Encoder(_encoder) => write!(f, "Encoder(VorbisEncoder<WriteBridge>)"),
2866 Self::Finished => write!(f, "Finished"),
2867 }
2868 }
2869 }
2870
2871 impl OggVorbisEncoderParams {
2872 pub fn create_vorbis_builder<W>(&self, writer: W) -> Result<VorbisEncoderBuilder<W>, AudioWriteError>
2873 where
2874 W: Write {
2875 let sample_rate = NonZero::new(self.sample_rate).unwrap();
2876 let channels = NonZero::new(self.channels as u8).unwrap();
2877
2878 let mut builder = VorbisEncoderBuilder::new(sample_rate, channels, writer)?;
2879
2880 match self.mode {
2881 OggVorbisMode::HaveNoCodebookHeader => (),
2882 _ => {
2883 if let Some(serial) = self.stream_serial {
2884 builder.stream_serial(serial);
2885 }
2886 if let Some(bitrate) = self.bitrate {
2887 builder.bitrate_management_strategy(bitrate.into());
2888 }
2889 }
2890 }
2891
2892 builder.minimum_page_data_size(self.minimum_page_data_size);
2893 Ok(builder)
2894 }
2895
2896 pub fn get_bitrate(&self) -> u32 {
2897 self.bitrate.unwrap_or_default().get_bitrate(self.channels, self.sample_rate).unwrap()
2898 }
2899 }
2900
2901 pub struct OggVorbisEncoderWrap<'a> {
2903 writer: SharedAlterIO<'a>,
2906
2907 params: OggVorbisEncoderParams,
2909
2910 encoder: OggVorbisEncoderOrBuilder<'a>,
2912
2913 data_offset: u64,
2915
2916 bytes_written: u64,
2918
2919 frames_written: u64,
2921
2922 vorbis_header: Vec<u8>,
2924 }
2925
2926 impl Debug for OggVorbisEncoderWrap<'_> {
2927 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
2928 f.debug_struct("OggVorbisEncoderWrap")
2929 .field("writer", &self.writer)
2930 .field("params", &self.params)
2931 .field("encoder", &self.encoder)
2932 .field("data_offset", &self.data_offset)
2933 .field("bytes_written", &self.bytes_written)
2934 .field("frames_written", &self.frames_written)
2935 .field("vorbis_header", &format_args!("[u8, {}]", self.vorbis_header.len()))
2936 .finish()
2937 }
2938 }
2939
2940 impl<'a> OggVorbisEncoderWrap<'a> {
2941 pub fn new(
2942 writer: &'a mut dyn Writer,
2943 params: &OggVorbisEncoderParams,
2944 ) -> Result<Self, AudioWriteError> {
2945 let mut shared_writer = SharedAlterIO::default();
2946 shared_writer.push_stream(SharedIO::Writer(writer));
2947 shared_writer.push_stream(SharedIO::CursorU8(CursorVecU8::default()));
2948 let data_offset = shared_writer.stream_position()?;
2949
2950 let mut ret = Self {
2951 writer: shared_writer.clone(),
2952 params: *params,
2953 encoder: OggVorbisEncoderOrBuilder::Builder {
2954 builder: params.create_vorbis_builder(shared_writer.clone())?,
2955 metadata: BTreeMap::new(),
2956 },
2957 data_offset,
2958 bytes_written: 0,
2959 frames_written: 0,
2960 vorbis_header: Vec::new(),
2961 };
2962 if ret.params.bitrate.is_none() {
2963 ret.params.bitrate = Some(VorbisBitrateManagementStrategy::default().into());
2964 }
2965 if let OggVorbisEncoderOrBuilder::Builder{builder: _, ref mut metadata} = ret.encoder {
2966 metadata.insert("ENCODER".to_string(), "rustwav".to_string());
2967 }
2968 Ok(ret)
2969 }
2970
2971 pub fn get_channels(&self) -> u16 {
2973 self.params.channels
2974 }
2975
2976 pub fn get_sample_rate(&self) -> u32 {
2978 self.params.sample_rate
2979 }
2980
2981 pub fn insert_comment(
2983 &mut self,
2984 key: String,
2985 value: String,
2986 ) -> Result<(), AudioWriteError> {
2987 match self.encoder {
2988 OggVorbisEncoderOrBuilder::Builder{builder: _, ref mut metadata} => {
2989 metadata.insert(key, value);
2990 Ok(())
2991 },
2992 _ => Err(AudioWriteError::InvalidArguments("The encoder has already entered encoding mode, why are you just starting to add metadata to it?".to_string())),
2993 }
2994 }
2995
2996 pub fn begin_to_encode(&mut self) -> Result<(), AudioWriteError> {
2999 match self.encoder {
3000 OggVorbisEncoderOrBuilder::Builder {
3001 ref mut builder,
3002 ref metadata,
3003 } => {
3004 for (tag, value) in metadata.iter() {
3005 match builder.comment_tag(tag, value) {
3006 Ok(_) => (),
3007 Err(e) => {
3008 eprintln!("Set comment tag failed: {tag}: {value}: {:?}", e)
3009 }
3010 }
3011 }
3012 self.encoder = OggVorbisEncoderOrBuilder::Encoder(builder.build()?);
3013 Ok(())
3014 }
3015 OggVorbisEncoderOrBuilder::Encoder(_) => Ok(()),
3016 OggVorbisEncoderOrBuilder::Finished => Err(AudioWriteError::AlreadyFinished(
3017 "The OggVorbis encoder has been sealed. No more encoding accepted."
3018 .to_string(),
3019 )),
3020 }
3021 }
3022
3023 fn peel_ogg(&mut self) -> Result<(), AudioWriteError> {
3025 let mut cursor = 0usize;
3026 let mut packet_length = 0usize;
3027 let data = self.writer.get_stream_mut(1).as_cursor().get_ref().clone();
3028 while cursor < data.len() {
3029 match OggPacket::from_bytes(&data[cursor..], &mut packet_length) {
3030 Ok(oggpacket) => {
3031 self.writer.set_stream(0);
3032 self.writer.write_all(&oggpacket.get_inner_data())?;
3033 self.writer.set_stream(1);
3034 cursor += packet_length;
3035 }
3036 Err(ioerr) => {
3037 match ioerr.kind() {
3038 ErrorKind::UnexpectedEof => {
3039 let remains = data[cursor..].to_vec();
3040 let _data = self.writer.get_stream_mut(1).take_cursor_data();
3041 self.writer.write_all(&remains)?;
3042 break;
3043 }
3044 _ => return Err(ioerr.into()),
3045 }
3046 }
3047 }
3048 }
3049 Ok(())
3050 }
3051
3052 pub fn write_interleaved_samples(&mut self, samples: &[f32]) -> Result<(), AudioWriteError> {
3055 let channels = self.get_channels();
3056 match self.encoder {
3057 OggVorbisEncoderOrBuilder::Builder {
3058 builder: _,
3059 metadata: _,
3060 } => Err(AudioWriteError::InvalidArguments(
3061 "Must call `begin_to_encode()` before encoding.".to_string(),
3062 )),
3063 OggVorbisEncoderOrBuilder::Encoder(ref mut encoder) => {
3064 let frames = audioutils::interleaved_samples_to_monos(samples, channels)?;
3065 encoder.encode_audio_block(&frames)?;
3066 if self.params.mode == OggVorbisMode::NakedVorbis {
3067 self.peel_ogg()?;
3068 }
3069 self.bytes_written = self.writer.stream_position()? - self.data_offset;
3070 self.frames_written += frames[0].len() as u64;
3071 Ok(())
3072 }
3073 OggVorbisEncoderOrBuilder::Finished => Err(AudioWriteError::AlreadyFinished(
3074 "The OggVorbis encoder has been sealed. No more encoding accepted."
3075 .to_string(),
3076 )),
3077 }
3078 }
3079
3080 pub fn write_monos(&mut self, monos: &[Vec<f32>]) -> Result<(), AudioWriteError> {
3082 match self.encoder {
3083 OggVorbisEncoderOrBuilder::Builder {
3084 builder: _,
3085 metadata: _,
3086 } => Err(AudioWriteError::InvalidArguments(
3087 "Must call `begin_to_encode()` before encoding.".to_string(),
3088 )),
3089 OggVorbisEncoderOrBuilder::Encoder(ref mut encoder) => {
3090 encoder.encode_audio_block(monos)?;
3091 if self.params.mode == OggVorbisMode::NakedVorbis {
3092 self.peel_ogg()?;
3093 }
3094 self.bytes_written = self.writer.stream_position()? - self.data_offset;
3095 self.frames_written += monos.len() as u64;
3096 Ok(())
3097 }
3098 OggVorbisEncoderOrBuilder::Finished => Err(AudioWriteError::AlreadyFinished(
3099 "The OggVorbis encoder has been sealed. No more encoding accepted."
3100 .to_string(),
3101 )),
3102 }
3103 }
3104
3105 pub fn finish(&mut self) -> Result<(), AudioWriteError> {
3107 match self.encoder {
3108 OggVorbisEncoderOrBuilder::Builder {
3109 builder: _,
3110 metadata: _,
3111 } => Err(AudioWriteError::InvalidArguments(
3112 "Must call `begin_to_encode()` before encoding.".to_string(),
3113 )),
3114 OggVorbisEncoderOrBuilder::Encoder(ref mut _encoder) => {
3115 self.encoder = OggVorbisEncoderOrBuilder::Finished;
3116 Ok(())
3117 }
3118 OggVorbisEncoderOrBuilder::Finished => Ok(()),
3119 }
3120 }
3121 }
3122
3123 impl EncoderToImpl for OggVorbisEncoderWrap<'_> {
3124 fn get_channels(&self) -> u16 {
3125 self.params.channels
3126 }
3127
3128 fn get_max_channels(&self) -> u16 {
3129 255
3130 }
3131
3132 fn begin_encoding(&mut self) -> Result<(), AudioWriteError> {
3133 match self.params.mode {
3134 OggVorbisMode::OriginalStreamCompatible => self.begin_to_encode(),
3135 OggVorbisMode::HaveIndependentHeader => Ok(()),
3136 OggVorbisMode::HaveNoCodebookHeader => {
3137 let _header = self.writer.get_stream_mut(1).take_cursor_data();
3138 Ok(())
3139 }
3140 OggVorbisMode::NakedVorbis => Ok(())
3141 }
3142 }
3143
3144 fn get_bitrate(&self) -> u32 {
3145 if self.frames_written != 0 {
3146 (self.bytes_written * 8 * self.get_sample_rate() as u64 / self.frames_written)
3147 as u32
3148 } else {
3149 self.params.get_bitrate()
3150 }
3151 }
3152
3153 fn new_fmt_chunk(&mut self) -> Result<FmtChunk, AudioWriteError> {
3154 match self.params.mode {
3155 OggVorbisMode::OriginalStreamCompatible => (),
3156 OggVorbisMode::HaveIndependentHeader => {
3157 self.writer.set_stream(1);
3159 self.begin_to_encode()?;
3160 self.vorbis_header = self.writer.get_cur_stream_mut().take_cursor_data();
3161 self.writer.set_stream(0);
3162 }
3163 OggVorbisMode::HaveNoCodebookHeader => {
3164 self.writer.set_stream(1);
3165 self.begin_to_encode()?;
3166 let _header = self.writer.get_cur_stream_mut().take_cursor_data();
3168 self.writer.set_stream(0);
3169 }
3170 OggVorbisMode::NakedVorbis => {
3171 use revorbis::get_vorbis_headers_from_ogg_packet_bytes;
3173 self.writer.set_stream(1);
3174 self.begin_to_encode()?;
3175 let header = self.writer.get_cur_stream_mut().take_cursor_data();
3176 let mut _stream_id = 0u32;
3177 let (identification_header, comments_header, setup_header) = get_vorbis_headers_from_ogg_packet_bytes(&header, &mut _stream_id)?;
3178 self.vorbis_header.clear();
3179 self.vorbis_header.push(2); self.vorbis_header.push(identification_header.len() as u8);
3181 self.vorbis_header.push(comments_header.len() as u8);
3182 self.vorbis_header.extend(identification_header);
3183 self.vorbis_header.extend(comments_header);
3184 self.vorbis_header.extend(setup_header);
3185 }
3186 }
3187 Ok(FmtChunk {
3188 format_tag: match self.params.mode {
3189 OggVorbisMode::OriginalStreamCompatible => {
3190 if self.params.bitrate.unwrap().is_vbr() {
3191 FORMAT_TAG_OGG_VORBIS1
3192 } else {
3193 FORMAT_TAG_OGG_VORBIS1P
3194 }
3195 }
3196 OggVorbisMode::HaveIndependentHeader => {
3197 if self.params.bitrate.unwrap().is_vbr() {
3198 FORMAT_TAG_OGG_VORBIS2
3199 } else {
3200 FORMAT_TAG_OGG_VORBIS2P
3201 }
3202 }
3203 OggVorbisMode::HaveNoCodebookHeader => {
3204 if self.params.bitrate.unwrap().is_vbr() {
3205 FORMAT_TAG_OGG_VORBIS3
3206 } else {
3207 FORMAT_TAG_OGG_VORBIS3P
3208 }
3209 }
3210 OggVorbisMode::NakedVorbis => FORMAT_TAG_VORBIS,
3211 },
3212 channels: self.get_channels(),
3213 sample_rate: self.get_sample_rate(),
3214 byte_rate: self.params.get_bitrate() / 8,
3215 block_align: 4,
3216 bits_per_sample: 16,
3217 extension: Some(if self.vorbis_header.is_empty() {
3218 FmtExtension::new_oggvorbis(OggVorbisData::new())
3219 } else if self.params.mode != OggVorbisMode::NakedVorbis {
3220 FmtExtension::new_oggvorbis_with_header(OggVorbisWithHeaderData::new(&self.vorbis_header))
3221 } else {
3222 FmtExtension::new_vorbis(VorbisHeaderData::new(&self.vorbis_header))
3223 }),
3224 })
3225 }
3226
3227 fn update_fmt_chunk(&self, fmt: &mut FmtChunk) -> Result<(), AudioWriteError> {
3228 fmt.byte_rate = self.get_bitrate() / 8;
3229 Ok(())
3230 }
3231
3232 fn finish(&mut self) -> Result<(), AudioWriteError> {
3233 self.finish()?;
3234 Ok(())
3235 }
3236
3237 fn write_interleaved_samples__i8(&mut self, samples: &[i8 ]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
3238 fn write_interleaved_samples_i16(&mut self, samples: &[i16]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
3239 fn write_interleaved_samples_i24(&mut self, samples: &[i24]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
3240 fn write_interleaved_samples_i32(&mut self, samples: &[i32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
3241 fn write_interleaved_samples_i64(&mut self, samples: &[i64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
3242 fn write_interleaved_samples__u8(&mut self, samples: &[u8 ]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
3243 fn write_interleaved_samples_u16(&mut self, samples: &[u16]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
3244 fn write_interleaved_samples_u24(&mut self, samples: &[u24]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
3245 fn write_interleaved_samples_u32(&mut self, samples: &[u32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
3246 fn write_interleaved_samples_u64(&mut self, samples: &[u64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
3247 fn write_interleaved_samples_f32(&mut self, samples: &[f32]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
3248 fn write_interleaved_samples_f64(&mut self, samples: &[f64]) -> Result<(), AudioWriteError> {self.write_interleaved_samples(&sample_conv(samples))}
3249
3250 fn write_monos__i8(&mut self, monos_array: &[Vec<i8 >]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
3251 fn write_monos_i16(&mut self, monos_array: &[Vec<i16>]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
3252 fn write_monos_i24(&mut self, monos_array: &[Vec<i24>]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
3253 fn write_monos_i32(&mut self, monos_array: &[Vec<i32>]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
3254 fn write_monos_i64(&mut self, monos_array: &[Vec<i64>]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
3255 fn write_monos__u8(&mut self, monos_array: &[Vec<u8 >]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
3256 fn write_monos_u16(&mut self, monos_array: &[Vec<u16>]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
3257 fn write_monos_u24(&mut self, monos_array: &[Vec<u24>]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
3258 fn write_monos_u32(&mut self, monos_array: &[Vec<u32>]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
3259 fn write_monos_u64(&mut self, monos_array: &[Vec<u64>]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
3260 fn write_monos_f32(&mut self, monos_array: &[Vec<f32>]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
3261 fn write_monos_f64(&mut self, monos_array: &[Vec<f64>]) -> Result<(), AudioWriteError> {self.write_monos(&sample_conv_batch(monos_array))}
3262 }
3263
3264 impl From<vorbis_rs::VorbisError> for AudioWriteError {
3265 fn from(err: vorbis_rs::VorbisError) -> Self {
3266 use vorbis_rs::VorbisError::*;
3267 match err {
3268 LibraryError(liberr) => {
3269 let lib = liberr.library();
3270 let func = liberr.function();
3271 let kind = liberr.kind();
3272 let message =
3273 format!("OggVorbis library error: lib: {lib}, function: {func}, kind: {kind}");
3274 use vorbis_rs::VorbisLibraryErrorKind::*;
3275 match kind {
3276 False | Hole | InternalFault | NotVorbis | BadHeader | BadVorbisVersion
3277 | NotAudio | BadPacket | BadLink => Self::OtherReason(message),
3278 Eof => Self::IOError(IOErrorInfo::new(ErrorKind::UnexpectedEof, message)),
3279 Io => Self::IOError(IOErrorInfo::new(ErrorKind::Other, message)),
3280 NotImplemented => Self::Unimplemented(message),
3281 InvalidValue => Self::InvalidInput(message),
3282 NotSeekable => Self::IOError(IOErrorInfo::new(ErrorKind::NotSeekable, message)),
3283 Other { result_code: code } => Self::OtherReason(format!(
3284 "OggVorbis library error: lib: {lib}, function: {func}, kind: {kind}, code: {code}"
3285 )),
3286 o => Self::OtherReason(format!(
3287 "OggVorbis library error: lib: {lib}, function: {func}, kind: {kind}, error: {o}"
3288 )),
3289 }
3290 }
3291 InvalidAudioBlockChannelCount { expected, actual } => Self::WrongChannels(format!(
3292 "Channel error: expected: {expected}, actual: {actual}"
3293 )),
3294 InvalidAudioBlockSampleCount { expected, actual } => Self::InvalidData(format!(
3295 "Invalid audio block sample count: expected: {expected}, actual: {actual}"
3296 )),
3297 UnsupportedStreamChaining => {
3298 Self::Unsupported("Unsupported stream chaining".to_string())
3299 }
3300 InvalidCommentString(err_char) => {
3301 Self::InvalidInput(format!("Invalid comment string char {err_char}"))
3302 }
3303 RangeExceeded(try_error) => {
3304 Self::InvalidInput(format!("Invalid parameters range exceeded: {try_error}"))
3305 }
3306 Io(ioerr) => Self::IOError(IOErrorInfo::new(ioerr.kind(), format!("{:?}", ioerr))),
3307 Rng(rngerr) => Self::OtherReason(format!("Random number generator error: {rngerr}")),
3308 ConsumedEncoderBuilderSink => {
3309 Self::InvalidArguments("The `writer` was already consumed".to_string())
3310 }
3311 o => Self::OtherReason(format!("Unknown error: {o}")),
3312 }
3313 }
3314 }
3315
3316 }
3317
3318 #[cfg(any(feature = "vorbis", feature = "oggvorbis"))]
3319 pub use impl_vorbis::*;
3320}
3321
3322pub use oggvorbis_enc::{OggVorbisBitrateStrategy, OggVorbisEncoderParams, OggVorbisMode};