3#include "AudioCodecsBase.h"
4#include "AudioToolsConfig.h"
5#include "AudioTools/CoreAudio/AudioLogger.h"
6#include "AudioTools/CoreAudio/AudioIO.h"
7#include "AudioTools/CoreAudio/AudioOutput.h"
8#include "AudioTools/CoreAudio/AudioStreams.h"
9#include "AudioTools/CoreAudio/AudioTypes.h"
86 if (this->cfg != newInfo && newInfo) {
96 if (decoder_ptr != undefined && *decoder_ptr){
98 if (info)
return info;
105 ptr_out = outputStream;
106 if (decoder_ptr != undefined) {
109 if (encoder_ptr != undefined) {
110 encoder_ptr->setOutput(*ptr_out);
128 void setEncoder(AudioEncoder *
encoder) {
134 if (ptr_out !=
nullptr) {
135 encoder_ptr->setOutput(*ptr_out);
139 AudioEncoder *getEncoder() {
return encoder_ptr; }
141 void setDecoder(AudioDecoder *
decoder) {
147 if (ptr_out !=
nullptr) {
152 AudioDecoder *getDecoder() {
return decoder_ptr; }
160 if (to_notify !=
nullptr) {
165 if (decoder_ptr != undefined || encoder_ptr != undefined) {
167 if (!decoder_ptr->begin(cfg)) active =
false;
168 if (!encoder_ptr->begin(cfg)) active =
false;
170 LOGW(
"no decoder or encoder defined");
193 virtual size_t write(
const uint8_t *data,
size_t len)
override {
198 LOGD(
"EncodedAudioOutput::write: %d", (
int)len);
200 if (writer_ptr ==
nullptr || data ==
nullptr) {
205 if (check_available_for_write && availableForWrite() == 0) {
209 size_t result = writer_ptr->write(data, len);
210 LOGD(
"EncodedAudioOutput::write: %d -> %d", (
int)len, (
int)result);
214 int availableForWrite()
override {
215 if (!check_available_for_write)
return frame_size;
216 return min(ptr_out->availableForWrite(), frame_size);
220 operator bool()
override {
return active; }
235 decoder_ptr = src.decoder_ptr;
236 encoder_ptr = src.encoder_ptr;
237 ptr_out = src.ptr_out;
239 check_available_for_write = src.check_available_for_write;
240 frame_size = src.frame_size;
242 is_active = src.is_active;
249 CodecNOP* undefined = CodecNOP::instance();
250 AudioDecoder *decoder_ptr = undefined;
251 AudioEncoder *encoder_ptr = undefined;
252 AudioWriter *writer_ptr =
nullptr;
253 Print *ptr_out =
nullptr;
254 AudioInfoSupport *to_notify =
nullptr;
256 bool check_available_for_write =
false;
257 int frame_size = DEFAULT_BUFFER_SIZE;
261using EncodedAudioPrint = EncodedAudioOutput;
276 setStream(*ioStream);
281 setStream(*ioStream);
286 setOutput(*outputStream);
291 setOutput(*outputStream);
296 setOutput(*outputStream);
309 AudioEncoder *getEncoder() {
return enc_out.getEncoder(); }
311 AudioDecoder *getDecoder() {
return enc_out.getDecoder(); }
319 void setStream(
Stream *stream) { setStream(*stream); }
321 void setStream(AudioStream *stream) { setStream(*stream); }
323 void setOutput(AudioOutput *stream) { setOutput(*stream); }
325 void setOutput(Print *stream) { setOutput(*stream); }
327 void setStream(AudioStream &stream)
override {
338 ReformatBaseStream::setOutput(stream);
343 ReformatBaseStream::setOutput(out);
352 bool begin(AudioInfo info) {
357 bool begin()
override {
360 ReformatBaseStream::begin();
365 void end()
override {
370 int availableForWrite()
override {
return enc_out.availableForWrite(); }
372 size_t write(
const uint8_t *data,
size_t len)
override {
374 return enc_out.
write(data, len);
377 size_t readBytes(uint8_t *data,
size_t len)
override {
378 return reader.readBytes(data, len);
387 void setByteFactor(
float factor) { byte_factor = factor; }
393 enc_out = src.enc_out;
394 byte_factor = src.byte_factor;
395 p_stream = src.p_stream;
396 p_print = src.p_print;
412 float byte_factor = 2.0f;
424 void setWriter(
AudioWriter *writer) { p_writer = writer; }
425 size_t write(
const uint8_t *data,
size_t len) {
426 return p_writer->write(data, len);
442 virtual bool begin() = 0;
443 virtual void end() = 0;
444 virtual void setAudioInfo(
AudioInfo info) {
447 if (p_writer1 !=
nullptr) p_writer1->
setAudioInfo(info);
448 if (p_writer2 !=
nullptr) p_writer2->
setAudioInfo(info);
451 virtual size_t write(uint8_t *data,
size_t size) = 0;
467 print2.setWriter(p_writer2);
475 virtual bool begin() {
478 if (p_writer2 !=
nullptr) {
479 p_writer1->setOutput(print2);
480 p_writer2->setOutput(*p_print);
484 p_writer1->setOutput(*p_print);
492 if (p_writer1 !=
nullptr) p_writer1->end();
493 if (p_writer2 !=
nullptr) p_writer2->end();
497 virtual size_t write(uint8_t *data,
size_t size) {
499 return p_writer1->write(data, size);
503 Print *p_print =
nullptr;