2019-12-26 14:45:42 -05:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
2018-09-25 10:11:35 -04:00
|
|
|
|
|
|
|
|
#include "AudioMixerNullDevice.h"
|
|
|
|
|
#include "CoreMinimal.h"
|
|
|
|
|
#include "HAL/PlatformProcess.h"
|
2019-09-26 08:12:08 -04:00
|
|
|
#include "HAL/PlatformTime.h"
|
2018-09-25 10:11:35 -04:00
|
|
|
|
|
|
|
|
namespace Audio
|
|
|
|
|
{
|
|
|
|
|
uint32 FMixerNullCallback::Run()
|
|
|
|
|
{
|
2019-09-26 07:27:04 -04:00
|
|
|
//
|
|
|
|
|
// To simulate an audio device requesting for more audio, we sleep between callbacks.
|
|
|
|
|
// The problem with this is that Sleep is not accurate. It will always be slightly higher than requested,
|
|
|
|
|
// which means that audio will be generated slightly slower than the stated sample rate.
|
|
|
|
|
// To correct this, we keep track of the real time passed, and adjust the sleep time accordingly so the audio clock
|
|
|
|
|
// stays as close to the real time clock as possible.
|
|
|
|
|
|
|
|
|
|
double AudioClock = FPlatformTime::Seconds();
|
|
|
|
|
|
|
|
|
|
float SleepTime = CallbackTime;
|
2018-09-25 10:11:35 -04:00
|
|
|
while (!bShouldShutdown)
|
|
|
|
|
{
|
|
|
|
|
Callback();
|
2019-09-26 07:27:04 -04:00
|
|
|
FPlatformProcess::Sleep(FMath::Max(0.f, SleepTime));
|
|
|
|
|
|
|
|
|
|
AudioClock += CallbackTime;
|
|
|
|
|
double RealClock = FPlatformTime::Seconds();
|
|
|
|
|
double AudioVsReal = RealClock - AudioClock;
|
|
|
|
|
// For the next sleep, we adjust the sleep duration to try and keep the audio clock as close
|
|
|
|
|
// to the real time clock as possible
|
|
|
|
|
SleepTime = CallbackTime - AudioVsReal;
|
2018-09-25 10:11:35 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2019-08-26 18:35:22 -04:00
|
|
|
FMixerNullCallback::FMixerNullCallback(float BufferDuration, TFunction<void()> InCallback, EThreadPriority ThreadPriority)
|
2018-09-25 10:11:35 -04:00
|
|
|
: Callback(InCallback)
|
|
|
|
|
, CallbackTime(BufferDuration)
|
|
|
|
|
, bShouldShutdown(false)
|
|
|
|
|
{
|
2019-08-26 18:35:22 -04:00
|
|
|
CallbackThread.Reset(FRunnableThread::Create(this, TEXT("AudioMixerNullCallbackThread"), 0, ThreadPriority, FPlatformAffinity::GetAudioThreadMask()));
|
2018-09-25 10:11:35 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FMixerNullCallback::~FMixerNullCallback()
|
|
|
|
|
{
|
|
|
|
|
bShouldShutdown = true;
|
|
|
|
|
CallbackThread->Kill(true);
|
|
|
|
|
}
|
|
|
|
|
}
|