Signed-off-by: Huw Davies huw@codeweavers.com --- dlls/winealsa.drv/alsa.c | 1 + dlls/winealsa.drv/alsamidi.c | 265 +++++++++++++++++++++++++++++++++++ dlls/winealsa.drv/midi.c | 250 ++------------------------------- dlls/winealsa.drv/unixlib.h | 34 +++++ 4 files changed, 314 insertions(+), 236 deletions(-)
diff --git a/dlls/winealsa.drv/alsa.c b/dlls/winealsa.drv/alsa.c index cdc3d81d8cc..76e4b98caaf 100644 --- a/dlls/winealsa.drv/alsa.c +++ b/dlls/winealsa.drv/alsa.c @@ -2444,6 +2444,7 @@ unixlib_entry_t __wine_unix_call_funcs[] = set_event_handle, is_started, get_prop_value, + midi_init,
midi_seq_lock, /* temporary */ }; diff --git a/dlls/winealsa.drv/alsamidi.c b/dlls/winealsa.drv/alsamidi.c index ab4de4f7f9e..86e092bd977 100644 --- a/dlls/winealsa.drv/alsamidi.c +++ b/dlls/winealsa.drv/alsamidi.c @@ -31,6 +31,7 @@ #include <stdarg.h> #include <stdio.h> #include <pthread.h> +#include <alsa/asoundlib.h>
#include "ntstatus.h" #define WIN32_NO_STATUS @@ -38,13 +39,23 @@ #include "winbase.h" #include "winternl.h" #include "mmdeviceapi.h" +#include "mmddk.h"
+#include "wine/debug.h" #include "wine/unixlib.h"
#include "unixlib.h"
+WINE_DEFAULT_DEBUG_CHANNEL(midi); + static pthread_mutex_t seq_mutex = PTHREAD_MUTEX_INITIALIZER;
+static unsigned int num_dests, num_srcs; +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 void seq_lock(void) { pthread_mutex_lock(&seq_mutex); @@ -62,3 +73,257 @@ NTSTATUS midi_seq_lock(void *args)
return STATUS_SUCCESS; } + +static int seq_open(void) +{ + static int midi_warn; + + seq_lock(); + if (seq_refs == 0) + { + if (snd_seq_open(&midi_seq, "default", SND_SEQ_OPEN_DUPLEX, 0) < 0) + { + if (!midi_warn) + WARN("Error opening ALSA sequencer.\n"); + midi_warn = 1; + seq_unlock(); + return -1; + } + } + seq_refs++; + seq_unlock(); + return 0; +} + +static void seq_close(void) +{ + seq_lock(); + if (--seq_refs == 0) + { + snd_seq_close(midi_seq); + midi_seq = NULL; + } + seq_unlock(); +} + +static int alsa_to_win_device_type(unsigned int type) +{ + /* MOD_MIDIPORT output port + * MOD_SYNTH generic internal synth + * MOD_SQSYNTH square wave internal synth + * MOD_FMSYNTH FM internal synth + * MOD_MAPPER MIDI mapper + * MOD_WAVETABLE hardware wavetable internal synth + * MOD_SWSYNTH software internal synth + */ + + /* FIXME Is this really the correct equivalence from ALSA to + Windows Sound type? */ + + if (type & SND_SEQ_PORT_TYPE_SYNTH) + return MOD_FMSYNTH; + + if (type & (SND_SEQ_PORT_TYPE_DIRECT_SAMPLE|SND_SEQ_PORT_TYPE_SAMPLE)) + return MOD_SYNTH; + + if (type & (SND_SEQ_PORT_TYPE_MIDI_GENERIC|SND_SEQ_PORT_TYPE_APPLICATION)) + return MOD_MIDIPORT; + + ERR("Cannot determine the type (alsa type is %x) of this midi device. Assuming FM Synth\n", type); + return MOD_FMSYNTH; +} + +static void port_add(snd_seq_client_info_t* cinfo, snd_seq_port_info_t* pinfo, unsigned int cap, unsigned int type) +{ + char name[MAXPNAMELEN]; + unsigned int len; + struct midi_dest *dest; + struct midi_src *src; + + if (cap & SND_SEQ_PORT_CAP_WRITE) { + TRACE("OUT (%d:%s:%s:%d:%s:%x)\n",snd_seq_client_info_get_client(cinfo), + snd_seq_client_info_get_name(cinfo), + snd_seq_client_info_get_type(cinfo) == SND_SEQ_USER_CLIENT ? "user" : "kernel", + snd_seq_port_info_get_port(pinfo), + snd_seq_port_info_get_name(pinfo), + type); + + if (num_dests >= MAX_MIDIOUTDRV) + return; + if (!type) + return; + + dest = dests + num_dests; + dest->addr = *snd_seq_port_info_get_addr(pinfo); + + /* Manufac ID. We do not have access to this with soundcard.h + * Does not seem to be a problem, because in mmsystem.h only + * Microsoft's ID is listed. + */ + dest->caps.wMid = 0x00FF; + dest->caps.wPid = 0x0001; /* FIXME Product ID */ + /* Product Version. We simply say "1" */ + dest->caps.vDriverVersion = 0x001; + /* The following are mandatory for MOD_MIDIPORT */ + dest->caps.wChannelMask = 0xFFFF; + dest->caps.wVoices = 0; + dest->caps.wNotes = 0; + dest->caps.dwSupport = 0; + + /* Try to use both client and port names, if this is too long take the port name only. + In the second case the port name should be explicit enough due to its big size. + */ + len = strlen(snd_seq_port_info_get_name(pinfo)); + if ( (strlen(snd_seq_client_info_get_name(cinfo)) + len + 3) < sizeof(name) ) { + sprintf(name, "%s - %s", snd_seq_client_info_get_name(cinfo), snd_seq_port_info_get_name(pinfo)); + len = strlen(name); + } else { + len = min(len, sizeof(name) - 1); + memcpy(name, snd_seq_port_info_get_name(pinfo), len); + name[len] = '\0'; + } + ntdll_umbstowcs( name, len + 1, dest->caps.szPname, ARRAY_SIZE(dest->caps.szPname)); + + dest->caps.wTechnology = alsa_to_win_device_type(type); + + if (MOD_MIDIPORT != dest->caps.wTechnology) { + /* FIXME Do we have this information? + * Assuming the soundcards can handle + * MIDICAPS_VOLUME and MIDICAPS_LRVOLUME but + * not MIDICAPS_CACHE. + */ + dest->caps.dwSupport = MIDICAPS_VOLUME|MIDICAPS_LRVOLUME; + dest->caps.wVoices = 16; + + /* FIXME Is it possible to know the maximum + * number of simultaneous notes of a soundcard ? + * I believe we don't have this information, but + * it's probably equal or more than wVoices + */ + dest->caps.wNotes = 16; + } + dest->bEnabled = TRUE; + dest->port_out = -1; + + TRACE("MidiOut[%d]\tname='%s' techn=%d voices=%d notes=%d chnMsk=%04x support=%d\n" + "\tALSA info: midi dev-type=%x, capa=0\n", + num_dests, wine_dbgstr_w(dest->caps.szPname), + dest->caps.wTechnology, + dest->caps.wVoices, dest->caps.wNotes, + dest->caps.wChannelMask, dest->caps.dwSupport, + type); + + num_dests++; + } + if (cap & SND_SEQ_PORT_CAP_READ) { + TRACE("IN (%d:%s:%s:%d:%s:%x)\n",snd_seq_client_info_get_client(cinfo), + snd_seq_client_info_get_name(cinfo), + snd_seq_client_info_get_type(cinfo) == SND_SEQ_USER_CLIENT ? "user" : "kernel", + snd_seq_port_info_get_port(pinfo), + snd_seq_port_info_get_name(pinfo), + type); + + if (num_srcs >= MAX_MIDIINDRV) + return; + if (!type) + return; + + src = srcs + num_srcs; + src->addr = *snd_seq_port_info_get_addr(pinfo); + + /* Manufac ID. We do not have access to this with soundcard.h + * Does not seem to be a problem, because in mmsystem.h only + * Microsoft's ID is listed. + */ + src->caps.wMid = 0x00FF; + src->caps.wPid = 0x0001; /* FIXME Product ID */ + /* Product Version. We simply say "1" */ + src->caps.vDriverVersion = 0x001; + src->caps.dwSupport = 0; /* mandatory with MIDIINCAPS */ + + /* Try to use both client and port names, if this is too long take the port name only. + In the second case the port name should be explicit enough due to its big size. + */ + len = strlen(snd_seq_port_info_get_name(pinfo)); + if ( (strlen(snd_seq_client_info_get_name(cinfo)) + len + 3) < sizeof(name) ) { + sprintf(name, "%s - %s", snd_seq_client_info_get_name(cinfo), snd_seq_port_info_get_name(pinfo)); + len = strlen(name); + } else { + len = min(len, sizeof(name) - 1); + memcpy(name, snd_seq_port_info_get_name(pinfo), len); + name[len] = '\0'; + } + ntdll_umbstowcs( name, len + 1, src->caps.szPname, ARRAY_SIZE(src->caps.szPname)); + src->state = 0; + + TRACE("MidiIn [%d]\tname='%s' support=%d\n" + "\tALSA info: midi dev-type=%x, capa=0\n", + num_srcs, wine_dbgstr_w(src->caps.szPname), src->caps.dwSupport, type); + + num_srcs++; + } +} + +NTSTATUS midi_init(void *args) +{ + struct midi_init_params *params = args; + static BOOL init_done; + snd_seq_client_info_t *cinfo; + snd_seq_port_info_t *pinfo; + + if (init_done) { + *params->err = ERROR_ALREADY_INITIALIZED; + return STATUS_SUCCESS; + } + + TRACE("Initializing the MIDI variables.\n"); + init_done = TRUE; + + /* try to open device */ + if (seq_open() == -1) { + *params->err = ERROR_OPEN_FAILED; + return STATUS_SUCCESS; + } + + cinfo = calloc( 1, snd_seq_client_info_sizeof() ); + pinfo = calloc( 1, snd_seq_port_info_sizeof() ); + + /* First, search for all internal midi devices */ + snd_seq_client_info_set_client(cinfo, -1); + while (snd_seq_query_next_client(midi_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) { + unsigned int cap = snd_seq_port_info_get_capability(pinfo); + unsigned int type = snd_seq_port_info_get_type(pinfo); + if (!(type & SND_SEQ_PORT_TYPE_PORT)) + port_add(cinfo, pinfo, cap, type); + } + } + + /* Second, search for all external ports */ + snd_seq_client_info_set_client(cinfo, -1); + while (snd_seq_query_next_client(midi_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) { + unsigned int cap = snd_seq_port_info_get_capability(pinfo); + unsigned int type = snd_seq_port_info_get_type(pinfo); + if (type & SND_SEQ_PORT_TYPE_PORT) + port_add(cinfo, pinfo, cap, type); + } + } + seq_close(); + free( cinfo ); + free( pinfo ); + + *params->err = NOERROR; + params->num_dests = num_dests; + params->num_srcs = num_srcs; + params->dests = dests; + params->srcs = srcs; + + TRACE("End\n"); + + return STATUS_SUCCESS; +} diff --git a/dlls/winealsa.drv/midi.c b/dlls/winealsa.drv/midi.c index dff77ce88d8..988429ab934 100644 --- a/dlls/winealsa.drv/midi.c +++ b/dlls/winealsa.drv/midi.c @@ -43,33 +43,12 @@ #include "wine/debug.h" #include "wine/unixlib.h"
-#include <alsa/asoundlib.h> - #include "unixlib.h"
WINE_DEFAULT_DEBUG_CHANNEL(midi);
-typedef struct { - int state; /* -1 disabled, 0 is no recording started, 1 in recording, bit 2 set if in sys exclusive recording */ - MIDIOPENDESC midiDesc; - WORD wFlags; - LPMIDIHDR lpQueueHdr; - DWORD startTime; - MIDIINCAPSW caps; - snd_seq_addr_t addr; -} WINE_MIDIIN; - -typedef struct { - BOOL bEnabled; - MIDIOPENDESC midiDesc; - WORD wFlags; - MIDIOUTCAPSW caps; - snd_seq_addr_t addr; - int port_out; -} WINE_MIDIOUT; - -static WINE_MIDIIN MidiInDev [MAX_MIDIINDRV ]; -static WINE_MIDIOUT MidiOutDev[MAX_MIDIOUTDRV]; +static WINE_MIDIIN *MidiInDev; +static WINE_MIDIOUT *MidiOutDev;
/* this is the total number of MIDI out devices found (synth and port) */ static int MODM_NumDevs = 0; @@ -124,39 +103,6 @@ static void error_handler(const char* file, int line, const char* function, int } #endif
-/************************************************************************** - * MIDI_unixToWindowsDeviceType [internal] - * - * return the Windows equivalent to a Unix Device Type - * - */ -static int MIDI_AlsaToWindowsDeviceType(unsigned int type) -{ - /* MOD_MIDIPORT output port - * MOD_SYNTH generic internal synth - * MOD_SQSYNTH square wave internal synth - * MOD_FMSYNTH FM internal synth - * MOD_MAPPER MIDI mapper - * MOD_WAVETABLE hardware wavetable internal synth - * MOD_SWSYNTH software internal synth - */ - - /* FIXME Is this really the correct equivalence from ALSA to - Windows Sound type? */ - - if (type & SND_SEQ_PORT_TYPE_SYNTH) - return MOD_FMSYNTH; - - if (type & (SND_SEQ_PORT_TYPE_DIRECT_SAMPLE|SND_SEQ_PORT_TYPE_SAMPLE)) - return MOD_SYNTH; - - if (type & (SND_SEQ_PORT_TYPE_MIDI_GENERIC|SND_SEQ_PORT_TYPE_APPLICATION)) - return MOD_MIDIPORT; - - ERR("Cannot determine the type (alsa type is %x) of this midi device. Assuming FM Synth\n", type); - return MOD_FMSYNTH; -} - /************************************************************************** * MIDI_NotifyClient [internal] */ @@ -1121,134 +1067,6 @@ static DWORD modReset(WORD wDevID) }
-/************************************************************************** - * ALSA_AddMidiPort [internal] - * - * Helper for ALSA_MidiInit - */ -static void ALSA_AddMidiPort(snd_seq_client_info_t* cinfo, snd_seq_port_info_t* pinfo, unsigned int cap, unsigned int type) -{ - char midiPortName[MAXPNAMELEN]; - - if (cap & SND_SEQ_PORT_CAP_WRITE) { - TRACE("OUT (%d:%s:%s:%d:%s:%x)\n",snd_seq_client_info_get_client(cinfo), - snd_seq_client_info_get_name(cinfo), - snd_seq_client_info_get_type(cinfo) == SND_SEQ_USER_CLIENT ? "user" : "kernel", - snd_seq_port_info_get_port(pinfo), - snd_seq_port_info_get_name(pinfo), - type); - - if (MODM_NumDevs >= MAX_MIDIOUTDRV) - return; - if (!type) - return; - - MidiOutDev[MODM_NumDevs].addr = *snd_seq_port_info_get_addr(pinfo); - - /* Manufac ID. We do not have access to this with soundcard.h - * Does not seem to be a problem, because in mmsystem.h only - * Microsoft's ID is listed. - */ - MidiOutDev[MODM_NumDevs].caps.wMid = 0x00FF; - MidiOutDev[MODM_NumDevs].caps.wPid = 0x0001; /* FIXME Product ID */ - /* Product Version. We simply say "1" */ - MidiOutDev[MODM_NumDevs].caps.vDriverVersion = 0x001; - /* The following are mandatory for MOD_MIDIPORT */ - MidiOutDev[MODM_NumDevs].caps.wChannelMask = 0xFFFF; - MidiOutDev[MODM_NumDevs].caps.wVoices = 0; - MidiOutDev[MODM_NumDevs].caps.wNotes = 0; - MidiOutDev[MODM_NumDevs].caps.dwSupport = 0; - - /* Try to use both client and port names, if this is too long take the port name only. - In the second case the port name should be explicit enough due to its big size. - */ - if ( (strlen(snd_seq_client_info_get_name(cinfo)) + strlen(snd_seq_port_info_get_name(pinfo)) + 3) < MAXPNAMELEN ) { - sprintf(midiPortName, "%s - %s", snd_seq_client_info_get_name(cinfo), snd_seq_port_info_get_name(pinfo)); - } else { - lstrcpynA(midiPortName, snd_seq_port_info_get_name(pinfo), MAXPNAMELEN); - } - MultiByteToWideChar(CP_UNIXCP, 0, midiPortName, -1, MidiOutDev[MODM_NumDevs].caps.szPname, - ARRAY_SIZE(MidiOutDev[MODM_NumDevs].caps.szPname)); - - MidiOutDev[MODM_NumDevs].caps.wTechnology = MIDI_AlsaToWindowsDeviceType(type); - - if (MOD_MIDIPORT != MidiOutDev[MODM_NumDevs].caps.wTechnology) { - /* FIXME Do we have this information? - * Assuming the soundcards can handle - * MIDICAPS_VOLUME and MIDICAPS_LRVOLUME but - * not MIDICAPS_CACHE. - */ - MidiOutDev[MODM_NumDevs].caps.dwSupport = MIDICAPS_VOLUME|MIDICAPS_LRVOLUME; - MidiOutDev[MODM_NumDevs].caps.wVoices = 16; - - /* FIXME Is it possible to know the maximum - * number of simultaneous notes of a soundcard ? - * I believe we don't have this information, but - * it's probably equal or more than wVoices - */ - MidiOutDev[MODM_NumDevs].caps.wNotes = 16; - } - MidiOutDev[MODM_NumDevs].bEnabled = TRUE; - MidiOutDev[MODM_NumDevs].port_out = -1; - - TRACE("MidiOut[%d]\tname='%s' techn=%d voices=%d notes=%d chnMsk=%04x support=%d\n" - "\tALSA info: midi dev-type=%x, capa=0\n", - MODM_NumDevs, wine_dbgstr_w(MidiOutDev[MODM_NumDevs].caps.szPname), - MidiOutDev[MODM_NumDevs].caps.wTechnology, - MidiOutDev[MODM_NumDevs].caps.wVoices, MidiOutDev[MODM_NumDevs].caps.wNotes, - MidiOutDev[MODM_NumDevs].caps.wChannelMask, MidiOutDev[MODM_NumDevs].caps.dwSupport, - type); - - MODM_NumDevs++; - } - if (cap & SND_SEQ_PORT_CAP_READ) { - TRACE("IN (%d:%s:%s:%d:%s:%x)\n",snd_seq_client_info_get_client(cinfo), - snd_seq_client_info_get_name(cinfo), - snd_seq_client_info_get_type(cinfo) == SND_SEQ_USER_CLIENT ? "user" : "kernel", - snd_seq_port_info_get_port(pinfo), - snd_seq_port_info_get_name(pinfo), - type); - - if (MIDM_NumDevs >= MAX_MIDIINDRV) - return; - if (!type) - return; - - MidiInDev[MIDM_NumDevs].addr = *snd_seq_port_info_get_addr(pinfo); - - /* Manufac ID. We do not have access to this with soundcard.h - * Does not seem to be a problem, because in mmsystem.h only - * Microsoft's ID is listed. - */ - MidiInDev[MIDM_NumDevs].caps.wMid = 0x00FF; - MidiInDev[MIDM_NumDevs].caps.wPid = 0x0001; /* FIXME Product ID */ - /* Product Version. We simply say "1" */ - MidiInDev[MIDM_NumDevs].caps.vDriverVersion = 0x001; - MidiInDev[MIDM_NumDevs].caps.dwSupport = 0; /* mandatory with MIDIINCAPS */ - - /* Try to use both client and port names, if this is too long take the port name only. - In the second case the port name should be explicit enough due to its big size. - */ - if ( (strlen(snd_seq_client_info_get_name(cinfo)) + strlen(snd_seq_port_info_get_name(pinfo)) + 3) < MAXPNAMELEN ) { - sprintf(midiPortName, "%s - %s", snd_seq_client_info_get_name(cinfo), snd_seq_port_info_get_name(pinfo)); - } else { - lstrcpynA(midiPortName, snd_seq_port_info_get_name(pinfo), MAXPNAMELEN); - } - MultiByteToWideChar(CP_UNIXCP, 0, midiPortName, -1, MidiInDev[MIDM_NumDevs].caps.szPname, - ARRAY_SIZE(MidiInDev[MIDM_NumDevs].caps.szPname)); - MidiInDev[MIDM_NumDevs].state = 0; - - TRACE("MidiIn [%d]\tname='%s' support=%d\n" - "\tALSA info: midi dev-type=%x, capa=0\n", - MIDM_NumDevs, wine_dbgstr_w(MidiInDev[MIDM_NumDevs].caps.szPname), - MidiInDev[MIDM_NumDevs].caps.dwSupport, - type); - - MIDM_NumDevs++; - } -} - - /*======================================================================* * MIDI entry points * *======================================================================*/ @@ -1260,59 +1078,19 @@ static void ALSA_AddMidiPort(snd_seq_client_info_t* cinfo, snd_seq_port_info_t* */ static BOOL ALSA_MidiInit(void) { - static BOOL bInitDone = FALSE; - snd_seq_client_info_t *cinfo; - snd_seq_port_info_t *pinfo; - - if (bInitDone) - return TRUE; - - TRACE("Initializing the MIDI variables.\n"); - bInitDone = TRUE; - - /* try to open device */ - if (midiOpenSeq(FALSE) == -1) { - return TRUE; + struct midi_init_params params; + UINT err; + + params.err = &err; + ALSA_CALL(midi_init, ¶ms); + + if (!err) + { + MODM_NumDevs = params.num_dests; + MIDM_NumDevs = params.num_srcs; + MidiOutDev = params.dests; + MidiInDev = params.srcs; } - -#if 0 /* Debug purpose */ - snd_lib_error_set_handler(error_handler); -#endif - cinfo = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, snd_seq_client_info_sizeof() ); - pinfo = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, snd_seq_port_info_sizeof() ); - - /* First, search for all internal midi devices */ - snd_seq_client_info_set_client(cinfo, -1); - while(snd_seq_query_next_client(midiSeq, 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(midiSeq, pinfo) >= 0) { - unsigned int cap = snd_seq_port_info_get_capability(pinfo); - unsigned int type = snd_seq_port_info_get_type(pinfo); - if (!(type & SND_SEQ_PORT_TYPE_PORT)) - ALSA_AddMidiPort(cinfo, pinfo, cap, type); - } - } - - /* Second, search for all external ports */ - snd_seq_client_info_set_client(cinfo, -1); - while(snd_seq_query_next_client(midiSeq, 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(midiSeq, pinfo) >= 0) { - unsigned int cap = snd_seq_port_info_get_capability(pinfo); - unsigned int type = snd_seq_port_info_get_type(pinfo); - if (type & SND_SEQ_PORT_TYPE_PORT) - ALSA_AddMidiPort(cinfo, pinfo, cap, type); - } - } - - /* close file and exit */ - midiCloseSeq(); - HeapFree( GetProcessHeap(), 0, cinfo ); - HeapFree( GetProcessHeap(), 0, pinfo ); - - TRACE("End\n"); return TRUE; }
diff --git a/dlls/winealsa.drv/unixlib.h b/dlls/winealsa.drv/unixlib.h index 89afcb71bec..adac72183ee 100644 --- a/dlls/winealsa.drv/unixlib.h +++ b/dlls/winealsa.drv/unixlib.h @@ -207,6 +207,37 @@ struct get_prop_value_params unsigned int *buffer_size; };
+#include <alsa/asoundlib.h> +#include "mmddk.h" + +typedef struct midi_src +{ + int state; /* -1 disabled, 0 is no recording started, 1 in recording, bit 2 set if in sys exclusive recording */ + MIDIOPENDESC midiDesc; + WORD wFlags; + MIDIHDR *lpQueueHdr; + UINT startTime; + MIDIINCAPSW caps; + snd_seq_addr_t addr; +} WINE_MIDIIN; + +typedef struct midi_dest +{ + BOOL bEnabled; + MIDIOPENDESC midiDesc; + WORD wFlags; + MIDIOUTCAPSW caps; + snd_seq_addr_t addr; + int port_out; +} WINE_MIDIOUT; + +struct midi_init_params +{ + UINT *err; + unsigned int num_dests, num_srcs; + void *dests, *srcs; +}; + enum alsa_funcs { alsa_get_endpoint_ids, @@ -232,10 +263,13 @@ enum alsa_funcs alsa_set_event_handle, alsa_is_started, alsa_get_prop_value, + alsa_midi_init,
alsa_midi_seq_lock, /* temporary */ };
+NTSTATUS midi_init(void *args) DECLSPEC_HIDDEN; + NTSTATUS midi_seq_lock(void *args) DECLSPEC_HIDDEN;
extern unixlib_handle_t alsa_handle;