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 &&
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; }
141 const CodecNOP *nop = CodecNOP::instance();
142 if (decoder_ptr != nop || encoder_ptr != nop) {
144 if (!decoder_ptr->begin(cfg)) active =
false;
145 if (!encoder_ptr->begin(cfg)) active =
false;
147 LOGW(
"no decoder or encoder defined");
170 virtual size_t write(
const uint8_t *data,
size_t len)
override {
175 LOGD(
"EncodedAudioOutput::write: %d", (
int)len);
177 if (writer_ptr ==
nullptr || data ==
nullptr) {
182 if (check_available_for_write && availableForWrite() == 0) {
186 size_t result = writer_ptr->write(data, len);
187 LOGD(
"EncodedAudioOutput::write: %d -> %d", (
int)len, (
int)result);
170 virtual size_t write(
const uint8_t *data,
size_t len)
override {
…}
191 int availableForWrite()
override {
192 if (!check_available_for_write)
return frame_size;
193 return min(ptr_out->availableForWrite(), frame_size);
197 operator bool()
override {
return active; }
216 Print *ptr_out =
nullptr;
218 bool check_available_for_write =
false;
219 int frame_size = DEFAULT_BUFFER_SIZE;
223using EncodedAudioPrint = EncodedAudioOutput;
238 setStream(*ioStream);
243 setStream(*ioStream);
248 setOutput(*outputStream);
253 setOutput(*outputStream);
258 setOutput(*outputStream);
271 AudioEncoder *getEncoder() {
return enc_out.getEncoder(); }
273 AudioDecoder *getDecoder() {
return enc_out.getDecoder(); }
281 void setStream(
Stream *stream) { setStream(*stream); }
283 void setStream(AudioStream *stream) { setStream(*stream); }
285 void setOutput(AudioOutput *stream) { setOutput(*stream); }
287 void setOutput(Print *stream) { setOutput(*stream); }
289 void setStream(AudioStream &stream)
override {
300 ReformatBaseStream::setOutput(stream);
305 ReformatBaseStream::setOutput(out);
314 bool begin(AudioInfo info) {
319 bool begin()
override {
322 ReformatBaseStream::begin();
326 void end()
override {
331 int availableForWrite()
override {
return enc_out.availableForWrite(); }
333 size_t write(
const uint8_t *data,
size_t len)
override {
335 return enc_out.
write(data, len);
338 size_t readBytes(uint8_t *data,
size_t len)
override {
339 return reader.readBytes(data, len);
348 void setByteFactor(
float factor) { byte_factor = factor; }
355 float byte_factor = 2.0f;
367 void setWriter(
AudioWriter *writer) { p_writer = writer; }
368 size_t write(
const uint8_t *data,
size_t len) {
369 return p_writer->write(data, len);
385 virtual bool begin() = 0;
386 virtual void end() = 0;
387 virtual void setAudioInfo(
AudioInfo info) {
390 if (p_writer1 !=
nullptr) p_writer1->
setAudioInfo(info);
391 if (p_writer2 !=
nullptr) p_writer2->
setAudioInfo(info);
394 virtual size_t write(uint8_t *data,
size_t size) = 0;
410 print2.setWriter(p_writer2);
418 virtual bool begin() {
421 if (p_writer2 !=
nullptr) {
422 p_writer1->setOutput(print2);
423 p_writer2->setOutput(*p_print);
427 p_writer1->setOutput(*p_print);
435 if (p_writer1 !=
nullptr) p_writer1->end();
436 if (p_writer2 !=
nullptr) p_writer2->end();
440 virtual size_t write(uint8_t *data,
size_t size) {
442 return p_writer1->write(data, size);
446 Print *p_print =
nullptr;