forked from mia/Aegisub
The buffer length/wanted latency in the dsound2 audio player are now tweakable in config.dat; the options are called "audio dsound buffer latency" and "audio dsound buffer length" respectively. Defaults to 100/5 respectively (should work for the people who used to get buffer errors); for better responsiveness try 80/4.
Originally committed to SVN as r2905.
This commit is contained in:
parent
4d83215690
commit
732ccbbb26
3 changed files with 30 additions and 11 deletions
|
@ -48,6 +48,7 @@
|
|||
#include "utils.h"
|
||||
#include "main.h"
|
||||
#include "frame_main.h"
|
||||
#include "options.h"
|
||||
#include "audio_player_dsound2.h"
|
||||
|
||||
|
||||
|
@ -131,12 +132,15 @@ class DirectSoundPlayer2Thread {
|
|||
int64_t start_frame;
|
||||
int64_t end_frame;
|
||||
|
||||
int wanted_latency;
|
||||
int buffer_length;
|
||||
|
||||
DWORD last_playback_restart;
|
||||
|
||||
AudioProvider *provider;
|
||||
|
||||
public:
|
||||
DirectSoundPlayer2Thread(AudioProvider *provider);
|
||||
DirectSoundPlayer2Thread(AudioProvider *provider, int WantedLatency, int BufferLength);
|
||||
~DirectSoundPlayer2Thread();
|
||||
|
||||
void Play(int64_t start, int64_t count);
|
||||
|
@ -159,11 +163,6 @@ unsigned int __stdcall DirectSoundPlayer2Thread::ThreadProc(void *parameter)
|
|||
}
|
||||
|
||||
|
||||
#define WANTED_LATENCY 80
|
||||
#define BUFFER_LENGTH 4
|
||||
// The buffer will hold BUFFER_LENGTH times WANTED_LATENCY milliseconds of audio
|
||||
|
||||
|
||||
void DirectSoundPlayer2Thread::Run()
|
||||
{
|
||||
#define REPORT_ERROR(msg) { error_message = _T("DirectSoundPlayer2Thread: ") _T(msg); SetEvent(error_happened); return; }
|
||||
|
@ -194,7 +193,7 @@ void DirectSoundPlayer2Thread::Run()
|
|||
waveFormat.cbSize = sizeof(waveFormat);
|
||||
|
||||
// And the buffer itself
|
||||
int aim = waveFormat.nAvgBytesPerSec * (WANTED_LATENCY*BUFFER_LENGTH)/1000;
|
||||
int aim = waveFormat.nAvgBytesPerSec * (wanted_latency*buffer_length)/1000;
|
||||
int min = DSBSIZE_MIN;
|
||||
int max = DSBSIZE_MAX;
|
||||
DWORD bufSize = MIN(MAX(min,aim),max); // size of entier playback buffer
|
||||
|
@ -239,7 +238,7 @@ void DirectSoundPlayer2Thread::Run()
|
|||
|
||||
while (running)
|
||||
{
|
||||
DWORD wait_result = WaitForMultipleObjects(sizeof(events_to_wait)/sizeof(HANDLE), events_to_wait, FALSE, WANTED_LATENCY);
|
||||
DWORD wait_result = WaitForMultipleObjects(sizeof(events_to_wait)/sizeof(HANDLE), events_to_wait, FALSE, wanted_latency);
|
||||
|
||||
switch (wait_result)
|
||||
{
|
||||
|
@ -475,7 +474,7 @@ void DirectSoundPlayer2Thread::CheckError()
|
|||
}
|
||||
|
||||
|
||||
DirectSoundPlayer2Thread::DirectSoundPlayer2Thread(AudioProvider *provider)
|
||||
DirectSoundPlayer2Thread::DirectSoundPlayer2Thread(AudioProvider *provider, int _WantedLatency, int _BufferLength)
|
||||
{
|
||||
event_start_playback = CreateEvent(0, FALSE, FALSE, 0);
|
||||
event_stop_playback = CreateEvent(0, FALSE, FALSE, 0);
|
||||
|
@ -492,6 +491,9 @@ DirectSoundPlayer2Thread::DirectSoundPlayer2Thread(AudioProvider *provider)
|
|||
start_frame = 0;
|
||||
end_frame = 0;
|
||||
|
||||
wanted_latency = _WantedLatency;
|
||||
buffer_length = _BufferLength;
|
||||
|
||||
this->provider = provider;
|
||||
|
||||
thread_handle = (HANDLE)_beginthreadex(0, 0, ThreadProc, this, 0, 0);
|
||||
|
@ -613,6 +615,16 @@ double DirectSoundPlayer2Thread::GetVolume()
|
|||
DirectSoundPlayer2::DirectSoundPlayer2()
|
||||
{
|
||||
thread = 0;
|
||||
|
||||
// The buffer will hold BufferLength times WantedLatency milliseconds of audio
|
||||
WantedLatency = Options.AsInt(_T("Audio dsound buffer latency"));
|
||||
BufferLength = Options.AsInt(_T("Audio dsound buffer length"));
|
||||
|
||||
// sanity checking
|
||||
if (WantedLatency <= 0)
|
||||
WantedLatency = 100;
|
||||
if (BufferLength <= 0)
|
||||
BufferLength = 5;
|
||||
}
|
||||
|
||||
|
||||
|
@ -628,7 +640,7 @@ void DirectSoundPlayer2::OpenStream()
|
|||
|
||||
try
|
||||
{
|
||||
thread = new DirectSoundPlayer2Thread(GetProvider());
|
||||
thread = new DirectSoundPlayer2Thread(GetProvider(), WantedLatency, BufferLength);
|
||||
}
|
||||
catch (const wxChar *msg)
|
||||
{
|
||||
|
@ -661,7 +673,7 @@ void DirectSoundPlayer2::SetProvider(AudioProvider *provider)
|
|||
if (thread && provider != GetProvider())
|
||||
{
|
||||
delete thread;
|
||||
thread = new DirectSoundPlayer2Thread(provider);
|
||||
thread = new DirectSoundPlayer2Thread(provider, WantedLatency, BufferLength);
|
||||
}
|
||||
|
||||
AudioPlayer::SetProvider(provider);
|
||||
|
|
|
@ -45,6 +45,10 @@ class DirectSoundPlayer2Thread;
|
|||
class DirectSoundPlayer2 : public AudioPlayer {
|
||||
DirectSoundPlayer2Thread *thread;
|
||||
|
||||
protected:
|
||||
int WantedLatency;
|
||||
int BufferLength;
|
||||
|
||||
public:
|
||||
DirectSoundPlayer2();
|
||||
~DirectSoundPlayer2();
|
||||
|
|
|
@ -219,6 +219,9 @@ void OptionsManager::LoadDefaults(bool onlyDefaults,bool doOverride) {
|
|||
SetInt(_T("Audio Spectrum Cutoff"),0);
|
||||
SetInt(_T("Audio Spectrum Quality"),1);
|
||||
SetInt(_T("Audio Spectrum Memory Max"),128); // megabytes
|
||||
// and this one could do with just reiniting the audio player
|
||||
SetInt(_T("Audio dsound buffer latency"), 100);
|
||||
SetInt(_T("Audio dsound buffer length"), 5);
|
||||
|
||||
// Automation
|
||||
// The path changes only take effect when a script is (re)loaded but Automatic should be good enough, it certainly doesn't warrart a restart
|
||||
|
|
Loading…
Reference in a new issue