wineoss: Add a temporary syscall to open and close the seq fd.
Signed-off-by: Huw Davies <huw@codeweavers.com> Signed-off-by: Andrew Eikum <aeikum@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
53eeb1162d
commit
e37bf4e991
|
@ -75,7 +75,6 @@ static int MODM_NumFMSynthDevs = 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 int numOpenMidiSeq = 0;
|
|
||||||
static int numStartedMidiIn = 0;
|
static int numStartedMidiIn = 0;
|
||||||
|
|
||||||
static CRITICAL_SECTION crit_sect; /* protects all MidiIn buffers queues */
|
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);
|
DriverCallback(dwCallBack, uFlags, hDev, wMsg, dwInstance, dwParam1, dwParam2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int midi_warn = 1;
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* midiOpenSeq [internal]
|
* midiOpenSeq [internal]
|
||||||
*/
|
*/
|
||||||
static int midiOpenSeq(void)
|
static int midiOpenSeq(void)
|
||||||
{
|
{
|
||||||
static int midiSeqFD = -1;
|
struct midi_seq_open_params params;
|
||||||
|
|
||||||
if (numOpenMidiSeq == 0) {
|
params.close = 0;
|
||||||
const char* device;
|
params.fd = -1;
|
||||||
device=getenv("MIDIDEV");
|
OSS_CALL(midi_seq_open, ¶ms);
|
||||||
if (!device) device="/dev/sequencer";
|
|
||||||
midiSeqFD = open(device, O_RDWR, 0);
|
return params.fd;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
|
@ -249,8 +217,11 @@ static int midiOpenSeq(void)
|
||||||
*/
|
*/
|
||||||
static int midiCloseSeq(int fd)
|
static int midiCloseSeq(int fd)
|
||||||
{
|
{
|
||||||
if (--numOpenMidiSeq == 0)
|
struct midi_seq_open_params params;
|
||||||
close(fd);
|
|
||||||
|
params.close = 1;
|
||||||
|
params.fd = fd;
|
||||||
|
OSS_CALL(midi_seq_open, ¶ms);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1406,4 +1406,6 @@ unixlib_entry_t __wine_unix_call_funcs[] =
|
||||||
set_event_handle,
|
set_event_handle,
|
||||||
is_started,
|
is_started,
|
||||||
midi_init,
|
midi_init,
|
||||||
|
|
||||||
|
midi_seq_open,
|
||||||
};
|
};
|
||||||
|
|
|
@ -119,6 +119,18 @@ static int seq_close(int fd)
|
||||||
return 0;
|
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)
|
NTSTATUS midi_init(void *args)
|
||||||
{
|
{
|
||||||
struct midi_init_params *params = args;
|
struct midi_init_params *params = args;
|
||||||
|
|
|
@ -246,6 +246,12 @@ struct midi_init_params
|
||||||
struct midi_src *srcs;
|
struct midi_src *srcs;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct midi_seq_open_params
|
||||||
|
{
|
||||||
|
int close;
|
||||||
|
int fd;
|
||||||
|
};
|
||||||
|
|
||||||
enum oss_funcs
|
enum oss_funcs
|
||||||
{
|
{
|
||||||
oss_test_connect,
|
oss_test_connect,
|
||||||
|
@ -272,9 +278,12 @@ enum oss_funcs
|
||||||
oss_set_event_handle,
|
oss_set_event_handle,
|
||||||
oss_is_started,
|
oss_is_started,
|
||||||
oss_midi_init,
|
oss_midi_init,
|
||||||
|
|
||||||
|
oss_midi_seq_open, /* temporary */
|
||||||
};
|
};
|
||||||
|
|
||||||
NTSTATUS midi_init(void *args) DECLSPEC_HIDDEN;
|
NTSTATUS midi_init(void *args) DECLSPEC_HIDDEN;
|
||||||
|
NTSTATUS midi_seq_open(void *args) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
extern unixlib_handle_t oss_handle;
|
extern unixlib_handle_t oss_handle;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue