[PATCH 3/5] winealsa: Handle MIDI running status.

Andrew Eikum aeikum at codeweavers.com
Thu May 26 11:17:54 CDT 2022


Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>

On Thu, May 26, 2022 at 11:38:47PM +0900, Akihiro Sagawa wrote:
> Signed-off-by: Akihiro Sagawa <sagawa.aki at gmail.com>
> ---
>  dlls/winealsa.drv/alsamidi.c | 31 ++++++++++++++++++++++++++++---
>  1 file changed, 28 insertions(+), 3 deletions(-)
> 

> diff --git a/dlls/winealsa.drv/alsamidi.c b/dlls/winealsa.drv/alsamidi.c
> index ccb9146ed2b..6350e3e4265 100644
> --- a/dlls/winealsa.drv/alsamidi.c
> +++ b/dlls/winealsa.drv/alsamidi.c
> @@ -55,6 +55,7 @@ struct midi_dest
>  {
>      BOOL                bEnabled;
>      MIDIOPENDESC        midiDesc;
> +    BYTE                runningStatus;
>      WORD                wFlags;
>      MIDIOUTCAPSW        caps;
>      snd_seq_t          *seq;
> @@ -539,6 +540,7 @@ static UINT midi_out_open(WORD dev_id, MIDIOPENDESC *midi_desc, UINT flags, stru
>          return MMSYSERR_NOTENABLED;
>      }
>  
> +    dest->runningStatus = 0;
>      dest->wFlags = HIWORD(flags & CALLBACK_TYPEMASK);
>      dest->midiDesc = *midi_desc;
>      dest->seq = midi_seq;
> @@ -639,9 +641,7 @@ static UINT midi_out_close(WORD dev_id, struct notify_context *notify)
>  
>  static UINT midi_out_data(WORD dev_id, UINT data)
>  {
> -    BYTE evt = LOBYTE(LOWORD(data));
> -    BYTE d1  = HIBYTE(LOWORD(data));
> -    BYTE d2  = LOBYTE(HIWORD(data));
> +    BYTE evt = LOBYTE(LOWORD(data)), d1, d2;
>      struct midi_dest *dest;
>  
>      TRACE("(%04X, %08X);\n", dev_id, data);
> @@ -656,6 +656,28 @@ static UINT midi_out_data(WORD dev_id, UINT data)
>          WARN("can't play !\n");
>          return MIDIERR_NODEVICE;
>      }
> +
> +    if (evt & 0x80)
> +    {
> +        d1 = HIBYTE(LOWORD(data));
> +        d2 = LOBYTE(HIWORD(data));
> +        if (evt < 0xF0)
> +            dest->runningStatus = evt;
> +        else if (evt <= 0xF7)
> +            dest->runningStatus = 0;
> +    }
> +    else if (dest->runningStatus)
> +    {
> +        evt = dest->runningStatus;
> +        d1 = LOBYTE(LOWORD(data));
> +        d2 = HIBYTE(LOWORD(data));
> +    }
> +    else
> +    {
> +        FIXME("ooch %x\n", data);
> +        return MMSYSERR_NOERROR;
> +    }
> +
>      switch (dest->caps.wTechnology)
>      {
>      case MOD_SYNTH:
> @@ -724,6 +746,7 @@ static UINT midi_out_data(WORD dev_id, UINT data)
>              {
>                  BYTE reset_sysex_seq[] = {MIDI_CMD_COMMON_SYSEX, 0x7e, 0x7f, 0x09, 0x01, 0xf7};
>                  snd_seq_ev_set_sysex(&event, sizeof(reset_sysex_seq), reset_sysex_seq);
> +                dest->runningStatus = 0;
>                  break;
>              }
>              case 0x01:	/* MTC Quarter frame */
> @@ -855,6 +878,7 @@ static UINT midi_out_long_data(WORD dev_id, MIDIHDR *hdr, UINT hdr_size, struct
>          return MMSYSERR_NOTENABLED;
>      }
>  
> +    dest->runningStatus = 0;
>      hdr->dwFlags &= ~MHDR_INQUEUE;
>      hdr->dwFlags |= MHDR_DONE;
>      set_out_notify(notify, dest, dev_id, MOM_DONE, (DWORD_PTR)hdr, 0);
> @@ -929,6 +953,7 @@ static UINT midi_out_reset(WORD dev_id)
>          /* remove sustain on all channels */
>          midi_out_data(dev_id, (MIDI_CTL_SUSTAIN << 8) | MIDI_CMD_CONTROL | chn);
>      }
> +    dests[dev_id].runningStatus = 0;
>      /* FIXME: the LongData buffers must also be returned to the app */
>      return MMSYSERR_NOERROR;
>  }




More information about the wine-devel mailing list