1/*
2Copyright 2018 Google Inc. All Rights Reserved.
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS-IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15*/
16
17#ifndef RESONANCE_AUDIO_GRAPH_BINAURAL_SURROUND_RENDERER_IMPL_H_
18#define RESONANCE_AUDIO_GRAPH_BINAURAL_SURROUND_RENDERER_IMPL_H_
19
20#include <memory>
21#include <string>
22
23#include "api/binaural_surround_renderer.h"
24#include "api/resonance_audio_api.h"
25#include "base/constants_and_types.h"
26#include "utils/buffer_partitioner.h"
27#include "utils/buffer_unpartitioner.h"
28#include "utils/threadsafe_fifo.h"
29
30namespace vraudio {
31
32// Renders virtual surround sound as well as ambisonic soundfields to binaural
33// stereo.
34class BinauralSurroundRendererImpl : public BinauralSurroundRenderer {
35 public:
36 // Constructor.
37 //
38 // @param frames_per_buffer Number of frames in output buffer.
39 // @param sample_rate_hz Sample rate of audio buffers.
40 BinauralSurroundRendererImpl(size_t frames_per_buffer, int sample_rate_hz);
41
42 ~BinauralSurroundRendererImpl() override{};
43
44 // Initializes surround sound decoding.
45 //
46 // @param surround_format Surround sound input format.
47 // @return True on success.
48 bool Init(SurroundFormat surround_format);
49
50 // Implements |AudioRenderer| interface.
51 void SetStereoSpeakerMode(bool enabled) override;
52 size_t GetNumAvailableFramesInInputBuffer() const override;
53 size_t AddInterleavedInput(const int16* input_buffer_ptr, size_t num_channels,
54 size_t num_frames) override;
55 size_t AddInterleavedInput(const float* input_buffer_ptr, size_t num_channels,
56 size_t num_frames) override;
57 size_t AddPlanarInput(const int16* const* input_buffer_ptrs,
58 size_t num_channels, size_t num_frames) override;
59 size_t AddPlanarInput(const float* const* input_buffer_ptrs,
60 size_t num_channels, size_t num_frames) override;
61 size_t GetAvailableFramesInStereoOutputBuffer() const override;
62 size_t GetInterleavedStereoOutput(int16* output_buffer_ptr,
63 size_t num_frames) override;
64 size_t GetInterleavedStereoOutput(float* output_buffer_ptr,
65 size_t num_frames) override;
66 size_t GetPlanarStereoOutput(int16** output_buffer_ptrs,
67 size_t num_frames) override;
68 size_t GetPlanarStereoOutput(float** output_buffer_ptrs,
69 size_t num_frames) override;
70 bool TriggerProcessing() override;
71 void Clear() override;
72 void SetHeadRotation(float w, float x, float y, float z) override;
73
74 protected:
75 // Protected default constructor for mock tests.
76 BinauralSurroundRendererImpl();
77
78 private:
79 // Callback triggered by |buffer_partitioner_| whenever a new |AudioBuffer|
80 // has been generated.
81 //
82 // @param processed_buffer Pointer to processed buffer.
83 // @return Pointer to next |AudioBuffer| to be filled up.
84 AudioBuffer* BufferPartitionerCallback(AudioBuffer* processed_buffer);
85
86 // Helper method to implement |AddInterleavedInput| independently from the
87 // sample type.
88 //
89 // @tparam BufferType Input buffer type.
90 // @param input_buffer_ptr Pointer to interleaved input data.
91 // @param num_channels Number of channels in input buffer.
92 // @param num_frames Number of frames in input buffer.
93 // @return The number of consumed samples.
94 template <typename BufferType>
95 size_t AddInputBufferTemplated(const BufferType input_buffer_ptr,
96 size_t num_channels, size_t num_frames);
97
98 // Helper method to implement |GetInterleavedOutput| independently from the
99 // sample type.
100 //
101 // @tparam BufferType Output buffer type.
102 // @param output_buffer_ptr Pointer to allocated interleaved output buffer.
103 // @param num_frames Size of output buffer in frames.
104 // @return The number of consumed frames.
105 template <typename BufferType>
106 size_t GetStereoOutputBufferTemplated(BufferType output_buffer_ptr,
107 size_t num_frames);
108
109 // Helper method to obtain the expected number of audio channels for a given
110 // surround format.
111 //
112 // @param surround_format Surround format query.
113 // @return Number of audio channels.
114 static size_t GetExpectedNumChannelsFromSurroundFormat(
115 SurroundFormat surround_format);
116
117 // Process method executed by |buffer_unpartitioner_|.
118 AudioBuffer* ProcessBuffer();
119
120 // Initializes binaural mono rendering.
121 void InitializeBinauralMono();
122
123 // Initializes binaural stereo rendering.
124 void InitializeBinauralStereo();
125
126 // Initializes binaural 5.1 rendering.
127 void InitializeBinauralSurround5dot1();
128
129 // Initializes binaural 7.1 rendering.
130 void InitializeBinauralSurround7dot1();
131
132 // Initializes binaural ambisonic rendering.
133 void InitializeAmbisonics();
134
135 // Initializes binaural ambisonic rendering with non-diegetic stereo.
136 void InitializeAmbisonicsWithNonDiegeticStereo();
137
138 // Creates a sound object at given angle within the horizontal listener plane.
139 SourceId CreateSoundObject(float azimuth_deg);
140
141 // Initializes room reverb for virtual surround sound rendering.
142 void InitializeRoomReverb();
143
144 // ResonanceAudioApi instance.
145 std::unique_ptr<ResonanceAudioApi> resonance_audio_api_;
146
147 // Frames per buffer.
148 const size_t frames_per_buffer_;
149
150 // System sample rate.
151 const int sample_rate_hz_;
152
153 // Selected surround sound format.
154 SurroundFormat surround_format_;
155
156 // Number of input channels.
157 size_t num_input_channels_;
158
159 // Partitions input buffers into |AudioBuffer|s.
160 std::unique_ptr<BufferPartitioner> buffer_partitioner_;
161
162 // Buffer queue containing partitioned input |AudioBuffer|s.
163 std::unique_ptr<ThreadsafeFifo<AudioBuffer>> input_audio_buffer_queue_;
164
165 // Binaural stereo output buffer.
166 AudioBuffer output_buffer_;
167
168 // Unpartitions processed |AudioBuffer|s into interleaved output buffers.
169 std::unique_ptr<BufferUnpartitioner> buffer_unpartitioner_;
170
171 // Vector containing the source ids of all rendered sound sources.
172 std::vector<SourceId> source_ids_;
173
174 // Total number of frames currently buffered.
175 size_t total_frames_buffered_;
176
177 // Total number of zero padded frames from |TriggerProcessing| calls.
178 size_t num_zero_padded_frames_;
179
180 // Temporary buffer to store pointers to planar ambisonic and stereo channels.
181 std::vector<const float*> temp_planar_buffer_ptrs_;
182
183 // Global output gain adjustment, to avoid clipping of individual channels
184 // in virtual speaker modes.
185 float output_gain_;
186};
187
188} // namespace vraudio
189
190#endif // RESONANCE_AUDIO_GRAPH_BINAURAL_SURROUND_RENDERER_IMPL_H_
191

source code of qtmultimedia/src/3rdparty/resonance-audio/resonance_audio/graph/binaural_surround_renderer_impl.h