[PATCH 4/6] winealsa: Add a temporary syscall to return the snd_seq handle.
Huw Davies
huw at codeweavers.com
Tue Mar 15 04:30:43 CDT 2022
Signed-off-by: Huw Davies <huw at codeweavers.com>
---
dlls/winealsa.drv/alsa.c | 1 +
dlls/winealsa.drv/alsamidi.c | 47 +++++++++++++++++++++++++++++-----
dlls/winealsa.drv/midi.c | 49 ++++++++----------------------------
dlls/winealsa.drv/unixlib.h | 9 +++++++
4 files changed, 62 insertions(+), 44 deletions(-)
diff --git a/dlls/winealsa.drv/alsa.c b/dlls/winealsa.drv/alsa.c
index 76e4b98caaf..16c0c7c387d 100644
--- a/dlls/winealsa.drv/alsa.c
+++ b/dlls/winealsa.drv/alsa.c
@@ -2447,4 +2447,5 @@ unixlib_entry_t __wine_unix_call_funcs[] =
midi_init,
midi_seq_lock, /* temporary */
+ midi_seq_open,
};
diff --git a/dlls/winealsa.drv/alsamidi.c b/dlls/winealsa.drv/alsamidi.c
index 9e7962f46cd..a90d5b30fcf 100644
--- a/dlls/winealsa.drv/alsamidi.c
+++ b/dlls/winealsa.drv/alsamidi.c
@@ -55,6 +55,7 @@ static struct midi_dest dests[MAX_MIDIOUTDRV];
static struct midi_src srcs[MAX_MIDIINDRV];
static snd_seq_t *midi_seq;
static unsigned int seq_refs;
+static int port_in = -1;
static void seq_lock(void)
{
@@ -74,7 +75,7 @@ NTSTATUS midi_seq_lock(void *args)
return STATUS_SUCCESS;
}
-static int seq_open(void)
+static snd_seq_t *seq_open(int *port_in_ret)
{
static int midi_warn;
@@ -87,12 +88,28 @@ static int seq_open(void)
WARN("Error opening ALSA sequencer.\n");
midi_warn = 1;
seq_unlock();
- return -1;
+ return NULL;
}
+ snd_seq_set_client_name(midi_seq, "WINE midi driver");
}
seq_refs++;
+
+ if (port_in_ret)
+ {
+ if (port_in < 0)
+ {
+ port_in = snd_seq_create_simple_port(midi_seq, "WINE ALSA Input",
+ SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_READ | SND_SEQ_PORT_CAP_SUBS_WRITE,
+ SND_SEQ_PORT_TYPE_MIDI_GENERIC | SND_SEQ_PORT_TYPE_APPLICATION);
+ if (port_in < 0)
+ TRACE("Unable to create input port\n");
+ else
+ TRACE("Input port %d created successfully\n", port_in);
+ }
+ *port_in_ret = port_in;
+ }
seq_unlock();
- return 0;
+ return midi_seq;
}
static void seq_close(void)
@@ -100,12 +117,29 @@ static void seq_close(void)
seq_lock();
if (--seq_refs == 0)
{
+ if (port_in >= 0)
+ {
+ snd_seq_delete_simple_port(midi_seq, port_in);
+ port_in = -1;
+ }
snd_seq_close(midi_seq);
midi_seq = NULL;
}
seq_unlock();
}
+NTSTATUS midi_seq_open(void *args)
+{
+ struct midi_seq_open_params *params = args;
+
+ if (!params->close)
+ params->seq = seq_open(params->port_in);
+ else
+ seq_close();
+
+ return STATUS_SUCCESS;
+}
+
static int alsa_to_win_device_type(unsigned int type)
{
/* MOD_MIDIPORT output port
@@ -270,6 +304,7 @@ NTSTATUS midi_init(void *args)
static BOOL init_done;
snd_seq_client_info_t *cinfo;
snd_seq_port_info_t *pinfo;
+ snd_seq_t *seq;
int external;
if (init_done) {
@@ -281,7 +316,7 @@ NTSTATUS midi_init(void *args)
init_done = TRUE;
/* try to open device */
- if (seq_open() == -1) {
+ if (!(seq = seq_open(NULL))) {
*params->err = ERROR_OPEN_FAILED;
return STATUS_SUCCESS;
}
@@ -292,10 +327,10 @@ NTSTATUS midi_init(void *args)
/* Add internal ports first, followed by external */
for (external = 0; external < 2; external++) {
snd_seq_client_info_set_client(cinfo, -1);
- while (snd_seq_query_next_client(midi_seq, cinfo) >= 0) {
+ while (snd_seq_query_next_client(seq, cinfo) >= 0) {
snd_seq_port_info_set_client(pinfo, snd_seq_client_info_get_client(cinfo));
snd_seq_port_info_set_port(pinfo, -1);
- while (snd_seq_query_next_port(midi_seq, pinfo) >= 0) {
+ while (snd_seq_query_next_port(seq, pinfo) >= 0) {
unsigned int cap = snd_seq_port_info_get_capability(pinfo);
unsigned int type = snd_seq_port_info_get_type(pinfo);
if (!external == !(type & SND_SEQ_PORT_TYPE_PORT))
diff --git a/dlls/winealsa.drv/midi.c b/dlls/winealsa.drv/midi.c
index fae6ddf8615..535f3dbd348 100644
--- a/dlls/winealsa.drv/midi.c
+++ b/dlls/winealsa.drv/midi.c
@@ -55,12 +55,8 @@ static int MODM_NumDevs = 0;
/* this is the total number of MIDI out devices found */
static int MIDM_NumDevs = 0;
-static snd_seq_t* midiSeq = NULL;
-static int numOpenMidiSeq = 0;
static int numStartedMidiIn = 0;
-static int port_in;
-
static CRITICAL_SECTION crit_sect; /* protects all MidiIn buffer queues */
static CRITICAL_SECTION_DEBUG critsect_debug =
{
@@ -152,40 +148,18 @@ static void MIDI_NotifyClient(UINT wDevID, WORD wMsg,
DriverCallback(dwCallBack, uFlags, hDev, wMsg, dwInstance, dwParam1, dwParam2);
}
-static BOOL midi_warn = TRUE;
/**************************************************************************
* midiOpenSeq [internal]
*/
static snd_seq_t *midiOpenSeq(int *port_in_ret)
{
- seq_lock();
- if (numOpenMidiSeq == 0) {
- if (snd_seq_open(&midiSeq, "default", SND_SEQ_OPEN_DUPLEX, 0) < 0)
- {
- if (midi_warn)
- {
- WARN("Error opening ALSA sequencer.\n");
- }
- midi_warn = FALSE;
- seq_unlock();
- return NULL;
- }
+ struct midi_seq_open_params params;
- /* Setting the client name is the only init to do */
- snd_seq_set_client_name(midiSeq, "WINE midi driver");
+ params.port_in = port_in_ret;
+ params.close = 0;
+ ALSA_CALL(midi_seq_open, ¶ms);
- port_in = snd_seq_create_simple_port(midiSeq, "WINE ALSA Input",
- SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_READ|SND_SEQ_PORT_CAP_SUBS_WRITE,
- SND_SEQ_PORT_TYPE_MIDI_GENERIC|SND_SEQ_PORT_TYPE_APPLICATION);
- if (port_in < 0)
- TRACE("Unable to create input port\n");
- else
- TRACE("Input port %d created successfully\n", port_in);
- }
- numOpenMidiSeq++;
- seq_unlock();
- if (port_in_ret) *port_in_ret = port_in;
- return midiSeq;
+ return params.seq;
}
/**************************************************************************
@@ -193,13 +167,12 @@ static snd_seq_t *midiOpenSeq(int *port_in_ret)
*/
static int midiCloseSeq(void)
{
- seq_lock();
- if (--numOpenMidiSeq == 0) {
- snd_seq_delete_simple_port(midiSeq, port_in);
- snd_seq_close(midiSeq);
- midiSeq = NULL;
- }
- seq_unlock();
+ struct midi_seq_open_params params;
+
+ params.port_in = NULL;
+ params.close = 1;
+ ALSA_CALL(midi_seq_open, ¶ms);
+
return 0;
}
diff --git a/dlls/winealsa.drv/unixlib.h b/dlls/winealsa.drv/unixlib.h
index e0ae16b97d9..d69ab980f42 100644
--- a/dlls/winealsa.drv/unixlib.h
+++ b/dlls/winealsa.drv/unixlib.h
@@ -241,6 +241,13 @@ struct midi_init_params
void *dests, *srcs;
};
+struct midi_seq_open_params
+{
+ int close;
+ snd_seq_t *seq;
+ int *port_in;
+};
+
enum alsa_funcs
{
alsa_get_endpoint_ids,
@@ -269,11 +276,13 @@ enum alsa_funcs
alsa_midi_init,
alsa_midi_seq_lock, /* temporary */
+ alsa_midi_seq_open,
};
NTSTATUS midi_init(void *args) DECLSPEC_HIDDEN;
NTSTATUS midi_seq_lock(void *args) DECLSPEC_HIDDEN;
+NTSTATUS midi_seq_open(void *args) DECLSPEC_HIDDEN;
extern unixlib_handle_t alsa_handle;
--
2.25.1
More information about the wine-devel
mailing list