summaryrefslogtreecommitdiff
path: root/src/audio/stream_info.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-04-19 16:45:50 +1000
committerjacqueline <me@jacqueline.id.au>2023-04-19 16:45:50 +1000
commit4c77950e702a329f3136456a932efbea36e03d42 (patch)
tree5df7e8717b751846655c16b50c352712b642658b /src/audio/stream_info.cpp
parent561f9d2a07ee6ee1c2f18dc375125f87ea7b0d55 (diff)
downloadtangara-fw-4c77950e702a329f3136456a932efbea36e03d42.tar.gz
Pipeline working and outputting correctly, but noisy
Diffstat (limited to 'src/audio/stream_info.cpp')
-rw-r--r--src/audio/stream_info.cpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/audio/stream_info.cpp b/src/audio/stream_info.cpp
new file mode 100644
index 00000000..7d833d25
--- /dev/null
+++ b/src/audio/stream_info.cpp
@@ -0,0 +1,70 @@
+#include "stream_info.hpp"
+
+#include <cstdint>
+#include <optional>
+#include <string>
+#include <string_view>
+#include <type_traits>
+#include <utility>
+#include <variant>
+
+#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);
+ std::move(new_data.begin(), new_data.end(), raw_->data.begin());
+ raw_->info->bytes_in_stream = new_data.size_bytes();
+}
+
+void InputStream::mark_incomplete() const {
+ raw_->is_incomplete = true;
+}
+
+const StreamInfo& InputStream::info() const {
+ return *raw_->info;
+}
+
+cpp::span<const std::byte> InputStream::data() const {
+ 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;
+}
+
+bool OutputStream::prepare(const StreamInfo::Format& new_format) {
+ if (std::holds_alternative<std::monostate>(raw_->info->format)) {
+ raw_->info->format = new_format;
+ raw_->info->bytes_in_stream = 0;
+ return true;
+ }
+ if (new_format == raw_->info->format) {
+ return true;
+ }
+ if (raw_->is_incomplete) {
+ raw_->info->format = new_format;
+ raw_->info->bytes_in_stream = 0;
+ return true;
+ }
+ return false;
+}
+
+const StreamInfo& OutputStream::info() const {
+ return *raw_->info;
+}
+
+cpp::span<std::byte> OutputStream::data() const {
+ return raw_->data.subspan(raw_->info->bytes_in_stream);
+}
+
+bool OutputStream::is_incomplete() const {
+ return raw_->is_incomplete;
+}
+
+} // namespace audio