[wdmaudiodev] API to set sample rate in Windows 10

  • From: Günter Hildebrandt <guenter.hildebrandt@xxxxxxxx>
  • To: wdmaudiodev@xxxxxxxxxxxxx
  • Date: Fri, 18 Nov 2016 13:07:40 +0100

Hi,

I develop and maintain an ASIO/AVS WDM driver for Windows. The driver is used for multi-channel devices.

Per design and customer requirement the sample rate of the device is set with the ASIO control panel or the ASIO interface, or is given by digital audio input (S/PDIF). When the sample rate is changed by the user the AVS driver is disabled and re-started using PDO states of my bus driver.

The AVS driver offers exactly the sample rate to Windows that is selected by the user on ASIO interface.

Starting with Windows Vista the sound dialog offers the advanced tab to select the sample rate and format. Unfortunately this value is cached by the system during first enumeration after installation in registry:

\\Registry\\Machine\\Software\\Microsoft\\Windows\\CurrentVersion\\MMDevices\\Audio\\<Capture|Render>

The multi-channel device is exposed as up to 8 render and up to 8 capture device device, each with two channels. It is no practical option for the user to open all dialog boxes and switch the sample rate to the new one after changing it in ASIO. Without doing this the devices cannot be used.

I have seen several discussions like:
//www.freelists.org/post/wdmaudiodev/setting-sample-rate-in-the-control-panel-in-Vista,4
but I did not see a solution for this problem.

My current workaround is the following:
I enumerate the following keys from kernel driver

L"{f19f064d-082c-4e27-bc73-6882a1bb8e4c},0"; // PKEY_AudioEngine_DeviceFormat
L"{e4870e26-3cc5-4cd2-ba46-ca0a9a70ed04},0"; // PKEY_AudioEngine_OEMFormat
L"{3d6e1656-2e50-4c4c-8d85-d0acae3c6c68},2"; // unknown
L"{a2a3fff4-353f-407c-9d86-1f9dc7d5a606},2"; // unknown

The keys contain one or more serialized PROPVARIANT structures, with a blob type and the data structure WAVEFORMATEX. I fix the data structure with the current sample rate before creating the filters. This seems to work but is not stable related to operating system changes. E.g. Windows 10 anniversary update has modified the data structures.

I have also considered the option to use KsPinGenerateEvents(KSPIN, KSEVENTSETID_PinCapsChange, KSEVENT_PINCAPS_FORMATCHANGE, ...), but my problem is: in error case no KsPin is created and for that reason I cannot call it.

The access from user mode seems to be possible with IPropertyStore::SetValue(), but it requires administrator privileges and the data format for the unknown GUIDs is not documented. I do not see an advantage in comparison to my existing workaround when using this interface.

Is there in the meantime an API for Windows 10 or a workaround to set the sample rate for an audio device by program?

Thank you.
Regards,
Guenter Hildebrandt
--

Dr. Günter Hildebrandt
Senior Software Developer

Other related posts: