commit 4407671260579ab82834a81c18fe72d8f59c77f5
parent fc84989374baf6eac06941c9c953e456ffec0ddc
Author: Karl Tomlinson <karlt+@karlt.net>
Date: Wed, 8 Oct 2025 05:54:48 +0000
Bug 1992922 Tighten TestSlowStart NotifyInputData() frame count expectations r=pehrsons
The WEBAUDIO_BLOCK_SIZE tolerance was only large enough while aAlreadyBuffered
was always <= WEBAUDIO_BLOCK_SIZE.
A subsequent patch will mean that aAlreadyBuffered is sometimes greater than
WEBAUDIO_BLOCK_SIZE.
The expectation at the end of the test had the incorrect sign on
alreadyBuffered.
Differential Revision: https://phabricator.services.mozilla.com/D267739
Diffstat:
1 file changed, 24 insertions(+), 13 deletions(-)
diff --git a/dom/media/gtest/TestAudioCallbackDriver.cpp b/dom/media/gtest/TestAudioCallbackDriver.cpp
@@ -154,29 +154,37 @@ void TestSlowStart(const TrackRate aRate) MOZ_CAN_RUN_SCRIPT_BOUNDARY {
nsIThread* mainThread = NS_GetCurrentThread();
Maybe<int64_t> audioStart;
- Maybe<uint32_t> alreadyBuffered;
+ Maybe<uint32_t> firstAlreadyBuffered;
int64_t inputFrameCount = 0;
int64_t processedFrameCount = -1;
ON_CALL(*graph, NotifyInputData)
.WillByDefault([&](const AudioDataValue*, size_t aFrames, TrackRate,
uint32_t, uint32_t aAlreadyBuffered) {
if (!audioStart) {
+ // GraphDrivers advance state computed time only in block size
+ // increments and AudioCallbackDriver first advances state computed
+ // time in the same iteration as NotifyInputData() is first called,
+ // so the frame after firstAlreadyBuffered.value() aligns with a
+ // block boundary in state computed time.
audioStart = Some(graph->StateComputedTime());
- alreadyBuffered = Some(aAlreadyBuffered);
+ firstAlreadyBuffered = Some(aAlreadyBuffered);
mainThread->Dispatch(NS_NewRunnableFunction(__func__, [&] {
// Start processedFrameCount now, ignoring frames processed while
// waiting for the fallback driver to stop.
processedFrameCount = 0;
}));
}
- EXPECT_NEAR(inputFrameCount,
- static_cast<int64_t>(graph->StateComputedTime() -
- *audioStart + *alreadyBuffered),
- WEBAUDIO_BLOCK_SIZE)
+ EXPECT_EQ(
+ PR_ROUNDUP(
+ inputFrameCount + aAlreadyBuffered - *firstAlreadyBuffered,
+ WEBAUDIO_BLOCK_SIZE),
+ static_cast<int64_t>(graph->StateComputedTime() - *audioStart))
<< "Input should be behind state time, due to the delayed start. "
- "stateComputedTime="
- << graph->StateComputedTime() << ", audioStartTime=" << *audioStart
- << ", alreadyBuffered=" << *alreadyBuffered;
+ << "inputFrameCount=" << inputFrameCount
+ << ", firstAlreadyBuffered=" << *firstAlreadyBuffered
+ << ", aAlreadyBuffered=" << aAlreadyBuffered
+ << ", stateComputedTime=" << graph->StateComputedTime()
+ << ", audioStartTime=" << *audioStart;
inputFrameCount += aFrames;
});
@@ -234,10 +242,13 @@ void TestSlowStart(const TrackRate aRate) MOZ_CAN_RUN_SCRIPT_BOUNDARY {
processedListener.Disconnect();
EXPECT_EQ(inputFrameCount, processedFrameCount);
- EXPECT_NEAR(graph->StateComputedTime() - *audioStart,
- inputFrameCount + *alreadyBuffered, WEBAUDIO_BLOCK_SIZE)
- << "Graph progresses while audio driver runs. stateComputedTime="
- << graph->StateComputedTime() << ", inputFrameCount=" << inputFrameCount;
+ EXPECT_EQ(
+ graph->StateComputedTime() - *audioStart,
+ PR_ROUNDUP(inputFrameCount - *firstAlreadyBuffered, WEBAUDIO_BLOCK_SIZE))
+ << "Graph progresses while audio driver runs. "
+ << "stateComputedTime=" << graph->StateComputedTime()
+ << ", inputFrameCount=" << inputFrameCount
+ << ", firstAlreadyBuffered=" << *firstAlreadyBuffered;
}
TEST(TestAudioCallbackDriver, SlowStart)