6#include "opus/opus_multistream.h"
8#ifndef OPUS_ENC_MAX_BUFFER_SIZE
9#define OPUS_ENC_MAX_BUFFER_SIZE 2048
12#ifndef OPUS_DEC_MAX_BUFFER_SIZE
13#define OPUS_DEC_MAX_BUFFER_SIZE 4 * 1024
139 const char*
mime()
override {
return "audio/opus"; }
170 if (err != OPUS_OK ||
dec ==
nullptr) {
172 "opus_multistream_decoder_create: %s for sample_rate: %d, "
173 "channels:%d, streams:%d, coupled:%d",
184 if (
dec !=
nullptr) {
185 opus_multistream_decoder_destroy(
dec);
208 if (channels_changed || !
active) {
215 size_t write(
const uint8_t* data,
size_t len)
override {
217 LOGD(
"OpusMultiStreamAudioDecoder::write: %d", (
int)len);
218 int in_band_forward_error_correction = 0;
220 int out_samples = opus_multistream_decode(
221 dec, (uint8_t*)data, len, (opus_int16*)
outbuf.
data(), frame_count,
222 in_band_forward_error_correction);
223 if (out_samples < 0) {
224 LOGW(
"opus_multistream_decode: %s", opus_strerror(out_samples));
225 }
else if (out_samples > 0) {
226 int out_bytes = out_samples *
cfg.
channels *
sizeof(int16_t);
227 LOGD(
"opus_multistream_decode: %d", out_bytes);
228 int open = out_bytes;
234 processed += written;
240 operator bool()
override {
return active; }
246 OpusMSDecoder*
dec =
nullptr;
250 const uint32_t
valid_rates[5] = {8000, 12000, 16000, 24000, 48000};
255 if (valid == rate)
return true;
284 const char*
mime()
override {
return "audio/opus"; }
287 LOGD(
"OpusMultiStreamAudioEncoder::setAudioInfo: sample_rate: %d, channels: %d",
294 if (
enc !=
nullptr) {
301 LOGD(
"OpusMultiStreamAudioEncoder::begin: sample_rate: %d, channels: %d",
319 if (err != OPUS_OK ||
enc ==
nullptr) {
321 "opus_multistream_encoder_create: %s for sample_rate: %d, "
322 "channels:%d, streams:%d, coupled:%d",
346 if (
enc !=
nullptr) {
347 opus_multistream_encoder_destroy(
enc);
353 size_t write(
const uint8_t* data,
size_t len)
override {
355 LOGD(
"OpusMultiStreamAudioEncoder::write: %d", (
int)len);
356 for (
int j = 0; j < len; j++) {
367 if (
enc ==
nullptr)
return 0;
368 opus_int32 samples = 0;
369 if (opus_multistream_encoder_ctl(
enc, OPUS_GET_LOOKAHEAD(&samples)) !=
373 return samples > 0 ? samples : 0;
379 int bytesPerSample =
cfg.
channels * (int)
sizeof(int16_t);
380 if (bytesPerSample <= 0)
return 0;
388 OpusMSEncoder*
enc =
nullptr;
406 LOGD(
"opus_multistream_encode - frame_size: %d", frames);
407 int len = opus_multistream_encode(
enc, (opus_int16*)
frame.
data(), frames,
410 LOGE(
"opus_multistream_encode: %s", opus_strerror(len));
411 }
else if (len > 0) {
412 LOGD(
"opus_multistream_encode: %d", len);
415 LOGE(
"encodeFrame data lost: %d->%d", len, eff);
423 case OPUS_FRAMESIZE_2_5_MS:
424 return sampling_rate / 400;
425 case OPUS_FRAMESIZE_5_MS:
426 return sampling_rate / 200;
427 case OPUS_FRAMESIZE_10_MS:
428 return sampling_rate / 100;
429 case OPUS_FRAMESIZE_20_MS:
430 return sampling_rate / 50;
431 case OPUS_FRAMESIZE_40_MS:
432 return sampling_rate / 25;
433 case OPUS_FRAMESIZE_60_MS:
434 return 3 * sampling_rate / 50;
435 case OPUS_FRAMESIZE_80_MS:
436 return 4 * sampling_rate / 50;
437 case OPUS_FRAMESIZE_100_MS:
438 return 5 * sampling_rate / 50;
439 case OPUS_FRAMESIZE_120_MS:
440 return 6 * sampling_rate / 50;
442 return sampling_rate / 100;
448 opus_multistream_encoder_ctl(
enc, OPUS_SET_BITRATE(
cfg.
bitrate)) !=
454 opus_multistream_encoder_ctl(
460 opus_multistream_encoder_ctl(
enc, OPUS_SET_VBR(
cfg.
vbr)) != OPUS_OK) {
465 opus_multistream_encoder_ctl(
471 opus_multistream_encoder_ctl(
477 opus_multistream_encoder_ctl(
482 if (
cfg.
signal >= 0 && opus_multistream_encoder_ctl(
488 opus_multistream_encoder_ctl(
494 opus_multistream_encoder_ctl(
500 opus_multistream_encoder_ctl(
enc, OPUS_SET_LSB_DEPTH(
cfg.
lsb_depth)) !=
506 opus_multistream_encoder_ctl(
512 if (
cfg.
use_dtx >= 0 && opus_multistream_encoder_ctl(
518 opus_multistream_encoder_ctl(
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGD(...)
Definition AudioLoggerIDF.h:27
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#define OPUS_DEC_MAX_BUFFER_SIZE
Definition CodecOpus.h:12
#define OPUS_ENC_MAX_BUFFER_SIZE
Definition CodecOpus.h:8
#define assert(T)
Definition avr.h:10
virtual size_t write(const uint8_t *data, size_t len)
Definition Arduino.h:120