fix audio desync for realsies, stderr to log.txt

This commit is contained in:
2026-03-10 00:36:21 -04:00
parent c11b404392
commit 1b5ba6b584
13 changed files with 347 additions and 21 deletions
+34 -2
View File
@@ -1,5 +1,7 @@
#include "audio_stream.hpp"
#include <algorithm>
#if defined(__clang__) || defined(__GNUC__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
@@ -10,16 +12,46 @@ namespace anm2ed
void AudioStream::callback(void* userData, MIX_Mixer* mixer, const SDL_AudioSpec* spec, float* pcm, int samples)
{
auto self = (AudioStream*)userData;
if (!self->isFirstCallbackCaptured)
{
self->firstCallbackCounter = SDL_GetPerformanceCounter();
self->isFirstCallbackCaptured = true;
}
self->callbackSamples = samples;
self->stream.insert(self->stream.end(), pcm, pcm + samples);
}
AudioStream::AudioStream(MIX_Mixer* mixer) { MIX_GetMixerFormat(mixer, &spec); }
void AudioStream::capture_begin(MIX_Mixer* mixer) { MIX_SetPostMixCallback(mixer, callback, this); }
void AudioStream::capture_begin(MIX_Mixer* mixer)
{
stream.clear();
callbackSamples = 0;
captureStartCounter = SDL_GetPerformanceCounter();
firstCallbackCounter = 0;
isFirstCallbackCaptured = false;
MIX_SetPostMixCallback(mixer, callback, this);
}
void AudioStream::capture_end(MIX_Mixer* mixer)
{
MIX_SetPostMixCallback(mixer, nullptr, this);
stream.clear();
}
}
double AudioStream::callback_latency_seconds_get() const
{
auto freq = std::max(spec.freq, 1);
auto channels = std::max(spec.channels, 1);
auto framesPerCallback = (double)callbackSamples / (double)channels;
return framesPerCallback / (double)freq;
}
double AudioStream::capture_start_delay_seconds_get() const
{
if (!isFirstCallbackCaptured || captureStartCounter == 0 || firstCallbackCounter < captureStartCounter) return 0.0;
auto frequency = SDL_GetPerformanceFrequency();
if (frequency == 0) return 0.0;
return (double)(firstCallbackCounter - captureStartCounter) / (double)frequency;
}
}