3 #include "AudioConfig.h"
4 #include "AudioLogger.h"
5 #include "AudioTools/AudioIO.h"
6 #include "AudioTools/AudioOutput.h"
7 #include "AudioTools/AudioStreams.h"
8 #include "AudioTools/AudioTypes.h"
31 notifyAudioChange(from);
37 Print *p_print = &out_stream;
44 Print *p_print = &out_stream;
50 virtual void setOutput(
Print &out_stream)
override { p_print = &out_stream; }
56 virtual bool begin(
AudioInfo info)
override {
60 bool begin()
override {
return true; }
61 void end()
override {}
67 Print *p_print =
nullptr;
79 bool isResultPCM()
override {
return true; }
95 virtual const char *
mime() = 0;
106 virtual void setBlockSize(
int blockSize) = 0;
111 virtual int blockSize() = 0;
129 virtual bool begin() {
return true; }
130 virtual void end() {}
139 virtual operator bool() {
return false; }
140 virtual int readStream(Stream &in) {
return 0; };
143 virtual size_t write(
const void *in_ptr,
size_t in_size) {
144 memset((
void *)in_ptr, 0, in_size);
148 virtual const char *
mime() {
return nullptr; }
171 Print *p_print = &out_stream;
178 Print *p_print = &out_stream;
197 virtual operator bool() = 0;
203 virtual size_t readBytes(uint8_t *buffer,
size_t len) = 0;
204 Print *p_print =
nullptr;
205 Stream *p_input =
nullptr;
217 int copySize = DEFAULT_BUFFER_SIZE) {
218 p_decoder = &decoder;
219 if (copySize > 0)
resize(copySize);
222 bool begin()
override {
return p_input !=
nullptr && p_decoder->begin(); }
225 void end()
override { p_decoder->end(); }
236 virtual operator bool() {
return *p_decoder; }
240 int read = readBytes(&buffer[0], buffer.size());
242 if (read > 0) written = p_decoder->write(&buffer[0], read);
247 void resize(
int bufferSize) { buffer.resize(bufferSize); }
253 size_t readBytes(uint8_t *buffer,
size_t len)
override {
254 if (p_input ==
nullptr)
return 0;
255 return p_input->readBytes(buffer, len);
322 static int count = 0;
349 ptr_out = outputStream;
350 if (decoder_ptr !=
nullptr) {
353 if (encoder_ptr !=
nullptr) {
354 encoder_ptr->setOutput(*ptr_out);
360 encoder = CodecNOP::instance();
364 if (ptr_out !=
nullptr) {
365 encoder_ptr->setOutput(*ptr_out);
369 AudioEncoder *getEncoder() {
return encoder_ptr; }
371 void setDecoder(AudioDecoder *
decoder) {
373 decoder = CodecNOP::instance();
377 if (ptr_out !=
nullptr) {
382 AudioDecoder *getDecoder() {
return decoder_ptr; }
386 custom_log_level.set();
390 const CodecNOP *nop = CodecNOP::instance();
391 if (decoder_ptr != nop || encoder_ptr != nop) {
393 if (!decoder_ptr->begin(cfg)) active =
false;
394 if (!encoder_ptr->begin(cfg)) active =
false;
396 LOGW(
"no decoder or encoder defined");
399 custom_log_level.reset();
411 custom_log_level.set();
416 custom_log_level.reset();
420 virtual size_t write(
const uint8_t *data,
size_t len)
override {
425 custom_log_level.set();
426 LOGD(
"EncodedAudioOutput::write: %d", (
int)len);
428 if (writer_ptr ==
nullptr || data ==
nullptr) {
433 if (check_available_for_write && availableForWrite() == 0) {
437 size_t result = writer_ptr->write(data, len);
438 LOGD(
"EncodedAudioOutput::write: %d -> %d", (
int)len, (
int)result);
439 custom_log_level.reset();
444 int availableForWrite()
override {
445 if (!check_available_for_write)
return frame_size;
446 return min(ptr_out->availableForWrite(), frame_size);
450 operator bool() {
return active; }
459 void setLogLevel(AudioLogger::LogLevel level) { custom_log_level.set(level); }
471 Print *ptr_out =
nullptr;
473 bool check_available_for_write =
false;
474 CustomLogLevel custom_log_level;
475 int frame_size = DEFAULT_BUFFER_SIZE;
479 using EncodedAudioPrint = EncodedAudioOutput;
494 setStream(*ioStream);
499 setStream(*ioStream);
503 setOutput(*outputStream);
508 setOutput(*outputStream);
513 setOutput(*outputStream);
525 AudioEncoder *getEncoder() {
return enc_out.getEncoder(); }
527 AudioDecoder *getDecoder() {
return enc_out.getDecoder(); }
535 void setStream(
Stream *stream) {
539 void setStream(AudioStream *stream) {
543 void setOutput(AudioOutput *stream) {
547 void setOutput(Print *stream) {
551 void setStream(AudioStream &stream) {
562 ReformatBaseStream::setOutput(stream);
567 ReformatBaseStream::setOutput(out);
576 bool begin(AudioInfo info) {
582 is_output_notify =
false;
583 reader.setByteCountFactor(10);
585 ReformatBaseStream::begin();
594 int availableForWrite() {
return enc_out.availableForWrite(); }
596 size_t write(
const uint8_t *data,
size_t len) {
598 return enc_out.
write(data, len);
601 size_t readBytes(uint8_t *data,
size_t size) {
602 return reader.readBytes(data, size);
609 float getByteFactor() {
return 1.0f; }
628 void setWriter(
AudioWriter *writer) { p_writer = writer; }
629 size_t write(
const uint8_t *in_ptr,
size_t in_size) {
630 return p_writer->write(in_ptr, in_size);
646 virtual bool begin() = 0;
647 virtual void end() = 0;
648 virtual void setAudioInfo(
AudioInfo info) {
651 if (p_writer1 !=
nullptr) p_writer1->
setAudioInfo(info);
652 if (p_writer2 !=
nullptr) p_writer2->
setAudioInfo(info);
655 virtual size_t write(uint8_t *data,
size_t size) = 0;
671 print2.setWriter(p_writer2);
679 virtual bool begin() {
682 if (p_writer2 !=
nullptr) {
683 p_writer1->setOutput(print2);
684 p_writer2->setOutput(*p_print);
688 p_writer1->setOutput(*p_print);
696 if (p_writer1 !=
nullptr) p_writer1->end();
697 if (p_writer2 !=
nullptr) p_writer2->end();
701 virtual size_t write(uint8_t *data,
size_t size) {
703 return p_writer1->write(data, size);
707 Print *p_print =
nullptr;