[PATCH] winepulse: Add pulse driver, v8

Chris Robinson chris.kcat at gmail.com
Tue Feb 28 23:58:23 CST 2012


On Tuesday, February 28, 2012 5:32:13 PM Maarten Lankhorst wrote:
> + * This is basically the same as the pa_threaded_mainloop implementation,
> + * but that cannot be used because it uses pthread_create directly
> + *
> + * pa_threaded_mainloop_(un)lock -> pthread_mutex_(un)lock
> + * pa_threaded_mainloop_signal -> pthread_cond_signal
> + * pa_threaded_mainloop_wait -> pthread_cond_wait

I'm curious why you're using pthreads. Doesn't WinAPI have anything comparable 
to pthread_cond_wait?

> +static void pulse_probe_settings(void) {
...
> +        ret = pa_stream_connect_playback(stream, NULL, &attr,
> +        PA_STREAM_START_CORKED|PA_STREAM_FIX_RATE|PA_STREAM_FIX_FORMAT|PA_S
> TREAM_FIX_CHANNELS|PA_STREAM_EARLY_REQUESTS, NULL, NULL);

Is it necessary to fix the format? MSDN says that the audio service always 
works with floating-point, and GetMixFormat always specified floating-point in 
my dealings with it. I don't think it should blindly return whatever 
PulseAudio does, unless it can be shown that Windows doesn't always give 
floating-point.

> +static WAVEFORMATEX *clone_format(const WAVEFORMATEX *fmt)
> +{
> +    WAVEFORMATEX *ret;
> +    size_t size;
> +
> +    if (fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE)
> +        size = sizeof(WAVEFORMATEXTENSIBLE);
> +    else
> +        size = sizeof(WAVEFORMATEX);
> +
> +    ret = HeapAlloc(GetProcessHeap(), 0, size);

This should probably use CoTaskMemAlloc, as it's used for IsFormatSupported. 
I'm also curious if IsFormatSupported should always return a 
WAVE_FORMAT_EXTENSIBLE object.

> +static enum pa_channel_position pulse_map[] = {

This should probably be const.

> +        if (fmt->wFormatTag == WAVE_FORMAT_IEEE_FLOAT)
> +            This->ss.format = PA_SAMPLE_FLOAT32LE;
...
> +        if (IsEqualGUID(&wfe->SubFormat, &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT))
> +            This->ss.format = PA_SAMPLE_FLOAT32LE;

You likely should check that the format specifies 32 bits, and not 64 or 
something different like that.


This isn't an all-inclusive lookover, just some things that caught my eye. 
Also, does this driver fail to load if it can't connect to a pulse server?



More information about the wine-devel mailing list