audio: switch waveout backend to pull rendering

This commit is contained in:
2026-04-14 19:04:18 +08:00
parent e77dbe40b1
commit 882df1ae5a
10 changed files with 378 additions and 94 deletions

View File

@@ -23,23 +23,40 @@ namespace {
#ifdef _WIN32
TEST(WaveOutBackend, ProcessAudioCopiesOnlyRequestedSamplesIntoPendingMixBuffer) {
TEST(WaveOutBackend, RenderCallbackCanDrivePcm16ConversionForPullModel) {
WaveOut::WaveOutBackend backend;
backend.m_pendingMixBuffer.assign(8, 1.0f);
backend.m_config.bufferSize = 2;
backend.m_config.channels = 2;
backend.m_config.sampleRate = 48000;
float input[] = {0.25f, -0.5f, 0.75f, -1.0f};
backend.ProcessAudio(input, 2, 2, 48000);
bool callbackInvoked = false;
backend.SetRenderCallback(
[&callbackInvoked](float* buffer, uint32 frameCount, uint32 channels, uint32 sampleRate) {
callbackInvoked = true;
EXPECT_EQ(frameCount, 2u);
EXPECT_EQ(channels, 2u);
EXPECT_EQ(sampleRate, 48000u);
ASSERT_EQ(backend.m_pendingMixBuffer.size(), 8u);
EXPECT_TRUE(backend.m_hasPendingMix);
EXPECT_FLOAT_EQ(backend.m_pendingMixBuffer[0], 0.25f);
EXPECT_FLOAT_EQ(backend.m_pendingMixBuffer[1], -0.5f);
EXPECT_FLOAT_EQ(backend.m_pendingMixBuffer[2], 0.75f);
EXPECT_FLOAT_EQ(backend.m_pendingMixBuffer[3], -1.0f);
EXPECT_FLOAT_EQ(backend.m_pendingMixBuffer[4], 0.0f);
EXPECT_FLOAT_EQ(backend.m_pendingMixBuffer[5], 0.0f);
EXPECT_FLOAT_EQ(backend.m_pendingMixBuffer[6], 0.0f);
EXPECT_FLOAT_EQ(backend.m_pendingMixBuffer[7], 0.0f);
buffer[0] = 0.25f;
buffer[1] = -0.5f;
buffer[2] = 0.75f;
buffer[3] = -1.0f;
});
backend.m_renderBuffer.assign(4, 0.0f);
ASSERT_TRUE(static_cast<bool>(backend.m_renderCallback));
backend.m_renderCallback(backend.m_renderBuffer.data(), 2, 2, 48000);
std::vector<int16_t> output(4, 0);
WaveOut::WaveOutBackend::FillPcm16Buffer(output, backend.m_renderBuffer);
EXPECT_TRUE(backend.UsesPullModel());
EXPECT_TRUE(callbackInvoked);
ASSERT_EQ(output.size(), 4u);
EXPECT_EQ(output[0], 8191);
EXPECT_EQ(output[1], -16383);
EXPECT_EQ(output[2], 24575);
EXPECT_EQ(output[3], -32767);
}
TEST(WaveOutBackend, SetDeviceAcceptsDefaultDeviceBeforeInitialize) {