1use crate::{sys, mem, ErrorCode, Application, SampleRate, Bandwidth, Bitrate, Signal, InbandFec, FrameDuration};
2use super::Config;
3
4use mem::alloc::vec::Vec;
5
6pub struct Encoder {
9 inner: mem::Unique<sys::OpusMSEncoder>,
10 channels: u8,
11}
12
13impl Encoder {
14 pub fn new<const CH: usize>(config: Config<CH>, rate: SampleRate, app: Application) -> Result<Self, ErrorCode> {
33 let size = unsafe {
34 sys::opus_multistream_encoder_get_size(config.streams as _, config.coupled_streams as _)
35 };
36
37 if size == 0 {
38 return Err(ErrorCode::Internal);
39 }
40
41 let mut encoder = match mem::Unique::new(size as _) {
42 Some(inner) => Encoder {
43 inner,
44 channels: CH as _,
45 },
46 None => return Err(ErrorCode::AllocFail)
47 };
48
49 let result = unsafe {
50 sys::opus_multistream_encoder_init(encoder.inner.as_mut(), rate as _, CH as _, config.streams as _, config.coupled_streams as _, config.mapping.as_ptr() as _, app as _)
51 };
52
53 map_sys_error!(result => encoder)
54 }
55
56 #[inline]
57 pub fn reset(&mut self) -> Result<(), ErrorCode> {
59 let result = unsafe {
60 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_RESET_STATE)
61 };
62
63 map_sys_error!(result => ())
64 }
65
66 pub fn encode_to(&mut self, input: &[u16], output: &mut [mem::MaybeUninit<u8>]) -> Result<usize, ErrorCode> {
74 let result = unsafe {
75 sys::opus_multistream_encode(self.inner.as_mut(),
76 input.as_ptr() as _, (input.len() / (self.channels as usize)) as _,
77 output.as_mut_ptr() as _, output.len() as _)
78 };
79
80 map_sys_error!(result => result as _)
81 }
82
83 #[inline(always)]
84 pub fn encode_to_slice(&mut self, input: &[u16], output: &mut [u8]) -> Result<usize, ErrorCode> {
88 self.encode_to(input, unsafe { mem::transmute(output) })
89 }
90
91 #[inline(always)]
92 pub fn encode_to_vec(&mut self, input: &[u16], output: &mut Vec<u8>) -> Result<usize, ErrorCode> {
100 let initial_len = output.len();
101 let result = self.encode_to(input, output.spare_capacity_mut())?;
102 unsafe {
103 output.set_len(initial_len + result);
104 }
105 Ok(result)
106 }
107
108 pub fn encode_float_to(&mut self, input: &[f32], output: &mut [mem::MaybeUninit<u8>]) -> Result<usize, ErrorCode> {
123 let result = unsafe {
124 sys::opus_multistream_encode_float(self.inner.as_mut(),
125 input.as_ptr(), (input.len() / (self.channels as usize)) as _,
126 output.as_mut_ptr() as _, output.len() as _)
127 };
128
129 map_sys_error!(result => result as _)
130 }
131
132 #[inline(always)]
133 pub fn encode_float_to_slice(&mut self, input: &[f32], output: &mut [u8]) -> Result<usize, ErrorCode> {
137 self.encode_float_to(input, unsafe { mem::transmute(output) })
138 }
139
140 #[inline(always)]
141 pub fn encode_float_to_vec(&mut self, input: &[f32], output: &mut Vec<u8>) -> Result<usize, ErrorCode> {
149 let initial_len = output.len();
150 let result = self.encode_float_to(input, output.spare_capacity_mut())?;
151 unsafe {
152 output.set_len(initial_len + result);
153 }
154 Ok(result)
155 }
156
157 #[inline]
158 pub fn get_look_ahead(&mut self) -> Result<u32, ErrorCode> {
162 let mut value: i32 = 0;
163 let result = unsafe {
164 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_LOOKAHEAD_REQUEST, &mut value)
165 };
166
167 map_sys_error!(result => match value.is_negative() {
168 false => value as _,
169 true => return Err(ErrorCode::unknown())
170 })
171 }
172
173 #[inline]
174 pub fn get_bitrate(&mut self) -> Result<Bitrate, ErrorCode> {
176 let mut value: i32 = 0;
177 let result = unsafe {
178 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_BITRATE_REQUEST, &mut value)
179 };
180
181 map_sys_error!(result => value.into())
182 }
183
184 #[inline]
185 pub fn set_bitrate(&mut self, value: Bitrate) -> Result<(), ErrorCode> {
187 let value: i32 = value.into();
188 let result = unsafe {
189 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_BITRATE_REQUEST, value)
190 };
191
192 map_sys_error!(result => ())
193 }
194
195 #[inline]
196 pub fn get_vbr(&mut self) -> Result<bool, ErrorCode> {
198 let mut value: i32 = 0;
199 let result = unsafe {
200 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_VBR_REQUEST, &mut value)
201 };
202
203 map_sys_error!(result => value == 1)
204 }
205
206 #[inline]
207 pub fn set_vbr(&mut self, value: bool) -> Result<(), ErrorCode> {
211 let value: i32 = match value {
212 true => 1,
213 false => 0
214 };
215 let result = unsafe {
216 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_VBR_REQUEST, value)
217 };
218
219 map_sys_error!(result => ())
220 }
221
222 #[inline]
223 pub fn get_vbr_constraint(&mut self) -> Result<bool, ErrorCode> {
225 let mut value: i32 = 0;
226 let result = unsafe {
227 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_VBR_CONSTRAINT_REQUEST, &mut value)
228 };
229
230 map_sys_error!(result => value == 1)
231 }
232
233 #[inline]
234 pub fn set_vbr_constraint(&mut self, value: bool) -> Result<(), ErrorCode> {
244 let value: i32 = match value {
245 true => 1,
246 false => 0
247 };
248 let result = unsafe {
249 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_VBR_CONSTRAINT_REQUEST, value)
250 };
251
252 map_sys_error!(result => ())
253 }
254
255 #[inline]
256 pub fn get_complexity(&mut self) -> Result<u8, ErrorCode> {
258 let mut value: i32 = 0;
259 let result = unsafe {
260 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_COMPLEXITY_REQUEST, &mut value)
261 };
262
263 map_sys_error!(result => value as _)
264 }
265
266 #[inline]
267 pub fn set_complexity(&mut self, value: u8) -> Result<(), ErrorCode> {
271 let result = unsafe {
272 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_COMPLEXITY_REQUEST, value as i32)
273 };
274
275 map_sys_error!(result => ())
276 }
277
278 #[inline]
279 pub fn get_signal(&mut self) -> Result<Signal, ErrorCode> {
281 let mut value: i32 = 0;
282 let result = unsafe {
283 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_SIGNAL_REQUEST, &mut value)
284 };
285
286 map_sys_error!(result => value.into())
287 }
288
289 #[inline]
290 pub fn set_signal(&mut self, value: Signal) -> Result<(), ErrorCode> {
294 let result = unsafe {
295 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_SIGNAL_REQUEST, value as i32)
296 };
297
298 map_sys_error!(result => ())
299 }
300
301 #[inline]
302 pub fn get_application(&mut self) -> Result<Application, ErrorCode> {
304 let mut value: i32 = 0;
305 let result = unsafe {
306 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_APPLICATION_REQUEST, &mut value)
307 };
308
309 map_sys_error!(result => match Application::from_sys(value) {
310 Some(value) => value,
311 None => return Err(ErrorCode::unknown())
312 })
313 }
314
315 #[inline]
316 pub fn set_application(&mut self, value: Application) -> Result<(), ErrorCode> {
320 let result = unsafe {
321 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_APPLICATION_REQUEST, value as i32)
322 };
323
324 map_sys_error!(result => ())
325 }
326
327 #[inline]
328 pub fn get_bandwidth(&mut self) -> Result<Bandwidth, ErrorCode> {
330 let mut value: i32 = 0;
331 let result = unsafe {
332 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_BANDWIDTH_REQUEST, &mut value)
333 };
334
335 map_sys_error!(result => value.into())
336 }
337
338 #[inline]
339 pub fn set_bandwidth(&mut self, value: Bandwidth) -> Result<(), ErrorCode> {
346 let result = unsafe {
347 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_BANDWIDTH_REQUEST, value as i32)
348 };
349
350 map_sys_error!(result => ())
351 }
352
353 #[inline]
354 pub fn set_max_bandwidth(&mut self, value: Bandwidth) -> Result<(), ErrorCode> {
361 let result = unsafe {
362 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_MAX_BANDWIDTH_REQUEST, value as i32)
363 };
364
365 map_sys_error!(result => ())
366 }
367
368 #[inline]
369 pub fn get_inband_fec(&mut self) -> Result<InbandFec, ErrorCode> {
371 let mut value: i32 = 0;
372 let result = unsafe {
373 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_INBAND_FEC_REQUEST, &mut value)
374 };
375
376 map_sys_error!(result => match value {
377 0 => InbandFec::Off,
378 1 => InbandFec::Mode1,
379 2 => InbandFec::Mode2,
380 _ => return Err(ErrorCode::unknown()),
381 })
382 }
383
384 #[inline]
385 pub fn set_inband_fec(&mut self, value: InbandFec) -> Result<(), ErrorCode> {
391 let result = unsafe {
392 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_INBAND_FEC_REQUEST, value as i32)
393 };
394
395 map_sys_error!(result => ())
396 }
397
398 #[inline]
399 pub fn get_packet_loss(&mut self) -> Result<u8, ErrorCode> {
401 let mut value: i32 = 0;
402 let result = unsafe {
403 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_PACKET_LOSS_PERC_REQUEST, &mut value)
404 };
405
406 map_sys_error!(result => value as _)
407 }
408
409 #[inline]
410 pub fn set_packet_loss(&mut self, value: u8) -> Result<(), ErrorCode> {
416 let result = unsafe {
417 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_PACKET_LOSS_PERC_REQUEST, value as i32)
418 };
419
420 map_sys_error!(result => ())
421 }
422
423 #[inline]
424 pub fn get_prediction_disabled(&mut self) -> Result<bool, ErrorCode> {
426 let mut value: i32 = 0;
427 let result = unsafe {
428 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_PREDICTION_DISABLED_REQUEST, &mut value)
429 };
430
431 map_sys_error!(result => value == 1)
432 }
433
434 #[inline]
435 pub fn set_prediction_disabled(&mut self, value: bool) -> Result<(), ErrorCode> {
439 let value: i32 = match value {
440 true => 1,
441 false => 0,
442 };
443
444 let result = unsafe {
445 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_PREDICTION_DISABLED_REQUEST, value)
446 };
447
448 map_sys_error!(result => ())
449 }
450
451 #[inline]
452 pub fn get_lsb_depth(&mut self) -> Result<u8, ErrorCode> {
454 let mut value: i32 = 0;
455 let result = unsafe {
456 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_LSB_DEPTH_REQUEST, &mut value)
457 };
458
459 map_sys_error!(result => value as _)
460 }
461
462 #[inline]
463 pub fn set_lsb_depth(&mut self, value: u8) -> Result<(), ErrorCode> {
475 let result = unsafe {
476 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_LSB_DEPTH_REQUEST, value as i32)
477 };
478
479 map_sys_error!(result => ())
480 }
481
482 #[inline]
483 pub fn get_frame_duration(&mut self) -> Result<FrameDuration, ErrorCode> {
485 let mut value: i32 = 0;
486 let result = unsafe {
487 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_EXPERT_FRAME_DURATION_REQUEST, &mut value)
488 };
489
490 map_sys_error!(result => match value {
491 sys::OPUS_FRAMESIZE_ARG => FrameDuration::SizeArg,
492 sys::OPUS_FRAMESIZE_2_5_MS => FrameDuration::Size2_5,
493 sys::OPUS_FRAMESIZE_5_MS => FrameDuration::Size5,
494 sys::OPUS_FRAMESIZE_10_MS => FrameDuration::Size10,
495 sys::OPUS_FRAMESIZE_20_MS => FrameDuration::Size20,
496 sys::OPUS_FRAMESIZE_40_MS => FrameDuration::Size40,
497 sys::OPUS_FRAMESIZE_60_MS => FrameDuration::Size60,
498 sys::OPUS_FRAMESIZE_80_MS => FrameDuration::Size80,
499 sys::OPUS_FRAMESIZE_100_MS => FrameDuration::Size100,
500 sys::OPUS_FRAMESIZE_120_MS => FrameDuration::Size120,
501 _ => return Err(ErrorCode::unknown()),
502 })
503 }
504
505 #[inline]
506 pub fn set_frame_duration(&mut self, value: FrameDuration) -> Result<(), ErrorCode> {
514 let result = unsafe {
515 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_EXPERT_FRAME_DURATION_REQUEST, value as i32)
516 };
517
518 map_sys_error!(result => ())
519 }
520
521 #[inline]
522 pub fn get_sample_rate(&mut self) -> Result<SampleRate, ErrorCode> {
524 let mut value: i32 = 0;
525 let result = unsafe {
526 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_SAMPLE_RATE_REQUEST, &mut value)
527 };
528
529 map_sys_error!(result => match value {
530 8000 => SampleRate::Hz8000,
531 12000 => SampleRate::Hz12000,
532 16000 => SampleRate::Hz16000,
533 24000 => SampleRate::Hz24000,
534 48000 => SampleRate::Hz48000,
535 _ => return Err(ErrorCode::unknown())
536 })
537 }
538
539 #[inline]
540 pub fn get_dtx(&mut self) -> Result<bool, ErrorCode> {
542 let mut value: i32 = 0;
543 let result = unsafe {
544 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_DTX_REQUEST, &mut value)
545 };
546
547 map_sys_error!(result => value == 1)
548 }
549
550 #[inline]
551 pub fn set_dtx(&mut self, value: bool) -> Result<(), ErrorCode> {
555 let value: i32 = match value {
556 true => 1,
557 false => 0,
558 };
559
560 let result = unsafe {
561 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_DTX_REQUEST, value)
562 };
563
564 map_sys_error!(result => ())
565 }
566
567 #[inline]
568 pub fn get_phase_inversion_disabled(&mut self) -> Result<bool, ErrorCode> {
570 let mut value: i32 = 0;
571 let result = unsafe {
572 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST, &mut value)
573 };
574
575 map_sys_error!(result => value == 1)
576 }
577
578 #[inline]
579 pub fn set_phase_inversion_disabled(&mut self, value: bool) -> Result<(), ErrorCode> {
584 let value: i32 = match value {
585 true => 1,
586 false => 0,
587 };
588
589 let result = unsafe {
590 sys::opus_multistream_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST, value)
591 };
592
593 map_sys_error!(result => ())
594 }
595}
596
597unsafe impl Send for Encoder {}