[wdmaudiodev] Re: Exposing more than 8 channels on Windows 7

  • From: Matthew van Eerde <Matthew.van.Eerde@xxxxxxxxxxxxx>
  • To: "wdmaudiodev@xxxxxxxxxxxxx" <wdmaudiodev@xxxxxxxxxxxxx>
  • Date: Mon, 9 Jan 2012 16:17:44 +0000

        pWaveFormatEx->wFormatTag      = WAVE_FORMAT_EXTENSIBLE;
        pWaveFormatEx->cbSize          = 0;

You're setting the wFormatTag to WAVE_FORMAT_EXTENSIBLE.  This means you need 
to fill out a WAVEFORMATEXTENSIBLE structure, not a WAVEFORMATEX.  Set cbSize = 
sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX) and fill in the additional 
data on the end.

From: wdmaudiodev-bounce@xxxxxxxxxxxxx 
[mailto:wdmaudiodev-bounce@xxxxxxxxxxxxx] On Behalf Of Neetu Sand
Sent: Monday, January 09, 2012 6:04 AM
To: wdmaudiodev@xxxxxxxxxxxxx
Subject: [wdmaudiodev] Re: Exposing more than 8 channels on Windows 7

Hi Matthew,

Yes, I am seeing Get request. I am returning the default format expected by my 
driver. Code is as follows:

        if (PropertyRequest->ValueSize == 0)
            PropertyRequest->ValueSize = sizeof(KSDATAFORMAT_WAVEFORMATEX);
            return STATUS_BUFFER_OVERFLOW;
        else if (PropertyRequest->ValueSize < sizeof(KSDATAFORMAT_WAVEFORMATEX))
            return STATUS_BUFFER_TOO_SMALL;

        PWAVEFORMATEX               pWaveFormatEx;

        pKsFormat->DataFormat.FormatSize   = sizeof (KSDATAFORMAT_WAVEFORMATEX);
        pKsFormat->DataFormat.Flags        = 0;
        pKsFormat->DataFormat.Reserved     = 0;

        pKsFormat->DataFormat.MajorFormat  = KSDATAFORMAT_TYPE_AUDIO;
        pKsFormat->DataFormat.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
        pKsFormat->DataFormat.Specifier = KSDATAFORMAT_SPECIFIER_WAVEFORMATEX;
        pWaveFormatEx = (PWAVEFORMATEX)((PKSDATAFORMAT)PropertyRequest->Value + 
        pWaveFormatEx->wFormatTag      = WAVE_FORMAT_EXTENSIBLE;
        pWaveFormatEx->nChannels       = MAX_CHANNELS; //16

        pWaveFormatEx->nSamplesPerSec  = m_SampleRate; //could be in range of 
32kHz-192 kHz
        pWaveFormatEx->wBitsPerSample  = 16;
        pWaveFormatEx->cbSize          = 0;
        pWaveFormatEx->nBlockAlign     =
            pWaveFormatEx->nChannels * pWaveFormatEx->wBitsPerSample / 8;
        pWaveFormatEx->nAvgBytesPerSec =
            pWaveFormatEx->nSamplesPerSec * pWaveFormatEx->nBlockAlign;

        pKsFormat->DataFormat.SampleSize   = pWaveFormatEx->nBlockAlign; // 
must match nBlockAlign

        PropertyRequest->ValueSize = sizeof(KSDATAFORMAT_WAVEFORMATEX);
        ntStatus = STATUS_SUCCESS;
        return ntStatus;

I receive get call twice. First time it gets the size of buffer and second time 
it extracts the format. Then I get a set call but the set call is never made 
with 16 channels which is returned in Get call. I return STATUS_SUCCESS in set 
call for (channel <=16). Set is called with channel count 2 and then called 
with channel count that is selected as speaker configuration i.e. if I keep 
speaker configuration 7.1 then second set call is made with channel count 8.

So I don't know how can I show format for 16 channels on advance tab of my 
speaker device. Because the speaker configuration only shows up to 7.1 that is 
8 channels. Do I need to disable configure button for speaker? If yes then how 
can I do that?

Please note that I do the same things for my recording device and it shows 
format for channel 1-16 i.e. it works as expected on sample rates 32kHz -48 
kHz. For higher sample rates, this does not work and Advance tab is not shown.


O n Fri, Jan 6, 2012 at 9:42 PM, Matthew van Eerde 
<Matthew.van.Eerde@xxxxxxxxxxxxx<mailto:Matthew.van.Eerde@xxxxxxxxxxxxx>> wrote:
Are you seeing a KSPROPERTY_TYPE_GET request?  What are you returning?

From: wdmaudiodev-bounce@xxxxxxxxxxxxx<mailto:wdmaudiodev-bounce@xxxxxxxxxxxxx> 
 On Behalf Of Neetu Sand
Sent: Friday, January 06, 2012 5:57 AM
To: wdmaudiodev@xxxxxxxxxxxxx<mailto:wdmaudiodev@xxxxxxxxxxxxx>
Subject: [wdmaudiodev] Exposing more than 8 channels on Windows 7

Hi All,

I have a query regarding publishing 16 channels on a speaker device. I specify 
channel count as 16 while specifying the datarange in pin factory. In handler 
for KSPROPERTY_PIN_PROPOSEDATAFORMAT, I handle condition for 16 channels but 
the problem is that the handler for KSPROPERTY_PIN_PROPOSEDATAFORMAT is never 
called with 16 channels. It is called within the channel count range of 1-8. 
DataRangeIntersection is never called.

Also I notice that for some devices "Advance" tab on Sound and Audio control 
panel shows "Channel, Bit Depth and Sample Rate" while for others, it just 
shows "Bit Depth and Sample rate". However for later case speaker configuration 
is enabled but for the earlier case "configure" button on Sound And audio 
control panel is disabled. What change in driver code leads to this behavior of 
Sound and Audio Control Panel? I tried removing KSPROPERTY_AUDIO_CHANNEL_CONFIG 
from my code but I still see "Configure" button enabled for my device.

I am not sure what change in driver would let Sound and Audio CPL detect 16 
channels for my device. Any help is appreciated.


Other related posts: