diff options
Diffstat (limited to 'src/audio/stream_info.cpp')
| -rw-r--r-- | src/audio/stream_info.cpp | 75 |
1 files changed, 31 insertions, 44 deletions
diff --git a/src/audio/stream_info.cpp b/src/audio/stream_info.cpp index 3927e5f8..6efe297e 100644 --- a/src/audio/stream_info.cpp +++ b/src/audio/stream_info.cpp @@ -5,6 +5,7 @@ */ #include "stream_info.hpp" +#include <sys/_stdint.h> #include <cstdint> #include <optional> @@ -14,77 +15,63 @@ #include <utility> #include <variant> +#include "esp_heap_caps.h" #include "result.hpp" #include "span.hpp" #include "types.hpp" namespace audio { -void InputStream::consume(std::size_t bytes) const { - assert(raw_->info->bytes_in_stream >= bytes); - auto new_data = - raw_->data.subspan(bytes, raw_->info->bytes_in_stream - bytes); - std::move(new_data.begin(), new_data.end(), raw_->data.begin()); - raw_->info->bytes_in_stream = new_data.size_bytes(); +RawStream::RawStream(std::size_t size) + : info_(), + buffer_size_(size), + buffer_(reinterpret_cast<std::byte*>( + heap_caps_malloc(size, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT))) { + assert(buffer_ != NULL); +} + +RawStream::~RawStream() { + heap_caps_free(buffer_); } -void InputStream::mark_consumer_finished() const { - raw_->info->is_consumer_finished = true; - if (is_producer_finished()) { - raw_->info->format = std::monostate(); - } +auto RawStream::data() -> cpp::span<std::byte> { + return {buffer_, buffer_size_}; } -bool InputStream::is_producer_finished() const { - return raw_->info->is_producer_finished; +void InputStream::consume(std::size_t bytes) const { + assert(raw_->info().bytes_in_stream() >= bytes); + auto new_data = + raw_->data().subspan(bytes, raw_->info().bytes_in_stream() - bytes); + std::move(new_data.begin(), new_data.end(), raw_->data().begin()); + raw_->info().bytes_in_stream() = new_data.size_bytes(); } const StreamInfo& InputStream::info() const { - return *raw_->info; + return raw_->info(); } cpp::span<const std::byte> InputStream::data() const { - return raw_->data.first(raw_->info->bytes_in_stream); + return raw_->data().first(raw_->info().bytes_in_stream()); } void OutputStream::add(std::size_t bytes) const { - assert(raw_->info->bytes_in_stream + bytes <= raw_->data.size_bytes()); - raw_->info->bytes_in_stream += bytes; + assert(raw_->info().bytes_in_stream() + bytes <= raw_->data().size_bytes()); + raw_->info().bytes_in_stream() += bytes; } -bool OutputStream::prepare(const StreamInfo::Format& new_format) { - if (std::holds_alternative<std::monostate>(raw_->info->format) || - raw_->info->is_consumer_finished) { - raw_->info->format = new_format; - raw_->info->bytes_in_stream = 0; - raw_->info->is_producer_finished = false; - raw_->info->is_consumer_finished = false; - return true; - } - return false; -} - -void OutputStream::set_duration(std::size_t seconds) { - raw_->info->duration_seconds = seconds; +void OutputStream::prepare(const StreamInfo::Format& new_format, + std::optional<uint32_t> length) { + raw_->info().set_format(new_format); + raw_->info().bytes_in_stream() = 0; + raw_->info().total_length_bytes() = length; } const StreamInfo& OutputStream::info() const { - return *raw_->info; + return raw_->info(); } cpp::span<std::byte> OutputStream::data() const { - return raw_->data.subspan(raw_->info->bytes_in_stream); -} - -void OutputStream::mark_producer_finished() const { - raw_->info->is_producer_finished = true; - if (is_consumer_finished()) { - raw_->info->format = std::monostate(); - } -} - -bool OutputStream::is_consumer_finished() const { - return raw_->info->is_consumer_finished; + return raw_->data().subspan(raw_->info().bytes_in_stream()); } } // namespace audio |
