WASAPI ISimpleAudioVolume::SetMasterVolume appears to not work

Andrew Eikum aeikum at codeweavers.com
Mon Apr 16 08:44:04 CDT 2012


Hi Adam,

On Sun, Apr 15, 2012 at 12:06:14AM +0100, adam smith wrote:
> I've been trying to get WASAPI audio output working for our app as
> Directsound output was very glitchy post the new audio stack.
> 

Sorry to hear that. We do have a large sequence of patches just about
ready to go into Wine which will improve directsound greatly, but
they're not in quite yet.

> All seems to work great with WASAPI however I need to able to set the
> volume level independently for individual audio sessions / streams for
> crossfading however I'm having problems controlling the volume levels of a
> shared mode audio session / stream. specifically,
> 
> ISimpleAudioVolume::SetMasterVolume ... returns success but does not
> change the volume level though interestingly
> 

Yes, this is a limitation of the ALSA and OSS drivers. You can see
that <dlls/winealsa.drv/mmdevdrv.c:SimpleAudioVolume_SetMasterVolume>
actually doesn't do anything. This is because ALSA and OSS don't
support per-stream volume control. For example, if we set the volume
on an ALSA device, it will actually affect the volume of _every_
stream that uses that ALSA device, which isn't what we want.

> HRESULT hr;
> hr=audioClient_->GetService(IID_ISimpleAudioVolume,(void**)&simpleAudioVolume_);
> if (SUCCESS(hr))
> hr=simpleAudioVolume_->SetMute(TRUE,NULL);
> 
> does work and mute the volume.
> 

Yes, we have some logic to allow muting to work, by just setting the
samples sent to ALSA to silence. Again, this is because muting the
ALSA device would result in muting _every_ stream using that device.

> Does anyone have any experience of these interfaces or know equivalent
> interfaces to use instead
> 

Sorry, Linux's audio systems just don't have the capabilities to let
Wine do this. We would need to build a software mixer into Wine to do
volume control, and we don't have that (yet).

Andrew



More information about the wine-devel mailing list