[PATCH 7/8] wineoss: Move the stream creation to AudioClient_Initialize().

Andrew Eikum aeikum at codeweavers.com
Mon Apr 11 09:00:30 CDT 2022


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

On Wed, Apr 06, 2022 at 07:55:57AM +0100, Huw Davies wrote:
> Signed-off-by: Huw Davies <huw at codeweavers.com>
> ---
>  dlls/wineoss.drv/mmdevdrv.c | 148 +++++++++++++++++-------------------
>  1 file changed, 70 insertions(+), 78 deletions(-)
> 
> diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c
> index 990429156bc..6ab7b3e551d 100644
> --- a/dlls/wineoss.drv/mmdevdrv.c
> +++ b/dlls/wineoss.drv/mmdevdrv.c
> @@ -430,8 +430,6 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev,
>          IAudioClient **out)
>  {
>      ACImpl *This;
> -    struct oss_stream *stream;
> -    oss_audioinfo ai;
>      const OSSDevice *oss_dev;
>      HRESULT hr;
>      int len;
> @@ -448,57 +446,15 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev,
>      if(!This)
>          return E_OUTOFMEMORY;
>  
> -    stream = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*This->stream));
> -    if(!stream){
> -        HeapFree(GetProcessHeap(), 0, This);
> -        return E_OUTOFMEMORY;
> -    }
> -    stream->flow = oss_dev->flow;
> -    This->stream = stream;
> -
>      hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient3_iface, &This->pUnkFTMarshal);
>      if (FAILED(hr)) {
> -         HeapFree(GetProcessHeap(), 0, stream);
>           HeapFree(GetProcessHeap(), 0, This);
>           return hr;
>      }
>  
> -    stream->fd = open_device(oss_dev->devnode, oss_dev->flow);
> -    if(stream->fd < 0){
> -        WARN("Unable to open device %s: %d (%s)\n", oss_dev->devnode, errno,
> -                strerror(errno));
> -        HeapFree(GetProcessHeap(), 0, stream);
> -        HeapFree(GetProcessHeap(), 0, This);
> -        return AUDCLNT_E_DEVICE_INVALIDATED;
> -    }
> -
>      This->dataflow = oss_dev->flow;
> -
> -    ai.dev = -1;
> -    if(ioctl(stream->fd, SNDCTL_ENGINEINFO, &ai) < 0){
> -        WARN("Unable to get audio info for device %s: %d (%s)\n", oss_dev->devnode,
> -                errno, strerror(errno));
> -        close(stream->fd);
> -        HeapFree(GetProcessHeap(), 0, stream);
> -        HeapFree(GetProcessHeap(), 0, This);
> -        return E_FAIL;
> -    }
> -
>      strcpy(This->devnode, oss_dev->devnode);
>  
> -    TRACE("OSS audioinfo:\n");
> -    TRACE("devnode: %s\n", ai.devnode);
> -    TRACE("name: %s\n", ai.name);
> -    TRACE("busy: %x\n", ai.busy);
> -    TRACE("caps: %x\n", ai.caps);
> -    TRACE("iformats: %x\n", ai.iformats);
> -    TRACE("oformats: %x\n", ai.oformats);
> -    TRACE("enabled: %d\n", ai.enabled);
> -    TRACE("min_rate: %d\n", ai.min_rate);
> -    TRACE("max_rate: %d\n", ai.max_rate);
> -    TRACE("min_channels: %d\n", ai.min_channels);
> -    TRACE("max_channels: %d\n", ai.max_channels);
> -
>      This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl;
>      This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl;
>      This->IAudioCaptureClient_iface.lpVtbl = &AudioCaptureClient_Vtbl;
> @@ -576,17 +532,19 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface)
>          IUnknown_Release(This->pUnkFTMarshal);
>          This->lock.DebugInfo->Spare[0] = 0;
>          DeleteCriticalSection(&This->lock);
> -        close(stream->fd);
>          if(This->initted){
>              EnterCriticalSection(&g_sessions_lock);
>              list_remove(&This->entry);
>              LeaveCriticalSection(&g_sessions_lock);
>          }
>          HeapFree(GetProcessHeap(), 0, This->vols);
> -        HeapFree(GetProcessHeap(), 0, stream->local_buffer);
> -        HeapFree(GetProcessHeap(), 0, stream->tmp_buffer);
> -        CoTaskMemFree(stream->fmt);
> -        HeapFree(GetProcessHeap(), 0, stream);
> +        if(stream){
> +            close(stream->fd);
> +            HeapFree(GetProcessHeap(), 0, stream->local_buffer);
> +            HeapFree(GetProcessHeap(), 0, stream->tmp_buffer);
> +            CoTaskMemFree(stream->fmt);
> +            HeapFree(GetProcessHeap(), 0, stream);
> +        }
>          HeapFree(GetProcessHeap(), 0, This);
>      }
>      return ref;
> @@ -882,7 +840,8 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
>          const GUID *sessionguid)
>  {
>      ACImpl *This = impl_from_IAudioClient3(iface);
> -    struct oss_stream *stream = This->stream;
> +    struct oss_stream *stream;
> +    oss_audioinfo ai;
>      int i;
>      HRESULT hr;
>  
> @@ -942,18 +901,49 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
>          return AUDCLNT_E_ALREADY_INITIALIZED;
>      }
>  
> -    hr = setup_oss_device(mode, stream->fd, fmt, NULL);
> -    if(FAILED(hr)){
> +    stream = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*This->stream));
> +    if(!stream){
>          LeaveCriticalSection(&This->lock);
>          LeaveCriticalSection(&g_sessions_lock);
> -        return hr;
> +        return E_OUTOFMEMORY;
> +    }
> +    stream->flow = This->dataflow;
> +
> +    stream->fd = open_device(This->devnode, This->dataflow);
> +    if(stream->fd < 0){
> +        WARN("Unable to open device %s: %d (%s)\n", This->devnode, errno, strerror(errno));
> +        hr = AUDCLNT_E_DEVICE_INVALIDATED;
> +        goto exit;
> +    }
> +
> +    ai.dev = -1;
> +    if(ioctl(stream->fd, SNDCTL_ENGINEINFO, &ai) < 0){
> +        WARN("Unable to get audio info for device %s: %d (%s)\n", This->devnode, errno, strerror(errno));
> +        hr = E_FAIL;
> +        goto exit;
>      }
>  
> +    TRACE("OSS audioinfo:\n");
> +    TRACE("devnode: %s\n", ai.devnode);
> +    TRACE("name: %s\n", ai.name);
> +    TRACE("busy: %x\n", ai.busy);
> +    TRACE("caps: %x\n", ai.caps);
> +    TRACE("iformats: %x\n", ai.iformats);
> +    TRACE("oformats: %x\n", ai.oformats);
> +    TRACE("enabled: %d\n", ai.enabled);
> +    TRACE("min_rate: %d\n", ai.min_rate);
> +    TRACE("max_rate: %d\n", ai.max_rate);
> +    TRACE("min_channels: %d\n", ai.min_channels);
> +    TRACE("max_channels: %d\n", ai.max_channels);
> +
> +    hr = setup_oss_device(mode, stream->fd, fmt, NULL);
> +    if(FAILED(hr))
> +        goto exit;
> +
>      stream->fmt = clone_format(fmt);
>      if(!stream->fmt){
> -        LeaveCriticalSection(&This->lock);
> -        LeaveCriticalSection(&g_sessions_lock);
> -        return E_OUTOFMEMORY;
> +        hr = E_OUTOFMEMORY;
> +        goto exit;
>      }
>  
>      stream->period_us = period / 10;
> @@ -965,23 +955,16 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
>      stream->local_buffer = HeapAlloc(GetProcessHeap(), 0,
>              stream->bufsize_frames * fmt->nBlockAlign);
>      if(!stream->local_buffer){
> -        CoTaskMemFree(stream->fmt);
> -        stream->fmt = NULL;
> -        LeaveCriticalSection(&This->lock);
> -        LeaveCriticalSection(&g_sessions_lock);
> -        return E_OUTOFMEMORY;
> +        hr = E_OUTOFMEMORY;
> +        goto exit;
>      }
>  
>      This->channel_count = fmt->nChannels;
>      This->vols = HeapAlloc(GetProcessHeap(), 0, This->channel_count * sizeof(float));
>      if(!This->vols){
> -        CoTaskMemFree(stream->fmt);
> -        stream->fmt = NULL;
> -        LeaveCriticalSection(&This->lock);
> -        LeaveCriticalSection(&g_sessions_lock);
> -        return E_OUTOFMEMORY;
> +        hr = E_OUTOFMEMORY;
> +        goto exit;
>      }
> -
>      for(i = 0; i < This->channel_count; ++i)
>          This->vols[i] = 1.f;
>  
> @@ -991,24 +974,25 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
>  
>      hr = get_audio_session(sessionguid, This->parent, This->channel_count,
>              &This->session);
> +
> +exit:
>      if(FAILED(hr)){
>          HeapFree(GetProcessHeap(), 0, This->vols);
>          This->vols = NULL;
>          CoTaskMemFree(stream->fmt);
> -        stream->fmt = NULL;
> -        LeaveCriticalSection(&This->lock);
> -        LeaveCriticalSection(&g_sessions_lock);
> -        return hr;
> +        if(stream->fd >= 0) close(stream->fd);
> +        HeapFree(GetProcessHeap(), 0, stream->local_buffer);
> +        HeapFree(GetProcessHeap(), 0, stream);
> +    } else {
> +        list_add_tail(&This->session->clients, &This->entry);
> +        This->stream = stream;
> +        This->initted = TRUE;
>      }
>  
> -    list_add_tail(&This->session->clients, &This->entry);
> -
> -    This->initted = TRUE;
> -
>      LeaveCriticalSection(&This->lock);
>      LeaveCriticalSection(&g_sessions_lock);
>  
> -    return S_OK;
> +    return hr;
>  }
>  
>  static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface,
> @@ -1129,7 +1113,7 @@ static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface,
>      ACImpl *This = impl_from_IAudioClient3(iface);
>      WAVEFORMATEXTENSIBLE *fmt;
>      oss_audioinfo ai;
> -    int formats;
> +    int formats, fd;
>  
>      TRACE("(%p)->(%p)\n", This, pwfx);
>  
> @@ -1137,12 +1121,20 @@ static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface,
>          return E_POINTER;
>      *pwfx = NULL;
>  
> +    fd = open_device(This->devnode, This->dataflow);
> +    if(fd < 0){
> +        WARN("Unable to open device %s: %d (%s)\n", This->devnode, errno, strerror(errno));
> +        return AUDCLNT_E_DEVICE_INVALIDATED;
> +    }
> +
>      ai.dev = -1;
> -    if(ioctl(This->stream->fd, SNDCTL_ENGINEINFO, &ai) < 0){
> +    if(ioctl(fd, SNDCTL_ENGINEINFO, &ai) < 0){
>          WARN("Unable to get audio info for device %s: %d (%s)\n", This->devnode,
>                  errno, strerror(errno));
> +        close(fd);
>          return E_FAIL;
>      }
> +    close(fd);
>  
>      if(This->dataflow == eRender)
>          formats = ai.oformats;
> -- 
> 2.25.1
> 
> 



More information about the wine-devel mailing list