Re: audio ring buffer
Peter Hunnisett <[email protected]>
| Newsgroups | gmane.comp.emulators.winex.devel |
|---|---|
| Message-ID | <[email protected]> |
Hi Rob,
I'd just like to make sure that your 2 sound patches are X11 licensed.
Could you please reply to the list indicating so? If they're not X11
licensed, TransGaming cannot consider them for inclusion into WineX and
ReWind.
Thanks,
Peter
Rob Crittenden wrote:
>Attached is a simple patch to convert from a fixed audio ring buffer to
>one that grows dynamically. I picked a startup/increment size of 128 out of
>thin air, there may be a better value.
>
>rob
>
>
>------------------------------------------------------------------------
>
>Index: wineoss/audio.c
>===================================================================
>RCS file: /cvsroot/winex/wine/dlls/winmm/wineoss/audio.c,v
>retrieving revision 1.50
>diff -u -r1.50 audio.c
>--- wineoss/audio.c 25 Jul 2003 21:45:27 -0000 1.50
>+++ wineoss/audio.c 7 Nov 2003 15:44:42 -0000
>@@ -130,10 +130,9 @@
> * this ring will be used by the input (resp output) record (resp playback) routine
> */
> typedef struct {
>- /* FIXME: this could be made a dynamically growing array (if needed) */
>- /* maybe it's needed, a Humongous game manages to transmit 128 messages at once at startup */
>-#define OSS_RING_BUFFER_SIZE 192
>- OSS_MSG messages[OSS_RING_BUFFER_SIZE];
>+#define OSS_RING_BUFFER_SIZE 128
>+ int entries; /* # of entries in the ring */
>+ OSS_MSG * messages;
> int msg_tosave;
> int msg_toget;
> #ifdef USE_PIPE_SYNC
>@@ -919,7 +918,8 @@
> #else
> omr->msg_event = CreateEventA(NULL, FALSE, FALSE, NULL);
> #endif
>- memset(omr->messages, 0, sizeof(OSS_MSG) * OSS_RING_BUFFER_SIZE);
>+ omr->entries = OSS_RING_BUFFER_SIZE;
>+ omr->messages = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, omr->entries * sizeof(OSS_MSG));
> InitializeCriticalSection(&omr->msg_crst);
> return 0;
> }
>@@ -950,11 +950,11 @@
> HANDLE hEvent = INVALID_HANDLE_VALUE;
>
> EnterCriticalSection(&omr->msg_crst);
>- if ((omr->msg_toget == ((omr->msg_tosave + 1) % OSS_RING_BUFFER_SIZE))) /* buffer overflow ? */
>+ if ((omr->msg_toget == ((omr->msg_tosave + 1) % omr->entries))) /* buffer overflow */
> {
>- ERR("buffer overflow !?\n");
>- LeaveCriticalSection(&omr->msg_crst);
>- return 0;
>+ omr->entries += OSS_RING_BUFFER_SIZE;
>+ omr->messages = HeapReAlloc(GetProcessHeap(), 0, omr->messages, omr->entries * sizeof(OSS_MSG));
>+ TRACE("Growing ring buffer to %d\n", omr->entries);
> }
> if (wait)
> {
>@@ -969,7 +969,7 @@
> FIXME("two fast messages in the queue!!!!\n");
>
> /* fast messages have to be added at the start of the queue */
>- omr->msg_toget = (omr->msg_toget + OSS_RING_BUFFER_SIZE - 1) % OSS_RING_BUFFER_SIZE;
>+ omr->msg_toget = (omr->msg_toget + omr->entries - 1) % omr->entries;
>
> omr->messages[omr->msg_toget].msg = msg;
> omr->messages[omr->msg_toget].param = param;
>@@ -980,7 +980,7 @@
> omr->messages[omr->msg_tosave].msg = msg;
> omr->messages[omr->msg_tosave].param = param;
> omr->messages[omr->msg_tosave].hEvent = INVALID_HANDLE_VALUE;
>- omr->msg_tosave = (omr->msg_tosave + 1) % OSS_RING_BUFFER_SIZE;
>+ omr->msg_tosave = (omr->msg_tosave + 1) % omr->entries;
> }
> LeaveCriticalSection(&omr->msg_crst);
> /* signal a new message */
>@@ -1014,7 +1014,7 @@
> omr->messages[omr->msg_toget].msg = 0;
> *param = omr->messages[omr->msg_toget].param;
> *hEvent = omr->messages[omr->msg_toget].hEvent;
>- omr->msg_toget = (omr->msg_toget + 1) % OSS_RING_BUFFER_SIZE;
>+ omr->msg_toget = (omr->msg_toget + 1) % omr->entries;
> CLEAR_OMR(omr);
> LeaveCriticalSection(&omr->msg_crst);
> return 1;
>Index: winealsa/audio.c
>===================================================================
>RCS file: /cvsroot/winex/wine/dlls/winmm/winealsa/audio.c,v
>retrieving revision 1.2
>diff -u -r1.2 audio.c
>--- winealsa/audio.c 15 Oct 2003 02:53:13 -0000 1.2
>+++ winealsa/audio.c 7 Nov 2003 15:44:47 -0000
>@@ -89,9 +89,9 @@
> * this ring will be used by the input (resp output) record (resp playback) routine
> */
> typedef struct {
>- /* FIXME: this could be made a dynamically growing array (if needed) */
>-#define ALSA_RING_BUFFER_SIZE 30
>- ALSA_MSG messages[ALSA_RING_BUFFER_SIZE];
>+#define ALSA_RING_BUFFER_SIZE 128
>+ int entries; /* # of entries in the ring */
>+ ALSA_MSG * messages;
> int msg_tosave;
> int msg_toget;
> HANDLE msg_event;
>@@ -504,7 +504,8 @@
> omr->msg_toget = 0;
> omr->msg_tosave = 0;
> omr->msg_event = CreateEventA(NULL, FALSE, FALSE, NULL);
>- memset(omr->messages, 0, sizeof(ALSA_MSG) * ALSA_RING_BUFFER_SIZE);
>+ omr->entries = ALSA_RING_BUFFER_SIZE;
>+ omr->messages = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, omr->entries * sizeof(ALSA_MSG));
> InitializeCriticalSection(&omr->msg_crst);
> return 0;
> }
>@@ -530,11 +531,11 @@
> HANDLE hEvent = INVALID_HANDLE_VALUE;
>
> EnterCriticalSection(&omr->msg_crst);
>- if ((omr->msg_toget == ((omr->msg_tosave + 1) % ALSA_RING_BUFFER_SIZE))) /* buffer overflow ? */
>+ if ((omr->msg_toget == ((omr->msg_tosave + 1) % omr->entries))) /* buffer overflow ? */
> {
>- ERR("buffer overflow !?\n");
>- LeaveCriticalSection(&omr->msg_crst);
>- return 0;
>+ omr->entries += ALSA_RING_BUFFER_SIZE;
>+ omr->messages = HeapReAlloc(GetProcessHeap(), 0, omr->messages, omr->entries * sizeof(ALSA_MSG));
>+ TRACE("Growing audio ring buffer to %d\n", omr->entries);
> }
> if (wait)
> {
>@@ -549,7 +550,7 @@
> FIXME("two fast messages in the queue!!!!\n");
>
> /* fast messages have to be added at the start of the queue */
>- omr->msg_toget = (omr->msg_toget + ALSA_RING_BUFFER_SIZE - 1) % ALSA_RING_BUFFER_SIZE;
>+ omr->msg_toget = (omr->msg_toget + omr->entries - 1) % omr->entries;
>
> omr->messages[omr->msg_toget].msg = msg;
> omr->messages[omr->msg_toget].param = param;
>@@ -560,7 +561,7 @@
> omr->messages[omr->msg_tosave].msg = msg;
> omr->messages[omr->msg_tosave].param = param;
> omr->messages[omr->msg_tosave].hEvent = INVALID_HANDLE_VALUE;
>- omr->msg_tosave = (omr->msg_tosave + 1) % ALSA_RING_BUFFER_SIZE;
>+ omr->msg_tosave = (omr->msg_tosave + 1) % omr->entries;
> }
> LeaveCriticalSection(&omr->msg_crst);
> /* signal a new message */
>@@ -594,7 +595,7 @@
> omr->messages[omr->msg_toget].msg = 0;
> *param = omr->messages[omr->msg_toget].param;
> *hEvent = omr->messages[omr->msg_toget].hEvent;
>- omr->msg_toget = (omr->msg_toget + 1) % ALSA_RING_BUFFER_SIZE;
>+ omr->msg_toget = (omr->msg_toget + 1) % omr->entries;
> LeaveCriticalSection(&omr->msg_crst);
> return 1;
> }
>
>
-------------------------------------------------------
This SF.Net email sponsored by: ApacheCon 2003,
16-19 November in Las Vegas. Learn firsthand the latest
developments in Apache, PHP, Perl, XML, Java, MySQL,
WebDAV, and more! http://www.apachecon.com/