summaryrefslogtreecommitdiff
path: root/src/audio/include/stream_info.hpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-08-03 15:32:28 +1000
committerjacqueline <me@jacqueline.id.au>2023-08-03 15:32:28 +1000
commit3511852f39cd5023ec8e6d0b94cc69f34e9201ed (patch)
treefa38c2dd0a88d39616540e59f9850b919e20d852 /src/audio/include/stream_info.hpp
parentfbebc525117f18d5751e6951bc4ffcc51f70dcc4 (diff)
downloadtangara-fw-3511852f39cd5023ec8e6d0b94cc69f34e9201ed.tar.gz
Add very limited resampling (it's slow as shit)
Diffstat (limited to 'src/audio/include/stream_info.hpp')
-rw-r--r--src/audio/include/stream_info.hpp35
1 files changed, 34 insertions, 1 deletions
diff --git a/src/audio/include/stream_info.hpp b/src/audio/include/stream_info.hpp
index d48c39a8..d31e035c 100644
--- a/src/audio/include/stream_info.hpp
+++ b/src/audio/include/stream_info.hpp
@@ -56,6 +56,18 @@ class StreamInfo {
bool operator==(const Encoded&) const = default;
};
+ /*
+ * Two-channel, interleaved, 32-bit floating point pcm samples.
+ */
+ struct FloatingPointPcm {
+ // Number of channels in this stream.
+ uint8_t channels;
+ // The sample rate.
+ uint32_t sample_rate;
+
+ bool operator==(const FloatingPointPcm&) const = default;
+ };
+
struct Pcm {
// Number of channels in this stream.
uint8_t channels;
@@ -64,10 +76,14 @@ class StreamInfo {
// The sample rate.
uint32_t sample_rate;
+ auto real_bytes_per_sample() const -> uint8_t {
+ return bits_per_sample == 16 ? 2 : 4;
+ }
+
bool operator==(const Pcm&) const = default;
};
- typedef std::variant<std::monostate, Encoded, Pcm> Format;
+ typedef std::variant<std::monostate, Encoded, FloatingPointPcm, Pcm> Format;
auto format() const -> const Format& { return format_; }
auto set_format(Format f) -> void { format_ = f; }
@@ -98,6 +114,12 @@ class RawStream {
auto info() -> StreamInfo& { return info_; }
auto data() -> cpp::span<std::byte>;
+ template <typename T>
+ auto data_as() -> cpp::span<T> {
+ auto orig = data();
+ return {reinterpret_cast<T*>(orig.data()), orig.size_bytes() / sizeof(T)};
+ }
+ auto empty() const -> bool { return info_.bytes_in_stream() == 0; }
private:
StreamInfo info_;
@@ -114,6 +136,12 @@ class InputStream {
const StreamInfo& info() const;
cpp::span<const std::byte> data() const;
+ template <typename T>
+ auto data_as() const -> cpp::span<const T> {
+ auto orig = data();
+ return {reinterpret_cast<const T*>(orig.data()),
+ orig.size_bytes() / sizeof(T)};
+ }
private:
RawStream* raw_;
@@ -131,6 +159,11 @@ class OutputStream {
const StreamInfo& info() const;
cpp::span<std::byte> data() const;
+ template <typename T>
+ auto data_as() const -> cpp::span<T> {
+ auto orig = data();
+ return {reinterpret_cast<T*>(orig.data()), orig.size_bytes() / sizeof(T)};
+ }
private:
RawStream* raw_;