RavEngine
Loading...
Searching...
No Matches
AudioTypes.hpp
1#pragma once
2#include <span>
3#include "Ref.hpp"
4#include "DataStructures.hpp"
5
6namespace RavEngine{
7 class AudioAsset;
8
13 using InterleavedSampleBufferView = std::span<float,std::dynamic_extent>;
14
21 protected:
22 using data_t = float;
23 std::span<data_t,std::dynamic_extent> combined_buffers;
24 size_t sizeOfOneChannelInFrames = 0;
25
26 auto channel_at(size_t i) const{
27 auto ptr = combined_buffers.data()+(i*sizeOfOneChannelInFrames);
28 decltype(combined_buffers) retview{ptr,sizeOfOneChannelInFrames};
29 return retview;
30 }
31
32 public:
33 using value_type = decltype(combined_buffers)::value_type;
34 PlanarSampleBufferInlineView(const decltype(combined_buffers)& buf, decltype(sizeOfOneChannelInFrames) sizeOfOneChannelInFrames) : combined_buffers(buf), sizeOfOneChannelInFrames(sizeOfOneChannelInFrames){}
35
36 PlanarSampleBufferInlineView(decltype(combined_buffers)::value_type* data, const decltype(combined_buffers)::size_type nframestotal, decltype(sizeOfOneChannelInFrames) sizeOfOneChannelInFrames):
37 combined_buffers(data, nframestotal), sizeOfOneChannelInFrames(sizeOfOneChannelInFrames){}
38
40
41 auto operator[](size_t i){
42 return channel_at(i);
43 }
44 const auto operator[](size_t i) const{
45 return channel_at(i);
46 }
47 uint8_t GetNChannels() const{
48 return combined_buffers.size() / sizeOfOneChannelInFrames;
49 }
53 auto size() const{
54 return combined_buffers.size();
55 }
56
60 auto GetNumSamples() const {
61 return combined_buffers.size() / GetNChannels();
62 }
63
64 auto data() {
65 return combined_buffers.data();
66 }
67
68 const auto data() const {
69 return combined_buffers.data();
70 }
71
75 auto sizeOneChannel() const{
76 return sizeOfOneChannelInFrames;
77 }
78
79 auto bytesOneChannel() const {
80 return sizeOneChannel() * sizeof(data_t);
81 }
82
88 sizeOfOneChannelInFrames = interleaved.size() / nchannels;
89#pragma omp simd
90 for (size_t i = 0; i < interleaved.size(); i++) {
91 auto view = channel_at(i % nchannels);
92 view[i / nchannels] = interleaved[i];
93 }
94 }
95 };
96
97 inline void AdditiveBlendSamples(InterleavedSampleBufferView& A, const InterleavedSampleBufferView& B){
98 auto bounds = std::min(A.size(),A.size());
99#pragma omp simd
100 for(decltype(bounds) i = 0; i < bounds; i++){
101 A[i] += B[i];
102 }
103 }
104 inline void AdditiveBlendSamples(PlanarSampleBufferInlineView& A, const PlanarSampleBufferInlineView& B){
105 for(uint8_t c = 0; c < std::min(A.GetNChannels(),B.GetNChannels()); c++){
106#pragma omp simd
107 for(size_t i = 0; i < A.sizeOneChannel();i++){
108 A[c][i] += B[c][i];
109 }
110 }
111 }
112
113 class AudioGraphAsset;
116 private:
118 effect_graph_ptr_t effectGraph;
119 public:
120
121 void SetGraph(decltype(effectGraph) inGraph){
122 effectGraph = inGraph;
123 }
124
125 auto GetGraph() const{
126 return effectGraph;
127 }
128
137 };
138}
Definition AudioTypes.hpp:20
auto size() const
Definition AudioTypes.hpp:53
void ImportInterleavedData(InterleavedSampleBufferView interleaved, uint8_t nchannels)
Definition AudioTypes.hpp:87
auto sizeOneChannel() const
Definition AudioTypes.hpp:75
auto GetNumSamples() const
Definition AudioTypes.hpp:60
Definition concurrentqueue.h:747
Definition Animation.hpp:6
std::span< float, std::dynamic_extent > InterleavedSampleBufferView
Definition AudioTypes.hpp:13
Definition AudioTypes.hpp:114
void Render(PlanarSampleBufferInlineView &inputSamples, PlanarSampleBufferInlineView &intermediateBuffer, uint8_t nchannels)
Definition AudioTypes.hpp:134