Make WASAPIAudioOutputStream report glitch stats.
Bug: 1384499
Change-Id: Ie230b7b129d1833623fb9b5f0bf69be8c536f359
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4225492
Reviewed-by: Olga Sharonova <olka@chromium.org>
Reviewed-by: Sam Zackrisson <saza@chromium.org>
Commit-Queue: Fredrik Hernqvist <fhernqvist@google.com>
Cr-Commit-Position: refs/heads/main@{#1107660}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
f28e5260f7
commit
f3753645fe
@ -29,6 +29,7 @@
|
||||
#include "media/audio/win/audio_session_event_listener_win.h"
|
||||
#include "media/audio/win/avrt_wrapper_win.h"
|
||||
#include "media/audio/win/core_audio_util_win.h"
|
||||
#include "media/base/audio_glitch_info.h"
|
||||
#include "media/base/audio_sample_types.h"
|
||||
#include "media/base/limits.h"
|
||||
#include "media/base/media_switches.h"
|
||||
@ -670,6 +671,8 @@ bool WASAPIAudioOutputStream::RenderAudioFromSource(UINT64 device_frequency) {
|
||||
UINT64 qpc_position = 0;
|
||||
base::TimeDelta delay;
|
||||
base::TimeTicks delay_timestamp;
|
||||
// Stores glitch info to be passed on to OnMoreData().
|
||||
AudioGlitchInfo::Accumulator glitch_info_accumulator;
|
||||
hr = audio_clock_->GetPosition(&position, &qpc_position);
|
||||
if (SUCCEEDED(hr)) {
|
||||
// Number of frames already played out through the speaker.
|
||||
@ -699,9 +702,16 @@ bool WASAPIAudioOutputStream::RenderAudioFromSource(UINT64 device_frequency) {
|
||||
|
||||
const int64_t gap_duration_us = qpc_position_diff_us - position_diff_us;
|
||||
|
||||
glitch_reporter_.UpdateStats(gap_duration_us > buffer_duration_us / 2
|
||||
// TODO(crbug.com/1417946): Investigate precisely what gap duration
|
||||
// should be counted as a glitch.
|
||||
bool is_glitch = gap_duration_us > buffer_duration_us / 2;
|
||||
glitch_reporter_.UpdateStats(is_glitch
|
||||
? base::Microseconds(gap_duration_us)
|
||||
: base::TimeDelta());
|
||||
if (is_glitch) {
|
||||
glitch_info_accumulator.Add(
|
||||
{.duration = base::Microseconds(gap_duration_us), .count = 1});
|
||||
}
|
||||
}
|
||||
|
||||
last_position_ = position;
|
||||
@ -736,8 +746,9 @@ bool WASAPIAudioOutputStream::RenderAudioFromSource(UINT64 device_frequency) {
|
||||
std::unique_ptr<AudioBus> audio_bus(
|
||||
AudioBus::WrapMemory(params_, audio_data));
|
||||
audio_bus_->set_is_bitstream_format(true);
|
||||
int frames_filled =
|
||||
source_->OnMoreData(delay, delay_timestamp, {}, audio_bus.get());
|
||||
int frames_filled = source_->OnMoreData(
|
||||
delay, delay_timestamp, glitch_info_accumulator.GetAndReset(),
|
||||
audio_bus.get());
|
||||
|
||||
// During pause/seek, keep the pipeline filled with zero'ed frames.
|
||||
if (!frames_filled)
|
||||
@ -750,8 +761,9 @@ bool WASAPIAudioOutputStream::RenderAudioFromSource(UINT64 device_frequency) {
|
||||
return true;
|
||||
}
|
||||
#endif // BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
|
||||
int frames_filled =
|
||||
source_->OnMoreData(delay, delay_timestamp, {}, audio_bus_.get());
|
||||
int frames_filled = source_->OnMoreData(
|
||||
delay, delay_timestamp, glitch_info_accumulator.GetAndReset(),
|
||||
audio_bus_.get());
|
||||
uint32_t num_filled_bytes = frames_filled * format_.Format.nBlockAlign;
|
||||
DCHECK_LE(num_filled_bytes, packet_size_bytes_);
|
||||
audio_bus_->Scale(volume_);
|
||||
|
Reference in New Issue
Block a user