3#include "AudioTools/CoreAudio/AudioOutput.h"
4#include "AudioTools/CoreAudio/AudioStreams.h"
5#include "AudioTools/CoreAudio/AudioIO.h"
25 LOGE(
"Output already defined");
30 if (p_stream ==
nullptr) {
31 LOGE(
"Input not defined");
37 if (p_ai_source !=
nullptr) {
42 components.push_back(&io);
51 last_c.addNotifyAudioChange(io);
53 components.push_back(&io);
61 LOGE(
"Output already defined");
66 LOGE(
"Input not supported");
71 cleanup.push_back(io);
96 LOGE(
"Output already defined");
119 LOGE(
"Defined as output");
124 LOGE(
"Input already defined");
134 int availableForWrite()
override {
135 if (!is_active)
return 0;
137 if (p_print !=
nullptr)
return p_print->availableForWrite();
140 return components[0]->availableForWrite();
143 size_t write(
const uint8_t* data,
size_t len)
override {
144 if (!is_active)
return 0;
146 if (p_print !=
nullptr)
return p_print->write(data, len);
149 LOGD(
"write: %u", (
unsigned)len);
150 return components[0]->write(data, len);
153 int available()
override {
154 if (!is_active)
return 0;
156 if (in ==
nullptr)
return 0;
157 return in->available();
160 size_t readBytes(uint8_t* data,
size_t len)
override {
161 if (!is_active)
return 0;
163 if (in ==
nullptr)
return 0;
164 return in->readBytes(data, len);
186 for (
auto c : components) {
187 ok =
ok &&
c->begin();
190 if (p_out_stream !=
nullptr) {
191 ok =
ok && p_out_stream->begin();
192 }
else if (p_out_print !=
nullptr) {
193 ok =
ok && p_out_print->begin();
196 if (p_ai_input !=
nullptr) {
197 ok =
ok && p_ai_input->begin();
208 for (
auto c : components) {
212 for (
auto&
c : cleanup) {
219 p_out_print =
nullptr;
220 p_out_stream =
nullptr;
223 p_ai_source =
nullptr;
224 p_ai_input =
nullptr;
232 if (has_input && p_ai_input !=
nullptr) {
234 }
else if (has_output) {
235 components[0]->setAudioInfo(info);
252 int size() {
return components.size(); }
267 is_notify_active =
flag;
268 for (
auto c : components) {
269 c->setNotifyActive(
flag);
289 operator bool() {
return is_ok && is_active; }
293 Vector<ModifyingStream*> cleanup{0};
294 bool has_output =
false;
295 bool has_input =
false;
297 bool is_active =
true;
299 Stream* p_stream =
nullptr;
300 AudioInfoSource* p_ai_source =
nullptr;
301 AudioStream* p_ai_input =
nullptr;
303 AudioOutput* p_out_print =
nullptr;
304 AudioStream* p_out_stream =
nullptr;
305 Print* p_print =
nullptr;
317 size_t write(
const uint8_t* data,
size_t len)
override {
318 return p_out->write(data, len);
321 bool begin()
override {
return p_out->begin(); }
323 void end()
override { p_out->end(); }