[PATCH v2 3/6] winealsa: Move start to the unixlib.

Andrew Eikum aeikum at codeweavers.com
Thu Mar 3 12:56:36 CST 2022


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

On Wed, Mar 02, 2022 at 10:53:17AM +0000, Huw Davies wrote:
> Signed-off-by: Huw Davies <huw at codeweavers.com>
> ---
>  dlls/winealsa.drv/alsa.c     | 56 +++++++++++++++++----
>  dlls/winealsa.drv/mmdevdrv.c | 97 ++----------------------------------
>  dlls/winealsa.drv/unixlib.h  | 17 +++----
>  3 files changed, 59 insertions(+), 111 deletions(-)
> 
> diff --git a/dlls/winealsa.drv/alsa.c b/dlls/winealsa.drv/alsa.c
> index d455a3787e8..a5558718f47 100644
> --- a/dlls/winealsa.drv/alsa.c
> +++ b/dlls/winealsa.drv/alsa.c
> @@ -1214,13 +1214,6 @@ static snd_pcm_sframes_t alsa_write_best_effort(struct alsa_stream *stream, BYTE
>      return written;
>  }
>  
> -static NTSTATUS write_best_effort(void *args)
> -{
> -    struct write_best_effort_tmp_params *params = args;
> -    *params->written = alsa_write_best_effort(params->stream, params->buf, params->frames);
> -    return STATUS_SUCCESS;
> -}
> -
>  static snd_pcm_sframes_t alsa_write_buffer_wrap(struct alsa_stream *stream, BYTE *buf,
>          snd_pcm_uframes_t buflen, snd_pcm_uframes_t offs,
>          snd_pcm_uframes_t to_write)
> @@ -1416,6 +1409,52 @@ exit:
>          NtSetEvent(stream->event, NULL);
>  }
>  
> +static NTSTATUS start(void *args)
> +{
> +    struct start_params *params = args;
> +    struct alsa_stream *stream = params->stream;
> +
> +    alsa_lock(stream);
> +
> +    if((stream->flags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) && !stream->event)
> +        return alsa_unlock_result(stream, &params->result, AUDCLNT_E_EVENTHANDLE_NOT_SET);
> +
> +    if(stream->started)
> +        return alsa_unlock_result(stream, &params->result, AUDCLNT_E_NOT_STOPPED);
> +
> +    if(stream->flow == eCapture){
> +        /* dump any data that might be leftover in the ALSA capture buffer */
> +        snd_pcm_readi(stream->pcm_handle, stream->local_buffer,
> +                stream->bufsize_frames);
> +    }else{
> +        snd_pcm_sframes_t avail, written;
> +        snd_pcm_uframes_t offs;
> +
> +        avail = snd_pcm_avail_update(stream->pcm_handle);
> +        avail = min(avail, stream->held_frames);
> +
> +        if(stream->wri_offs_frames < stream->held_frames)
> +            offs = stream->bufsize_frames - stream->held_frames + stream->wri_offs_frames;
> +        else
> +            offs = stream->wri_offs_frames - stream->held_frames;
> +
> +        /* fill it with data */
> +        written = alsa_write_buffer_wrap(stream, stream->local_buffer,
> +                stream->bufsize_frames, offs, avail);
> +
> +        if(written > 0){
> +            stream->lcl_offs_frames = (offs + written) % stream->bufsize_frames;
> +            stream->data_in_alsa_frames = written;
> +        }else{
> +            stream->lcl_offs_frames = offs;
> +            stream->data_in_alsa_frames = 0;
> +        }
> +    }
> +    stream->started = TRUE;
> +
> +    return alsa_unlock_result(stream, &params->result, S_OK);
> +}
> +
>  static NTSTATUS timer_loop(void *args)
>  {
>      struct timer_loop_params *params = args;
> @@ -1761,12 +1800,11 @@ unixlib_entry_t __wine_unix_call_funcs[] =
>      get_endpoint_ids,
>      create_stream,
>      release_stream,
> +    start,
>      timer_loop,
>      is_format_supported,
>      get_mix_format,
>      get_buffer_size,
>      get_latency,
>      get_current_padding,
> -
> -    write_best_effort /* temporary */
>  };
> diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c
> index 2748cc552a6..5eab548e606 100644
> --- a/dlls/winealsa.drv/mmdevdrv.c
> +++ b/dlls/winealsa.drv/mmdevdrv.c
> @@ -963,51 +963,6 @@ static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient3 *iface,
>      return S_OK;
>  }
>  
> -static snd_pcm_sframes_t alsa_write_best_effort(struct alsa_stream *stream, BYTE *buf, snd_pcm_uframes_t frames)
> -{
> -    struct write_best_effort_tmp_params params;
> -    snd_pcm_sframes_t written;
> -
> -    params.stream = stream;
> -    params.buf = buf;
> -    params.frames = frames;
> -    params.written = &written;
> -
> -    ALSA_CALL(write_best_effort_tmp, &params);
> -
> -    return written;
> -}
> -
> -static snd_pcm_sframes_t alsa_write_buffer_wrap(struct alsa_stream *stream, BYTE *buf,
> -        snd_pcm_uframes_t buflen, snd_pcm_uframes_t offs,
> -        snd_pcm_uframes_t to_write)
> -{
> -    snd_pcm_sframes_t ret = 0;
> -
> -    while(to_write){
> -        snd_pcm_uframes_t chunk;
> -        snd_pcm_sframes_t tmp;
> -
> -        if(offs + to_write > buflen)
> -            chunk = buflen - offs;
> -        else
> -            chunk = to_write;
> -
> -        tmp = alsa_write_best_effort(stream, buf + offs * stream->fmt->nBlockAlign, chunk);
> -        if(tmp < 0)
> -            return ret;
> -        if(!tmp)
> -            break;
> -
> -        ret += tmp;
> -        to_write -= tmp;
> -        offs += tmp;
> -        offs %= buflen;
> -    }
> -
> -    return ret;
> -}
> -
>  static snd_pcm_uframes_t interp_elapsed_frames(struct alsa_stream *stream)
>  {
>      LARGE_INTEGER time_freq, current_time, time_diff;
> @@ -1053,7 +1008,7 @@ static int alsa_rewind_best_effort(ACImpl *This)
>  static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface)
>  {
>      ACImpl *This = impl_from_IAudioClient3(iface);
> -    struct alsa_stream *stream = This->stream;
> +    struct start_params params;
>  
>      TRACE("(%p)\n", This);
>  
> @@ -1064,60 +1019,18 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface)
>          return AUDCLNT_E_NOT_INITIALIZED;
>      }
>  
> -    alsa_lock(stream);
> -
> -    if((stream->flags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) && !stream->event){
> -        alsa_unlock(stream);
> -        LeaveCriticalSection(&g_sessions_lock);
> -        return AUDCLNT_E_EVENTHANDLE_NOT_SET;
> -    }
> -
> -    if(stream->started){
> -        alsa_unlock(stream);
> -        LeaveCriticalSection(&g_sessions_lock);
> -        return AUDCLNT_E_NOT_STOPPED;
> -    }
> -
> -    if(stream->flow == eCapture){
> -        /* dump any data that might be leftover in the ALSA capture buffer */
> -        snd_pcm_readi(stream->pcm_handle, stream->local_buffer,
> -                stream->bufsize_frames);
> -    }else{
> -        snd_pcm_sframes_t avail, written;
> -        snd_pcm_uframes_t offs;
> -
> -        avail = snd_pcm_avail_update(stream->pcm_handle);
> -        avail = min(avail, stream->held_frames);
> -
> -        if(stream->wri_offs_frames < stream->held_frames)
> -            offs = stream->bufsize_frames - stream->held_frames + stream->wri_offs_frames;
> -        else
> -            offs = stream->wri_offs_frames - stream->held_frames;
> +    params.stream = This->stream;
>  
> -        /* fill it with data */
> -        written = alsa_write_buffer_wrap(stream, stream->local_buffer,
> -                stream->bufsize_frames, offs, avail);
> +    ALSA_CALL(start, &params);
>  
> -        if(written > 0){
> -            stream->lcl_offs_frames = (offs + written) % stream->bufsize_frames;
> -            stream->data_in_alsa_frames = written;
> -        }else{
> -            stream->lcl_offs_frames = offs;
> -            stream->data_in_alsa_frames = 0;
> -        }
> -    }
> -
> -    if(!This->timer_thread){
> +    if(SUCCEEDED(params.result) && !This->timer_thread){
>          This->timer_thread = CreateThread(NULL, 0, alsa_timer_thread, This->stream, 0, NULL);
>          SetThreadPriority(This->timer_thread, THREAD_PRIORITY_TIME_CRITICAL);
>      }
>  
> -    stream->started = TRUE;
> -
> -    alsa_unlock(stream);
>      LeaveCriticalSection(&g_sessions_lock);
>  
> -    return S_OK;
> +    return params.result;
>  }
>  
>  static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface)
> diff --git a/dlls/winealsa.drv/unixlib.h b/dlls/winealsa.drv/unixlib.h
> index 4acbbcbcf11..c058a920b6e 100644
> --- a/dlls/winealsa.drv/unixlib.h
> +++ b/dlls/winealsa.drv/unixlib.h
> @@ -91,6 +91,12 @@ struct release_stream_params
>      HRESULT result;
>  };
>  
> +struct start_params
> +{
> +    struct alsa_stream *stream;
> +    HRESULT result;
> +};
> +
>  struct timer_loop_params
>  {
>      struct alsa_stream *stream;
> @@ -135,27 +141,18 @@ struct get_current_padding_params
>      UINT32 *padding;
>  };
>  
> -struct write_best_effort_tmp_params
> -{
> -    struct alsa_stream *stream;
> -    BYTE *buf;
> -    snd_pcm_uframes_t frames;
> -    snd_pcm_sframes_t *written;
> -};
> -
>  enum alsa_funcs
>  {
>      alsa_get_endpoint_ids,
>      alsa_create_stream,
>      alsa_release_stream,
> +    alsa_start,
>      alsa_timer_loop,
>      alsa_is_format_supported,
>      alsa_get_mix_format,
>      alsa_get_buffer_size,
>      alsa_get_latency,
>      alsa_get_current_padding,
> -
> -    alsa_write_best_effort_tmp
>  };
>  
>  extern unixlib_handle_t alsa_handle;
> -- 
> 2.25.1
> 
> 



More information about the wine-devel mailing list