[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