[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, ¶m, &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, ¶m, &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