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"
89 if (this->cfg != newInfo && newInfo.
channels != 0 &&
99 ptr_out = outputStream;
100 if (decoder_ptr !=
nullptr) {
103 if (encoder_ptr !=
nullptr) {
104 encoder_ptr->setOutput(*ptr_out);
122 void setEncoder(AudioEncoder *
encoder) {
124 encoder = CodecNOP::instance();
128 if (ptr_out !=
nullptr) {
129 encoder_ptr->setOutput(*ptr_out);
133 AudioEncoder *getEncoder() {
return encoder_ptr; }
135 void setDecoder(AudioDecoder *
decoder) {
137 decoder = CodecNOP::instance();
141 if (ptr_out !=
nullptr) {
146 AudioDecoder *getDecoder() {
return decoder_ptr; }
154 if (to_notify !=
nullptr) {
158 if (decoder_ptr != undefined || encoder_ptr != undefined) {
160 if (!decoder_ptr->begin(cfg)) active =
false;
161 if (!encoder_ptr->begin(cfg)) active =
false;
163 LOGW(
"no decoder or encoder defined");
186 virtual size_t write(
const uint8_t *data,
size_t len)
override {
191 LOGD(
"EncodedAudioOutput::write: %d", (
int)len);
193 if (writer_ptr ==
nullptr || data ==
nullptr) {
198 if (check_available_for_write && availableForWrite() == 0) {
202 size_t result = writer_ptr->write(data, len);
203 LOGD(
"EncodedAudioOutput::write: %d -> %d", (
int)len, (
int)result);
207 int availableForWrite()
override {
208 if (!check_available_for_write)
return frame_size;
209 return min(ptr_out->availableForWrite(), frame_size);
213 operator bool()
override {
return active; }
228 decoder_ptr = src.decoder_ptr;
229 encoder_ptr = src.encoder_ptr;
230 ptr_out = src.ptr_out;
232 check_available_for_write = src.check_available_for_write;
233 frame_size = src.frame_size;
235 is_active = src.is_active;
241 if (decoder_ptr != undefined){
249 CodecNOP* undefined = CodecNOP::instance();
253 Print *ptr_out =
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();
364 void end()
override {
369 int availableForWrite()
override {
return enc_out.availableForWrite(); }
371 size_t write(
const uint8_t *data,
size_t len)
override {
373 return enc_out.
write(data, len);
376 size_t readBytes(uint8_t *data,
size_t len)
override {
377 return reader.readBytes(data, len);
386 void setByteFactor(
float factor) { byte_factor = factor; }
392 enc_out = src.enc_out;
393 byte_factor = src.byte_factor;
394 p_stream = src.p_stream;
395 p_print = src.p_print;
404 float byte_factor = 2.0f;
416 void setWriter(
AudioWriter *writer) { p_writer = writer; }
417 size_t write(
const uint8_t *data,
size_t len) {
418 return p_writer->write(data, len);
434 virtual bool begin() = 0;
435 virtual void end() = 0;
436 virtual void setAudioInfo(
AudioInfo info) {
439 if (p_writer1 !=
nullptr) p_writer1->
setAudioInfo(info);
440 if (p_writer2 !=
nullptr) p_writer2->
setAudioInfo(info);
443 virtual size_t write(uint8_t *data,
size_t size) = 0;
459 print2.setWriter(p_writer2);
467 virtual bool begin() {
470 if (p_writer2 !=
nullptr) {
471 p_writer1->setOutput(print2);
472 p_writer2->setOutput(*p_print);
476 p_writer1->setOutput(*p_print);
484 if (p_writer1 !=
nullptr) p_writer1->end();
485 if (p_writer2 !=
nullptr) p_writer2->end();
489 virtual size_t write(uint8_t *data,
size_t size) {
491 return p_writer1->write(data, size);
495 Print *p_print =
nullptr;