Comment 417 for bug 371897

Revision history for this message
In , Raymond (superquad-vortex2) wrote :

(In reply to comment #310)

>
> > If pulseaudio take up the role of Kmixer in linux , winepulse should provide
> > hardware secondary buffers like the Kmixer in windows
> ...
> > why onboard HDA cannot use Full Acceleration (i.e. hardware secondary buffers)
> > with winepulse
>
> winepulse CANNOT provide hardware acceleration in any way because pulse is a
> software-only mixer that locks out all applications from direct hardware access
> (as well as dmix).

DSCAPS_CONTINUOUSRATE The device supports all sample rates between the dwMinSecondarySampleRate and dwMaxSecondarySampleRate member values. Typically, this means that the actual output rate will be within +/- 10 hertz (Hz) of the requested frequency.

DSCAPS_SECONDARY16BIT The device supports hardware-mixed secondary sound buffers with 16-bit samples.
DSCAPS_SECONDARY8BIT The device supports hardware-mixed secondary buffers with 8-bit samples.
DSCAPS_SECONDARYMONO The device supports hardware-mixed monophonic secondary buffers.
DSCAPS_SECONDARYSTEREO The device supports hardware-mixed stereo secondary buffers

this mean winealsa.drv is incorrect to use those flags when it disable the alsa-lib resampling

    *flags = DSCAPS_CERTIFIED | DSCAPS_CONTINUOUSRATE;
    *flags |= DSCAPS_SECONDARYMONO | DSCAPS_SECONDARYSTEREO;
    *flags |= DSCAPS_SECONDARY8BIT | DSCAPS_SECONDARY16BIT;

since only wineoss.drv with ossv4 have hardware mixing buffers which define PCM_CAP_MULT

#define DSP_CAP_MULTI PCM_CAP_MULTI

#ifdef DSP_CAP_MULTI /* not every oss has this */
        /* check for hardware secondary buffer support (multi open) */
        if ((arg & DSP_CAP_MULTI) &&
            (ossdev->out_caps.dwSupport & WAVECAPS_DIRECTSOUND)) {
            TRACE("hardware secondary buffer support available\n");

            ossdev->ds_caps.dwMaxHwMixingAllBuffers = 16;
            ossdev->ds_caps.dwMaxHwMixingStaticBuffers = 0;
            ossdev->ds_caps.dwMaxHwMixingStreamingBuffers = 16;

            ossdev->ds_caps.dwFreeHwMixingAllBuffers = 16;
            ossdev->ds_caps.dwFreeHwMixingStaticBuffers = 0;
            ossdev->ds_caps.dwFreeHwMixingStreamingBuffers = 16;
        }
#endif

This is equivalent to those 16 or more playback subdevices in alsa