summaryrefslogtreecommitdiff
path: root/src/audio/stream_info.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-07-26 17:11:23 +1000
committerjacqueline <me@jacqueline.id.au>2023-07-26 17:11:23 +1000
commit9b1b401dcb986a26d10bcc898be670653acc2d3f (patch)
tree697b14553dc75ddaab060406cd62ee4b08f05e9e /src/audio/stream_info.cpp
parentf94be3db2f2bb6c1b359744cb915683095e4ee80 (diff)
downloadtangara-fw-9b1b401dcb986a26d10bcc898be670653acc2d3f.tar.gz
big cleanup of new encoder + stream buffer types
Diffstat (limited to 'src/audio/stream_info.cpp')
-rw-r--r--src/audio/stream_info.cpp75
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