diff --git a/audio/dsoundaudio.c b/audio/dsoundaudio.c index c265c0094b..b6bc241faa 100644 --- a/audio/dsoundaudio.c +++ b/audio/dsoundaudio.c @@ -53,6 +53,9 @@ typedef struct { typedef struct { HWVoiceOut hw; LPDIRECTSOUNDBUFFER dsound_buffer; + void *buffer1, buffer2; + DWORD size1, size2; + bool has_remaining; dsound *s; } DSoundVoiceOut; @@ -414,10 +417,16 @@ static void *dsound_get_buffer_out(HWVoiceOut *hw, size_t *size) DSoundVoiceOut *ds = (DSoundVoiceOut *) hw; LPDIRECTSOUNDBUFFER dsb = ds->dsound_buffer; HRESULT hr; - DWORD ppos, act_size; + DWORD ppos, act_size1, act_size2; size_t req_size; int err; - void *ret; + void *ret1, *ret2; + + if (ds->has_remaining) { + ds->has_remaining = false; + *size = ds->size2; + return ds->buffer2; + } hr = IDirectSoundBuffer_GetCurrentPosition(dsb, &ppos, NULL); if (FAILED(hr)) { @@ -429,15 +438,20 @@ static void *dsound_get_buffer_out(HWVoiceOut *hw, size_t *size) req_size = audio_ring_dist(ppos, hw->pos_emul, hw->size_emul); req_size = MIN(req_size, hw->size_emul - hw->pos_emul); - err = dsound_lock_out(dsb, &hw->info, hw->pos_emul, req_size, &ret, NULL, - &act_size, NULL, false, ds->s); + err = dsound_lock_out(dsb, &hw->info, hw->pos_emul, req_size, &ret1, &ret2, + &act_size1, &act_size2, false, ds->s); if (err) { dolog("Failed to lock buffer\n"); *size = 0; return NULL; } - *size = act_size; + *size = act_size1; + ds->buffer1 = ret1; + ds->buffer2 = ret2; + ds->size1 = act_size1; + ds->size2 = act_size2; + ds->has_remaining = ret2 != NULL; return ret; } @@ -445,7 +459,16 @@ static size_t dsound_put_buffer_out(HWVoiceOut *hw, void *buf, size_t len) { DSoundVoiceOut *ds = (DSoundVoiceOut *) hw; LPDIRECTSOUNDBUFFER dsb = ds->dsound_buffer; - int err = dsound_unlock_out(dsb, buf, NULL, len, 0); + int err; + + if (ds->has_remaining) { + ds->size1 = len; + hw->pos_emul = (hw->pos_emul + len) % hw->size_emul; + return len; + } + + *(ds->buffer2 ? &ds->size2 : &ds->size1) = len; + err = dsound_unlock_out(dsb, ds->buffer1, ds->buffer2, ds->size1, ds->size2); if (err) { dolog("Failed to unlock buffer!!\n");