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