[PATCH v2 2/5] winealsa: Store the snd_seq handle and the input port in the device data.
Andrew Eikum
aeikum at codeweavers.com
Wed Mar 16 09:02:13 CDT 2022
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
On Tue, Mar 15, 2022 at 04:19:00PM +0000, Huw Davies wrote:
> This is to avoid accessing more global variables and generally
> makes things a bit cleaner.
>
> Signed-off-by: Huw Davies <huw at codeweavers.com>
> ---
> dlls/winealsa.drv/midi.c | 85 ++++++++++++++++++++-----------------
> dlls/winealsa.drv/unixlib.h | 3 ++
> 2 files changed, 49 insertions(+), 39 deletions(-)
>
> diff --git a/dlls/winealsa.drv/midi.c b/dlls/winealsa.drv/midi.c
> index 988429ab934..fae6ddf8615 100644
> --- a/dlls/winealsa.drv/midi.c
> +++ b/dlls/winealsa.drv/midi.c
> @@ -156,7 +156,7 @@ static BOOL midi_warn = TRUE;
> /**************************************************************************
> * midiOpenSeq [internal]
> */
> -static int midiOpenSeq(BOOL create_client)
> +static snd_seq_t *midiOpenSeq(int *port_in_ret)
> {
> seq_lock();
> if (numOpenMidiSeq == 0) {
> @@ -168,25 +168,24 @@ static int midiOpenSeq(BOOL create_client)
> }
> midi_warn = FALSE;
> seq_unlock();
> - return -1;
> + return NULL;
> }
>
> - if (create_client) {
> - /* Setting the client name is the only init to do */
> - snd_seq_set_client_name(midiSeq, "WINE midi driver");
> -
> - 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);
> - }
> + /* Setting the client name is the only init to do */
> + snd_seq_set_client_name(midiSeq, "WINE midi driver");
> +
> + 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();
> - return 0;
> + if (port_in_ret) *port_in_ret = port_in;
> + return midiSeq;
> }
>
> /**************************************************************************
> @@ -314,8 +313,9 @@ static void handle_midi_event(snd_seq_event_t *ev)
> }
> }
>
> -static DWORD WINAPI midRecThread(LPVOID arg)
> +static DWORD WINAPI midRecThread(void *arg)
> {
> + snd_seq_t *midi_seq = arg;
> int npfd;
> struct pollfd *pfd;
> int ret;
> @@ -325,9 +325,9 @@ static DWORD WINAPI midRecThread(LPVOID arg)
> while(!end_thread) {
> TRACE("Thread loop\n");
> seq_lock();
> - npfd = snd_seq_poll_descriptors_count(midiSeq, POLLIN);
> + npfd = snd_seq_poll_descriptors_count(midi_seq, POLLIN);
> pfd = HeapAlloc(GetProcessHeap(), 0, npfd * sizeof(struct pollfd));
> - snd_seq_poll_descriptors(midiSeq, pfd, npfd, POLLIN);
> + snd_seq_poll_descriptors(midi_seq, pfd, npfd, POLLIN);
> seq_unlock();
>
> /* Check if an event is present */
> @@ -337,9 +337,9 @@ static DWORD WINAPI midRecThread(LPVOID arg)
> }
>
> /* Note: This definitely does not work.
> - * while(snd_seq_event_input_pending(midiSeq, 0) > 0) {
> + * while(snd_seq_event_input_pending(midi_seq, 0) > 0) {
> snd_seq_event_t* ev;
> - snd_seq_event_input(midiSeq, &ev);
> + snd_seq_event_input(midi_seq, &ev);
> ....................
> snd_seq_free_event(ev);
> }*/
> @@ -348,7 +348,7 @@ static DWORD WINAPI midRecThread(LPVOID arg)
> snd_seq_event_t *ev;
>
> seq_lock();
> - snd_seq_event_input(midiSeq, &ev);
> + snd_seq_event_input(midi_seq, &ev);
> seq_unlock();
>
> if (ev) {
> @@ -357,10 +357,10 @@ static DWORD WINAPI midRecThread(LPVOID arg)
> }
>
> seq_lock();
> - ret = snd_seq_event_input_pending(midiSeq, 0);
> + ret = snd_seq_event_input_pending(midi_seq, 0);
> seq_unlock();
> } while(ret > 0);
> -
> +
> HeapFree(GetProcessHeap(), 0, pfd);
> }
> return 0;
> @@ -387,7 +387,8 @@ static DWORD midGetDevCaps(WORD wDevID, LPMIDIINCAPSW lpCaps, DWORD dwSize)
> */
> static DWORD midOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
> {
> - int ret = 0;
> + int ret = 0, port_in;
> + snd_seq_t *midi_seq;
>
> TRACE("(%04X, %p, %08X);\n", wDevID, lpDesc, dwFlags);
>
> @@ -420,7 +421,7 @@ static DWORD midOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
> return MMSYSERR_INVALFLAG;
> }
>
> - if (midiOpenSeq(TRUE) < 0) {
> + if (!(midi_seq = midiOpenSeq(&port_in))) {
> return MMSYSERR_ERROR;
> }
>
> @@ -430,10 +431,12 @@ static DWORD midOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
> MidiInDev[wDevID].midiDesc = *lpDesc;
> MidiInDev[wDevID].state = 0;
> MidiInDev[wDevID].startTime = 0;
> + MidiInDev[wDevID].seq = midi_seq;
> + MidiInDev[wDevID].port_in = port_in;
>
> /* Connect our app port to the device port */
> seq_lock();
> - ret = snd_seq_connect_from(midiSeq, port_in, MidiInDev[wDevID].addr.client,
> + ret = snd_seq_connect_from(midi_seq, port_in, MidiInDev[wDevID].addr.client,
> MidiInDev[wDevID].addr.port);
> seq_unlock();
> if (ret < 0)
> @@ -443,7 +446,7 @@ static DWORD midOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
>
> if (numStartedMidiIn++ == 0) {
> end_thread = 0;
> - hThread = CreateThread(NULL, 0, midRecThread, NULL, 0, NULL);
> + hThread = CreateThread(NULL, 0, midRecThread, midi_seq, 0, NULL);
> if (!hThread) {
> numStartedMidiIn = 0;
> WARN("Couldn't create thread for midi-in\n");
> @@ -479,7 +482,7 @@ static DWORD midClose(WORD wDevID)
> return MIDIERR_STILLPLAYING;
> }
>
> - if (midiSeq == NULL) {
> + if (MidiInDev[wDevID].seq == NULL) {
> WARN("ooops !\n");
> return MMSYSERR_ERROR;
> }
> @@ -494,12 +497,13 @@ static DWORD midClose(WORD wDevID)
> }
>
> seq_lock();
> - snd_seq_disconnect_from(midiSeq, port_in, MidiInDev[wDevID].addr.client, MidiInDev[wDevID].addr.port);
> + snd_seq_disconnect_from(MidiInDev[wDevID].seq, MidiInDev[wDevID].port_in, MidiInDev[wDevID].addr.client, MidiInDev[wDevID].addr.port);
> seq_unlock();
> midiCloseSeq();
>
> MIDI_NotifyClient(wDevID, MIM_CLOSE, 0L, 0L);
> MidiInDev[wDevID].midiDesc.hMidi = 0;
> + MidiInDev[wDevID].seq = NULL;
>
> return ret;
> }
> @@ -655,6 +659,7 @@ static DWORD modOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
> int ret;
> int port_out;
> char port_out_name[32];
> + snd_seq_t *midi_seq;
>
> TRACE("(%04X, %p, %08X);\n", wDevID, lpDesc, dwFlags);
> if (lpDesc == NULL) {
> @@ -682,7 +687,7 @@ static DWORD modOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
> case MOD_FMSYNTH:
> case MOD_MIDIPORT:
> case MOD_SYNTH:
> - if (midiOpenSeq(TRUE) < 0) {
> + if (!(midi_seq = midiOpenSeq(NULL))) {
> return MMSYSERR_ALLOCATED;
> }
> break;
> @@ -694,6 +699,7 @@ static DWORD modOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
>
> MidiOutDev[wDevID].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
> MidiOutDev[wDevID].midiDesc = *lpDesc;
> + MidiOutDev[wDevID].seq = midi_seq;
>
> seq_lock();
> /* Create a port dedicated to a specific device */
> @@ -701,7 +707,7 @@ static DWORD modOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
> if (wDevID)
> sprintf(port_out_name, "WINE ALSA Output #%d", wDevID);
>
> - port_out = snd_seq_create_simple_port(midiSeq, wDevID?port_out_name:"WINE ALSA Output",
> + port_out = snd_seq_create_simple_port(midi_seq, wDevID?port_out_name:"WINE ALSA Output",
> SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ|SND_SEQ_PORT_CAP_SUBS_WRITE,
> SND_SEQ_PORT_TYPE_MIDI_GENERIC|SND_SEQ_PORT_TYPE_APPLICATION);
>
> @@ -713,7 +719,7 @@ static DWORD modOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
> MidiOutDev[wDevID].port_out = port_out;
>
> /* Connect our app port to the device port */
> - ret = snd_seq_connect_to(midiSeq, port_out, MidiOutDev[wDevID].addr.client,
> + ret = snd_seq_connect_to(midi_seq, port_out, MidiOutDev[wDevID].addr.client,
> MidiOutDev[wDevID].addr.port);
>
> /* usually will happen when the port is already connected */
> @@ -751,7 +757,7 @@ static DWORD modClose(WORD wDevID)
> /* FIXME: should test that no pending buffer is still in the queue for
> * playing */
>
> - if (midiSeq == NULL) {
> + if (MidiOutDev[wDevID].seq == NULL) {
> WARN("can't close !\n");
> return MMSYSERR_ERROR;
> }
> @@ -762,10 +768,11 @@ static DWORD modClose(WORD wDevID)
> case MOD_SYNTH:
> seq_lock();
> TRACE("Deleting port :%d, connected to %d:%d\n", MidiOutDev[wDevID].port_out, MidiOutDev[wDevID].addr.client, MidiOutDev[wDevID].addr.port);
> - snd_seq_delete_simple_port(midiSeq, MidiOutDev[wDevID].port_out);
> + snd_seq_delete_simple_port(MidiOutDev[wDevID].seq, MidiOutDev[wDevID].port_out);
> MidiOutDev[wDevID].port_out = -1;
> seq_unlock();
> - midiCloseSeq();
> + midiCloseSeq();
> + MidiOutDev[wDevID].seq = NULL;
> break;
> default:
> WARN("Technology not supported (yet) %d !\n",
> @@ -792,7 +799,7 @@ static DWORD modData(WORD wDevID, DWORD dwParam)
> if (wDevID >= MODM_NumDevs) return MMSYSERR_BADDEVICEID;
> if (!MidiOutDev[wDevID].bEnabled) return MIDIERR_NODEVICE;
>
> - if (midiSeq == NULL) {
> + if (MidiOutDev[wDevID].seq == NULL) {
> WARN("can't play !\n");
> return MIDIERR_NODEVICE;
> }
> @@ -886,7 +893,7 @@ static DWORD modData(WORD wDevID, DWORD dwParam)
> }
> if (handled) {
> seq_lock();
> - snd_seq_event_output_direct(midiSeq, &event);
> + snd_seq_event_output_direct(MidiOutDev[wDevID].seq, &event);
> seq_unlock();
> }
> }
> @@ -919,7 +926,7 @@ static DWORD modLongData(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
> if (wDevID >= MODM_NumDevs) return MMSYSERR_BADDEVICEID;
> if (!MidiOutDev[wDevID].bEnabled) return MIDIERR_NODEVICE;
>
> - if (midiSeq == NULL) {
> + if (MidiOutDev[wDevID].seq == NULL) {
> WARN("can't play !\n");
> return MIDIERR_NODEVICE;
> }
> @@ -977,7 +984,7 @@ static DWORD modLongData(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
> snd_seq_ev_set_subs(&event);
> snd_seq_ev_set_sysex(&event, lpMidiHdr->dwBufferLength + len_add, lpNewData ? lpNewData : lpData);
> seq_lock();
> - snd_seq_event_output_direct(midiSeq, &event);
> + snd_seq_event_output_direct(MidiOutDev[wDevID].seq, &event);
> seq_unlock();
> HeapFree(GetProcessHeap(), 0, lpNewData);
> break;
> diff --git a/dlls/winealsa.drv/unixlib.h b/dlls/winealsa.drv/unixlib.h
> index adac72183ee..e0ae16b97d9 100644
> --- a/dlls/winealsa.drv/unixlib.h
> +++ b/dlls/winealsa.drv/unixlib.h
> @@ -218,7 +218,9 @@ typedef struct midi_src
> MIDIHDR *lpQueueHdr;
> UINT startTime;
> MIDIINCAPSW caps;
> + snd_seq_t *seq;
> snd_seq_addr_t addr;
> + int port_in;
> } WINE_MIDIIN;
>
> typedef struct midi_dest
> @@ -227,6 +229,7 @@ typedef struct midi_dest
> MIDIOPENDESC midiDesc;
> WORD wFlags;
> MIDIOUTCAPSW caps;
> + snd_seq_t *seq;
> snd_seq_addr_t addr;
> int port_out;
> } WINE_MIDIOUT;
> --
> 2.25.1
>
>
More information about the wine-devel
mailing list