Move media engine teardown logic to a new Terminate() method

This fixes a need for a recent addition of a blocking invoke in the
destructor of ConnectionContext, and also removes the blocking invoke
that's been a part of the construction of ConnectionContext for a while.

Add Terminate() methods to MediaEngineInterface and VoiceEngineInterface
as a symmetric counterpart to the existing Init() method. This follows
the existing naming convention in the media code (see e.g. AudioInput,
AudioOutput, AudioDeviceGeneric) and is not related to an ongoing
conversation about introducing blocking Terminate calls elsewhere in the
codebase.

This new method is responsible for tearing down active processing that
was started by Init(). All blocking shutdown logic (e.g., stopping audio
devices) is moved from the WebRtcVoiceEngine destructor into
Terminate().

The media engine's lifecycle is, as before, managed by ConnectionContext
but active processing is now additionally controlled through usage a
reference counting mechanism. ConnectionContext calls Init() when the
first media engine usage is registered and Terminate() when the last
usage is unregistered.

This change removes blocking calls from the ConnectionContext
constructor and destructor, simplifying shutdown and resolving potential
threading issues. A call to Init() must now always be matched by a
corresponding call to Terminate().

Bug: webrtc:42224720
Change-Id: I83e6922a9d082ee67a4d3b08b110259e88f602d9
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/410860
Reviewed-by: Per Kjellander <perkj@webrtc.org>
Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#45773}
15 files changed
tree: 3e9dd6d88736d08ec2ab308a3646fa7593c1644e
  1. api/
  2. audio/
  3. build_overrides/
  4. call/
  5. common_audio/
  6. common_video/
  7. data/
  8. docs/
  9. examples/
  10. experiments/
  11. g3doc/
  12. infra/
  13. logging/
  14. media/
  15. modules/
  16. net/
  17. p2p/
  18. pc/
  19. resources/
  20. rtc_base/
  21. rtc_tools/
  22. sdk/
  23. stats/
  24. system_wrappers/
  25. test/
  26. tools_webrtc/
  27. video/
  28. .clang-format
  29. .clang-tidy
  30. .git-blame-ignore-revs
  31. .gitignore
  32. .gn
  33. .mailmap
  34. .rustfmt.toml
  35. .style.yapf
  36. .vpython3
  37. AUTHORS
  38. BUILD.gn
  39. CODE_OF_CONDUCT.md
  40. codereview.settings
  41. DEPS
  42. DIR_METADATA
  43. ENG_REVIEW_OWNERS
  44. LICENSE
  45. license_template.txt
  46. native-api.md
  47. OWNERS
  48. OWNERS_INFRA
  49. PATENTS
  50. PRESUBMIT.py
  51. presubmit_test.py
  52. presubmit_test_mocks.py
  53. pylintrc
  54. pylintrc_old_style
  55. README.chromium
  56. README.md
  57. WATCHLISTS
  58. webrtc.gni
  59. webrtc_lib_link_test.cc
  60. whitespace.txt
README.md

WebRTC is a free, open software project that provides browsers and mobile applications with Real-Time Communications (RTC) capabilities via simple APIs. The WebRTC components have been optimized to best serve this purpose.

Our mission: To enable rich, high-quality RTC applications to be developed for the browser, mobile platforms, and IoT devices, and allow them all to communicate via a common set of protocols.

The WebRTC initiative is a project supported by Google, Mozilla and Opera, amongst others.

Development

See here for instructions on how to get started developing with the native code.

Authoritative list of directories that contain the native API header files.

More info