Commit 43e56571 authored by Huw Davies's avatar Huw Davies Committed by Alexandre Julliard

winealsa: Add a temporary syscall to return the snd_seq handle.

parent 8656ec92
...@@ -2447,4 +2447,5 @@ unixlib_entry_t __wine_unix_call_funcs[] = ...@@ -2447,4 +2447,5 @@ unixlib_entry_t __wine_unix_call_funcs[] =
midi_init, midi_init,
midi_seq_lock, /* temporary */ midi_seq_lock, /* temporary */
midi_seq_open,
}; };
...@@ -55,6 +55,7 @@ static struct midi_dest dests[MAX_MIDIOUTDRV]; ...@@ -55,6 +55,7 @@ static struct midi_dest dests[MAX_MIDIOUTDRV];
static struct midi_src srcs[MAX_MIDIINDRV]; static struct midi_src srcs[MAX_MIDIINDRV];
static snd_seq_t *midi_seq; static snd_seq_t *midi_seq;
static unsigned int seq_refs; static unsigned int seq_refs;
static int port_in = -1;
static void seq_lock(void) static void seq_lock(void)
{ {
...@@ -74,7 +75,7 @@ NTSTATUS midi_seq_lock(void *args) ...@@ -74,7 +75,7 @@ NTSTATUS midi_seq_lock(void *args)
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
static int seq_open(void) static snd_seq_t *seq_open(int *port_in_ret)
{ {
static int midi_warn; static int midi_warn;
...@@ -87,12 +88,28 @@ static int seq_open(void) ...@@ -87,12 +88,28 @@ static int seq_open(void)
WARN("Error opening ALSA sequencer.\n"); WARN("Error opening ALSA sequencer.\n");
midi_warn = 1; midi_warn = 1;
seq_unlock(); seq_unlock();
return -1; return NULL;
} }
snd_seq_set_client_name(midi_seq, "WINE midi driver");
} }
seq_refs++; 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(); seq_unlock();
return 0; return midi_seq;
} }
static void seq_close(void) static void seq_close(void)
...@@ -100,12 +117,29 @@ static void seq_close(void) ...@@ -100,12 +117,29 @@ static void seq_close(void)
seq_lock(); seq_lock();
if (--seq_refs == 0) 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); snd_seq_close(midi_seq);
midi_seq = NULL; midi_seq = NULL;
} }
seq_unlock(); 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) static int alsa_to_win_device_type(unsigned int type)
{ {
/* MOD_MIDIPORT output port /* MOD_MIDIPORT output port
...@@ -270,6 +304,7 @@ NTSTATUS midi_init(void *args) ...@@ -270,6 +304,7 @@ NTSTATUS midi_init(void *args)
static BOOL init_done; static BOOL init_done;
snd_seq_client_info_t *cinfo; snd_seq_client_info_t *cinfo;
snd_seq_port_info_t *pinfo; snd_seq_port_info_t *pinfo;
snd_seq_t *seq;
if (init_done) { if (init_done) {
*params->err = ERROR_ALREADY_INITIALIZED; *params->err = ERROR_ALREADY_INITIALIZED;
...@@ -280,7 +315,7 @@ NTSTATUS midi_init(void *args) ...@@ -280,7 +315,7 @@ NTSTATUS midi_init(void *args)
init_done = TRUE; init_done = TRUE;
/* try to open device */ /* try to open device */
if (seq_open() == -1) { if (!(seq = seq_open(NULL))) {
*params->err = ERROR_OPEN_FAILED; *params->err = ERROR_OPEN_FAILED;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
...@@ -290,10 +325,10 @@ NTSTATUS midi_init(void *args) ...@@ -290,10 +325,10 @@ NTSTATUS midi_init(void *args)
/* First, search for all internal midi devices */ /* First, search for all internal midi devices */
snd_seq_client_info_set_client(cinfo, -1); 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_client(pinfo, snd_seq_client_info_get_client(cinfo));
snd_seq_port_info_set_port(pinfo, -1); 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 cap = snd_seq_port_info_get_capability(pinfo);
unsigned int type = snd_seq_port_info_get_type(pinfo); unsigned int type = snd_seq_port_info_get_type(pinfo);
if (!(type & SND_SEQ_PORT_TYPE_PORT)) if (!(type & SND_SEQ_PORT_TYPE_PORT))
...@@ -303,10 +338,10 @@ NTSTATUS midi_init(void *args) ...@@ -303,10 +338,10 @@ NTSTATUS midi_init(void *args)
/* Second, search for all external ports */ /* Second, search for all external ports */
snd_seq_client_info_set_client(cinfo, -1); 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_client(pinfo, snd_seq_client_info_get_client(cinfo));
snd_seq_port_info_set_port(pinfo, -1); 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 cap = snd_seq_port_info_get_capability(pinfo);
unsigned int type = snd_seq_port_info_get_type(pinfo); unsigned int type = snd_seq_port_info_get_type(pinfo);
if (type & SND_SEQ_PORT_TYPE_PORT) if (type & SND_SEQ_PORT_TYPE_PORT)
......
...@@ -55,12 +55,8 @@ static int MODM_NumDevs = 0; ...@@ -55,12 +55,8 @@ static int MODM_NumDevs = 0;
/* this is the total number of MIDI out devices found */ /* this is the total number of MIDI out devices found */
static int MIDM_NumDevs = 0; static int MIDM_NumDevs = 0;
static snd_seq_t* midiSeq = NULL;
static int numOpenMidiSeq = 0;
static int numStartedMidiIn = 0; static int numStartedMidiIn = 0;
static int port_in;
static CRITICAL_SECTION crit_sect; /* protects all MidiIn buffer queues */ static CRITICAL_SECTION crit_sect; /* protects all MidiIn buffer queues */
static CRITICAL_SECTION_DEBUG critsect_debug = static CRITICAL_SECTION_DEBUG critsect_debug =
{ {
...@@ -152,40 +148,18 @@ static void MIDI_NotifyClient(UINT wDevID, WORD wMsg, ...@@ -152,40 +148,18 @@ static void MIDI_NotifyClient(UINT wDevID, WORD wMsg,
DriverCallback(dwCallBack, uFlags, hDev, wMsg, dwInstance, dwParam1, dwParam2); DriverCallback(dwCallBack, uFlags, hDev, wMsg, dwInstance, dwParam1, dwParam2);
} }
static BOOL midi_warn = TRUE;
/************************************************************************** /**************************************************************************
* midiOpenSeq [internal] * midiOpenSeq [internal]
*/ */
static snd_seq_t *midiOpenSeq(int *port_in_ret) static snd_seq_t *midiOpenSeq(int *port_in_ret)
{ {
seq_lock(); struct midi_seq_open_params params;
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;
}
/* Setting the client name is the only init to do */ params.port_in = port_in_ret;
snd_seq_set_client_name(midiSeq, "WINE midi driver"); params.close = 0;
ALSA_CALL(midi_seq_open, &params);
port_in = snd_seq_create_simple_port(midiSeq, "WINE ALSA Input", return params.seq;
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;
} }
/************************************************************************** /**************************************************************************
...@@ -193,13 +167,12 @@ static snd_seq_t *midiOpenSeq(int *port_in_ret) ...@@ -193,13 +167,12 @@ static snd_seq_t *midiOpenSeq(int *port_in_ret)
*/ */
static int midiCloseSeq(void) static int midiCloseSeq(void)
{ {
seq_lock(); struct midi_seq_open_params params;
if (--numOpenMidiSeq == 0) {
snd_seq_delete_simple_port(midiSeq, port_in); params.port_in = NULL;
snd_seq_close(midiSeq); params.close = 1;
midiSeq = NULL; ALSA_CALL(midi_seq_open, &params);
}
seq_unlock();
return 0; return 0;
} }
......
...@@ -241,6 +241,13 @@ struct midi_init_params ...@@ -241,6 +241,13 @@ struct midi_init_params
void *dests, *srcs; void *dests, *srcs;
}; };
struct midi_seq_open_params
{
int close;
snd_seq_t *seq;
int *port_in;
};
enum alsa_funcs enum alsa_funcs
{ {
alsa_get_endpoint_ids, alsa_get_endpoint_ids,
...@@ -269,11 +276,13 @@ enum alsa_funcs ...@@ -269,11 +276,13 @@ enum alsa_funcs
alsa_midi_init, alsa_midi_init,
alsa_midi_seq_lock, /* temporary */ alsa_midi_seq_lock, /* temporary */
alsa_midi_seq_open,
}; };
NTSTATUS midi_init(void *args) DECLSPEC_HIDDEN; NTSTATUS midi_init(void *args) DECLSPEC_HIDDEN;
NTSTATUS midi_seq_lock(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; extern unixlib_handle_t alsa_handle;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment