parent
3817ec0c77
commit
7c6fd654f5
@ -1,56 +0,0 @@ |
|||||||
#include "audio_element.hpp" |
|
||||||
#include <memory> |
|
||||||
|
|
||||||
namespace audio { |
|
||||||
|
|
||||||
IAudioElement::IAudioElement() |
|
||||||
: input_events_(xQueueCreate(kEventQueueSize, sizeof(void*))), |
|
||||||
output_events_(nullptr), |
|
||||||
buffered_output_() {} |
|
||||||
|
|
||||||
IAudioElement::~IAudioElement() { |
|
||||||
// Ensure we don't leak any memory from events leftover in the queue.
|
|
||||||
while (uxQueueSpacesAvailable(input_events_) < kEventQueueSize) { |
|
||||||
StreamEvent* event; |
|
||||||
if (xQueueReceive(input_events_, &event, 0)) { |
|
||||||
free(event); |
|
||||||
} else { |
|
||||||
break; |
|
||||||
} |
|
||||||
} |
|
||||||
// Technically there's a race here if someone is still adding to the queue,
|
|
||||||
// but hopefully the whole pipeline is stopped if an element is being
|
|
||||||
// destroyed.
|
|
||||||
vQueueDelete(input_events_); |
|
||||||
} |
|
||||||
|
|
||||||
auto IAudioElement::SendOrBufferEvent(std::unique_ptr<StreamEvent> event) |
|
||||||
-> bool { |
|
||||||
if (!buffered_output_.empty()) { |
|
||||||
// To ensure we send data in order, don't try to send if we've already
|
|
||||||
// failed to send something.
|
|
||||||
buffered_output_.push_back(std::move(event)); |
|
||||||
return false; |
|
||||||
} |
|
||||||
StreamEvent* raw_event = event.release(); |
|
||||||
if (!xQueueSend(output_events_, &raw_event, 0)) { |
|
||||||
event.reset(raw_event); |
|
||||||
buffered_output_.push_back(std::move(event)); |
|
||||||
return false; |
|
||||||
} |
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
auto IAudioElement::FlushBufferedOutput() -> bool { |
|
||||||
while (!buffered_output_.empty()) { |
|
||||||
StreamEvent* raw_event = buffered_output_.front().release(); |
|
||||||
buffered_output_.pop_front(); |
|
||||||
if (!xQueueSend(output_events_, &raw_event, 0)) { |
|
||||||
buffered_output_.emplace_front(raw_event); |
|
||||||
return false; |
|
||||||
} |
|
||||||
} |
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
} // namespace audio
|
|
@ -0,0 +1,22 @@ |
|||||||
|
#pragma once |
||||||
|
|
||||||
|
#include "audio_element.hpp" |
||||||
|
#include "stream_info.hpp" |
||||||
|
namespace audio { |
||||||
|
|
||||||
|
class IAudioSink { |
||||||
|
private: |
||||||
|
static const std::size_t kDrainBufferSize = 8 * 1024; |
||||||
|
StreamBufferHandle_t buffer_; |
||||||
|
|
||||||
|
public: |
||||||
|
IAudioSink() : buffer_(xStreamBufferCreate(kDrainBufferSize, 1)) {} |
||||||
|
virtual ~IAudioSink() { vStreamBufferDelete(buffer_); } |
||||||
|
|
||||||
|
virtual auto Configure(const StreamInfo::Format& format) -> bool = 0; |
||||||
|
virtual auto Send(const cpp::span<std::byte>& data) -> void = 0; |
||||||
|
|
||||||
|
auto buffer() const -> StreamBufferHandle_t { return buffer_; } |
||||||
|
}; |
||||||
|
|
||||||
|
} // namespace audio
|
Loading…
Reference in new issue