[wdmaudiodev] Re: How to support IMiniportAudioSignalProcessing in WaveCyclic based audio driver?

  • From: Frank Yerrace <Frank.Yerrace@xxxxxxxxxxxxx>
  • To: "wdmaudiodev@xxxxxxxxxxxxx" <wdmaudiodev@xxxxxxxxxxxxx>
  • Date: Wed, 22 Jan 2014 17:24:01 +0000

  1.
Possible, but not necessary.
  2.
No.

Regards,
Frank Yerrace
Microsoft

Sent from Windows Mail

From: Danny<mailto:dangxhfromuestc@xxxxxxxxx>
Sent: ‎Wednesday‎, ‎January‎ ‎22‎, ‎2014 ‎3‎:‎01‎ ‎AM
To: wdmaudiodev@xxxxxxxxxxxxx<mailto:wdmaudiodev@xxxxxxxxxxxxx>

Sorry for the confusion of BSOD. I'll debug it later.

The remaining questions are: 1) Is it possible or necessary switch the project 
to WaveRT?   2) the audio path in my driver is    wavecyclic->physical 
connection ->topology.  Do I need to add IMiniportAudioSignalProcessing  
support  in Topology filter ?

Thanks.


2014/1/22 Gaurav Khuntale 
<gauravkhuntale@xxxxxxxxx<mailto:gauravkhuntale@xxxxxxxxx>>
Hi Danny,

Thanks for the help. I will check out the link you mentioned.

Thank you,
Gaurav


On Wed, Jan 22, 2014 at 11:47 AM, Danny 
<dangxhfromuestc@xxxxxxxxx<mailto:dangxhfromuestc@xxxxxxxxx>> wrote:
Hi, Gaurav:
Yes, it support KSPROPERTY_JACK_DESCRIPTION property.
I used SYSVAD sample as the start learning point of how to implement it. 
http://code.msdn.microsoft.com/windowshardware/slate-system-virtual-audio-f241062f
Please post your further question on another thread ;)

Hi, Matthew:
That is, what is the layer below you? That should determine your choice of 
WaveCyclic or WaveRT.
==>The layer below is windows 8 Bluetooth stack. PCM data will be encoded and 
send out via Bluetooth stack. Is it possible and necessary switch the project 
to WaveRT?

Yes, I've modified the code according to SYSVAD. but it keeps BSOD in 
CMiniportWaveCyclicMSVAD::GetDescription.
I guess I've missed something.



class CMiniportWaveCyclic :
public CMiniportWaveCyclicMSVAD,
public IMiniportWaveCyclic,
public IMiniportAudioSignalProcessing,
public CUnknown
{
public:
DECLARE_STD_UNKNOWN();
DEFINE_STD_CONSTRUCTOR(CMiniportWaveCyclic);
~CMiniportWaveCyclic();

IMP_IMiniportWaveCyclic;
IMP_IMiniportAudioSignalProcessing;
....
}



//=============================================================================
STDMETHODIMP_(NTSTATUS)

/* */
CMiniportWaveCyclic::NonDelegatingQueryInterface(IN REFIID Interface, OUT 
PVOID* Object)
{
PAGED_CODE();

ASSERT(Object);

if (IsEqualGUIDAligned(Interface, IID_IUnknown))
{
*Object = PVOID(PUNKNOWN(PMINIPORTWAVECYCLIC(this)));
}
else if (IsEqualGUIDAligned(Interface, IID_IMiniport))
{
*Object = PVOID(PMINIPORT(this));
}
    else if (IsEqualGUIDAligned(Interface, IID_IMiniportAudioSignalProcessing))
    {
        *Object = PVOID(PMINIPORTAudioSignalProcessing(this));
    }
else if (IsEqualGUIDAligned(Interface, IID_IMiniportWaveCyclic))
{
*Object = PVOID(PMINIPORTWAVECYCLIC(this));
}
else
{
*Object = NULL;
}
...
}

NTSTATUS
CMiniportWaveCyclic::GetModes
(
    IN     ULONG     Pin,
    OUT    GUID*     SignalProcessingModes,
    IN OUT ULONG*    NumSignalProcessingModes
)
{
...
}



KMODE_EXCEPTION_NOT_HANDLED (1e)
This is a very common bugcheck.  Usually the exception address pinpoints
the driver/function that caused the problem.  Always note this address
as well as the link date of the driver/image that contains this address.
Arguments:
Arg1: c0000005, The exception code that was not handled
Arg2: adff1a74, The address that the exception occurred at
Arg3: 00000001, Parameter 0 of the exception
Arg4: 00000000, Parameter 1 of the exception

WARNING: Stack unwind information not available. Following frames may be wrong.
a9b8a2e0 81209048 0000001e c0000005 adff1a74 nt+0x1061b4
a9b8a2fc 8117a532 a9b8a828 8125f1c0 a9b8a3f0 nt+0x1ab048
a9b8a320 8117a504 a9b8a828 8125f1c0 a9b8a3f0 nt+0x11c532
a9b8a3e0 8108425b a9b8a828 a9b8a3f0 00010037 nt+0x11c504
a9b8a80c 81176036 a9b8a828 00000000 a9b8a900 nt+0x2625b
a9b8a878 8117887b 00000000 00000000 00000000 nt+0x118036
a9b8a900 adff1a74 badb0d00 0123a3d0 ad044880 nt+0x11a87b
a9b8a974 adff23f2 b229d330 00000000 a9b8a9b0 
MyDriver!CMiniportWaveCyclicMSVAD::GetDescription+0x36 [.\source\basewave.cpp @ 
146]
a9b8a984 8a5ccb9f b229d320 00000000 00000000 
MyDriver!CMiniportWaveCyclic::GetDescription+0xc [.\source\minwave.cpp @ 295]
a9b8a9b0 8a5cccc2 9069c9b0 8c872160 b229d320 portcls+0x17b9f
a9b8a9c4 8a5cc759 8c872160 00000001 87175688 portcls+0x17cc2
a9b8a9e0 8a5cc831 a9d4d924 00000020 870f9538 portcls+0x17759
a9b8aa00 8a90a2b5 00000000 870f9538 00000000 portcls+0x17831
a9b8aa64 8a90a72a 00000028 a9d4d924 00000001 ks+0x122b5
a9b8aa80 8a5ca812 87175688 00000004 a9d4d8e8 ks+0x1272a
a9b8aa9c 8a5dd5a0 b1de0e70 0069c9b0 00000004 portcls+0x15812
a9b8aadc 8a5ca3e5 9069c998 ad396cb0 87175688 portcls+0x285a0
a9b8ab10 8a90a664 ad396cb0 00000002 87175688 portcls+0x153e5
a9b8ab2c 8a5ca03c ad396cb0 87175688 ad396cb0 ks+0x12664
a9b8ab5c 8a5ca299 a9b8ab98 adfd993c ad396cb0 portcls+0x1503c
a9b8ab64 adfd993c ad396cb0 87175688 00000000 portcls+0x15299
a9b8ab98 810cc63f ad396cb0 87175688 00000103 MyDriver!DispatchIoctl+0xc12 
[.\source\adapter.cpp @ 1255]
a9b8abb4 812f09de 87175884 87175688 00000003 nt+0x6e63f
a9b8ac10 812f6028 ad0cdb30 00000000 82376a01 nt+0x2929de
a9b8acb8 812f502e 00000000 00000000 00000204 nt+0x298028
a9b8ace4 811752f7 00000b18 00000000 00000000 nt+0x29702e
a9b8ad14 7715f934 badb0d00 02000000 00000000 nt+0x1172f7
a9b8ad18 badb0d00 02000000 00000000 00000000 0x7715f934
a9b8ad1c 02000000 00000000 00000000 00000000 0xbadb0d00
a9b8ad20 00000000 00000000 00000000 00000000 0x2000000


STACK_COMMAND:  kb

FOLLOWUP_IP:
MyDriver!CMiniportWaveCyclicMSVAD::GetDescription+36 [.\source\basewave.cpp @ 
146]
adff1a74 8908            mov     dword ptr [eax],ecx

FAULTING_SOURCE_LINE:  .\source\basewave.cpp

FAULTING_SOURCE_FILE:  .\source\basewave.cpp

FAULTING_SOURCE_LINE_NUMBER:  146

FAULTING_SOURCE_CODE:

   145:
>  146: *OutFilterDescriptor = m_FilterDescriptor;
   147:
   148: return STATUS_SUCCESS;
   149: } // GetDescription
   150:



Thank you.


2014/1/22 Matthew van Eerde 
<Matthew.van.Eerde@xxxxxxxxxxxxx<mailto:Matthew.van.Eerde@xxxxxxxxxxxxx>>
In particular, implement IMiniportAudioSignalProcessing::GetModes, and respond 
to QueryInterface for IID_IMiniportAudioSignalProcessing, and portcls will call 
into your GetModes() method. This should work even though you are WaveCyclic 
and not WaveRT.

The relevant code in 
http://code.msdn.microsoft.com/windowshardware/slate-system-virtual-audio-f241062f/sourcecode?fileId=86816&pathId=1882676779
 is:

// minwavert.h
class CMiniportWaveRT :
    public IMiniportWaveRT,
    public IMiniportAudioEngineNode,
    public IMiniportAudioSignalProcessing,
    public CUnknown
…

    IMP_IMiniportAudioSignalProcessing;

// minwavert.cpp

STDMETHODIMP_(NTSTATUS)
CMiniportWaveRT::NonDelegatingQueryInterface
…
    else if (IsEqualGUIDAligned(Interface, IID_IMiniportAudioSignalProcessing))
    {
        *Object = PVOID(PMINIPORTAudioSignalProcessing(this));
    }

…

NTSTATUS
CMiniportWaveRT::GetModes
(
    _In_                                        ULONG     Pin,
    _Out_writes_opt_(*NumSignalProcessingModes) GUID*     SignalProcessingModes,
    _Inout_                                     ULONG*    
NumSignalProcessingModes
)

From: wdmaudiodev-bounce@xxxxxxxxxxxxx<mailto:wdmaudiodev-bounce@xxxxxxxxxxxxx> 
[mailto:wdmaudiodev-bounce@xxxxxxxxxxxxx<mailto:wdmaudiodev-bounce@xxxxxxxxxxxxx>]
 On Behalf Of Matthew van Eerde
Sent: Tuesday, January 21, 2014 8:01 AM
To: wdmaudiodev@xxxxxxxxxxxxx<mailto:wdmaudiodev@xxxxxxxxxxxxx>
Subject: [wdmaudiodev] Re: How to support IMiniportAudioSignalProcessing in 
WaveCyclic based audio driver?

Yes, the WaveCyclic miniport model supports IMiniportAudioSignalProcessing.

What do you do with the audio data once you get it? That is, what is the layer 
below you? That should determine your choice of WaveCyclic or WaveRT.

From: wdmaudiodev-bounce@xxxxxxxxxxxxx<mailto:wdmaudiodev-bounce@xxxxxxxxxxxxx> 
[mailto:wdmaudiodev-bounce@xxxxxxxxxxxxx] On Behalf Of Danny
Sent: Tuesday, January 21, 2014 1:28 AM
To: wdmaudiodev@xxxxxxxxxxxxx<mailto:wdmaudiodev@xxxxxxxxxxxxx>
Subject: [wdmaudiodev] How to support IMiniportAudioSignalProcessing in 
WaveCyclic based audio driver?

Hello, my driver is a virtual sound driver based on WaveCyclic. It worked fine 
on Windows 8, but during WHCK KsPosition test, the test fails with the 
following error message.

Message

12/6/2013 2:10:26.125 PM

Failed to query for basic support KSPROPERTY_AUDIOSIGNALPROCESSING_MODES: Last 
error:1170


Can I add support for IMiniportAudioSignalProcessing in WaveCyclic based audio 
driver?

I've noticed that the new WDK sample SysVad support 
IMiniportAudioSignalProcessing property. But it was based on WaveRT.

Or should I change my project to WaveRT based example? Does WaveRT works for 
virtual sound driver? (We don't have the codec hardware, just to capture the 
pcm audio data and send out to another stack.)


Thank you!
--
Danny



--
Danny




--
Danny

Other related posts: