[PATCH 2/5 v2] wineoss: Add a temporary syscall to open and close the seq fd.

Andrew Eikum aeikum at codeweavers.com
Wed Apr 20 09:03:26 CDT 2022


From: Huw Davies <huw at codeweavers.com>

Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
---
 dlls/wineoss.drv/midi.c    | 51 ++++++++------------------------------
 dlls/wineoss.drv/oss.c     |  2 ++
 dlls/wineoss.drv/ossmidi.c | 12 +++++++++
 dlls/wineoss.drv/unixlib.h |  9 +++++++
 4 files changed, 34 insertions(+), 40 deletions(-)

diff --git a/dlls/wineoss.drv/midi.c b/dlls/wineoss.drv/midi.c
index 10e5ba854b1..58047380639 100644
--- a/dlls/wineoss.drv/midi.c
+++ b/dlls/wineoss.drv/midi.c
@@ -75,7 +75,6 @@ static	int		MODM_NumFMSynthDevs = 0;
 /* this is the total number of MIDI out devices found */
 static	int 		MIDM_NumDevs = 0;
 
-static	int		numOpenMidiSeq = 0;
 static	int		numStartedMidiIn = 0;
 
 static CRITICAL_SECTION crit_sect;   /* protects all MidiIn buffers queues */
@@ -199,49 +198,18 @@ static void MIDI_NotifyClient(UINT wDevID, WORD wMsg,
     DriverCallback(dwCallBack, uFlags, hDev, wMsg, dwInstance, dwParam1, dwParam2);
 }
 
-static int midi_warn = 1;
 /**************************************************************************
  * 			midiOpenSeq				[internal]
  */
 static int midiOpenSeq(void)
 {
-    static int midiSeqFD = -1;
+    struct midi_seq_open_params params;
 
-    if (numOpenMidiSeq == 0) {
-	const char* device;
-	device=getenv("MIDIDEV");
-	if (!device) device="/dev/sequencer";
-	midiSeqFD = open(device, O_RDWR, 0);
-	if (midiSeqFD == -1) {
-	    if (midi_warn)
-	    {
-		WARN("Can't open MIDI device '%s' ! (%s). If your "
-                        "program needs this (probably not): %s\n",
-			device, strerror(errno),
-			errno == ENOENT ?
-			"create it ! (\"man MAKEDEV\" ?)" :
-			errno == ENODEV ?
-			"load MIDI sequencer kernel driver !" :
-			errno == EACCES ?
-			"grant access ! (\"man chmod\")" : ""
-		);
-	    }
-	    midi_warn = 0;
-	    return -1;
-	}
-#if 0
-	if (fcntl(midiSeqFD, F_SETFL, O_NONBLOCK) < 0) {
-	    WARN("can't set sequencer fd to non-blocking, errno %d (%s)\n", errno, strerror(errno));
-	    close(midiSeqFD);
-	    midiSeqFD = -1;
-	    return -1;
-	}
-#endif
-	fcntl(midiSeqFD, F_SETFD, 1); /* set close on exec flag */
-	ioctl(midiSeqFD, SNDCTL_SEQ_RESET);
-    }
-    numOpenMidiSeq++;
-    return midiSeqFD;
+    params.close = 0;
+    params.fd = -1;
+    OSS_CALL(midi_seq_open, &params);
+
+    return params.fd;
 }
 
 /**************************************************************************
@@ -249,8 +217,11 @@ static int midiOpenSeq(void)
  */
 static int midiCloseSeq(int fd)
 {
-    if (--numOpenMidiSeq == 0)
-	close(fd);
+    struct midi_seq_open_params params;
+
+    params.close = 1;
+    params.fd = fd;
+    OSS_CALL(midi_seq_open, &params);
 
     return 0;
 }
diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c
index 4f3c0bcb2cf..ac8847920b0 100644
--- a/dlls/wineoss.drv/oss.c
+++ b/dlls/wineoss.drv/oss.c
@@ -1406,4 +1406,6 @@ unixlib_entry_t __wine_unix_call_funcs[] =
     set_event_handle,
     is_started,
     midi_init,
+
+    midi_seq_open,
 };
diff --git a/dlls/wineoss.drv/ossmidi.c b/dlls/wineoss.drv/ossmidi.c
index 75fbf6d7bee..a0a0b1caad2 100644
--- a/dlls/wineoss.drv/ossmidi.c
+++ b/dlls/wineoss.drv/ossmidi.c
@@ -119,6 +119,18 @@ static int seq_close(int fd)
     return 0;
 }
 
+NTSTATUS midi_seq_open(void *args)
+{
+    struct midi_seq_open_params *params = args;
+
+    if (!params->close)
+        params->fd = seq_open();
+    else
+        seq_close(params->fd);
+
+    return STATUS_SUCCESS;
+}
+
 NTSTATUS midi_init(void *args)
 {
     struct midi_init_params *params = args;
diff --git a/dlls/wineoss.drv/unixlib.h b/dlls/wineoss.drv/unixlib.h
index 8c131037b76..68d41e41f74 100644
--- a/dlls/wineoss.drv/unixlib.h
+++ b/dlls/wineoss.drv/unixlib.h
@@ -246,6 +246,12 @@ struct midi_init_params
     struct midi_src *srcs;
 };
 
+struct midi_seq_open_params
+{
+    int close;
+    int fd;
+};
+
 enum oss_funcs
 {
     oss_test_connect,
@@ -272,9 +278,12 @@ enum oss_funcs
     oss_set_event_handle,
     oss_is_started,
     oss_midi_init,
+
+    oss_midi_seq_open, /* temporary */
 };
 
 NTSTATUS midi_init(void *args) DECLSPEC_HIDDEN;
+NTSTATUS midi_seq_open(void *args) DECLSPEC_HIDDEN;
 
 extern unixlib_handle_t oss_handle;
 
-- 
2.36.0





More information about the wine-devel mailing list