[PATCH 2/3] wine audio: Use fevent instead of OMR hacks.

Maarten Lankhorst m.b.lankhorst at gmail.com
Sun May 13 09:30:08 CDT 2007


Removes duplication of same code at 3 places.
-------------- next part --------------
>From 59594f4387c69045254b34b88144574020ca3490 Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date: Sun, 13 May 2007 16:23:02 +0200
Subject: [PATCH] audio: Use fevents instead of duplicating the OMR hack

---
 dlls/winealsa.drv/alsa.c |   32 ++++---------------------
 dlls/winealsa.drv/alsa.h |    4 ++-
 dlls/wineesd.drv/audio.c |   57 ++++++---------------------------------------
 dlls/wineoss.drv/audio.c |   32 +++++---------------------
 dlls/wineoss.drv/audio.h |   24 +-----------------
 5 files changed, 24 insertions(+), 125 deletions(-)

diff --git a/dlls/winealsa.drv/alsa.c b/dlls/winealsa.drv/alsa.c
index b1945b2..f1d0281 100644
--- a/dlls/winealsa.drv/alsa.c
+++ b/dlls/winealsa.drv/alsa.c
@@ -45,27 +45,6 @@
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(alsa);
-/* unless someone makes a wineserver kernel module, Unix pipes are faster than win32 events */
-#define USE_PIPE_SYNC
-
-#ifdef USE_PIPE_SYNC
-#define INIT_OMR(omr) do { if (pipe(omr->msg_pipe) < 0) { omr->msg_pipe[0] = omr->msg_pipe[1] = -1; } } while (0)
-#define CLOSE_OMR(omr) do { close(omr->msg_pipe[0]); close(omr->msg_pipe[1]); } while (0)
-#define SIGNAL_OMR(omr) do { int x = 0; write((omr)->msg_pipe[1], &x, sizeof(x)); } while (0)
-#define CLEAR_OMR(omr) do { int x = 0; read((omr)->msg_pipe[0], &x, sizeof(x)); } while (0)
-#define RESET_OMR(omr) do { } while (0)
-#define WAIT_OMR(omr, sleep) \
-  do { struct pollfd pfd; pfd.fd = (omr)->msg_pipe[0]; \
-       pfd.events = POLLIN; poll(&pfd, 1, sleep); } while (0)
-#else
-#define INIT_OMR(omr) do { omr->msg_event = CreateEventW(NULL, FALSE, FALSE, NULL); } while (0)
-#define CLOSE_OMR(omr) do { CloseHandle(omr->msg_event); } while (0)
-#define SIGNAL_OMR(omr) do { SetEvent((omr)->msg_event); } while (0)
-#define CLEAR_OMR(omr) do { } while (0)
-#define RESET_OMR(omr) do { ResetEvent((omr)->msg_event); } while (0)
-#define WAIT_OMR(omr, sleep) \
-  do { WaitForSingleObject((omr)->msg_event, sleep); } while (0)
-#endif
 
 #define ALSA_RING_BUFFER_INCREMENT      64
 
@@ -79,7 +58,7 @@ int ALSA_InitRingMessage(ALSA_MSG_RING* omr)
 {
     omr->msg_toget = 0;
     omr->msg_tosave = 0;
-    INIT_OMR(omr);
+    omr->msg_event = CREATEEVENT(NULL, FALSE, FALSE, NULL);
     omr->ring_buffer_size = ALSA_RING_BUFFER_INCREMENT;
     omr->messages = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,omr->ring_buffer_size * sizeof(ALSA_MSG));
 
@@ -94,7 +73,7 @@ int ALSA_InitRingMessage(ALSA_MSG_RING* omr)
  */
 int ALSA_DestroyRingMessage(ALSA_MSG_RING* omr)
 {
-    CLOSE_OMR(omr);
+    CLOSEEVENT(omr->msg_event);
     HeapFree(GetProcessHeap(),0,omr->messages);
     omr->ring_buffer_size = 0;
     omr->msg_crst.DebugInfo->Spare[0] = 0;
@@ -107,7 +86,7 @@ int ALSA_DestroyRingMessage(ALSA_MSG_RING* omr)
  */
 void ALSA_ResetRingMessage(ALSA_MSG_RING* omr)
 {
-    RESET_OMR(omr);
+    RESETEVENT(omr->msg_event);
 }
 
 /******************************************************************
@@ -116,7 +95,7 @@ void ALSA_ResetRingMessage(ALSA_MSG_RING* omr)
  */
 void ALSA_WaitRingMessage(ALSA_MSG_RING* omr, DWORD sleep)
 {
-    WAIT_OMR(omr, sleep);
+    WAITEVENT(omr->msg_event, sleep);
 }
 
 /******************************************************************
@@ -177,7 +156,7 @@ int ALSA_AddRingMessage(ALSA_MSG_RING* omr, enum win_wm_message msg, DWORD param
     }
     LeaveCriticalSection(&omr->msg_crst);
     /* signal a new message */
-    SIGNAL_OMR(omr);
+    SETEVENT(omr->msg_event);
     if (wait)
     {
         /* wait for playback/record thread to have processed the message */
@@ -208,7 +187,6 @@ int ALSA_RetrieveRingMessage(ALSA_MSG_RING* omr,
     *param = omr->messages[omr->msg_toget].param;
     *hEvent = omr->messages[omr->msg_toget].hEvent;
     omr->msg_toget = (omr->msg_toget + 1) % omr->ring_buffer_size;
-    CLEAR_OMR(omr);
     LeaveCriticalSection(&omr->msg_crst);
     return 1;
 }
diff --git a/dlls/winealsa.drv/alsa.h b/dlls/winealsa.drv/alsa.h
index 26e379a..be705f9 100644
--- a/dlls/winealsa.drv/alsa.h
+++ b/dlls/winealsa.drv/alsa.h
@@ -51,6 +51,8 @@
 #include "ksmedia.h"
 #include "ksguid.h"
 
+#include "wine/debug.h"
+#include "wine/fevent.h"
 /* state diagram for waveOut writing:
  *
  * +---------+-------------+---------------+---------------------------------+
@@ -98,7 +100,7 @@ typedef struct {
 /* Either pipe or event is used, but that is defined in alsa.c,
  * since this is a global header we define both here */
     int                         msg_pipe[2];
-    HANDLE                      msg_event;
+    FEVENT                      msg_event;
     CRITICAL_SECTION		msg_crst;
 } ALSA_MSG_RING;
 
diff --git a/dlls/wineesd.drv/audio.c b/dlls/wineesd.drv/audio.c
index 8836672..df33b2f 100644
--- a/dlls/wineesd.drv/audio.c
+++ b/dlls/wineesd.drv/audio.c
@@ -44,12 +44,6 @@
 # include <unistd.h>
 #endif
 #include <fcntl.h>
-#ifdef HAVE_POLL_H
-#include <poll.h>
-#endif
-#ifdef HAVE_SYS_POLL_H
-# include <sys/poll.h>
-#endif
 
 #include "windef.h"
 #include "winbase.h"
@@ -65,6 +59,7 @@
 #include "ksmedia.h"
 #include "esound.h"
 #include "wine/debug.h"
+#include "wine/fevent.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(wave);
 
@@ -72,9 +67,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(wave);
 
 #include <esd.h>
 
-/* unless someone makes a wineserver kernel module, Unix pipes are faster than win32 events */
-#define USE_PIPE_SYNC
-
 /* define if you want to use esd_monitor_stream instead of
  * esd_record_stream for waveIn stream
  */
@@ -115,21 +107,6 @@ enum win_wm_message {
     WINE_WM_UPDATE, WINE_WM_BREAKLOOP, WINE_WM_CLOSING, WINE_WM_STARTING, WINE_WM_STOPPING
 };
 
-#ifdef USE_PIPE_SYNC
-#define SIGNAL_OMR(mr) do { int x = 0; write((mr)->msg_pipe[1], &x, sizeof(x)); } while (0)
-#define CLEAR_OMR(mr) do { int x = 0; read((mr)->msg_pipe[0], &x, sizeof(x)); } while (0)
-#define RESET_OMR(mr) do { } while (0)
-#define WAIT_OMR(mr, sleep) \
-  do { struct pollfd pfd; pfd.fd = (mr)->msg_pipe[0]; \
-       pfd.events = POLLIN; poll(&pfd, 1, sleep); } while (0)
-#else
-#define SIGNAL_OMR(mr) do { SetEvent((mr)->msg_event); } while (0)
-#define CLEAR_OMR(mr) do { } while (0)
-#define RESET_OMR(mr) do { ResetEvent((mr)->msg_event); } while (0)
-#define WAIT_OMR(mr, sleep) \
-  do { WaitForSingleObject((mr)->msg_event, sleep); } while (0)
-#endif
-
 typedef struct {
     enum win_wm_message 	msg;	/* message identifier */
     DWORD	                param;  /* parameter for this message */
@@ -146,11 +123,7 @@ typedef struct {
     int                         ring_buffer_size;
     int				msg_tosave;
     int				msg_toget;
-#ifdef USE_PIPE_SYNC
-    int                         msg_pipe[2];
-#else
-    HANDLE                      msg_event;
-#endif
+    FEVENT                      msg_event;
     CRITICAL_SECTION		msg_crst;
 } ESD_MSG_RING;
 
@@ -533,15 +506,7 @@ static int ESD_InitRingMessage(ESD_MSG_RING* mr)
 {
     mr->msg_toget = 0;
     mr->msg_tosave = 0;
-#ifdef USE_PIPE_SYNC
-    if (pipe(mr->msg_pipe) < 0) {
-        mr->msg_pipe[0] = -1;
-        mr->msg_pipe[1] = -1;
-        ERR("could not create pipe, error=%s\n", strerror(errno));
-    }
-#else
-    mr->msg_event = CreateEventW(NULL, FALSE, FALSE, NULL);
-#endif
+    mr->msg_event = CREATEEVENT(NULL, FALSE, FALSE, NULL);
     mr->ring_buffer_size = ESD_RING_BUFFER_INCREMENT;
     mr->messages = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,mr->ring_buffer_size * sizeof(RING_MSG));
     InitializeCriticalSection(&mr->msg_crst);
@@ -555,12 +520,7 @@ static int ESD_InitRingMessage(ESD_MSG_RING* mr)
  */
 static int ESD_DestroyRingMessage(ESD_MSG_RING* mr)
 {
-#ifdef USE_PIPE_SYNC
-    close(mr->msg_pipe[0]);
-    close(mr->msg_pipe[1]);
-#else
-    CloseHandle(mr->msg_event);
-#endif
+    CLOSEEVENT(mr->msg_event);
     HeapFree(GetProcessHeap(),0,mr->messages);
     mr->messages=NULL;
     mr->msg_crst.DebugInfo->Spare[0] = 0;
@@ -627,7 +587,7 @@ static int ESD_AddRingMessage(ESD_MSG_RING* mr, enum win_wm_message msg, DWORD p
     LeaveCriticalSection(&mr->msg_crst);
 
     /* signal a new message */
-    SIGNAL_OMR(mr);
+    SETEVENT(mr->msg_event);
     if (wait)
     {
         /* wait for playback/record thread to have processed the message */
@@ -659,7 +619,6 @@ static int ESD_RetrieveRingMessage(ESD_MSG_RING* mr,
     *param = mr->messages[mr->msg_toget].param;
     *hEvent = mr->messages[mr->msg_toget].hEvent;
     mr->msg_toget = (mr->msg_toget + 1) % mr->ring_buffer_size;
-    CLEAR_OMR(mr);
     LeaveCriticalSection(&mr->msg_crst);
     return 1;
 }
@@ -983,7 +942,7 @@ static	void	wodPlayer_Reset(WINE_WAVEOUT* wwo, BOOL reset)
 
             wodNotifyClient(wwo, WOM_DONE, param, 0);
         }
-        RESET_OMR(&wwo->msgRing);
+        RESETEVENT(wwo->msgRing.msg_event);
         LeaveCriticalSection(&wwo->msgRing.msg_crst);
     } else {
         if (wwo->lpLoopPtr) {
@@ -1148,7 +1107,7 @@ static	DWORD	CALLBACK	wodPlayer(LPVOID pmt)
          */
         dwSleepTime = min(dwNextFeedTime, dwNextNotifyTime);
         TRACE("waiting %ums (%u,%u)\n", dwSleepTime, dwNextFeedTime, dwNextNotifyTime);
-        WAIT_OMR(&wwo->msgRing, dwSleepTime);
+        WAITEVENT(wwo->msgRing.msg_event, dwSleepTime);
 	wodPlayer_ProcessMessages(wwo);
 	if (wwo->state == WINE_WS_PLAYING) {
 	    dwNextFeedTime = wodPlayer_FeedDSP(wwo);
@@ -1736,7 +1695,7 @@ static	DWORD	CALLBACK	widRecorder(LPVOID pmt)
 	}
 
 	/* wait for dwSleepTime or an event in thread's queue */
-	WAIT_OMR(&wwi->msgRing, dwSleepTime);
+	WAITEVENT(wwi->msgRing.msg_event, dwSleepTime);
 
 	while (ESD_RetrieveRingMessage(&wwi->msgRing, &msg, &param, &ev))
 	{
diff --git a/dlls/wineoss.drv/audio.c b/dlls/wineoss.drv/audio.c
index 98f5a70..190e968 100644
--- a/dlls/wineoss.drv/audio.c
+++ b/dlls/wineoss.drv/audio.c
@@ -49,12 +49,6 @@
 #ifdef HAVE_SYS_MMAN_H
 # include <sys/mman.h>
 #endif
-#ifdef HAVE_POLL_H
-#include <poll.h>
-#endif
-#ifdef HAVE_SYS_POLL_H
-# include <sys/poll.h>
-#endif
 
 #include "windef.h"
 #include "winbase.h"
@@ -1218,15 +1212,7 @@ static int OSS_InitRingMessage(OSS_MSG_RING* omr)
 {
     omr->msg_toget = 0;
     omr->msg_tosave = 0;
-#ifdef USE_PIPE_SYNC
-    if (pipe(omr->msg_pipe) < 0) {
-	omr->msg_pipe[0] = -1;
-	omr->msg_pipe[1] = -1;
-	ERR("could not create pipe, error=%s\n", strerror(errno));
-    }
-#else
-    omr->msg_event = CreateEventW(NULL, FALSE, FALSE, NULL);
-#endif
+    omr->msg_event = CREATEEVENT(NULL, FALSE, FALSE, NULL);
     omr->ring_buffer_size = OSS_RING_BUFFER_INCREMENT;
     omr->messages = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,omr->ring_buffer_size * sizeof(OSS_MSG));
     InitializeCriticalSection(&omr->msg_crst);
@@ -1240,12 +1226,7 @@ static int OSS_InitRingMessage(OSS_MSG_RING* omr)
  */
 static int OSS_DestroyRingMessage(OSS_MSG_RING* omr)
 {
-#ifdef USE_PIPE_SYNC
-    close(omr->msg_pipe[0]);
-    close(omr->msg_pipe[1]);
-#else
-    CloseHandle(omr->msg_event);
-#endif
+    CLOSEEVENT(omr->msg_event);
     HeapFree(GetProcessHeap(),0,omr->messages);
     omr->msg_crst.DebugInfo->Spare[0] = 0;
     DeleteCriticalSection(&omr->msg_crst);
@@ -1310,7 +1291,7 @@ static int OSS_AddRingMessage(OSS_MSG_RING* omr, enum win_wm_message msg, DWORD
     }
     LeaveCriticalSection(&omr->msg_crst);
     /* signal a new message */
-    SIGNAL_OMR(omr);
+    SETEVENT(omr->msg_event);
     if (wait)
     {
         /* wait for playback/record thread to have processed the message */
@@ -1341,7 +1322,6 @@ static int OSS_RetrieveRingMessage(OSS_MSG_RING* omr,
     *param = omr->messages[omr->msg_toget].param;
     *hEvent = omr->messages[omr->msg_toget].hEvent;
     omr->msg_toget = (omr->msg_toget + 1) % omr->ring_buffer_size;
-    CLEAR_OMR(omr);
     LeaveCriticalSection(&omr->msg_crst);
     return 1;
 }
@@ -1690,7 +1670,7 @@ static	void	wodPlayer_Reset(WINE_WAVEOUT* wwo, BOOL reset)
 
             wodNotifyClient(wwo, WOM_DONE, param, 0);
         }
-        RESET_OMR(&wwo->msgRing);
+        RESETEVENT(wwo->msgRing.msg_event);
         LeaveCriticalSection(&wwo->msgRing.msg_crst);
     } else {
         if (wwo->lpLoopPtr) {
@@ -1851,7 +1831,7 @@ static	DWORD	CALLBACK	wodPlayer(LPVOID pmt)
          */
         dwSleepTime = min(dwNextFeedTime, dwNextNotifyTime);
         TRACE("waiting %ums (%u,%u)\n", dwSleepTime, dwNextFeedTime, dwNextNotifyTime);
-	WAIT_OMR(&wwo->msgRing, dwSleepTime);
+	WAITEVENT(wwo->msgRing.msg_event, dwSleepTime);
 	wodPlayer_ProcessMessages(wwo);
 	if (wwo->state == WINE_WS_PLAYING) {
 	    dwNextFeedTime = wodPlayer_FeedDSP(wwo);
@@ -2660,7 +2640,7 @@ static	DWORD	CALLBACK	widRecorder(LPVOID pmt)
             }
 	}
 
-	WAIT_OMR(&wwi->msgRing, dwSleepTime);
+	WAITEVENT(wwi->msgRing.msg_event, dwSleepTime);
 
 	while (OSS_RetrieveRingMessage(&wwi->msgRing, &msg, &param, &ev))
 	{
diff --git a/dlls/wineoss.drv/audio.h b/dlls/wineoss.drv/audio.h
index 6fdb670..f2dbe88 100644
--- a/dlls/wineoss.drv/audio.h
+++ b/dlls/wineoss.drv/audio.h
@@ -27,8 +27,7 @@
 
 #ifdef HAVE_OSS
 
-/* unless someone makes a wineserver kernel module, Unix pipes are faster than win32 events */
-#define USE_PIPE_SYNC
+#include "wine/fevent.h"
 
 #define MAX_WAVEDRV 	(6)
 #define MAX_CHANNELS	6
@@ -45,21 +44,6 @@ enum win_wm_message {
     WINE_WM_UPDATE, WINE_WM_BREAKLOOP, WINE_WM_CLOSING, WINE_WM_STARTING, WINE_WM_STOPPING
 };
 
-#ifdef USE_PIPE_SYNC
-#define SIGNAL_OMR(omr) do { int x = 0; write((omr)->msg_pipe[1], &x, sizeof(x)); } while (0)
-#define CLEAR_OMR(omr) do { int x = 0; read((omr)->msg_pipe[0], &x, sizeof(x)); } while (0)
-#define RESET_OMR(omr) do { } while (0)
-#define WAIT_OMR(omr, sleep) \
-  do { struct pollfd pfd; pfd.fd = (omr)->msg_pipe[0]; \
-       pfd.events = POLLIN; poll(&pfd, 1, sleep); } while (0)
-#else
-#define SIGNAL_OMR(omr) do { SetEvent((omr)->msg_event); } while (0)
-#define CLEAR_OMR(omr) do { } while (0)
-#define RESET_OMR(omr) do { ResetEvent((omr)->msg_event); } while (0)
-#define WAIT_OMR(omr, sleep) \
-  do { WaitForSingleObject((omr)->msg_event, sleep); } while (0)
-#endif
-
 typedef struct {
     enum win_wm_message 	msg;	/* message identifier */
     DWORD	                param;  /* parameter for this message */
@@ -76,11 +60,7 @@ typedef struct {
     OSS_MSG			* messages;
     int				msg_tosave;
     int				msg_toget;
-#ifdef USE_PIPE_SYNC
-    int				msg_pipe[2];
-#else
-    HANDLE			msg_event;
-#endif
+    FEVENT			msg_event;
     CRITICAL_SECTION		msg_crst;
 } OSS_MSG_RING;
 
-- 
1.4.4.2



More information about the wine-patches mailing list