Request more data before reading in OutputController

This change is guarded behind the flag
"AudioOutputControllerRequestBeforeRead".

We currently read data from the shared memory before requesting more
data. This results in one callback size of additional latency.

With the flag enabled, this change avoids the extra latency by calling
RequestMoreData() then immediately calling Read().

This significantly reduces the amount of time available to prepare audio
samples, and also requires the audio thread to wait for audio generation
to finish. This has a high probability of causing audio glitches on
systems that ran glitch-free before, and affects all audio in Chromium.
The main goal of this CL is to enable third parties to investigate if it
is possible to reach full output latency parity with native audio
applications, and to quantify the cost of doing so. For this reason the
flag is disabled by default, and there currently is no rollout plan.

Round-trip latency test results:
- https://padenot.github.io/roundtrip-latency-tester/
- Linux using PulseAudio backend

Baseline
- AudioContext sample-rate: 48000
- Measured round-trip: 126.43750000000001ms
- Computed output latency: 50ms

With --enable-features="AudioOutputControllerRequestBeforeRead"
- AudioContext sample-rate: 48000
- Measured round-trip: 115.77083333333334ms
- Computed output latency: 30ms

The buffer size was 512, so we expected a bit more than 10ms of
 improvement.

Bug: 40125311
Change-Id: I8c5565499e7ca57ffda7b80c0f75567af88de393
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4195116
Reviewed-by: Olga Sharonova <olka@chromium.org>
Commit-Queue: Michael Wilson <mjwilson@chromium.org>
Reviewed-by: Dale Curtis <dalecurtis@chromium.org>
Reviewed-by: Thomas Guilbert <tguilbert@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1457040}
2 files changed
tree: 9ed06f993487ecbaec1b6e76fbfd3b199f3973d0
  1. android_webview/
  2. apps/
  3. ash/
  4. base/
  5. build/
  6. build_overrides/
  7. buildtools/
  8. cc/
  9. chrome/
  10. chromecast/
  11. chromeos/
  12. codelabs/
  13. components/
  14. content/
  15. crypto/
  16. dbus/
  17. device/
  18. docs/
  19. extensions/
  20. fuchsia_web/
  21. gin/
  22. google_apis/
  23. gpu/
  24. headless/
  25. infra/
  26. ios/
  27. ipc/
  28. media/
  29. mojo/
  30. native_client_sdk/
  31. net/
  32. pdf/
  33. ppapi/
  34. printing/
  35. remoting/
  36. rlz/
  37. sandbox/
  38. services/
  39. skia/
  40. sql/
  41. storage/
  42. styleguide/
  43. testing/
  44. third_party/
  45. tools/
  46. ui/
  47. url/
  48. webkit/
  49. .clang-format
  50. .clang-tidy
  51. .clangd
  52. .git-blame-ignore-revs
  53. .gitallowed
  54. .gitattributes
  55. .gitignore
  56. .gitmodules
  57. .gn
  58. .mailmap
  59. .rustfmt.toml
  60. .vpython3
  61. .yapfignore
  62. ATL_OWNERS
  63. AUTHORS
  64. BUILD.gn
  65. CODE_OF_CONDUCT.md
  66. codereview.settings
  67. CPPLINT.cfg
  68. CRYPTO_OWNERS
  69. DEPS
  70. DIR_METADATA
  71. LICENSE
  72. LICENSE.chromium_os
  73. OWNERS
  74. PRESUBMIT.py
  75. PRESUBMIT_test.py
  76. PRESUBMIT_test_mocks.py
  77. README.md
  78. WATCHLISTS
README.md

Logo Chromium

Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.

The project's web site is https://www.chromium.org.

To check out the source code locally, don't use git clone! Instead, follow the instructions on how to get the code.

Documentation in the source is rooted in docs/README.md.

Learn how to Get Around the Chromium Source Code Directory Structure.

For historical reasons, there are some small top level directories. Now the guidance is that new top level directories are for product (e.g. Chrome, Android WebView, Ash). Even if these products have multiple executables, the code should be in subdirectories of the product.

If you found a bug, please file it at https://crbug.com/new.