xref: /aosp_15_r20/external/webrtc/modules/audio_device/BUILD.gn (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1# Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
2#
3# Use of this source code is governed by a BSD-style license
4# that can be found in the LICENSE file in the root of the source
5# tree. An additional intellectual property rights grant can be found
6# in the file PATENTS.  All contributing project authors may
7# be found in the AUTHORS file in the root of the source tree.
8
9import("../../webrtc.gni")
10
11if (is_android) {
12  import("//build/config/android/config.gni")
13  import("//build/config/android/rules.gni")
14}
15
16config("audio_device_warnings_config") {
17  if (is_win && is_clang) {
18    cflags = [
19      # Disable warnings failing when compiling with Clang on Windows.
20      # https://bugs.chromium.org/p/webrtc/issues/detail?id=5366
21      "-Wno-microsoft-goto",
22    ]
23  }
24}
25
26rtc_source_set("audio_device_default") {
27  visibility = [ "*" ]
28  sources = [ "include/audio_device_default.h" ]
29  deps = [ ":audio_device_api" ]
30}
31
32rtc_source_set("audio_device") {
33  visibility = [ "*" ]
34  public_deps = [
35    ":audio_device_api",
36
37    # Deprecated.
38    # TODO(webrtc:7452): Remove this public dep. audio_device_impl should
39    # be depended on directly if needed.
40    ":audio_device_impl",
41  ]
42}
43
44rtc_source_set("audio_device_api") {
45  visibility = [ "*" ]
46  sources = [
47    "include/audio_device.h",
48    "include/audio_device_defines.h",
49  ]
50  deps = [
51    "../../api:scoped_refptr",
52    "../../api/task_queue",
53    "../../rtc_base:checks",
54    "../../rtc_base:refcount",
55    "../../rtc_base:stringutils",
56  ]
57}
58
59rtc_library("audio_device_buffer") {
60  sources = [
61    "audio_device_buffer.cc",
62    "audio_device_buffer.h",
63    "audio_device_config.h",
64    "fine_audio_buffer.cc",
65    "fine_audio_buffer.h",
66  ]
67  deps = [
68    ":audio_device_api",
69    "../../api:array_view",
70    "../../api:sequence_checker",
71    "../../api/task_queue",
72    "../../common_audio:common_audio_c",
73    "../../rtc_base:buffer",
74    "../../rtc_base:checks",
75    "../../rtc_base:event_tracer",
76    "../../rtc_base:logging",
77    "../../rtc_base:macromagic",
78    "../../rtc_base:rtc_task_queue",
79    "../../rtc_base:safe_conversions",
80    "../../rtc_base:timestamp_aligner",
81    "../../rtc_base:timeutils",
82    "../../rtc_base/synchronization:mutex",
83    "../../system_wrappers",
84    "../../system_wrappers:metrics",
85  ]
86}
87
88rtc_library("audio_device_generic") {
89  sources = [
90    "audio_device_generic.cc",
91    "audio_device_generic.h",
92  ]
93  deps = [
94    ":audio_device_api",
95    ":audio_device_buffer",
96    "../../rtc_base:logging",
97  ]
98}
99
100rtc_library("audio_device_name") {
101  sources = [
102    "audio_device_name.cc",
103    "audio_device_name.h",
104  ]
105  absl_deps = [ "//third_party/abseil-cpp/absl/strings" ]
106}
107
108rtc_source_set("windows_core_audio_utility") {
109  if (is_win && !build_with_chromium) {
110    sources = [
111      "win/core_audio_utility_win.cc",
112      "win/core_audio_utility_win.h",
113    ]
114
115    deps = [
116      ":audio_device_api",
117      ":audio_device_name",
118      "../../api/units:time_delta",
119      "../../rtc_base:checks",
120      "../../rtc_base:logging",
121      "../../rtc_base:macromagic",
122      "../../rtc_base:platform_thread_types",
123      "../../rtc_base:stringutils",
124      "../../rtc_base/win:windows_version",
125    ]
126    absl_deps = [ "//third_party/abseil-cpp/absl/strings:strings" ]
127
128    libs = [ "oleaut32.lib" ]
129  }
130}
131
132# An ADM with a dedicated factory method which does not depend on the
133# audio_device_impl target. The goal is to use this new structure and
134# gradually phase out the old design.
135# TODO(henrika): currently only supported on Windows.
136rtc_source_set("audio_device_module_from_input_and_output") {
137  visibility = [ "*" ]
138  if (is_win && !build_with_chromium) {
139    sources = [
140      "include/audio_device_factory.cc",
141      "include/audio_device_factory.h",
142    ]
143    sources += [
144      "win/audio_device_module_win.cc",
145      "win/audio_device_module_win.h",
146      "win/core_audio_base_win.cc",
147      "win/core_audio_base_win.h",
148      "win/core_audio_input_win.cc",
149      "win/core_audio_input_win.h",
150      "win/core_audio_output_win.cc",
151      "win/core_audio_output_win.h",
152    ]
153
154    deps = [
155      ":audio_device_api",
156      ":audio_device_buffer",
157      ":windows_core_audio_utility",
158      "../../api:make_ref_counted",
159      "../../api:scoped_refptr",
160      "../../api:sequence_checker",
161      "../../api/task_queue",
162      "../../rtc_base:checks",
163      "../../rtc_base:logging",
164      "../../rtc_base:macromagic",
165      "../../rtc_base:platform_thread",
166      "../../rtc_base:safe_conversions",
167      "../../rtc_base:stringutils",
168      "../../rtc_base:timeutils",
169      "../../rtc_base/win:scoped_com_initializer",
170      "../../rtc_base/win:windows_version",
171    ]
172    absl_deps = [
173      "//third_party/abseil-cpp/absl/strings:strings",
174      "//third_party/abseil-cpp/absl/types:optional",
175    ]
176  }
177}
178
179# Contains default implementations of webrtc::AudioDeviceModule for Windows,
180# Linux, Mac, iOS and Android.
181rtc_library("audio_device_impl") {
182  visibility = [ "*" ]
183  deps = [
184    ":audio_device_api",
185    ":audio_device_buffer",
186    ":audio_device_default",
187    ":audio_device_generic",
188    "../../api:array_view",
189    "../../api:make_ref_counted",
190    "../../api:refcountedbase",
191    "../../api:scoped_refptr",
192    "../../api:sequence_checker",
193    "../../api/task_queue",
194    "../../common_audio",
195    "../../common_audio:common_audio_c",
196    "../../rtc_base:buffer",
197    "../../rtc_base:checks",
198    "../../rtc_base:logging",
199    "../../rtc_base:macromagic",
200    "../../rtc_base:platform_thread",
201    "../../rtc_base:random",
202    "../../rtc_base:rtc_event",
203    "../../rtc_base:rtc_task_queue",
204    "../../rtc_base:safe_conversions",
205    "../../rtc_base:stringutils",
206    "../../rtc_base:timeutils",
207    "../../rtc_base/synchronization:mutex",
208    "../../rtc_base/system:arch",
209    "../../rtc_base/system:file_wrapper",
210    "../../rtc_base/task_utils:repeating_task",
211    "../../system_wrappers",
212    "../../system_wrappers:field_trial",
213    "../../system_wrappers:metrics",
214    "../utility",
215  ]
216  absl_deps = [
217    "//third_party/abseil-cpp/absl/base:core_headers",
218    "//third_party/abseil-cpp/absl/strings:strings",
219  ]
220  if (rtc_include_internal_audio_device && is_ios) {
221    deps += [ "../../sdk:audio_device" ]
222  }
223
224  sources = [
225    "dummy/audio_device_dummy.cc",
226    "dummy/audio_device_dummy.h",
227    "dummy/file_audio_device.cc",
228    "dummy/file_audio_device.h",
229    "include/fake_audio_device.h",
230    "include/test_audio_device.cc",
231    "include/test_audio_device.h",
232  ]
233
234  if (build_with_mozilla) {
235    sources += [
236      "opensl/single_rw_fifo.cc",
237      "opensl/single_rw_fifo.h",
238    ]
239  }
240
241  defines = []
242  cflags = []
243  if (rtc_audio_device_plays_sinus_tone) {
244    defines += [ "AUDIO_DEVICE_PLAYS_SINUS_TONE" ]
245  }
246  if (rtc_enable_android_aaudio) {
247    defines += [ "WEBRTC_AUDIO_DEVICE_INCLUDE_ANDROID_AAUDIO" ]
248  }
249  if (rtc_include_internal_audio_device) {
250    sources += [
251      "audio_device_data_observer.cc",
252      "audio_device_impl.cc",
253      "audio_device_impl.h",
254      "include/audio_device_data_observer.h",
255    ]
256    if (is_android) {
257      sources += [
258        "android/audio_common.h",
259        "android/audio_device_template.h",
260        "android/audio_manager.cc",
261        "android/audio_manager.h",
262        "android/audio_record_jni.cc",
263        "android/audio_record_jni.h",
264        "android/audio_track_jni.cc",
265        "android/audio_track_jni.h",
266        "android/build_info.cc",
267        "android/build_info.h",
268        "android/opensles_common.cc",
269        "android/opensles_common.h",
270        "android/opensles_player.cc",
271        "android/opensles_player.h",
272        "android/opensles_recorder.cc",
273        "android/opensles_recorder.h",
274      ]
275      libs = [
276        "log",
277        "OpenSLES",
278      ]
279      if (rtc_enable_android_aaudio) {
280        sources += [
281          "android/aaudio_player.cc",
282          "android/aaudio_player.h",
283          "android/aaudio_recorder.cc",
284          "android/aaudio_recorder.h",
285          "android/aaudio_wrapper.cc",
286          "android/aaudio_wrapper.h",
287        ]
288        libs += [ "aaudio" ]
289      }
290
291      if (build_with_mozilla) {
292        include_dirs += [
293          "/config/external/nspr",
294          "/nsprpub/lib/ds",
295          "/nsprpub/pr/include",
296        ]
297      }
298    }
299    if (rtc_use_dummy_audio_file_devices) {
300      defines += [ "WEBRTC_DUMMY_FILE_DEVICES" ]
301    } else {
302      if (is_linux || is_chromeos) {
303        sources += [
304          "linux/alsasymboltable_linux.cc",
305          "linux/alsasymboltable_linux.h",
306          "linux/audio_device_alsa_linux.cc",
307          "linux/audio_device_alsa_linux.h",
308          "linux/audio_mixer_manager_alsa_linux.cc",
309          "linux/audio_mixer_manager_alsa_linux.h",
310          "linux/latebindingsymboltable_linux.cc",
311          "linux/latebindingsymboltable_linux.h",
312        ]
313        defines += [ "WEBRTC_ENABLE_LINUX_ALSA" ]
314        libs = [ "dl" ]
315        if (rtc_use_x11) {
316          libs += [ "X11" ]
317          defines += [ "WEBRTC_USE_X11" ]
318        }
319        if (rtc_include_pulse_audio) {
320          defines += [ "WEBRTC_ENABLE_LINUX_PULSE" ]
321        }
322        sources += [
323          "linux/audio_device_pulse_linux.cc",
324          "linux/audio_device_pulse_linux.h",
325          "linux/audio_mixer_manager_pulse_linux.cc",
326          "linux/audio_mixer_manager_pulse_linux.h",
327          "linux/pulseaudiosymboltable_linux.cc",
328          "linux/pulseaudiosymboltable_linux.h",
329        ]
330      }
331      if (is_mac) {
332        sources += [
333          "mac/audio_device_mac.cc",
334          "mac/audio_device_mac.h",
335          "mac/audio_mixer_manager_mac.cc",
336          "mac/audio_mixer_manager_mac.h",
337        ]
338        deps += [
339          ":audio_device_impl_frameworks",
340          "../third_party/portaudio:mac_portaudio",
341        ]
342      }
343      if (is_win) {
344        sources += [
345          "win/audio_device_core_win.cc",
346          "win/audio_device_core_win.h",
347        ]
348        libs = [
349          # Required for the built-in WASAPI AEC.
350          "dmoguids.lib",
351          "wmcodecdspuuid.lib",
352          "amstrmid.lib",
353          "msdmo.lib",
354          "oleaut32.lib",
355        ]
356        deps += [
357          "../../rtc_base:win32",
358          "../../rtc_base/win:scoped_com_initializer",
359        ]
360      }
361      configs += [ ":audio_device_warnings_config" ]
362    }
363  } else {
364    defines = [ "WEBRTC_DUMMY_AUDIO_BUILD" ]
365  }
366
367  if (!build_with_chromium) {
368    sources += [
369      # Do not link these into Chrome since they contain static data.
370      "dummy/file_audio_device_factory.cc",
371      "dummy/file_audio_device_factory.h",
372    ]
373  }
374}
375
376if (is_mac) {
377  rtc_source_set("audio_device_impl_frameworks") {
378    visibility = [ ":*" ]
379    frameworks = [
380      # Needed for CoreGraphics:
381      "ApplicationServices.framework",
382
383      "AudioToolbox.framework",
384      "CoreAudio.framework",
385
386      # Needed for CGEventSourceKeyState in audio_device_mac.cc:
387      "CoreGraphics.framework",
388    ]
389  }
390}
391
392rtc_source_set("mock_audio_device") {
393  visibility = [ "*" ]
394  testonly = true
395  sources = [
396    "include/mock_audio_device.h",
397    "include/mock_audio_transport.h",
398    "mock_audio_device_buffer.h",
399  ]
400  deps = [
401    ":audio_device",
402    ":audio_device_buffer",
403    ":audio_device_impl",
404    "../../api:make_ref_counted",
405    "../../test:test_support",
406  ]
407}
408
409if (rtc_include_tests && !build_with_chromium) {
410  rtc_library("audio_device_unittests") {
411    testonly = true
412
413    sources = [
414      "fine_audio_buffer_unittest.cc",
415      "include/test_audio_device_unittest.cc",
416    ]
417    deps = [
418      ":audio_device",
419      ":audio_device_buffer",
420      ":audio_device_impl",
421      ":mock_audio_device",
422      "../../api:array_view",
423      "../../api:scoped_refptr",
424      "../../api:sequence_checker",
425      "../../api/task_queue",
426      "../../api/task_queue:default_task_queue_factory",
427      "../../common_audio",
428      "../../rtc_base:buffer",
429      "../../rtc_base:checks",
430      "../../rtc_base:ignore_wundef",
431      "../../rtc_base:logging",
432      "../../rtc_base:macromagic",
433      "../../rtc_base:race_checker",
434      "../../rtc_base:rtc_event",
435      "../../rtc_base:safe_conversions",
436      "../../rtc_base:timeutils",
437      "../../rtc_base/synchronization:mutex",
438      "../../system_wrappers",
439      "../../test:fileutils",
440      "../../test:test_support",
441    ]
442    absl_deps = [
443      "//third_party/abseil-cpp/absl/strings",
444      "//third_party/abseil-cpp/absl/types:optional",
445    ]
446    if (is_linux || is_chromeos || is_mac || is_win) {
447      sources += [ "audio_device_unittest.cc" ]
448    }
449    if (is_win) {
450      sources += [ "win/core_audio_utility_win_unittest.cc" ]
451      deps += [
452        ":audio_device_module_from_input_and_output",
453        ":windows_core_audio_utility",
454        "../../rtc_base/win:scoped_com_initializer",
455        "../../rtc_base/win:windows_version",
456      ]
457    }
458    if (is_android) {
459      sources += [
460        "android/audio_device_unittest.cc",
461        "android/audio_manager_unittest.cc",
462        "android/ensure_initialized.cc",
463        "android/ensure_initialized.h",
464      ]
465      deps += [
466        "../../sdk/android:internal_jni",
467        "../../sdk/android:libjingle_peerconnection_java",
468        "../../sdk/android:native_api_jni",
469        "../../sdk/android:native_test_jni_onload",
470        "../utility",
471      ]
472    }
473    if (!rtc_include_internal_audio_device) {
474      defines = [ "WEBRTC_DUMMY_AUDIO_BUILD" ]
475    }
476  }
477}
478
479if (!build_with_chromium && is_android) {
480  rtc_android_library("audio_device_java") {
481    sources = [
482      "android/java/src/org/webrtc/voiceengine/BuildInfo.java",
483      "android/java/src/org/webrtc/voiceengine/WebRtcAudioEffects.java",
484      "android/java/src/org/webrtc/voiceengine/WebRtcAudioManager.java",
485      "android/java/src/org/webrtc/voiceengine/WebRtcAudioRecord.java",
486      "android/java/src/org/webrtc/voiceengine/WebRtcAudioTrack.java",
487      "android/java/src/org/webrtc/voiceengine/WebRtcAudioUtils.java",
488    ]
489    deps = [
490      "../../rtc_base:base_java",
491      "//third_party/androidx:androidx_annotation_annotation_java",
492    ]
493  }
494}
495