3#include "AudioConfig.h"
4#include "AudioLogger.h"
5#include "AudioTools/CoreAudio/AudioIO.h"
6#include "AudioTools/CoreAudio/AudioOutput.h"
7#include "AudioTools/CoreAudio/AudioStreams.h"
8#include "AudioTools/CoreAudio/AudioTypes.h"
9#include "AudioCodecsBase.h"
101 ptr_out = outputStream;
102 if (decoder_ptr !=
nullptr) {
105 if (encoder_ptr !=
nullptr) {
106 encoder_ptr->setOutput(*ptr_out);
112 encoder = CodecNOP::instance();
116 if (ptr_out !=
nullptr) {
117 encoder_ptr->setOutput(*ptr_out);
121 AudioEncoder *getEncoder() {
return encoder_ptr; }
123 void setDecoder(AudioDecoder *
decoder) {
125 decoder = CodecNOP::instance();
129 if (ptr_out !=
nullptr) {
134 AudioDecoder *getDecoder() {
return decoder_ptr; }
139 custom_log_level.set();
144 const CodecNOP *nop = CodecNOP::instance();
145 if (decoder_ptr != nop || encoder_ptr != nop) {
147 if (!decoder_ptr->begin(cfg)) active =
false;
148 if (!encoder_ptr->begin(cfg)) active =
false;
150 LOGW(
"no decoder or encoder defined");
154 custom_log_level.reset();
168 custom_log_level.set();
175 custom_log_level.reset();
180 virtual size_t write(
const uint8_t *data,
size_t len)
override {
186 custom_log_level.set();
188 LOGD(
"EncodedAudioOutput::write: %d", (
int)len);
190 if (writer_ptr ==
nullptr || data ==
nullptr) {
195 if (check_available_for_write && availableForWrite() == 0) {
199 size_t result = writer_ptr->write(data, len);
200 LOGD(
"EncodedAudioOutput::write: %d -> %d", (
int)len, (
int)result);
202 custom_log_level.reset();
207 int availableForWrite()
override {
208 if (!check_available_for_write)
return frame_size;
209 return min(ptr_out->availableForWrite(), frame_size);
213 operator bool() {
return active; }
223 void setLogLevel(AudioLogger::LogLevel level) { custom_log_level.set(level); }
236 Print *ptr_out =
nullptr;
238 bool check_available_for_write =
false;
240 CustomLogLevel custom_log_level;
242 int frame_size = DEFAULT_BUFFER_SIZE;
246using EncodedAudioPrint = EncodedAudioOutput;
261 setStream(*ioStream);
266 setStream(*ioStream);
271 setOutput(*outputStream);
276 setOutput(*outputStream);
281 setOutput(*outputStream);
292 AudioEncoder *getEncoder() {
return enc_out.getEncoder(); }
294 AudioDecoder *getDecoder() {
return enc_out.getDecoder(); }
302 void setStream(
Stream *stream) {
306 void setStream(AudioStream *stream) {
310 void setOutput(AudioOutput *stream) {
314 void setOutput(Print *stream) {
318 void setStream(AudioStream &stream) {
329 ReformatBaseStream::setOutput(stream);
334 ReformatBaseStream::setOutput(out);
343 bool begin(AudioInfo info) {
351 ReformatBaseStream::begin();
360 int availableForWrite() {
return enc_out.availableForWrite(); }
362 size_t write(
const uint8_t *data,
size_t len) {
364 return enc_out.
write(data, len);
367 size_t readBytes(uint8_t *data,
size_t len) {
368 return reader.readBytes(data, len);
377 void setByteFactor(
float factor) {byte_factor = factor;}
381 void setLogLevel(AudioLogger::LogLevel level) { enc_out.setLogLevel(level); }
389 float byte_factor = 2.0f;
402 void setWriter(
AudioWriter *writer) { p_writer = writer; }
403 size_t write(
const uint8_t *data,
size_t len) {
404 return p_writer->write(data, len);
420 virtual bool begin() = 0;
421 virtual void end() = 0;
422 virtual void setAudioInfo(
AudioInfo info) {
425 if (p_writer1 !=
nullptr) p_writer1->
setAudioInfo(info);
426 if (p_writer2 !=
nullptr) p_writer2->
setAudioInfo(info);
429 virtual size_t write(uint8_t *data,
size_t size) = 0;
445 print2.setWriter(p_writer2);
453 virtual bool begin() {
456 if (p_writer2 !=
nullptr) {
457 p_writer1->setOutput(print2);
458 p_writer2->setOutput(*p_print);
462 p_writer1->setOutput(*p_print);
470 if (p_writer1 !=
nullptr) p_writer1->end();
471 if (p_writer2 !=
nullptr) p_writer2->end();
475 virtual size_t write(uint8_t *data,
size_t size) {
477 return p_writer1->write(data, size);
481 Print *p_print =
nullptr;