mirror of https://github.com/snes9xgit/snes9x.git
win32: XAudio2: Allow partially filling sample blocks.
Use minimal Snes9x-side buffer with XAudio2.
This commit is contained in:
parent
2701e7219c
commit
d8579ff9cb
|
@ -146,7 +146,7 @@ bool CXAudio2::InitVoices(void)
|
|||
wfx.cbSize = 0;
|
||||
|
||||
if( FAILED(hr = pXAudio2->CreateSourceVoice(&pSourceVoice, (WAVEFORMATEX*)&wfx,
|
||||
XAUDIO2_VOICE_NOSRC , XAUDIO2_DEFAULT_FREQ_RATIO, this, NULL, NULL ) ) ) {
|
||||
XAUDIO2_VOICE_USEFILTER, XAUDIO2_DEFAULT_FREQ_RATIO, this, NULL, NULL ) ) ) {
|
||||
DXTRACE_ERR_MSGBOX(TEXT("Unable to create source voice."),hr);
|
||||
return false;
|
||||
}
|
||||
|
@ -239,6 +239,7 @@ bool CXAudio2::SetupSound()
|
|||
{
|
||||
soundBuffer = new uint8[sum_bufferSize];
|
||||
writeOffset = 0;
|
||||
partialOffset = 0;
|
||||
}
|
||||
else {
|
||||
DeInitVoices();
|
||||
|
@ -275,7 +276,7 @@ the OnBufferComplete callback.
|
|||
*/
|
||||
void CXAudio2::ProcessSound()
|
||||
{
|
||||
int freeBytes = (blockCount - bufferCount) * singleBufferBytes;
|
||||
int freeBytes = ((blockCount - bufferCount) * singleBufferBytes) - partialOffset;
|
||||
|
||||
if (Settings.DynamicRateControl)
|
||||
{
|
||||
|
@ -302,15 +303,38 @@ void CXAudio2::ProcessSound()
|
|||
if(!initDone)
|
||||
return;
|
||||
|
||||
BYTE * curBuffer;
|
||||
if (partialOffset != 0) {
|
||||
BYTE *offsetBuffer = soundBuffer + writeOffset + partialOffset;
|
||||
UINT32 samplesleftinblock = (singleBufferBytes - partialOffset) >> (Settings.SixteenBitSound ? 1 : 0);
|
||||
if (availableSamples < ((singleBufferBytes - partialOffset) >> (Settings.SixteenBitSound ? 1 : 0)))
|
||||
{
|
||||
S9xMixSamples(offsetBuffer, availableSamples);
|
||||
partialOffset += availableSamples << (Settings.SixteenBitSound ? 1 : 0);
|
||||
availableSamples = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
S9xMixSamples(offsetBuffer, samplesleftinblock);
|
||||
partialOffset = 0;
|
||||
availableSamples -= samplesleftinblock;
|
||||
PushBuffer(singleBufferBytes, soundBuffer + writeOffset, NULL);
|
||||
writeOffset += singleBufferBytes;
|
||||
writeOffset %= sum_bufferSize;
|
||||
}
|
||||
}
|
||||
|
||||
while(availableSamples > singleBufferSamples && bufferCount < blockCount) {
|
||||
curBuffer = soundBuffer + writeOffset;
|
||||
S9xMixSamples(curBuffer,singleBufferSamples);
|
||||
PushBuffer(singleBufferBytes,curBuffer,NULL);
|
||||
writeOffset+=singleBufferBytes;
|
||||
writeOffset%=sum_bufferSize;
|
||||
availableSamples -= singleBufferSamples;
|
||||
while (availableSamples > singleBufferSamples && bufferCount < blockCount) {
|
||||
BYTE *curBuffer = soundBuffer + writeOffset;
|
||||
S9xMixSamples(curBuffer, singleBufferSamples);
|
||||
PushBuffer(singleBufferBytes, curBuffer, NULL);
|
||||
writeOffset += singleBufferBytes;
|
||||
writeOffset %= sum_bufferSize;
|
||||
availableSamples -= singleBufferSamples;
|
||||
}
|
||||
|
||||
if (availableSamples > 0 && bufferCount < blockCount) {
|
||||
S9xMixSamples(soundBuffer + writeOffset, availableSamples);
|
||||
partialOffset = availableSamples << (Settings.SixteenBitSound ? 1 : 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -26,9 +26,9 @@ private:
|
|||
UINT32 singleBufferSamples; // samples in one block
|
||||
UINT32 singleBufferBytes; // bytes in one block
|
||||
UINT32 blockCount; // soundBuffer is divided into blockCount blocks
|
||||
// currently set to 4
|
||||
|
||||
// currently set to 8
|
||||
UINT32 writeOffset; // offset into the buffer for the next block
|
||||
UINT32 partialOffset; // offset into non-complete block
|
||||
uint8 *soundBuffer; // the buffer itself
|
||||
|
||||
bool InitVoices(void);
|
||||
|
|
|
@ -51,7 +51,10 @@ bool ReInitSound()
|
|||
if(S9xSoundOutput)
|
||||
S9xSoundOutput->DeInitSoundOutput();
|
||||
|
||||
return S9xInitSound(GUI.SoundBufferSize,0);
|
||||
if (S9xSoundOutput == &S9xDirectSound)
|
||||
return S9xInitSound(GUI.SoundBufferSize, 0);
|
||||
else
|
||||
return S9xInitSound(0, 0);
|
||||
}
|
||||
|
||||
void CloseSoundDevice() {
|
||||
|
|
Loading…
Reference in New Issue