Iros
 
Loading...
Searching...
No Matches
frame.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/assert/prelude.h"
4#include "di/meta/core.h"
5#include "di/meta/util.h"
6#include "di/types/byte.h"
7#include "di/types/floats.h"
8#include "di/types/integers.h"
9#include "di/util/declval.h"
10#include "di/util/unreachable.h"
14
15namespace audio {
16namespace frame {
17 template<typename Buffer>
18 class FrameImpl {
19 private:
20 constexpr static auto is_const =
21 di::SameAs<di::Span<byte const>, decltype(di::declval<Buffer const&>().span())>;
22
23 using ConstBuffer = typename Buffer::ByteBuffer;
24
25 public:
26 FrameImpl() = default;
27
28 constexpr explicit FrameImpl(Buffer buffer, FrameInfo info) : m_buffer(di::move(buffer)), m_info(info) {}
29
30 constexpr auto format() const -> SampleFormat { return m_info.format; }
31 constexpr auto channel_count() const -> usize { return m_info.channel_count; }
32 constexpr auto sample_rate_hz() const -> usize { return m_info.sample_rate_hz; }
33 constexpr auto info() const -> FrameInfo { return m_info; }
34
35 constexpr auto sample_count() const -> usize { return as_raw_bytes().size() / stride(); }
36 constexpr auto bytes_per_sample() const -> usize { return format_bytes_per_sample(format()); }
37 constexpr auto stride() const -> usize { return bytes_per_sample() * channel_count(); }
38 constexpr auto byte_count() const -> usize { return sample_count() * stride(); }
39
40 auto as_float32_le() const {
42 auto* data = reinterpret_cast<di::meta::MaybeConst<is_const, f32>*>(as_raw_bytes().data());
43 return di::Span { data, sample_count() * channel_count() };
44 }
45
46 auto as_signed_int16_le() const {
48 auto* data = reinterpret_cast<di::meta::MaybeConst<is_const, i16>*>(as_raw_bytes().data());
49 return di::Span { data, sample_count() * channel_count() };
50 }
51
52 auto as_signed_int32_le() const {
54 auto* data = reinterpret_cast<di::meta::MaybeConst<is_const, i32>*>(as_raw_bytes().data());
55 return di::Span { data, sample_count() * channel_count() };
56 }
57
58 constexpr auto as_raw_bytes() const { return m_buffer.span(); }
59
61 requires(!is_const)
62 {
63 m_buffer.shrink_to_first(count * stride());
64 }
65
66 operator ConstBuffer() && requires(!is_const) { return ConstBuffer(di::move(m_buffer), m_info); }
67
68 private : Buffer m_buffer;
69 FrameInfo m_info;
70 };
71}
72
75}
#define ASSERT_EQ
Definition assert_binary.h:84
Definition frame.h:18
constexpr auto byte_count() const -> usize
Definition frame.h:38
constexpr auto sample_rate_hz() const -> usize
Definition frame.h:32
constexpr FrameImpl(Buffer buffer, FrameInfo info)
Definition frame.h:28
constexpr auto stride() const -> usize
Definition frame.h:37
constexpr auto channel_count() const -> usize
Definition frame.h:31
constexpr auto info() const -> FrameInfo
Definition frame.h:33
auto as_signed_int16_le() const
Definition frame.h:46
constexpr auto shrink_to_first_n_samples(usize count)
Definition frame.h:60
constexpr auto as_raw_bytes() const
Definition frame.h:58
auto as_signed_int32_le() const
Definition frame.h:52
constexpr auto format() const -> SampleFormat
Definition frame.h:30
constexpr auto sample_count() const -> usize
Definition frame.h:35
auto as_float32_le() const
Definition frame.h:40
constexpr auto bytes_per_sample() const -> usize
Definition frame.h:36
Definition span_forward_declaration.h:10
Definition frame.h:16
Definition wav.cpp:17
constexpr auto format_bytes_per_sample(SampleFormat format) -> usize
Definition frame_info.h:25
frame::FrameImpl< di::ByteBuffer > Frame
Definition frame.h:73
SampleFormat
Definition frame_info.h:11
@ SignedInt32LE
Definition frame_info.h:14
@ SignedInt16LE
Definition frame_info.h:12
@ Float32LE
Definition frame_info.h:15
frame::FrameImpl< di::ExclusiveByteBuffer > ExclusiveFrame
Definition frame.h:74
Conditional< is_const, T const, T > MaybeConst
Definition util.h:9
size_t usize
Definition integers.h:33
Definition zstring_parser.h:9
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
constexpr auto data
Definition data.h:51
constexpr auto count
Definition count.h:37
Definition frame_info.h:39