[PATCH v2 6/7] winepulse: Allocate ACImpl volumes when channel count is known.

Andrew Eikum aeikum at codeweavers.com
Tue May 25 11:53:48 CDT 2021


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

On Mon, May 24, 2021 at 06:22:33PM +0200, Jacek Caban wrote:
> 
> Signed-off-by: Jacek Caban <jacek at codeweavers.com>
> ---
>  dlls/winepulse.drv/mmdevdrv.c | 52 +++++++++++++++++++++++------------
>  1 file changed, 34 insertions(+), 18 deletions(-)
> 
> 

> diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c
> index df38bb594c7..0d55b0fc2d0 100644
> --- a/dlls/winepulse.drv/mmdevdrv.c
> +++ b/dlls/winepulse.drv/mmdevdrv.c
> @@ -30,8 +30,6 @@
>  #include <stdio.h>
>  #include <errno.h>
>  
> -#include <pulse/pulseaudio.h>
> -
>  #include "windef.h"
>  #include "winbase.h"
>  #include "winnls.h"
> @@ -134,7 +132,7 @@ struct ACImpl {
>      IUnknown *marshal;
>      IMMDevice *parent;
>      struct list entry;
> -    float vol[PA_CHANNELS_MAX];
> +    float *vol;
>  
>      LONG ref;
>      EDataFlow dataflow;
> @@ -293,7 +291,6 @@ int WINAPI AUDDRV_GetPriority(void)
>  HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient **out)
>  {
>      ACImpl *This;
> -    int i;
>      EDataFlow dataflow;
>      HRESULT hr;
>  
> @@ -319,8 +316,6 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient
>      This->IAudioStreamVolume_iface.lpVtbl = &AudioStreamVolume_Vtbl;
>      This->dataflow = dataflow;
>      This->parent = dev;
> -    for (i = 0; i < PA_CHANNELS_MAX; ++i)
> -        This->vol[i] = 1.f;
>  
>      hr = CoCreateFreeThreadedMarshaler((IUnknown*)&This->IAudioClient3_iface, &This->marshal);
>      if (hr) {
> @@ -533,8 +528,10 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
>          const GUID *sessionguid)
>  {
>      ACImpl *This = impl_from_IAudioClient3(iface);
> +    unsigned int i, channel_count;
> +    struct pulse_stream *stream;
>      char *name;
> -    HRESULT hr = S_OK;
> +    HRESULT hr;
>  
>      TRACE("(%p)->(%x, %x, %s, %s, %p, %s)\n", This, mode, flags,
>            wine_dbgstr_longlong(duration), wine_dbgstr_longlong(period), fmt, debugstr_guid(sessionguid));
> @@ -583,21 +580,40 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
>  
>      name = get_application_name();
>      hr = pulse->create_stream(name, This->dataflow, mode, flags, duration, period, fmt,
> -                              &This->channel_count, &This->pulse_stream);
> +                              &channel_count, &stream);
>      free(name);
> -    if (SUCCEEDED(hr)) {
> -        hr = get_audio_session(sessionguid, This->parent, This->channel_count, &This->session);
> -        if (SUCCEEDED(hr)) {
> -            set_stream_volumes(This);
> -            list_add_tail(&This->session->clients, &This->entry);
> -        } else {
> -            pulse->release_stream(This->pulse_stream, NULL);
> -            This->pulse_stream = NULL;
> -        }
> +    if (FAILED(hr))
> +    {
> +        pulse->unlock();
> +        return hr;
> +    }
> +
> +    if (!(This->vol = malloc(channel_count * sizeof(*This->vol))))
> +    {
> +        pulse->release_stream(stream, NULL);
> +        pulse->unlock();
> +        return E_OUTOFMEMORY;
> +    }
> +    for (i = 0; i < channel_count; i++)
> +        This->vol[i] = 1.f;
> +
> +    hr = get_audio_session(sessionguid, This->parent, channel_count, &This->session);
> +    if (FAILED(hr))
> +    {
> +        free(This->vol);
> +        This->vol = NULL;
> +        pulse->unlock();
> +        pulse->release_stream(stream, NULL);
> +        return E_OUTOFMEMORY;
>      }
>  
> +    This->pulse_stream = stream;
> +    This->channel_count = channel_count;
> +    list_add_tail(&This->session->clients, &This->entry);
> +    set_stream_volumes(This);
> +
>      pulse->unlock();
> -    return hr;
> +    return S_OK;
>  }
>  
>  static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface,
> 




More information about the wine-devel mailing list