1use crate::{sys, mem, Decoder, ErrorCode, SampleRate, Bandwidth};
30
31use core::num;
32
33pub const DRED_PACKET_SIZE: usize = 10592;
35
36pub fn dred_packet_size() -> usize {
38 unsafe {
39 sys::opus_dred_get_size() as _
40 }
41}
42
43#[repr(transparent)]
44pub struct DredPacket {
46 inner: mem::Unique<sys::OpusDRED>
47}
48
49impl DredPacket {
50 pub fn new() -> Result<Self, ErrorCode> {
52 match mem::Unique::new(DRED_PACKET_SIZE) {
53 Some(inner) => Ok(DredPacket {
54 inner,
55 }),
56 None => Err(ErrorCode::AllocFail),
57 }
58 }
59}
60
61unsafe impl Send for DredPacket {}
62
63pub struct Dred {
65 inner: mem::Unique<sys::OpusDREDDecoder>,
66 decoder: Decoder,
67 packet: DredPacket,
68}
69
70impl Dred {
71 pub fn new(decoder: Decoder) -> Result<Self, ErrorCode> {
73 let size = unsafe {
74 sys::opus_dred_decoder_get_size()
75 };
76
77 if size == 0 {
78 return Err(ErrorCode::Internal);
79 }
80
81 let packet = DredPacket::new()?;
82 let mut decoder = match mem::Unique::new(size as _) {
83 Some(inner) => Dred {
84 inner,
85 decoder,
86 packet,
87 },
88 None => return Err(ErrorCode::AllocFail)
89 };
90
91 let result = unsafe {
92 sys::opus_dred_decoder_init(decoder.inner.as_mut())
93 };
94
95 map_sys_error!(result => decoder)
96 }
97
98 pub fn decoder(&mut self) -> &Decoder {
100 &self.decoder
101 }
102
103 pub fn decoder_mut(&mut self) -> &mut Decoder {
105 &mut self.decoder
106 }
107
108 pub fn decode_to(&mut self, input: &[u8], output: &mut [mem::MaybeUninit<i16>]) -> Result<usize, ErrorCode> {
116 const MAX_SAMPLE_RATE: i32 = SampleRate::Hz48000 as _;
117
118 let mut _dred_end = 0;
119 let input_ptr = input.as_ptr();
120 let input_len = input.len() as _;
121
122 let frame_size = (output.len() / self.decoder.channels() as usize) as _;
123
124 let result = unsafe {
125 sys::opus_dred_parse(self.inner.as_mut(), self.packet.inner.as_mut(),
126 input_ptr, input_len,
127 MAX_SAMPLE_RATE, MAX_SAMPLE_RATE,
128 &mut _dred_end, 0)
129 };
130
131 if result < 0 {
132 return Err(result.into());
133 }
134
135 let result = unsafe {
136 sys::opus_decoder_dred_decode(
137 self.decoder.inner.as_mut(), self.packet.inner.as_ptr(),
138 frame_size, output.as_ptr() as _, frame_size
139 )
140 };
141
142 map_sys_error!(result => result as _)
143 }
144
145 #[inline(always)]
146 pub fn decode_to_slice(&mut self, input: &[u8], output: &mut [u16]) -> Result<usize, ErrorCode> {
150 self.decode_to(input, unsafe { mem::transmute(output) })
151 }
152
153 pub fn decode_float_to(&mut self, input: &[u8], output: &mut [mem::MaybeUninit<f32>]) -> Result<usize, ErrorCode> {
161 const MAX_SAMPLE_RATE: i32 = SampleRate::Hz48000 as _;
162
163 let mut _dred_end = 0;
164 let input_ptr = input.as_ptr();
165 let input_len = input.len() as _;
166
167 let frame_size = (output.len() / self.decoder.channels() as usize) as _;
168
169 let result = unsafe {
170 sys::opus_dred_parse(self.inner.as_mut(), self.packet.inner.as_mut(),
171 input_ptr, input_len,
172 MAX_SAMPLE_RATE, MAX_SAMPLE_RATE,
173 &mut _dred_end, 0)
174 };
175
176 if result < 0 {
177 return Err(result.into());
178 }
179
180 let result = unsafe {
181 sys::opus_decoder_dred_decode_float(
182 self.decoder.inner.as_mut(), self.packet.inner.as_ptr(),
183 frame_size, output.as_ptr() as _, frame_size
184 )
185 };
186
187 map_sys_error!(result => result as _)
188 }
189
190 #[inline(always)]
191 pub fn decode_float_to_slice(&mut self, input: &[u8], output: &mut [f32]) -> Result<usize, ErrorCode> {
195 self.decode_float_to(input, unsafe { mem::transmute(output) })
196 }
197
198 #[inline]
199 pub fn reset(&mut self) -> Result<(), ErrorCode> {
201 self.decoder.reset()?;
202 let result = unsafe {
203 sys::opus_dred_decoder_ctl(self.inner.as_mut(), sys::OPUS_RESET_STATE)
204 };
205
206 map_sys_error!(result => ())
207 }
208
209 #[inline]
210 pub fn get_pitch(&mut self) -> Result<Option<num::NonZeroU32>, ErrorCode> {
216 let mut value: i32 = 0;
217 let result = unsafe {
218 sys::opus_dred_decoder_ctl(self.inner.as_mut(), sys::OPUS_GET_PITCH_REQUEST, &mut value)
219 };
220
221 map_sys_error!(result => num::NonZeroU32::new(result as _))
222 }
223
224 #[inline]
225 pub fn get_last_packet_duration(&mut self) -> Result<u32, ErrorCode> {
227 let mut value: i32 = 0;
228 let result = unsafe {
229 sys::opus_dred_decoder_ctl(self.inner.as_mut(), sys::OPUS_GET_LAST_PACKET_DURATION_REQUEST, &mut value)
230 };
231
232 map_sys_error!(result => value as _)
233 }
234
235 #[inline]
236 pub fn get_gain(&mut self) -> Result<i32, ErrorCode> {
238 let mut value: i32 = 0;
239 let result = unsafe {
240 sys::opus_dred_decoder_ctl(self.inner.as_mut(), sys::OPUS_GET_GAIN_REQUEST, &mut value)
241 };
242
243 map_sys_error!(result => value)
244 }
245
246 #[inline]
247 pub fn set_gain(&mut self, value: i32) -> Result<(), ErrorCode> {
260 let result = unsafe {
261 sys::opus_dred_decoder_ctl(self.inner.as_mut(), sys::OPUS_SET_GAIN_REQUEST, value)
262 };
263
264 map_sys_error!(result => ())
265 }
266
267 #[inline]
268 pub fn get_bandwidth(&mut self) -> Result<Bandwidth, ErrorCode> {
270 let mut value: i32 = 0;
271 let result = unsafe {
272 sys::opus_dred_decoder_ctl(self.inner.as_mut(), sys::OPUS_GET_BANDWIDTH_REQUEST, &mut value)
273 };
274
275 map_sys_error!(result => value.into())
276 }
277
278 #[inline]
279 pub fn get_sample_rate(&mut self) -> Result<SampleRate, ErrorCode> {
281 let mut value: i32 = 0;
282 let result = unsafe {
283 sys::opus_dred_decoder_ctl(self.inner.as_mut(), sys::OPUS_GET_SAMPLE_RATE_REQUEST, &mut value)
284 };
285
286 map_sys_error!(result => match value {
287 8000 => SampleRate::Hz8000,
288 12000 => SampleRate::Hz12000,
289 16000 => SampleRate::Hz16000,
290 24000 => SampleRate::Hz24000,
291 48000 => SampleRate::Hz48000,
292 _ => return Err(ErrorCode::unknown())
293 })
294 }
295
296 #[inline]
297 pub fn get_phase_inversion_disabled(&mut self) -> Result<bool, ErrorCode> {
299 let mut value: i32 = 0;
300 let result = unsafe {
301 sys::opus_dred_decoder_ctl(self.inner.as_mut(), sys::OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST, &mut value)
302 };
303
304 map_sys_error!(result => value == 1)
305 }
306
307 #[inline]
308 pub fn set_phase_inversion_disabled(&mut self, value: bool) -> Result<(), ErrorCode> {
317 let value: i32 = match value {
318 true => 1,
319 false => 0,
320 };
321
322 let result = unsafe {
323 sys::opus_dred_decoder_ctl(self.inner.as_mut(), sys::OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST, value)
324 };
325
326 map_sys_error!(result => ())
327 }
328}
329
330unsafe impl Send for Dred {}