Move the data around when the ring buffer is resized so that the empty
messages are between the tosave and toget indexes.
diff --git a/dlls/winmm/winealsa/audio.c b/dlls/winmm/winealsa/audio.c
index e35c319..6b0d635 100644
--- a/dlls/winmm/winealsa/audio.c
+++ b/dlls/winmm/winealsa/audio.c
@@ -717,9 +717,22 @@
EnterCriticalSection(&omr->msg_crst);
if ((omr->msg_toget == ((omr->msg_tosave + 1) % omr->ring_buffer_size)))
{
+ int old_ring_buffer_size = omr->ring_buffer_size;
omr->ring_buffer_size += ALSA_RING_BUFFER_INCREMENT;
TRACE("omr->ring_buffer_size=%d\n",omr->ring_buffer_size);
omr->messages = HeapReAlloc(GetProcessHeap(),0,omr->messages, omr->ring_buffer_size * sizeof(ALSA_MSG));
+ /* Now we need to rearrange the ring buffer so that the new
+ buffers just allocated are in between omr->msg_tosave and
+ omr->msg_toget.
+ */
+ if (omr->msg_tosave < omr->msg_toget)
+ {
+ memmove(&(omr->messages[omr->msg_toget + ALSA_RING_BUFFER_INCREMENT]),
+ &(omr->messages[omr->msg_toget]),
+ sizeof(ALSA_MSG)*(old_ring_buffer_size - omr->msg_toget)
+ );
+ omr->msg_toget += ALSA_RING_BUFFER_INCREMENT;
+ }
}
if (wait)
{
diff --git a/dlls/winmm/winenas/audio.c b/dlls/winmm/winenas/audio.c
index 303d5e6..5267587 100644
--- a/dlls/winmm/winenas/audio.c
+++ b/dlls/winmm/winenas/audio.c
@@ -454,9 +454,22 @@
EnterCriticalSection(&mr->msg_crst);
if ((mr->msg_toget == ((mr->msg_tosave + 1) % mr->ring_buffer_size)))
{
+ int old_ring_buffer_size = mr->ring_buffer_size;
mr->ring_buffer_size += NAS_RING_BUFFER_INCREMENT;
TRACE("omr->ring_buffer_size=%d\n",mr->ring_buffer_size);
mr->messages = HeapReAlloc(GetProcessHeap(),0,mr->messages, mr->ring_buffer_size * sizeof(RING_MSG));
+ /* Now we need to rearrange the ring buffer so that the new
+ buffers just allocated are in between mr->msg_tosave and
+ mr->msg_toget.
+ */
+ if (mr->msg_tosave < mr->msg_toget)
+ {
+ memmove(&(mr->messages[mr->msg_toget + NAS_RING_BUFFER_INCREMENT]),
+ &(mr->messages[mr->msg_toget]),
+ sizeof(RING_MSG)*(old_ring_buffer_size - mr->msg_toget)
+ );
+ mr->msg_toget += NAS_RING_BUFFER_INCREMENT;
+ }
}
if (wait)
{
diff --git a/dlls/winmm/wineoss/audio.c b/dlls/winmm/wineoss/audio.c
index cf64fd3..b7ca186 100644
--- a/dlls/winmm/wineoss/audio.c
+++ b/dlls/winmm/wineoss/audio.c
@@ -909,9 +909,22 @@
EnterCriticalSection(&omr->msg_crst);
if ((omr->msg_toget == ((omr->msg_tosave + 1) % omr->ring_buffer_size)))
{
+ int old_ring_buffer_size = omr->ring_buffer_size;
omr->ring_buffer_size += OSS_RING_BUFFER_INCREMENT;
TRACE("omr->ring_buffer_size=%d\n",omr->ring_buffer_size);
omr->messages = HeapReAlloc(GetProcessHeap(),0,omr->messages, omr->ring_buffer_size * sizeof(OSS_MSG));
+ /* Now we need to rearrange the ring buffer so that the new
+ buffers just allocated are in between omr->msg_tosave and
+ omr->msg_toget.
+ */
+ if (omr->msg_tosave < omr->msg_toget)
+ {
+ memmove(&(omr->messages[omr->msg_toget + OSS_RING_BUFFER_INCREMENT]),
+ &(omr->messages[omr->msg_toget]),
+ sizeof(OSS_MSG)*(old_ring_buffer_size - omr->msg_toget)
+ );
+ omr->msg_toget += OSS_RING_BUFFER_INCREMENT;
+ }
}
if (wait)
{