Huw Davies : wineoss: Introduce a notification thread.
Alexandre Julliard
julliard at winehq.org
Mon May 2 16:02:08 CDT 2022
Module: wine
Branch: master
Commit: 31c5a82b5f47538a81757c030a2a48620734deaf
URL: https://source.winehq.org/git/wine.git/?a=commit;h=31c5a82b5f47538a81757c030a2a48620734deaf
Author: Huw Davies <huw at codeweavers.com>
Date: Fri Apr 29 08:29:53 2022 +0100
wineoss: Introduce a notification thread.
Currently the thread just blocks until told to quit by midi_release.
Eventually this thread will dispatch the MIM_DATA and MIM_LONGDATA
notifications.
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wineoss.drv/midi.c | 21 +++++++++++++++++++++
dlls/wineoss.drv/oss.c | 2 ++
dlls/wineoss.drv/ossmidi.c | 39 +++++++++++++++++++++++++++++++++++++++
dlls/wineoss.drv/unixlib.h | 10 ++++++++++
4 files changed, 72 insertions(+)
diff --git a/dlls/wineoss.drv/midi.c b/dlls/wineoss.drv/midi.c
index e36a737624a..b3f980ab3da 100644
--- a/dlls/wineoss.drv/midi.c
+++ b/dlls/wineoss.drv/midi.c
@@ -552,6 +552,23 @@ DWORD WINAPI OSS_modMessage(UINT wDevID, UINT wMsg, DWORD_PTR dwUser,
return err;
}
+static DWORD WINAPI notify_thread(void *p)
+{
+ struct midi_notify_wait_params params;
+ struct notify_context notify;
+ BOOL quit;
+
+ params.notify = ¬ify;
+ params.quit = &quit;
+
+ while (1)
+ {
+ OSS_CALL(midi_notify_wait, ¶ms);
+ if (quit) break;
+ }
+ return 0;
+}
+
/**************************************************************************
* DriverProc (WINEOSS.1)
*/
@@ -563,7 +580,11 @@ LRESULT CALLBACK OSS_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg,
switch(wMsg) {
case DRV_LOAD:
+ CloseHandle(CreateThread(NULL, 0, notify_thread, NULL, 0, NULL));
+ return 1;
case DRV_FREE:
+ OSS_CALL(midi_release, NULL);
+ return 1;
case DRV_OPEN:
case DRV_CLOSE:
case DRV_ENABLE:
diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c
index a9081f2cac9..8fda9270a4e 100644
--- a/dlls/wineoss.drv/oss.c
+++ b/dlls/wineoss.drv/oss.c
@@ -1406,8 +1406,10 @@ unixlib_entry_t __wine_unix_call_funcs[] =
set_event_handle,
is_started,
midi_init,
+ midi_release,
midi_out_message,
midi_in_message,
+ midi_notify_wait,
midi_seq_open,
midi_in_lock,
diff --git a/dlls/wineoss.drv/ossmidi.c b/dlls/wineoss.drv/ossmidi.c
index 86d766eceaf..0790eaaec1a 100644
--- a/dlls/wineoss.drv/ossmidi.c
+++ b/dlls/wineoss.drv/ossmidi.c
@@ -66,6 +66,10 @@ static unsigned int num_dests, num_srcs, num_synths, seq_refs;
static struct midi_dest dests[MAX_MIDIOUTDRV];
static struct midi_src srcs[MAX_MIDIINDRV];
+static pthread_mutex_t notify_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t notify_read_cond = PTHREAD_COND_INITIALIZER;
+static BOOL notify_quit;
+
typedef struct sVoice
{
int note; /* 0 means not used */
@@ -155,6 +159,17 @@ NTSTATUS midi_in_lock(void *args)
return STATUS_SUCCESS;
}
+static void notify_post(struct notify_context *notify)
+{
+ pthread_mutex_lock(¬ify_mutex);
+
+ if (notify) FIXME("Not yet handled\n");
+ else notify_quit = TRUE;
+ pthread_cond_signal(¬ify_read_cond);
+
+ pthread_mutex_unlock(¬ify_mutex);
+}
+
static void set_in_notify(struct notify_context *notify, struct midi_src *src, WORD dev_id, WORD msg,
UINT_PTR param_1, UINT_PTR param_2)
{
@@ -432,6 +447,14 @@ wrapup:
return STATUS_SUCCESS;
}
+NTSTATUS midi_release(void *args)
+{
+ /* stop the notify_wait thread */
+ notify_post(NULL);
+
+ return STATUS_SUCCESS;
+}
+
/* FIXME: this is a bad idea, it's even not static... */
SEQ_DEFINEBUF(1024);
@@ -1367,3 +1390,19 @@ NTSTATUS midi_in_message(void *args)
return STATUS_SUCCESS;
}
+
+NTSTATUS midi_notify_wait(void *args)
+{
+ struct midi_notify_wait_params *params = args;
+
+ pthread_mutex_lock(¬ify_mutex);
+
+ while (!notify_quit)
+ pthread_cond_wait(¬ify_read_cond, ¬ify_mutex);
+
+ *params->quit = notify_quit;
+
+ pthread_mutex_unlock(¬ify_mutex);
+
+ return STATUS_SUCCESS;
+}
diff --git a/dlls/wineoss.drv/unixlib.h b/dlls/wineoss.drv/unixlib.h
index 867e1ff656e..ddeba49556c 100644
--- a/dlls/wineoss.drv/unixlib.h
+++ b/dlls/wineoss.drv/unixlib.h
@@ -267,6 +267,12 @@ struct midi_in_message_params
struct notify_context *notify;
};
+struct midi_notify_wait_params
+{
+ BOOL *quit;
+ struct notify_context *notify;
+};
+
struct midi_seq_open_params
{
int close;
@@ -299,16 +305,20 @@ enum oss_funcs
oss_set_event_handle,
oss_is_started,
oss_midi_init,
+ oss_midi_release,
oss_midi_out_message,
oss_midi_in_message,
+ oss_midi_notify_wait,
oss_midi_seq_open, /* temporary */
oss_midi_in_lock,
};
NTSTATUS midi_init(void *args) DECLSPEC_HIDDEN;
+NTSTATUS midi_release(void *args) DECLSPEC_HIDDEN;
NTSTATUS midi_out_message(void *args) DECLSPEC_HIDDEN;
NTSTATUS midi_in_message(void *args) DECLSPEC_HIDDEN;
+NTSTATUS midi_notify_wait(void *args) DECLSPEC_HIDDEN;
NTSTATUS midi_seq_open(void *args) DECLSPEC_HIDDEN;
NTSTATUS midi_in_lock(void *args) DECLSPEC_HIDDEN;
More information about the wine-cvs
mailing list