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) {
128 void setEncoder(AudioEncoder *
encoder) {
134 if (ptr_out !=
nullptr) {
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;
277 setStream(*ioStream);
282 setStream(*ioStream);
287 setOutput(*outputStream);
292 setOutput(*outputStream);
297 setOutput(*outputStream);
310 AudioEncoder *getEncoder() {
return enc_out.getEncoder(); }
312 AudioDecoder *getDecoder() {
return enc_out.getDecoder(); }
320 void setStream(
Stream *stream) { setStream(*stream); }
322 void setStream(AudioStream *stream) { setStream(*stream); }
324 void setOutput(AudioOutput *stream) { setOutput(*stream); }
326 void setOutput(Print *stream) { setOutput(*stream); }
328 void setStream(AudioStream &stream)
override {
339 ReformatBaseStream::setOutput(stream);
344 ReformatBaseStream::setOutput(out);
353 bool begin(AudioInfo info) {
358 bool begin()
override {
361 ReformatBaseStream::begin();
366 void end()
override {
371 int availableForWrite()
override {
return enc_out.availableForWrite(); }
373 size_t write(
const uint8_t *data,
size_t len)
override {
375 return enc_out.
write(data, len);
378 size_t readBytes(uint8_t *data,
size_t len)
override {
379 return reader.readBytes(data, len);
388 void setByteFactor(
float factor) { byte_factor = factor; }
394 enc_out = src.enc_out;
395 byte_factor = src.byte_factor;
396 p_stream = src.p_stream;
397 p_print = src.p_print;
413 float byte_factor = 2.0f;
425 void setWriter(
AudioWriter *writer) { p_writer = writer; }
426 size_t write(
const uint8_t *data,
size_t len) {
427 return p_writer->write(data, len);
443 virtual bool begin() = 0;
444 virtual void end() = 0;
445 virtual void setAudioInfo(
AudioInfo info) {
448 if (p_writer1 !=
nullptr) p_writer1->
setAudioInfo(info);
449 if (p_writer2 !=
nullptr) p_writer2->
setAudioInfo(info);
452 virtual size_t write(uint8_t *data,
size_t size) = 0;
468 print2.setWriter(p_writer2);
476 virtual bool begin() {
479 if (p_writer2 !=
nullptr) {
480 p_writer1->setOutput(print2);
481 p_writer2->setOutput(*p_print);
485 p_writer1->setOutput(*p_print);
493 if (p_writer1 !=
nullptr) p_writer1->end();
494 if (p_writer2 !=
nullptr) p_writer2->end();
498 virtual size_t write(uint8_t *data,
size_t size) {
500 return p_writer1->write(data, size);
504 Print *p_print =
nullptr;