Re: audio ring buffer
Rob Crittenden <[email protected]>
| Newsgroups | gmane.comp.emulators.winex.devel |
|---|---|
| Message-ID | <[email protected]> |
Yes, that is my intention (X11-license). Just trying to do my part to improve
WineX.
rob
On Fri, 7 Nov 2003, Peter Hunnisett wrote:
> 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/