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_AMBISONICS_HOA_ROTATOR_H_
18#define RESONANCE_AUDIO_AMBISONICS_HOA_ROTATOR_H_
19
20#include <vector>
21
22#include "Eigen/Dense"
23#include "base/audio_buffer.h"
24#include "base/misc_math.h"
25
26namespace vraudio {
27
28// Rotator for higher order ambisonic sound fields. It supports ACN channel
29// ordering and SN3D normalization (AmbiX).
30class HoaRotator {
31 public:
32 // Constructs a sound field rotator of an arbitrary ambisonic order.
33 //
34 // @param ambisonic_order Order of ambisonic sound field.
35 explicit HoaRotator(int ambisonic_order);
36
37 // Performs a smooth inplace rotation of a sound field buffer from
38 // |current_rotation_| to |target_rotation|.
39 //
40 // @param target_rotation Target rotation to be applied to the input buffer.
41 // @param input Higher order sound field input buffer to be rotated.
42 // @param output Pointer to output buffer.
43 // @return True if rotation has been applied.
44 bool Process(const WorldRotation& target_rotation, const AudioBuffer& input,
45 AudioBuffer* output);
46
47 private:
48 // Updates the rotation matrix with using supplied WorldRotation.
49 //
50 // @param rotation World rotation.
51 void UpdateRotationMatrix(const WorldRotation& rotation);
52
53 // Order of the ambisonic sound field handled by the rotator.
54 const int ambisonic_order_;
55
56 // Current rotation which is used in the interpolation process in order to
57 // compute new rotation matrix. Initialized with an identity rotation.
58 WorldRotation current_rotation_;
59
60 // Spherical harmonics rotation sub-matrices for each order.
61 std::vector<Eigen::MatrixXf> rotation_matrices_;
62
63 // Final spherical harmonics rotation matrix.
64 Eigen::MatrixXf rotation_matrix_;
65};
66
67} // namespace vraudio
68
69#endif // RESONANCE_AUDIO_AMBISONICS_HOA_ROTATOR_H_
70

source code of qtmultimedia/src/3rdparty/resonance-audio/resonance_audio/ambisonics/hoa_rotator.h