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