[wdmaudiodev] Re: Fwd: Re: KSPROPERTY_JACK_DESCRIPTION

  • From: Mitchell Rundle <mitchr@xxxxxxxxxxxxx>
  • To: "wdmaudiodev@xxxxxxxxxxxxx" <wdmaudiodev@xxxxxxxxxxxxx>
  • Date: Mon, 12 Mar 2007 12:09:59 -0700

Nikolay, sorry for the delay.

Starting with the MSVAD "simple" sample in the WDK, here's what it takes to add 
support for KSPROPERTY_JACK_DESCRIPTION.


1)     In Simple\TopTable.h, change the automation table in 
MiniportFilterDescriptor to point to a new automation table:

//=============================================================================
static
PCPROPERTY_ITEM PropertiesTopoFilter[] =
{
    {
        &KSPROPSETID_Jack,
        KSPROPERTY_JACK_DESCRIPTION,
        KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_BASICSUPPORT,
        PropertyHandler_TopoFilter
    }
};

DEFINE_PCAUTOMATION_TABLE_PROP(AutomationTopoFilter, PropertiesTopoFilter);

//=============================================================================
static
PCFILTER_DESCRIPTOR MiniportFilterDescriptor =
{
  0,                                  // Version
  &AutomationTopoFilter,              // AutomationTable
  sizeof(PCPIN_DESCRIPTOR),           // PinSize
  SIZEOF_ARRAY(MiniportPins),         // PinCount
  MiniportPins,                       // Pins
  sizeof(PCNODE_DESCRIPTOR),          // NodeSize
  SIZEOF_ARRAY(TopologyNodes),        // NodeCount
  TopologyNodes,                      // Nodes
  SIZEOF_ARRAY(MiniportConnections),  // ConnectionCount
  MiniportConnections,                // Connections
  0,                                  // CategoryCount
  NULL                                // Categories
};



2)     In simple\MinTopo.h, add a new property handler to the filter object:

class CMiniportTopology :
    public CMiniportTopologyMSVAD,
    public IMiniportTopology,
    public CUnknown
{
  public:
    DECLARE_STD_UNKNOWN();
    DEFINE_STD_CONSTRUCTOR(CMiniportTopology);
    ~CMiniportTopology();

    IMP_IMiniportTopology;

    NTSTATUS                    PropertyHandlerJackDescription
    (
        IN PPCPROPERTY_REQUEST  PropertyRequest
    );
};
typedef CMiniportTopology *PCMiniportTopology;

extern NTSTATUS PropertyHandler_TopoFilter(IN PPCPROPERTY_REQUEST 
PropertyRequest);


3)  In MinTopo.cpp, implement the property handler:

NTSTATUS
CMiniportTopology::PropertyHandlerJackDescription
(
    IN PPCPROPERTY_REQUEST      PropertyRequest
)
{
    PAGED_CODE();

    ASSERT(PropertyRequest);

    DPF_ENTER(("[PropertyHandlerJackDescription]"));

    NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST;
    ULONG    nPinId = (ULONG)-1;

    if (PropertyRequest->InstanceSize >= sizeof(ULONG))
    {
        nPinId = *(PULONG(PropertyRequest->Instance));

        if ((nPinId < ARRAYSIZE(JackDescriptions)) && (JackDescriptions[nPinId] 
!= NULL))
        {
            if (PropertyRequest->Verb & KSPROPERTY_TYPE_BASICSUPPORT)
            {
                ntStatus =
                    PropertyHandler_BasicSupport
                    (
                        PropertyRequest,
                        KSPROPERTY_TYPE_BASICSUPPORT | KSPROPERTY_TYPE_GET,
                        VT_ILLEGAL
                    );
            }
            else
            {
                ULONG cJacks = <number of jacks associated with this pin 
(nPinId) >
                ULONG cbNeeded = sizeof(KSMULTIPLE_ITEM) + 
sizeof(KSJACK_DESCRIPTION) * cJacks;

                if (PropertyRequest->ValueSize == 0)
                {
                    PropertyRequest->ValueSize = cbNeeded;
                    ntStatus = STATUS_BUFFER_OVERFLOW;
                }
                else if (PropertyRequest->ValueSize < cbNeeded)
                {
                    ntStatus = STATUS_BUFFER_TOO_SMALL;
                }
                else
                {
                    if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET)
                    {
                        PKSMULTIPLE_ITEM pMI = 
(PKSMULTIPLE_ITEM)PropertyRequest->Value;
                        PKSJACK_DESCRIPTION pDesc = 
(PKSJACK_DESCRIPTION)(pMI+1);

                        pMI->Size = sizeof(KSJACK_DESCRIPTION);
                        pMI->Count = cJacks;

                        // TODO:  copy jack info struct(s) into pDesc...

                        ntStatus = STATUS_SUCCESS;
                    }
                }
            }
        }
    }

    return ntStatus;
}

NTSTATUS
PropertyHandler_TopoFilter
(
    IN PPCPROPERTY_REQUEST      PropertyRequest
)
{
    PAGED_CODE();

    ASSERT(PropertyRequest);

    DPF_ENTER(("[PropertyHandler_TopoFilter]"));

    // PropertryRequest structure is filled by portcls.
    // MajorTarget is a pointer to miniport object for miniports.
    //
    NTSTATUS            ntStatus = STATUS_INVALID_DEVICE_REQUEST;
    PCMiniportTopology  pMiniport = 
(PCMiniportTopology)PropertyRequest->MajorTarget;

    if (IsEqualGUIDAligned(*PropertyRequest->PropertyItem->Set, 
KSPROPSETID_Jack) &&
        (PropertyRequest->PropertyItem->Id == KSPROPERTY_JACK_DESCRIPTION))
    {
        ntStatus =
            pMiniport->PropertyHandlerJackDescription
            (
                PropertyRequest
            );
    }

    return ntStatus;
} // PropertyHandler_TopoFilter


Regards,
Mitch
Microsoft Corp.

This posting is provided "AS IS" with no warranties, and confers no rights.

From: wdmaudiodev-bounce@xxxxxxxxxxxxx 
[mailto:wdmaudiodev-bounce@xxxxxxxxxxxxx] On Behalf Of Nikolay V. Pyatkov
Sent: Wednesday, February 28, 2007 8:49 AM
To: wdmaudiodev@xxxxxxxxxxxxx
Subject: [wdmaudiodev] Re: Fwd: Re: KSPROPERTY_JACK_DESCRIPTION


Can anybody point me to a sample of code which uses KSPROPERTY_JACK_DESCRIPTION?

Thanks,

Nikolay


------ Original Message ------
Received: Fri, 23 Feb 2007 01:08:38 PM EST
From: "Nikolay V. Pyatkov" <npyatkov@xxxxxxx>
To: <wdmaudiodev@xxxxxxxxxxxxx>
Subject: [wdmaudiodev] Re: Fwd: Re: KSPROPERTY_JACK_DESCRIPTION


No I do not see that message.

Just to test my sanity I have added two KdPrint() 's

The output from GetDescrioption() is:

pin no. 0, AutomationTable 00000000
pin no. 1, AutomationTable 00000000
pin no. 2, AutomationTable 00000000
pin no. 3, AutomationTable 00000000
pin no. 4, AutomationTable 86BB3418
pin no. 5, AutomationTable 00000000

Looks like the tablbe is attached to the speaker pin, but the 
PropertyHandlerGeneric() is never called with KSPROPERTY_JACK_DESCRIPTION 
parameter.

Also I do not see any unrecognized properties in the KsStudio log windows.

Thanks,

Nikolay

NTSTATUS

CMiniportTopologyMSVAD::PropertyHandlerGeneric(IN PPCPROPERTY_REQUEST 
PropertyRequest)

{
 switch (PropertyRequest->PropertyItem->Id)

 {

 case KSPROPERTY_JACK_DESCRIPTION:

  ntStatus = PropertyHandlerJack(PropertyRequest);

  KdPrint(("[PropertyHandlerGeneric: KSPROPERTY_JACK_DESCRIPTION]"));

  break;

 }

} // PropertyHandlerGeneric



CMiniportTopologyMSVAD::GetDescription( PPCFILTER_DESCRIPTOR *  
OutFilterDescriptor )
{
    *OutFilterDescriptor = m_FilterDescriptor;
    unsigned int i;
    for (i = 0; i < m_FilterDescriptor->PinCount; i++)
    {
        KdPrint(("pin no. %d, AutomationTable %p\n",
            i, m_FilterDescriptor->Pins[i].AutomationTable));
    }
    return (STATUS_SUCCESS);
} // GetDescription



------ Original Message ------
Received: Thu, 22 Feb 2007 07:03:56 PM EST
From: Mitchell Rundle <mitchr@xxxxxxxxxxxxx>
To: "wdmaudiodev@xxxxxxxxxxxxx" <wdmaudiodev@xxxxxxxxxxxxx>
Subject: [wdmaudiodev] Re: Fwd: Re: KSPROPERTY_JACK_DESCRI PTION

Correct, KSStudio hasn't yet been updated to show jack info.  If you search the 
logging window though, it should show

KSStudio does not recognize property GUID 
{4509F757-2D46-4637-8E62-CE7DB944F57B} supported by the filter.
This is not a driver bug.

Regards,
Mitch

From: wdmaudiodev-bounce@xxxxxxxxxxxxx 
[mailto:wdmaudiodev-bounce@xxxxxxxxxxxxx] On Behalf Of Cheng-mean Liu (SOCCER)
Sent: Thursday, February 22, 2007 2:31 PM
To: wdmaudiodev@xxxxxxxxxxxxx
Subject: [wdmaudiodev] Re: Fwd: Re: KSPROPERTY_JACK_DESCRIPTION

I don't think KSStudio would display it because KSStudio does not know such a 
new KSPROPSETID.
You can verify this by running your HD Audio device with inbox HDAudio driver 
and check information from mmsys.cpl and ksstudio.

From: wdmaudiodev-bounce@xxxxxxxxxxxxx 
[mailto:wdmaudiodev-bounce@xxxxxxxxxxxxx] On Behalf Of Nikolay V. Pyatkov
Sent: Thursday, February 22, 2007 2:10 PM
To: wdmaudiodev@xxxxxxxxxxxxx
Subject: [wdmaudiodev] Fwd: Re: KSPROPERTY_JACK_DESCRIPTION


I tried that too. Works the same. Should not KsStudio report at least something 
about this new property for the pin?



Thanks,

Nikolay



------ Original Message ------
Received: Thu, 22 Feb 2007 02:12:44 PM EST
From: "Cheng-mean Liu (SOCCER)" <soccerl@xxxxxxxxxxxxx>
To: "wdmaudiodev@xxxxxxxxxxxxx" <wdmaudiodev@xxxxxxxxxxxxx>
Subject: [wdmaudiodev] Re: KSPROPERTY_JACK_DESCRIPTION


I would try to replace KSPROPSETID_Audio with KSPROPSETID_Jack in your 
PCPROPERTY_ITEM structure for the topology filter
{
&KSPROPSETID_Jack, //<---------------------------like this line
KSPROPERTY_JACK_DESCRIPTION,
KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_BASICSUPPORT,
PropertyHandler_Topology
},

Thanks.

Cheng-mean Liu
Microsoft Corporation
This posting is provided "AS IS" with no warranties, and confers no rights.

-----Original Message-----
From: wdmaudiodev-bounce@xxxxxxxxxxxxx 
[mailto:wdmaudiodev-bounce@xxxxxxxxxxxxx] On Behalf Of Nikolay V. Pyatkov
Sent: Thurs d ay, February 22, 2007 7:07 AM
To: wdmaudiodev@xxxxxxxxxxxxx
Subject: [wdmaudiodev] KSPROPERTY_JACK_DESCRIPTION

I need to display speaker connection status in a portcls audio driver. To
begin I have modified audio/msvad/simple code in the DDK 6000. But the jack
is not displayed on the audio panel and the KsStudio does not show the
KSPROPERTY_JACK_DESCRIPTION when the driver is instantiated. The code is
below.

Any help or code sample would be appreciated.

Thanks,
Nikolay


static PCPROPERTY_ITEM PropertiesJack[] =
{
{
&KSPROPSETID_Audio,
KSPROPERTY_JACK_DESCRIPTION,
KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_BASICSUPPORT,
PropertyHandler_Topology
},
{
&KSPROPSETID_Audio,
KSPROPERTY_AUDIO_CPU_RESOURCES,
KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_BASICSUPPORT,
PropertyHandler_Topology
}
};

DEFINE_PCAUTOMATION_TABLE_PROP(AutomationJack, PropertiesJack); < B R>



// KSPIN_TOPO_LINEOUT_DEST (output jack)
{
0,
0,
0, // InstanceCount
&AutomationJack, // AutomationTable
{ // KsPinDescriptor
0, // InterfacesCount
NULL, // Interfaces
0, // MediumsCount
NULL, // Mediums
SIZEOF_ARRAY(PinDataRangePointersBridge), // DataRangesCount
PinDataRangePointersBridge, // DataRanges
KSPIN_DATAFLOW_OUT, // DataFlow
KSPIN_COMMUNICATION_NONE, // Communication
&KSNODETYPE_SPEAKER, // Category
NULL, // Name
0 // Reserved
}
},



// KSPROPERTY_JACK_DESCRIPTION handler
NTSTATUS CMiniportTopologyMSVAD::PropertyHandlerJack
(
IN PPCPROPERTY_REQUEST PropertyRequest
)
{
NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST;


typedef struct
{
KSMULTIPLE_ITEM mult_item;
KSJACK_DESCRIPTION dsc;
} tJackProperty;

tJackProperty * pJackProperty;


if (PropertyRequest->Verb & KSPROPERTY _T YP E_GET)
{
ntStatus = ValidatePropertyParams(PropertyRequest,
sizeof(tJackProperty));
if (NT_SUCCESS(ntStatus))
{
pJackProperty = (tJackProperty *)PropertyRequest->Value;
pJackProperty->mult_item.Size = sizeof(tJackProperty);
pJackProperty->mult_item.Count = 1;
pJackProperty->dsc.ChannelMapping = 1; //ePcxChanMap_Unknown;
pJackProperty->dsc.Color = 0x808080; // Grey?
pJackProperty->dsc.ConnectionType = eConnTypeUnknown;
pJackProperty->dsc.GeoLocation = eGeoLocFront;
pJackProperty->dsc.GenLocation = eGenLocOther;
pJackProperty->dsc.PortConnection = ePortConnUnknown;
pJackProperty->dsc.IsConnected = getSpeakerConnectionStatus();
}
}
else if (PropertyRequest->Verb & KSPROPERTY_TYPE_BASICSUPPORT)
{
ntStatus =
PropertyHandler_BasicSupport
(
PropertyRequest,
KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_BASICSUPPORT,
VT_ILLEGAL
);
}

r etu rn ntStatus;
}
******************

WDMAUDIODEV addresses:
Post message: mailto:wdmaudiodev@xxxxxxxxxxxxx
Subscribe: mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=subscribe
Unsubscribe: mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=unsubscribe
Moderator: mailto:wdmaudiodev-moderators@xxxxxxxxxxxxx

URL to WDMAUDIODEV page:
http://www.wdmaudiodev.com/

******************

WDMAUDIODEV addresses:
Post message: mailto:wdmaudiodev@xxxxxxxxxxxxx
Subscribe: mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=subscribe
Unsubscribe: mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=unsubscribe
Moderator: mailto:wdmaudiodev-moderators@xxxxxxxxxxxxx

URL to WDMAUDIODEV page:
http://www.wdmaudiodev.com/

****************** WDMAUDIODEV addresses: Post message: 
mailto:wdmaudiodev@xxxxxxxxxxxxx Subscribe: 
mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=subscribe Unsubscribe: 
mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=unsubscribe Moderator: 
mailto:wdmaudiodev-moderators@xxxxxxxxxxxxx URL to WDMAUDIODEV page: 
http://www.wdmaudiodev.com/

****************** WDMAUDIODEV addresses: Post message: 
mailto:wdmaudiodev@xxxxxxxxxxxxx Subscribe: 
mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=subscribe Unsubscribe: 
mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=unsubscribe Moderator: 
mailto:wdmaudiodev-moderators@xxxxxxxxxxxxx URL to WDMAUDIODEV page: 
http://www.wdmaudiodev.com/

****************** WDMAUDIODEV addresses: Post message: 
mailto:wdmaudiodev@xxxxxxxxxxxxx Subscribe: 
mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=subscribe Unsubscribe: 
mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=unsubscribe Moderator: 
mailto:wdmaudiodev-moderators@xxxxxxxxxxxxx URL to WDMAUDIODEV page: 
http://www.wdmaudiodev.com/

Other related posts: