All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Philippe Mathieu-Daudé" <philmd@redhat.com>
To: "KJ Liew" <liewkj@yahoo.com>,
	qemu-devel@nongnu.org, "Kővágó, Zoltán" <dirty.ice.hu@gmail.com>,
	"Gerd Hoffmann" <kraxel@redhat.com>
Subject: Re: [PATCH] audio/dsound: fix invalid parameters error
Date: Sat, 18 Jan 2020 07:30:02 +0100	[thread overview]
Message-ID: <29987343-f835-2280-4457-067d970c9c5e@redhat.com> (raw)
In-Reply-To: <20200117182621.GB13724@chuwi-lt0>

On 1/17/20 7:26 PM, KJ Liew wrote:
> QEMU Windows has broken dsound backend since the rewrite of audio API in
> version 4.2.0. Both playback and capture buffers failed to lock with
> invalid parameters error.

Fixes: 7fa9754ac88 (dsoundaudio: port to the new audio backend api)

Cc'ing Zoltán who wrote 7fa9754ac88, and Gerd (the maintainer of this file):

   $ ./scripts/get_maintainer.pl -f audio/dsoundaudio.c
   Gerd Hoffmann <kraxel@redhat.com> (maintainer:Audio)

> --- ../orig/qemu-4.2.0/audio/dsoundaudio.c	2019-12-12 10:20:47.000000000 -0800
> +++ ../qemu-4.2.0/audio/dsoundaudio.c	2020-01-17 08:05:46.783966900 -0800
> @@ -53,6 +53,7 @@
>   typedef struct {
>       HWVoiceOut hw;
>       LPDIRECTSOUNDBUFFER dsound_buffer;
> +    void *last_buf;
>       dsound *s;
>   } DSoundVoiceOut;
>   
> @@ -414,10 +415,10 @@
>       DSoundVoiceOut *ds = (DSoundVoiceOut *) hw;
>       LPDIRECTSOUNDBUFFER dsb = ds->dsound_buffer;
>       HRESULT hr;
> -    DWORD ppos, act_size;
> +    DWORD ppos, act_size, last_size;
>       size_t req_size;
>       int err;
> -    void *ret;
> +    void *ret, *last_ret;
>   
>       hr = IDirectSoundBuffer_GetCurrentPosition(dsb, &ppos, NULL);
>       if (FAILED(hr)) {
> @@ -426,17 +427,24 @@
>           return NULL;
>       }
>   
> +    if (ppos == hw->pos_emul) {
> +        *size = 0;
> +        return ds->last_buf;
> +    }
> +
>       req_size = audio_ring_dist(ppos, hw->pos_emul, hw->size_emul);
>       req_size = MIN(req_size, hw->size_emul - hw->pos_emul);
>   
> -    err = dsound_lock_out(dsb, &hw->info, hw->pos_emul, req_size, &ret, NULL,
> -                          &act_size, NULL, false, ds->s);
> +    err = dsound_lock_out(dsb, &hw->info, hw->pos_emul, req_size, &ret, &last_ret,
> +                          &act_size, &last_size, false, ds->s);
>       if (err) {
>           dolog("Failed to lock buffer\n");
>           *size = 0;
>           return NULL;
>       }
>   
> +    ds->last_buf = g_realloc(ds->last_buf, act_size);
> +    memcpy(ds->last_buf, ret, act_size);
>       *size = act_size;
>       return ret;
>   }
> @@ -445,6 +453,8 @@
>   {
>       DSoundVoiceOut *ds = (DSoundVoiceOut *) hw;
>       LPDIRECTSOUNDBUFFER dsb = ds->dsound_buffer;
> +    if (len == 0)
> +        return 0;
>       int err = dsound_unlock_out(dsb, buf, NULL, len, 0);
>   
>       if (err) {
> @@ -508,10 +518,10 @@
>       DSoundVoiceIn *ds = (DSoundVoiceIn *) hw;
>       LPDIRECTSOUNDCAPTUREBUFFER dscb = ds->dsound_capture_buffer;
>       HRESULT hr;
> -    DWORD cpos, act_size;
> +    DWORD cpos, act_size, last_size;
>       size_t req_size;
>       int err;
> -    void *ret;
> +    void *ret, *last_ret;
>   
>       hr = IDirectSoundCaptureBuffer_GetCurrentPosition(dscb, &cpos, NULL);
>       if (FAILED(hr)) {
> @@ -520,11 +530,16 @@
>           return NULL;
>       }
>   
> +    if (cpos == hw->pos_emul) {
> +        *size = 0;
> +        return NULL;
> +    }
> +
>       req_size = audio_ring_dist(cpos, hw->pos_emul, hw->size_emul);
>       req_size = MIN(req_size, hw->size_emul - hw->pos_emul);
>   
> -    err = dsound_lock_in(dscb, &hw->info, hw->pos_emul, req_size, &ret, NULL,
> -                         &act_size, NULL, false, ds->s);
> +    err = dsound_lock_in(dscb, &hw->info, hw->pos_emul, req_size, &ret, &last_ret,
> +                         &act_size, &last_size, false, ds->s);
>       if (err) {
>           dolog("Failed to lock buffer\n");
>           *size = 0;
> 



  reply	other threads:[~2020-01-18  6:31 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20200117182621.GB13724.ref@chuwi-lt0>
2020-01-17 18:26 ` [PATCH] audio/dsound: fix invalid parameters error KJ Liew
2020-01-18  6:30   ` Philippe Mathieu-Daudé [this message]
2020-01-27  1:46     ` Zoltán Kővágó
2020-01-31  7:55       ` Gerd Hoffmann
2020-02-01 18:28       ` KJ Liew
2020-02-02 23:02 Kővágó, Zoltán
2020-02-03  7:56 ` Howard Spoelstra
2020-02-03  9:18   ` Philippe Mathieu-Daudé
2020-02-03  9:25     ` Howard Spoelstra
2020-02-06 13:38 ` Gerd Hoffmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=29987343-f835-2280-4457-067d970c9c5e@redhat.com \
    --to=philmd@redhat.com \
    --cc=dirty.ice.hu@gmail.com \
    --cc=kraxel@redhat.com \
    --cc=liewkj@yahoo.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.