Skip to content

Commit 2e1f19a

Browse files
committed
Merge pull request #6 from trsonic:fix-cmake-src-list
PiperOrigin-RevId: 825392326
2 parents 2129829 + 028880c commit 2e1f19a

107 files changed

Lines changed: 301163 additions & 555196 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CMakeLists.txt

Lines changed: 49 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ include(FetchContent)
1919
FetchContent_Declare(
2020
absl
2121
GIT_REPOSITORY https://github.com/abseil/abseil-cpp.git
22-
GIT_TAG 4447c7562e3bc702ade25105912dce503f0c4010
22+
GIT_TAG d38452e1ee03523a208362186fd42248ff2609f6
2323
)
2424
FetchContent_MakeAvailable(absl)
2525

@@ -69,34 +69,54 @@ set(SourceFiles
6969
obr/ambisonic_binaural_decoder/wav.h
7070
obr/ambisonic_binaural_decoder/wav_reader.cc
7171
obr/ambisonic_binaural_decoder/wav_reader.h
72-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_1_oa_l.cc
73-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_1_oa_l.h
74-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_1_oa_r.cc
75-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_1_oa_r.h
76-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_2_oa_l.cc
77-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_2_oa_l.h
78-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_2_oa_r.cc
79-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_2_oa_r.h
80-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_3_oa_l.cc
81-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_3_oa_l.h
82-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_3_oa_r.cc
83-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_3_oa_r.h
84-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_4_oa_l.cc
85-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_4_oa_l.h
86-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_4_oa_r.cc
87-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_4_oa_r.h
88-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_5_oa_l.cc
89-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_5_oa_l.h
90-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_5_oa_r.cc
91-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_5_oa_r.h
92-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_6_oa_l.cc
93-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_6_oa_l.h
94-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_6_oa_r.cc
95-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_6_oa_r.h
96-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_7_oa_l.cc
97-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_7_oa_l.h
98-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_7_oa_r.cc
99-
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_7_oa_r.h
72+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_1_oa_direct_l.cc
73+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_1_oa_direct_l.h
74+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_1_oa_direct_r.cc
75+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_1_oa_direct_r.h
76+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_1_oa_ambient_l.cc
77+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_1_oa_ambient_l.h
78+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_1_oa_ambient_r.cc
79+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_1_oa_ambient_r.h
80+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_1_oa_reverberant_l.cc
81+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_1_oa_reverberant_l.h
82+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_1_oa_reverberant_r.cc
83+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_1_oa_reverberant_r.h
84+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_2_oa_direct_l.cc
85+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_2_oa_direct_l.h
86+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_2_oa_direct_r.cc
87+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_2_oa_direct_r.h
88+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_2_oa_ambient_l.cc
89+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_2_oa_ambient_l.h
90+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_2_oa_ambient_r.cc
91+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_2_oa_ambient_r.h
92+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_2_oa_reverberant_l.cc
93+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_2_oa_reverberant_l.h
94+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_2_oa_reverberant_r.cc
95+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_2_oa_reverberant_r.h
96+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_3_oa_direct_l.cc
97+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_3_oa_direct_l.h
98+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_3_oa_direct_r.cc
99+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_3_oa_direct_r.h
100+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_3_oa_ambient_l.cc
101+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_3_oa_ambient_l.h
102+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_3_oa_ambient_r.cc
103+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_3_oa_ambient_r.h
104+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_3_oa_reverberant_l.cc
105+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_3_oa_reverberant_l.h
106+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_3_oa_reverberant_r.cc
107+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_3_oa_reverberant_r.h
108+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_4_oa_direct_l.cc
109+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_4_oa_direct_l.h
110+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_4_oa_direct_r.cc
111+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_4_oa_direct_r.h
112+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_4_oa_ambient_l.cc
113+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_4_oa_ambient_l.h
114+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_4_oa_ambient_r.cc
115+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_4_oa_ambient_r.h
116+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_4_oa_reverberant_l.cc
117+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_4_oa_reverberant_l.h
118+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_4_oa_reverberant_r.cc
119+
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_4_oa_reverberant_r.h
100120
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_wrapper.cc
101121
obr/ambisonic_binaural_decoder/binaural_filters/binaural_filters_wrapper.h
102122
obr/ambisonic_encoder/ambisonic_encoder.cc

MODULE.bazel

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ module(
1313
bazel_dep(name = "rules_cc", version = "0.1.1")
1414
bazel_dep(
1515
name = "abseil-cpp",
16-
version = "20240722.0.bcr.2",
16+
version = "20250814.1",
1717
repo_name = "com_google_absl",
1818
)
1919
bazel_dep(
@@ -23,7 +23,7 @@ bazel_dep(
2323
)
2424
bazel_dep(
2525
name = "protobuf",
26-
version = "28.3",
26+
version = "32.1",
2727
repo_name = "com_google_protobuf",
2828
)
2929
bazel_dep(

README.md

Lines changed: 55 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,60 @@
11
# Open Binaural Renderer (obr)
2+
23
The `obr` binaural rendering library is designed to render immersive audio content.
34

45
## Features
5-
The library is written using C++ and it utilizes [Bazel](https://bazel.build/) build system. A CMake configuration is also provided.
6+
7+
The library is written using C++ and it utilizes [Bazel](https://bazel.build/) build system. A CMake configuration is
8+
also provided.
69

710
The library renders the following types of Audio Elements:
811

9-
* Ambisonics (from 1st to 7th order).
10-
* Channel-based (e.g. 5.1, 7.1.4). See [Loudspeaker Layouts](docs/loudspeaker_layouts.md) for the full list of supported loudspeaker layouts.
11-
* Object-based. The API allows for controlling the position of the object in the 3D space. Currently only single channel, point-source objects are supported.
12+
* Ambisonics (from 1st to 4th order).
13+
* Channel-based (e.g. 5.1, 7.1.4). See [Loudspeaker Layouts](docs/loudspeaker_layouts.md) for the full list of supported
14+
loudspeaker layouts.
15+
* Object-based. The API allows for controlling the position of the object in the 3D space. Currently only single
16+
channel, point-source objects are supported.
1217

1318
### Encoding to Ambisonics
14-
* Handling of channel and object-based audio elements is done by encoding the required input channels into an intermediate Ambisonic bed and subsequently rendering the bed using a set of FIR filters matching its Ambisonic order.
15-
* The calculation of spherical harmonic (SH) coefficients used during the encoding process is based on the [Resonance Audio](https://github.com/resonance-audio/resonance-audio/)'s [AssociatedLegendrePolynomialsGenerator](https://github.com/resonance-audio/resonance-audio/blob/master/resonance_audio/ambisonics/associated_legendre_polynomials_generator.h) class.
19+
20+
* Handling of channel and object-based audio elements is done by encoding the required input channels into an
21+
intermediate Ambisonic bed and subsequently rendering the bed using a set of FIR filters matching its Ambisonic order.
22+
* The calculation of spherical harmonic (SH) coefficients used during the encoding process is based on
23+
the [Resonance Audio](https://github.com/resonance-audio/resonance-audio/)'
24+
s [AssociatedLegendrePolynomialsGenerator](https://github.com/resonance-audio/resonance-audio/blob/master/resonance_audio/ambisonics/associated_legendre_polynomials_generator.h)
25+
class.
1626

1727
### Ambisonics to Binaural
18-
* The binaural renderer is based on the principle of using Head Related Transfer Functions (HRTFs) and Binaural Room Impulse Responses (BRIRs) decomposed using SH coefficients.
28+
29+
* The binaural renderer is based on the principle of using Head Related Transfer Functions (HRTFs) and Binaural Room
30+
Impulse Responses (BRIRs) decomposed using SH coefficients.
1931
* The FIR filters were designed as a combination of anechoic and reverberant filters.
20-
* The FIR filtering (convolution) mechanism employed in this library is based on the [Resonance Audio](https://github.com/resonance-audio/resonance-audio/)'s [AmbisonicBinauralDecoder](https://github.com/resonance-audio/resonance-audio/blob/master/resonance_audio/ambisonics/ambisonic_binaural_decoder.h) class and its dependencies.
32+
* The FIR filtering (convolution) mechanism employed in this library is based on
33+
the [Resonance Audio](https://github.com/resonance-audio/resonance-audio/)'
34+
s [AmbisonicBinauralDecoder](https://github.com/resonance-audio/resonance-audio/blob/master/resonance_audio/ambisonics/ambisonic_binaural_decoder.h)
35+
class and its dependencies.
2136
* The library uses asymmetric binaural processing, this means it employs dedicated filters for left and right ears.
2237
* Binaural filter matrices are loaded from embedded assets.
23-
* The rendering filters are selected depending on the Ambisonic order matching the input Audio Element, e.g. 7.1.4 rendering uses the highest available order of filters (7OA).
24-
* The default length of the binaural filters is 8192 samples per SH channel @ 48 kHz sampling rate.
38+
* The rendering filters are selected depending on the Ambisonic order matching the input Audio Element. Channel- and
39+
object-based Audio Elements are first encoded to 3rd Order Ambisonics and then rendered using filters of the same
40+
order,
41+
* The following table summarizes the binaural filter lengths per each SH channel for Direct, Ambient, and Reverberant
42+
types at a 48 kHz sampling rate:
43+
44+
| Filter Type | Filter Length (samples) | Sampling Rate |
45+
|-------------|-------------------------|---------------|
46+
| Direct | 256 | 48 kHz |
47+
| Ambient | 8192 | 48 kHz |
48+
| Reverberant | 8192 | 48 kHz |
2549

2650
## Usage
51+
2752
### C++ API
28-
The `ObrImpl` class is the main interface for the binaural renderer. It provides methods to configure audio elements, process audio buffers, and retrieve information about the renderer. See [obr_cli.cc](src/cli/obr_cli.cc) for an example of how to use the library. Listed below are the main methods required to configure the renderer and process audio data.
53+
54+
The `ObrImpl` class is the main interface for the binaural renderer. It provides methods to configure audio elements,
55+
process audio buffers, and retrieve information about the renderer. See [obr_cli_lib.cc](obr/cli/obr_cli_lib.cc) for an
56+
example
57+
of how to use the library. Listed below are the main methods required to configure the renderer and process audio data.
2958

3059
#### Constructor
3160

@@ -40,31 +69,41 @@ ObrImpl(int buffer_size_per_channel, int sampling_rate);
4069
4170
#### Configuration
4271
43-
In order to render immersive audio using `obr`, the renderer needs to be configured using the `AddAudioElement` method. The method accepts `AudioElementType` enums defined within the [audio_element_type.h](src/renderer/audio_element_type.h) file.
72+
In order to render immersive audio using `obr`, the renderer needs to be configured using the `AddAudioElement` method.
73+
The method accepts `AudioElementType` enums defined within the [audio_element_type.h](obr/renderer/audio_element_type.h)
74+
file and `BinauralFilterProfile` enums defined within
75+
the [audio_element_config.h](obr/renderer/audio_element_config.h) file. If the second argument is not provided, the
76+
filter type defaults to `kAmbient`.
4477
4578
```cpp
46-
absl::Status AddAudioElement(AudioElementType type);
79+
absl::Status AddAudioElement(AudioElementType type,
80+
BinauralFilterProfile filter_type);
4781
```
4882

4983
#### Audio processing callback
5084

51-
Once the renderer is configured, the rendering of audio data can be done using the `Process` method. The method uses [`AudioBuffer`](src/audio_buffer/audio_buffer.h) class for storing input and output audio data.
85+
Once the renderer is configured, the rendering of audio data can be done using the `Process` method. The method uses [
86+
`AudioBuffer`](obr/audio_buffer/audio_buffer.h) class for storing input and output audio data.
5287

5388
```cpp
5489
void Process(const AudioBuffer& input_buffer, AudioBuffer* output_buffer);
5590
```
5691
5792
### Command Line Interface (CLI)
58-
The command line interface provides a straightforward way to render audio files of certain types. The CLI is built as a standalone executable and can be run as follows:
93+
94+
The command line interface provides a straightforward way to render audio files of certain types. The CLI is built as a
95+
standalone executable and can be run as follows:
5996
6097
```
6198
obr_cli
62-
--input_type=<type> (3OA, 7OA, 7.1.4, OBA)
99+
--input_type=<1OA|2OA|3OA|4OA|7.1.4|OBA>
63100
--oba_metadata_file=<full path to textproto file> (required for OBA)
64101
--input_file=<full path to wav file>
65102
--output_file=<full path to wav file>
66103
--buffer_size=<number of samples> (optional, default is 256)
104+
--filter_type=<Direct|Ambient|Reverberant> (optional, default is Ambient)
67105
```
68106
69107
## Testing
108+
70109
The library is tested using Google Test framework. The tests are located in `test` subdirectories.

obr/ambisonic_binaural_decoder/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
load("@rules_cc//cc:cc_library.bzl", "cc_library")
2+
13
package(default_visibility = ["//obr:__subpackages__"])
24

35
cc_library(

obr/ambisonic_binaural_decoder/binaural_filters/BUILD

Lines changed: 50 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,61 @@
1+
load("@rules_cc//cc:cc_library.bzl", "cc_library")
2+
13
package(default_visibility = ["//obr:__subpackages__"])
24

35
cc_library(
46
name = "binaural_filters_wrapper",
57
srcs = [
6-
"binaural_filters_1_oa_l.cc",
7-
"binaural_filters_1_oa_r.cc",
8-
"binaural_filters_2_oa_l.cc",
9-
"binaural_filters_2_oa_r.cc",
10-
"binaural_filters_3_oa_l.cc",
11-
"binaural_filters_3_oa_r.cc",
12-
"binaural_filters_4_oa_l.cc",
13-
"binaural_filters_4_oa_r.cc",
14-
"binaural_filters_5_oa_l.cc",
15-
"binaural_filters_5_oa_r.cc",
16-
"binaural_filters_6_oa_l.cc",
17-
"binaural_filters_6_oa_r.cc",
18-
"binaural_filters_7_oa_l.cc",
19-
"binaural_filters_7_oa_r.cc",
8+
"binaural_filters_1_oa_ambient_l.cc",
9+
"binaural_filters_1_oa_ambient_r.cc",
10+
"binaural_filters_1_oa_direct_l.cc",
11+
"binaural_filters_1_oa_direct_r.cc",
12+
"binaural_filters_1_oa_reverberant_l.cc",
13+
"binaural_filters_1_oa_reverberant_r.cc",
14+
"binaural_filters_2_oa_ambient_l.cc",
15+
"binaural_filters_2_oa_ambient_r.cc",
16+
"binaural_filters_2_oa_direct_l.cc",
17+
"binaural_filters_2_oa_direct_r.cc",
18+
"binaural_filters_2_oa_reverberant_l.cc",
19+
"binaural_filters_2_oa_reverberant_r.cc",
20+
"binaural_filters_3_oa_ambient_l.cc",
21+
"binaural_filters_3_oa_ambient_r.cc",
22+
"binaural_filters_3_oa_direct_l.cc",
23+
"binaural_filters_3_oa_direct_r.cc",
24+
"binaural_filters_3_oa_reverberant_l.cc",
25+
"binaural_filters_3_oa_reverberant_r.cc",
26+
"binaural_filters_4_oa_ambient_l.cc",
27+
"binaural_filters_4_oa_ambient_r.cc",
28+
"binaural_filters_4_oa_direct_l.cc",
29+
"binaural_filters_4_oa_direct_r.cc",
30+
"binaural_filters_4_oa_reverberant_l.cc",
31+
"binaural_filters_4_oa_reverberant_r.cc",
2032
"binaural_filters_wrapper.cc",
2133
],
2234
hdrs = [
23-
"binaural_filters_1_oa_l.h",
24-
"binaural_filters_1_oa_r.h",
25-
"binaural_filters_2_oa_l.h",
26-
"binaural_filters_2_oa_r.h",
27-
"binaural_filters_3_oa_l.h",
28-
"binaural_filters_3_oa_r.h",
29-
"binaural_filters_4_oa_l.h",
30-
"binaural_filters_4_oa_r.h",
31-
"binaural_filters_5_oa_l.h",
32-
"binaural_filters_5_oa_r.h",
33-
"binaural_filters_6_oa_l.h",
34-
"binaural_filters_6_oa_r.h",
35-
"binaural_filters_7_oa_l.h",
36-
"binaural_filters_7_oa_r.h",
35+
"binaural_filters_1_oa_ambient_l.h",
36+
"binaural_filters_1_oa_ambient_r.h",
37+
"binaural_filters_1_oa_direct_l.h",
38+
"binaural_filters_1_oa_direct_r.h",
39+
"binaural_filters_1_oa_reverberant_l.h",
40+
"binaural_filters_1_oa_reverberant_r.h",
41+
"binaural_filters_2_oa_ambient_l.h",
42+
"binaural_filters_2_oa_ambient_r.h",
43+
"binaural_filters_2_oa_direct_l.h",
44+
"binaural_filters_2_oa_direct_r.h",
45+
"binaural_filters_2_oa_reverberant_l.h",
46+
"binaural_filters_2_oa_reverberant_r.h",
47+
"binaural_filters_3_oa_ambient_l.h",
48+
"binaural_filters_3_oa_ambient_r.h",
49+
"binaural_filters_3_oa_direct_l.h",
50+
"binaural_filters_3_oa_direct_r.h",
51+
"binaural_filters_3_oa_reverberant_l.h",
52+
"binaural_filters_3_oa_reverberant_r.h",
53+
"binaural_filters_4_oa_ambient_l.h",
54+
"binaural_filters_4_oa_ambient_r.h",
55+
"binaural_filters_4_oa_direct_l.h",
56+
"binaural_filters_4_oa_direct_r.h",
57+
"binaural_filters_4_oa_reverberant_l.h",
58+
"binaural_filters_4_oa_reverberant_r.h",
3759
"binaural_filters_wrapper.h",
3860
],
3961
deps = [],

0 commit comments

Comments
 (0)