summaryrefslogtreecommitdiff
path: root/audio/sysvad/EndpointsCommon
diff options
context:
space:
mode:
authorGirish Pattabiraman <[email protected]>2018-11-12 18:08:19 -0800
committerAdonais Romero González <[email protected]>2018-11-12 18:08:19 -0800
commit995e20f6dbca7ad10a039fa62a2de69eed092ffc (patch)
tree67075f06fd8aaedad732d6c73b682c6e0fda9dba /audio/sysvad/EndpointsCommon
parentc9110a3bc1634a5be8e7922119ad383311104095 (diff)
RS5 Updates (#311)
* Format Changes ============== * Add KSEVENT_PINCAPS_FORMATCHANGE to Bluetooth HFP Endpoints * Remove 8 bit formats from Bluetooth HFP Endpoints Name Template ============== * Bluetooth Endpoints are now based on templates in INF and then customized with endpoints specific data Sideband Common Interface for future Sideband buses =================================================== * Add ISidebandDevice * Add current directory to TabletAudioSample include path. Remove unused compiler flags. * RS4 bug fixes * Replace FastMutex with Spinlock for DeviceFormatsAndModes to work well at DISPATCH_LEVEL * Resync with Microsoft-master branch * Replace FastMutex with Spinlock for DeviceFormatsAndModes to work well at DISPATCH_LEVEL * RS5 updates: - USB Sideband implementation - Power management options: _USE_IPortClsRuntimePower, _USE_SingleComponentMultiFxStates
Diffstat (limited to 'audio/sysvad/EndpointsCommon')
-rw-r--r--audio/sysvad/EndpointsCommon/EndpointsCommon.vcxproj168
-rw-r--r--audio/sysvad/EndpointsCommon/MiniportStreamAudioEngineNode.cpp12
-rw-r--r--audio/sysvad/EndpointsCommon/UsbHsDeviceFormats.h272
-rw-r--r--audio/sysvad/EndpointsCommon/mintopo.cpp18
-rw-r--r--audio/sysvad/EndpointsCommon/mintopo.h28
-rw-r--r--audio/sysvad/EndpointsCommon/minwavert.cpp12
-rw-r--r--audio/sysvad/EndpointsCommon/minwavert.h24
-rw-r--r--audio/sysvad/EndpointsCommon/minwavertstream.cpp40
-rw-r--r--audio/sysvad/EndpointsCommon/minwavertstream.h8
-rw-r--r--audio/sysvad/EndpointsCommon/sources6
-rw-r--r--audio/sysvad/EndpointsCommon/usbhsmictopo.cpp349
-rw-r--r--audio/sysvad/EndpointsCommon/usbhsmictopo.h40
-rw-r--r--audio/sysvad/EndpointsCommon/usbhsmictoptable.h297
-rw-r--r--audio/sysvad/EndpointsCommon/usbhsmicwavtable.h483
-rw-r--r--audio/sysvad/EndpointsCommon/usbhsminipairs.h204
-rw-r--r--audio/sysvad/EndpointsCommon/usbhsminwavert.cpp211
-rw-r--r--audio/sysvad/EndpointsCommon/usbhsspeakertopo.cpp113
-rw-r--r--audio/sysvad/EndpointsCommon/usbhsspeakertopo.h30
-rw-r--r--audio/sysvad/EndpointsCommon/usbhsspeakertoptable.h176
-rw-r--r--audio/sysvad/EndpointsCommon/usbhsspeakerwavtable.h815
-rw-r--r--audio/sysvad/EndpointsCommon/usbhstopo.cpp538
-rw-r--r--audio/sysvad/EndpointsCommon/usbhstopo.h65
22 files changed, 3839 insertions, 70 deletions
diff --git a/audio/sysvad/EndpointsCommon/EndpointsCommon.vcxproj b/audio/sysvad/EndpointsCommon/EndpointsCommon.vcxproj
index 255bb57a..7fda3a23 100644
--- a/audio/sysvad/EndpointsCommon/EndpointsCommon.vcxproj
+++ b/audio/sysvad/EndpointsCommon/EndpointsCommon.vcxproj
@@ -1,10 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|ARM">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|ARM64">
+ <Configuration>Debug</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM">
+ <Configuration>Release</Configuration>
+ <Platform>ARM</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|ARM64">
+ <Configuration>Release</Configuration>
+ <Platform>ARM64</Platform>
+ </ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
@@ -35,6 +51,14 @@
<PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
<ConfigurationType>StaticLibrary</ConfigurationType>
</PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>False</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType>KMDF</DriverType>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ </PropertyGroup>
<PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<TargetVersion>Windows10</TargetVersion>
<UseDebugLibraries>True</UseDebugLibraries>
@@ -43,6 +67,14 @@
<PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
<ConfigurationType>StaticLibrary</ConfigurationType>
</PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>True</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType>KMDF</DriverType>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ </PropertyGroup>
<PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<TargetVersion>Windows10</TargetVersion>
<UseDebugLibraries>False</UseDebugLibraries>
@@ -51,6 +83,14 @@
<PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
<ConfigurationType>StaticLibrary</ConfigurationType>
</PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>False</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType>KMDF</DriverType>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ </PropertyGroup>
<PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<TargetVersion>Windows10</TargetVersion>
<UseDebugLibraries>True</UseDebugLibraries>
@@ -59,6 +99,14 @@
<PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
<ConfigurationType>StaticLibrary</ConfigurationType>
</PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
+ <TargetVersion>Windows10</TargetVersion>
+ <UseDebugLibraries>True</UseDebugLibraries>
+ <DriverTargetPlatform>Universal</DriverTargetPlatform>
+ <DriverType>KMDF</DriverType>
+ <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<PropertyGroup>
<OutDir>$(IntDir)</OutDir>
@@ -66,94 +114,186 @@
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
</ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
</ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
</ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
</ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
+ </ImportGroup>
<ItemGroup Label="WrappedTaskItems" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<TargetName>EndpointsCommon</TargetName>
</PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <TargetName>EndpointsCommon</TargetName>
+ </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<TargetName>EndpointsCommon</TargetName>
</PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <TargetName>EndpointsCommon</TargetName>
+ </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<TargetName>EndpointsCommon</TargetName>
</PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <TargetName>EndpointsCommon</TargetName>
+ </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<TargetName>EndpointsCommon</TargetName>
</PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <TargetName>EndpointsCommon</TargetName>
+ </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ResourceCompile>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS</PreprocessorDefinitions>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND</PreprocessorDefinitions>
</ResourceCompile>
<ClCompile>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..;.</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;_NEW_DELETE_OPERATORS_</PreprocessorDefinitions>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND;_NEW_DELETE_OPERATORS_</PreprocessorDefinitions>
<ExceptionHandling>
</ExceptionHandling>
<DisableSpecificWarnings>4595;%(DisableSpecificWarnings)</DisableSpecificWarnings>
</ClCompile>
<Midl>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS</PreprocessorDefinitions>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND</PreprocessorDefinitions>
+ </Midl>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND</PreprocessorDefinitions>
+ </ResourceCompile>
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..;.</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND;_NEW_DELETE_OPERATORS_</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <DisableSpecificWarnings>4595;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ </ClCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND</PreprocessorDefinitions>
</Midl>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ResourceCompile>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS</PreprocessorDefinitions>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND</PreprocessorDefinitions>
+ </ResourceCompile>
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..;.</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND;_NEW_DELETE_OPERATORS_</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <DisableSpecificWarnings>4595;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ </ClCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND</PreprocessorDefinitions>
+ </Midl>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND</PreprocessorDefinitions>
</ResourceCompile>
<ClCompile>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..;.</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;_NEW_DELETE_OPERATORS_</PreprocessorDefinitions>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND;_NEW_DELETE_OPERATORS_</PreprocessorDefinitions>
<ExceptionHandling>
</ExceptionHandling>
<DisableSpecificWarnings>4595;%(DisableSpecificWarnings)</DisableSpecificWarnings>
</ClCompile>
<Midl>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS</PreprocessorDefinitions>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND</PreprocessorDefinitions>
</Midl>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ResourceCompile>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS</PreprocessorDefinitions>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND</PreprocessorDefinitions>
</ResourceCompile>
<ClCompile>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..;.</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;_NEW_DELETE_OPERATORS_</PreprocessorDefinitions>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND;_NEW_DELETE_OPERATORS_</PreprocessorDefinitions>
<ExceptionHandling>
</ExceptionHandling>
<DisableSpecificWarnings>4595;%(DisableSpecificWarnings)</DisableSpecificWarnings>
</ClCompile>
<Midl>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS</PreprocessorDefinitions>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND</PreprocessorDefinitions>
+ </Midl>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND</PreprocessorDefinitions>
+ </ResourceCompile>
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..;.</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND;_NEW_DELETE_OPERATORS_</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <DisableSpecificWarnings>4595;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ </ClCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND</PreprocessorDefinitions>
</Midl>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ResourceCompile>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS</PreprocessorDefinitions>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND</PreprocessorDefinitions>
+ </ResourceCompile>
+ <ClCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..;.</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND;_NEW_DELETE_OPERATORS_</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <DisableSpecificWarnings>4595;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ </ClCompile>
+ <Midl>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND</PreprocessorDefinitions>
+ </Midl>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND</PreprocessorDefinitions>
</ResourceCompile>
<ClCompile>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..;.</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;_NEW_DELETE_OPERATORS_</PreprocessorDefinitions>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND;_NEW_DELETE_OPERATORS_</PreprocessorDefinitions>
<ExceptionHandling>
</ExceptionHandling>
<DisableSpecificWarnings>4595;%(DisableSpecificWarnings)</DisableSpecificWarnings>
</ClCompile>
<Midl>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS</PreprocessorDefinitions>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);_USE_WAVERT_;SYSVAD_BTH_BYPASS;SYSVAD_USB_SIDEBAND</PreprocessorDefinitions>
</Midl>
</ItemDefinitionGroup>
<ItemGroup>
@@ -171,6 +311,10 @@
<ClCompile Include="NewDelete.cpp" />
<ClCompile Include="speakerhptopo.cpp" />
<ClCompile Include="speakertopo.cpp" />
+ <ClCompile Include="usbhsminwavert.cpp" />
+ <ClCompile Include="usbhsmictopo.cpp" />
+ <ClCompile Include="usbhsspeakertopo.cpp" />
+ <ClCompile Include="usbhstopo.cpp" />
</ItemGroup>
<ItemGroup>
<Inf Exclude="@(Inf)" Include="*.inf" />
diff --git a/audio/sysvad/EndpointsCommon/MiniportStreamAudioEngineNode.cpp b/audio/sysvad/EndpointsCommon/MiniportStreamAudioEngineNode.cpp
index c3da83b9..1b0f13f1 100644
--- a/audio/sysvad/EndpointsCommon/MiniportStreamAudioEngineNode.cpp
+++ b/audio/sysvad/EndpointsCommon/MiniportStreamAudioEngineNode.cpp
@@ -776,13 +776,13 @@ NTSTATUS CMiniportWaveRTStream::SetCurrentWritePosition(_In_ ULONG _ulCurrentWr
NTSTATUS ntStatus;
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined (SYSVAD_USB_SIDEBAND)
if (m_SidebandStarted)
{
ntStatus = GetSidebandStreamNtStatus();
IF_FAILED_JUMP(ntStatus, Done);
}
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) || defined (SYSVAD_USB_SIDEBAND)
//
// Basic validation. WritePosition indicates the position (1-based) of the last valid byte.
@@ -872,13 +872,13 @@ NTSTATUS CMiniportWaveRTStream::GetPositions
NTSTATUS ntStatus;
LARGE_INTEGER ilQPC;
KIRQL oldIrql;
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
if (m_SidebandStarted)
{
ntStatus = GetSidebandStreamNtStatus();
IF_FAILED_JUMP(ntStatus, Done);
}
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
// Update *_pullLinearBufferPosition with the the number of bytes fetched from waveRT ever since a stream got set into RUN
// state.
@@ -909,9 +909,9 @@ NTSTATUS CMiniportWaveRTStream::GetPositions
ntStatus = STATUS_SUCCESS;
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
Done:
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
return ntStatus;
}
diff --git a/audio/sysvad/EndpointsCommon/UsbHsDeviceFormats.h b/audio/sysvad/EndpointsCommon/UsbHsDeviceFormats.h
new file mode 100644
index 00000000..720bfa9f
--- /dev/null
+++ b/audio/sysvad/EndpointsCommon/UsbHsDeviceFormats.h
@@ -0,0 +1,272 @@
+//----------------------------------------------------------------------------
+//
+// Formats
+// This reflects the Data formats of the hardware mixer output
+// Hardware vendor should retrieve these formats from the hardware and use to figure
+// out an intersection with the sideband data-range
+//
+// Defines a data structure containing the KSDATAFORMAT_WAVEFORMATEXTENSIBLE
+// structure for Audio Driver to build data range intersection
+//
+// NOTE: This is defined here because of the dependencies on the ks headers
+//----------------------------------------------------------------------------
+
+static
+KSDATAFORMAT_WAVEFORMATEXTENSIBLE UsbHsSpeakerSupportedDeviceFormats[] =
+{
+ { // 0
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 2,
+ 44100,
+ 176400,
+ 4,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_STEREO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 1
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 1,
+ 44100,
+ 88200,
+ 2,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_MONO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 2
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 2,
+ 48000,
+ 192000,
+ 4,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_STEREO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 3
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 1,
+ 48000,
+ 96000,
+ 2,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_MONO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 4
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 2,
+ 48000,
+ 288000,
+ 6,
+ 24,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 24,
+ KSAUDIO_SPEAKER_STEREO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ }
+};
+
+static
+KSDATAFORMAT_WAVEFORMATEXTENSIBLE UsbHsMicSupportedDeviceFormats[] =
+{
+ { // 0
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 2,
+ 44100,
+ 176400,
+ 4,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_STEREO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 1
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 1,
+ 44100,
+ 88200,
+ 2,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_MONO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 2
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 2,
+ 48000,
+ 192000,
+ 4,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_STEREO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 3
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 1,
+ 48000,
+ 96000,
+ 2,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_MONO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 4
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 2,
+ 48000,
+ 288000,
+ 6,
+ 24,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 24,
+ KSAUDIO_SPEAKER_STEREO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ }
+};
diff --git a/audio/sysvad/EndpointsCommon/mintopo.cpp b/audio/sysvad/EndpointsCommon/mintopo.cpp
index d0ecd848..128fa15c 100644
--- a/audio/sysvad/EndpointsCommon/mintopo.cpp
+++ b/audio/sysvad/EndpointsCommon/mintopo.cpp
@@ -110,13 +110,13 @@ Return Value:
DPF_ENTER(("[CMiniportTopology::~CMiniportTopology]"));
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
if (IsSidebandDevice())
{
ASSERT(m_pSidebandDevice != NULL);
//
- // Register with BthHfpDevice to get notification events.
+ // Register with BthHfpDevice or UsbHsDevice to get notification events.
//
if(IsSidebandDevice())
{
@@ -127,7 +127,7 @@ Return Value:
SAFE_RELEASE(m_pSidebandDevice); // ISidebandDeviceCommon
}
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
} // ~CMiniportTopology
@@ -281,7 +281,7 @@ Return Value:
DPF(D_ERROR, ("Init: CMiniportTopologySYSVAD::Init failed, 0x%x", ntStatus)),
Done);
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
if (IsSidebandDevice())
{
PSIDEBANDDEVICECOMMON sidebandDevice = NULL;
@@ -292,7 +292,7 @@ Return Value:
//
// Register with BthHfpDevice to get notification events.
//
- if (m_DeviceType == eBthHfpMicDevice)
+ if (m_DeviceType == eBthHfpMicDevice || m_DeviceType == eUsbHsMicDevice)
{
sidebandDevice->SetVolumeHandler(
m_DeviceType,
@@ -306,7 +306,7 @@ Return Value:
}
else
{
- ASSERT(m_DeviceType == eBthHfpSpeakerDevice);
+ ASSERT(m_DeviceType == eBthHfpSpeakerDevice || m_DeviceType == eUsbHsSpeakerDevice);
sidebandDevice->SetVolumeHandler(
m_DeviceType,
@@ -319,7 +319,7 @@ Return Value:
PCMiniportTopology(this)); // context.
}
}
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
Done:
return ntStatus;
@@ -581,7 +581,7 @@ Return Value:
return ntStatus;
}
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
//=============================================================================
#pragma code_seg()
VOID
@@ -685,7 +685,7 @@ CMiniportTopology::EvtMicConnectionStatusHandler
FALSE, // do not use node ID.
ULONG(-1)); // node ID, not used.
}
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
//=============================================================================
#pragma code_seg("PAGE")
diff --git a/audio/sysvad/EndpointsCommon/mintopo.h b/audio/sysvad/EndpointsCommon/mintopo.h
index f25d0991..7f573237 100644
--- a/audio/sysvad/EndpointsCommon/mintopo.h
+++ b/audio/sysvad/EndpointsCommon/mintopo.h
@@ -35,9 +35,9 @@ class CMiniportTopology :
eDeviceType m_DeviceType;
union {
PVOID m_DeviceContext;
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
PSIDEBANDDEVICECOMMON m_pSidebandDevice;
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
};
public:
@@ -55,7 +55,7 @@ public:
m_DeviceType(DeviceType),
m_DeviceContext(DeviceContext)
{
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
if (IsSidebandDevice())
{
if (m_pSidebandDevice != NULL)
@@ -64,7 +64,7 @@ public:
m_pSidebandDevice->AddRef(); // strong ref.
}
}
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
}
~CMiniportTopology();
@@ -86,11 +86,13 @@ public:
_In_ DWORD JackCapabilities
);
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
BOOL IsSidebandDevice()
{
return (m_DeviceType == eBthHfpMicDevice ||
- m_DeviceType == eBthHfpSpeakerDevice) ? TRUE : FALSE;
+ m_DeviceType == eBthHfpSpeakerDevice ||
+ m_DeviceType == eUsbHsMicDevice ||
+ m_DeviceType == eUsbHsSpeakerDevice ) ? TRUE : FALSE;
}
// Returns a weak ref to the Bluetooth HFP device.
@@ -136,7 +138,7 @@ public:
(
_In_opt_ PVOID Context
);
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) defined(SYSVAD_USB_SIDEBAND)
PVOID GetDeviceContext() { return m_DeviceContext; }
@@ -150,6 +152,18 @@ public:
_In_ PPCPROPERTY_REQUEST PropertyRequest);
friend NTSTATUS PropertyHandler_BthHfpSpeakerVolumeLevel(
_In_ PPCPROPERTY_REQUEST PropertyRequest);
+ friend NTSTATUS PropertyHandler_UsbHsJackContainerId(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest,
+ _In_ ULONG cJackDescriptions,
+ _In_reads_(cJackDescriptions) PKSJACK_DESCRIPTION * JackDescriptions);
+ friend NTSTATUS PropertyHandler_UsbHsVolumeLevel_BasicSupport(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest);
+ friend NTSTATUS PropertyHandler_UsbHsMicVolumeLevel(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest);
+ friend NTSTATUS PropertyHandler_UsbHsMute_BasicSupport(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest);
+ friend NTSTATUS PropertyHandler_UsbHsMicMute(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest);
};
typedef CMiniportTopology *PCMiniportTopology;
diff --git a/audio/sysvad/EndpointsCommon/minwavert.cpp b/audio/sysvad/EndpointsCommon/minwavert.cpp
index d56462a6..f4a0599c 100644
--- a/audio/sysvad/EndpointsCommon/minwavert.cpp
+++ b/audio/sysvad/EndpointsCommon/minwavert.cpp
@@ -196,13 +196,13 @@ Return Value:
m_pAudioModules = NULL;
}
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
if (IsSidebandDevice())
{
m_pSidebandDevice->SetFormatChangeHandler(m_DeviceType, NULL, NULL);
SAFE_RELEASE(m_pSidebandDevice);
}
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
} // ~CMiniportWaveRT
@@ -1438,11 +1438,13 @@ CMiniportWaveRT::PropertyHandlerProposedFormat
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET)
{
ntStatus = STATUS_INVALID_DEVICE_REQUEST;
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
if (IsSidebandDevice())
{
if (m_DeviceType == eBthHfpMicDevice ||
- m_DeviceType == eBthHfpSpeakerDevice)
+ m_DeviceType == eBthHfpSpeakerDevice ||
+ m_DeviceType == eUsbHsSpeakerDevice ||
+ m_DeviceType == eUsbHsMicDevice)
{
KSDATAFORMAT_WAVEFORMATEXTENSIBLE *propFormat = (KSDATAFORMAT_WAVEFORMATEXTENSIBLE *)PropertyRequest->Value;
ULONG numModes = 0;
@@ -1500,7 +1502,7 @@ CMiniportWaveRT::PropertyHandlerProposedFormat
ntStatus = STATUS_SUCCESS;
}
}
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
}
else if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET)
{
diff --git a/audio/sysvad/EndpointsCommon/minwavert.h b/audio/sysvad/EndpointsCommon/minwavert.h
index 848e4c9a..2472a872 100644
--- a/audio/sysvad/EndpointsCommon/minwavert.h
+++ b/audio/sysvad/EndpointsCommon/minwavert.h
@@ -18,6 +18,9 @@ Abstract:
#ifdef SYSVAD_BTH_BYPASS
#include "bthhfpmicwavtable.h"
#endif // SYSVAD_BTH_BYPASS
+#ifdef SYSVAD_USB_SIDEBAND
+#include "usbhsmicwavtable.h"
+#endif // SYSVAD_USB_SIDEBAND
//=============================================================================
// Referenced Forward
@@ -156,9 +159,9 @@ private:
union {
PVOID m_DeviceContext;
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
PSIDEBANDDEVICECOMMON m_pSidebandDevice;
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
};
AUDIOMODULE * m_pAudioModules;
@@ -330,7 +333,7 @@ public:
}
}
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
if (IsSidebandDevice())
{
if (m_pSidebandDevice != NULL)
@@ -417,6 +420,12 @@ public:
_In_ PPCPROPERTY_REQUEST PropertyRequest
);
#endif // SYSVAD_BTH_BYPASS
+#ifdef SYSVAD_USB_SIDEBAND
+ NTSTATUS PropertyHandler_UsbHsAudioEffectsDiscoveryEffectsList
+ (
+ _In_ PPCPROPERTY_REQUEST PropertyRequest
+ );
+#endif // SYSVAD_USB_SIDEBAND
//---------------------------------------------------------------------------------------------------------
// volume
@@ -664,6 +673,7 @@ protected:
m_DeviceType == eHdmiRenderDevice ||
m_DeviceType == eSpdifRenderDevice ||
m_DeviceType == eBthHfpSpeakerDevice ||
+ m_DeviceType == eUsbHsSpeakerDevice ||
m_DeviceType == eHandsetSpeakerDevice) ? TRUE : FALSE;
}
@@ -844,13 +854,15 @@ protected:
_In_ ULONG AudioModuleCount
);
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
public:
#pragma code_seg()
BOOL IsSidebandDevice()
{
return (m_DeviceType == eBthHfpMicDevice ||
- m_DeviceType == eBthHfpSpeakerDevice ) ? TRUE : FALSE;
+ m_DeviceType == eBthHfpSpeakerDevice ||
+ m_DeviceType == eUsbHsMicDevice ||
+ m_DeviceType == eUsbHsSpeakerDevice ) ? TRUE : FALSE;
}
// Returns a weak ref to the Bluetooth HFP device.
@@ -870,7 +882,7 @@ public:
return sidebandDevice;
}
#pragma code_seg()
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
#ifdef SYSVAD_BTH_BYPASS
#pragma code_seg()
diff --git a/audio/sysvad/EndpointsCommon/minwavertstream.cpp b/audio/sysvad/EndpointsCommon/minwavertstream.cpp
index e5dad74f..9ea47c56 100644
--- a/audio/sysvad/EndpointsCommon/minwavertstream.cpp
+++ b/audio/sysvad/EndpointsCommon/minwavertstream.cpp
@@ -252,10 +252,10 @@ Return Value:
m_dwLoopbackCaptureToneInitialPhase = 0;
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
m_SidebandOpen = FALSE;
m_SidebandStarted = FALSE;
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
m_pPortStream = PortStream_;
InitializeListHead(&m_NotificationList);
@@ -843,13 +843,13 @@ NTSTATUS CMiniportWaveRTStream::GetPosition
{
NTSTATUS ntStatus;
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
if (m_SidebandStarted)
{
ntStatus = GetSidebandStreamNtStatus();
IF_FAILED_JUMP(ntStatus, Done);
}
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
// Return failure if this is the keyword detector pin
if (m_pMiniport->IsKeywordDetectorPin(m_ulPin))
@@ -876,9 +876,9 @@ NTSTATUS CMiniportWaveRTStream::GetPosition
ntStatus = STATUS_SUCCESS;
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
Done:
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
return ntStatus;
}
@@ -1178,7 +1178,7 @@ NTSTATUS CMiniportWaveRTStream::SetState
if (m_KsState == KSSTATE_ACQUIRE)
{
// Acquire stream resources
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
if (m_SidebandOpen)
{
PSIDEBANDDEVICECOMMON sidebandDevice;
@@ -1198,7 +1198,7 @@ NTSTATUS CMiniportWaveRTStream::SetState
m_SidebandOpen = FALSE;
}
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
}
KeAcquireSpinLock(&m_PositionSpinLock, &oldIrql);
// Reset DMA
@@ -1228,7 +1228,7 @@ NTSTATUS CMiniportWaveRTStream::SetState
if (m_KsState == KSSTATE_STOP)
{
// Acquire stream resources
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
if (m_pMiniport->IsSidebandDevice())
{
if (m_SidebandOpen == FALSE)
@@ -1250,7 +1250,7 @@ NTSTATUS CMiniportWaveRTStream::SetState
m_SidebandOpen = TRUE;
}
}
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
}
break;
@@ -1288,7 +1288,7 @@ NTSTATUS CMiniportWaveRTStream::SetState
}
}
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
if (m_SidebandStarted)
{
PSIDEBANDDEVICECOMMON sidebandDevice;
@@ -1308,7 +1308,7 @@ NTSTATUS CMiniportWaveRTStream::SetState
m_SidebandStarted = FALSE;
}
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
}
// This call updates the linear buffer and presentation positions.
@@ -1317,7 +1317,7 @@ NTSTATUS CMiniportWaveRTStream::SetState
case KSSTATE_RUN:
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
if (m_pMiniport->IsSidebandDevice())
{
if (m_SidebandStarted == FALSE)
@@ -1339,7 +1339,7 @@ NTSTATUS CMiniportWaveRTStream::SetState
m_SidebandStarted = TRUE;
}
}
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
// Start DMA
LARGE_INTEGER ullPerfCounterTemp;
@@ -1371,9 +1371,9 @@ NTSTATUS CMiniportWaveRTStream::SetState
m_KsState = State_;
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
Done:
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
return ntStatus;
}
@@ -1649,7 +1649,7 @@ Return Value:
return ntStatus;
} // SetContentId
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
//=============================================================================
#pragma code_seg()
@@ -1687,7 +1687,7 @@ Return Value:
return ntStatus;
}
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
//=============================================================================
#pragma code_seg("PAGE")
@@ -1788,7 +1788,7 @@ TimerNotifyRT
_this->m_llPacketCounter++;
}
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
if (_this->m_SidebandStarted)
{
if (!NT_SUCCESS(_this->GetSidebandStreamNtStatus()))
@@ -1796,7 +1796,7 @@ TimerNotifyRT
goto End;
}
}
-#endif //defined(SYSVAD_BTH_BYPASS)
+#endif //defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
_this->m_pMiniport->DpcRoutine(qpc.QuadPart, qpcFrequency.QuadPart);
diff --git a/audio/sysvad/EndpointsCommon/minwavertstream.h b/audio/sysvad/EndpointsCommon/minwavertstream.h
index b1fc4628..4e9e882c 100644
--- a/audio/sysvad/EndpointsCommon/minwavertstream.h
+++ b/audio/sysvad/EndpointsCommon/minwavertstream.h
@@ -140,10 +140,10 @@ protected:
DWORD m_dwLoopbackCaptureToneInitialPhase; // must be between -31416 to 31416
// Member variable as config params for tone generator
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
BOOL m_SidebandOpen;
BOOL m_SidebandStarted;
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
public:
@@ -309,9 +309,9 @@ private:
);
NTSTATUS ReadRegistrySettings();
-#if defined(SYSVAD_BTH_BYPASS)
+#if defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
NTSTATUS GetSidebandStreamNtStatus();
-#endif // defined(SYSVAD_BTH_BYPASS)
+#endif // defined(SYSVAD_BTH_BYPASS) || defined(SYSVAD_USB_SIDEBAND)
};
typedef CMiniportWaveRTStream *PCMiniportWaveRTStream;
diff --git a/audio/sysvad/EndpointsCommon/sources b/audio/sysvad/EndpointsCommon/sources
index 18b2ddc4..4ac1b852 100644
--- a/audio/sysvad/EndpointsCommon/sources
+++ b/audio/sysvad/EndpointsCommon/sources
@@ -11,7 +11,7 @@ INCLUDES= \
..
-C_DEFINES = $(C_DEFINES) -D_USE_WAVERT_ -DSYSVAD_BTH_BYPASS
+C_DEFINES = $(C_DEFINES) -D_USE_WAVERT_ -DSYSVAD_BTH_BYPASS -DSYSVAD_USB_SIDEBAND
#C_DEFINES = $(C_DEFINES) -D_USE_WAVERT_
DDK_TARGET_PLATFORM=Universal
@@ -41,4 +41,8 @@ SOURCES=$(SOURCES) \
minwavertstream.cpp \
speakertopo.cpp \
speakerhptopo.cpp \
+ usbhstopo.cpp \
+ usbhsmictopo.cpp \
+ usbhsspeakertopo.cpp \
+ usbhsminwavert.cpp \
diff --git a/audio/sysvad/EndpointsCommon/usbhsmictopo.cpp b/audio/sysvad/EndpointsCommon/usbhsmictopo.cpp
new file mode 100644
index 00000000..6814b5ce
--- /dev/null
+++ b/audio/sysvad/EndpointsCommon/usbhsmictopo.cpp
@@ -0,0 +1,349 @@
+/*++
+
+Copyright (c) Microsoft Corporation All Rights Reserved
+
+Module Name:
+
+ usbhsmictopo.cpp
+
+Abstract:
+
+ Implementation of topology miniport for the mic (external: headphone).
+
+--*/
+#ifdef SYSVAD_USB_SIDEBAND
+
+#pragma warning (disable : 4127)
+
+#include <sysvad.h>
+#include "simple.h"
+#include "mintopo.h"
+#include "usbhstopo.h"
+#include "usbhsmictopo.h"
+#include "usbhsmictoptable.h"
+
+//=============================================================================
+#pragma code_seg("PAGE")
+NTSTATUS
+PropertyHandler_UsbHsMicTopoFilter
+(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest
+)
+/*++
+
+Routine Description:
+
+ Redirects property request to miniport object
+
+Arguments:
+
+ PropertyRequest -
+
+Return Value:
+
+ NT status code.
+
+--*/
+{
+ PAGED_CODE();
+
+ ASSERT(PropertyRequest);
+
+ DPF_ENTER(("[PropertyHandler_UsbHsMicTopoFilter]"));
+
+ // PropertryRequest structure is filled by portcls.
+ // MajorTarget is a pointer to miniport object for miniports.
+ //
+ NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST;
+
+ //
+ // This line shows how to get a pointer to the miniport topology object.
+ //
+ PCMiniportTopology pMiniport = (PCMiniportTopology)PropertyRequest->MajorTarget;
+ UNREFERENCED_VAR(pMiniport);
+
+ if (IsEqualGUIDAligned(*PropertyRequest->PropertyItem->Set, KSPROPSETID_Jack))
+ {
+ switch(PropertyRequest->PropertyItem->Id)
+ {
+ case KSPROPERTY_JACK_DESCRIPTION:
+ ntStatus = PropertyHandler_UsbHsJackDescription(
+ PropertyRequest,
+ ARRAYSIZE(UsbHsMicJackDescriptions),
+ UsbHsMicJackDescriptions);
+ break;
+
+ case KSPROPERTY_JACK_DESCRIPTION2:
+ ntStatus = PropertyHandler_UsbHsJackDescription2(
+ PropertyRequest,
+ ARRAYSIZE(UsbHsMicJackDescriptions),
+ UsbHsMicJackDescriptions);
+ break;
+
+ case KSPROPERTY_JACK_CONTAINERID:
+ ntStatus = PropertyHandler_UsbHsJackContainerId(
+ PropertyRequest,
+ ARRAYSIZE(UsbHsMicJackDescriptions),
+ UsbHsMicJackDescriptions);
+ break;
+ }
+ }
+
+ return ntStatus;
+} // PropertyHandler_UsbHsMicTopoFilter
+
+//=============================================================================
+#pragma code_seg("PAGE")
+NTSTATUS
+PropertyHandler_UsbHsMicVolumeLevel
+(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest
+)
+/*++
+
+Routine Description:
+
+ Handles ( KSPROPSETID_Audio, KSPROPERTY_AUDIO_VOLUMELEVEL )
+
+Arguments:
+
+ PropertyRequest -
+
+Return Value:
+
+ NT status code.
+
+--*/
+{
+ PAGED_CODE();
+
+ ASSERT(PropertyRequest);
+
+ DPF_ENTER(("[PropertyHandler_UsbHsMicVolumeLevel]"));
+
+ NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST;
+ PCMiniportTopology miniport = (PCMiniportTopology)PropertyRequest->MajorTarget;
+ PSIDEBANDDEVICECOMMON usbHsDevice = NULL;
+ ULONG channel = (ULONG)-1;
+
+ usbHsDevice = miniport->GetSidebandDevice(); // weak ref.
+ ASSERT(usbHsDevice != NULL);
+
+ if (usbHsDevice->IsVolumeSupported(miniport->m_DeviceType) == FALSE)
+ {
+ ntStatus = miniport->PropertyHandlerGeneric(PropertyRequest);
+ }
+ else if (PropertyRequest->Verb & KSPROPERTY_TYPE_BASICSUPPORT)
+ {
+ ntStatus = PropertyHandler_UsbHsVolumeLevel_BasicSupport(PropertyRequest);
+ }
+ else if (PropertyRequest->InstanceSize >= sizeof(ULONG))
+ {
+ // Instance is the channel #.
+ channel = *(PULONG(PropertyRequest->Instance));
+
+ ULONG cbNeeded = sizeof(LONG);
+
+ if (PropertyRequest->ValueSize == 0)
+ {
+ PropertyRequest->ValueSize = cbNeeded;
+ ntStatus = STATUS_BUFFER_OVERFLOW;
+ }
+ else if (PropertyRequest->ValueSize < cbNeeded)
+ {
+ ntStatus = STATUS_BUFFER_TOO_SMALL;
+ }
+ else
+ {
+ LONG* volume = (LONG*)PropertyRequest->Value;
+
+ if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET)
+ {
+ ntStatus = usbHsDevice->GetVolume(eUsbHsMicDevice, channel, volume);
+ }
+ else if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET)
+ {
+ ntStatus = usbHsDevice->SetVolume(eUsbHsMicDevice, channel, *volume);
+ }
+ }
+ }
+
+ return ntStatus;
+}
+
+//=============================================================================
+#pragma code_seg("PAGE")
+NTSTATUS
+PropertyHandler_UsbHsMicMute
+(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest
+)
+/*++
+
+Routine Description:
+
+ Handles ( KSPROPSETID_Audio, KSPROPERTY_AUDIO_MUTE )
+
+Arguments:
+
+ PropertyRequest -
+
+Return Value:
+
+ NT status code.
+
+--*/
+{
+ PAGED_CODE();
+
+ ASSERT(PropertyRequest);
+
+ DPF_ENTER(("[PropertyHandler_UsbHsMicMute]"));
+
+ NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST;
+ PCMiniportTopology miniport = (PCMiniportTopology)PropertyRequest->MajorTarget;
+ PSIDEBANDDEVICECOMMON usbHsDevice = NULL;
+ ULONG channel = (ULONG)-1;
+
+ usbHsDevice = miniport->GetSidebandDevice(); // weak ref.
+ ASSERT(usbHsDevice != NULL);
+
+ if (usbHsDevice->IsMuteSupported(miniport->m_DeviceType) == FALSE)
+ {
+ ntStatus = miniport->PropertyHandlerGeneric(PropertyRequest);
+ }
+ else if (PropertyRequest->Verb & KSPROPERTY_TYPE_BASICSUPPORT)
+ {
+ ntStatus = PropertyHandler_UsbHsMute_BasicSupport(PropertyRequest);
+ }
+ else if (PropertyRequest->InstanceSize >= sizeof(ULONG))
+ {
+ // Instance is the channel #.
+ channel = *(PULONG(PropertyRequest->Instance));
+
+ ULONG cbNeeded = sizeof(LONG);
+
+ if (PropertyRequest->ValueSize == 0)
+ {
+ PropertyRequest->ValueSize = cbNeeded;
+ ntStatus = STATUS_BUFFER_OVERFLOW;
+ }
+ else if (PropertyRequest->ValueSize < cbNeeded)
+ {
+ ntStatus = STATUS_BUFFER_TOO_SMALL;
+ }
+ else
+ {
+ LONG* mute = (LONG*)PropertyRequest->Value;
+
+ if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET)
+ {
+ *mute = usbHsDevice->GetMute(eUsbHsMicDevice, channel);
+
+ ntStatus = STATUS_SUCCESS;
+
+ }
+ else if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET)
+ {
+ ntStatus = usbHsDevice->SetMute(eUsbHsMicDevice, channel, *mute);
+ }
+ }
+ }
+
+ return ntStatus;
+}
+
+//=============================================================================
+#pragma code_seg("PAGE")
+NTSTATUS
+PropertyHandler_UsbHsMicTopoNode
+(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest
+)
+/*++
+
+Routine Description:
+
+ Redirects property request to miniport object
+
+Arguments:
+
+ PropertyRequest -
+
+Return Value:
+
+ NT status code.
+
+--*/
+{
+ PAGED_CODE();
+
+ ASSERT(PropertyRequest);
+
+ DPF_ENTER(("[PropertyHandler_UsbHsMicTopoNode]"));
+
+ // PropertryRequest structure is filled by portcls.
+ // MajorTarget is a pointer to miniport object for miniports.
+ //
+ NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST;
+
+ //
+ // This line shows how to get a pointer to the miniport topology object.
+ //
+ PCMiniportTopology pMiniport = (PCMiniportTopology)PropertyRequest->MajorTarget;
+ UNREFERENCED_VAR(pMiniport);
+
+ if (IsEqualGUIDAligned(*PropertyRequest->PropertyItem->Set, KSPROPSETID_Audio))
+ {
+ if (PropertyRequest->PropertyItem->Id == KSPROPERTY_AUDIO_VOLUMELEVEL)
+ {
+ ntStatus = PropertyHandler_UsbHsMicVolumeLevel(PropertyRequest);
+ }
+ else if (PropertyRequest->PropertyItem->Id == KSPROPERTY_AUDIO_MUTE)
+ {
+ ntStatus = PropertyHandler_UsbHsMicMute(PropertyRequest);
+ }
+ }
+
+ return ntStatus;
+} // PropertyHandler_UsbHsMicTopoFilter
+
+//=============================================================================
+#pragma code_seg()
+NTSTATUS
+PropertyHandler_UsbHsMicTopoNodeEvent
+(
+ _In_ PPCEVENT_REQUEST EventRequest
+)
+{
+ ASSERT(EventRequest);
+
+ DPF_ENTER(("[PropertyHandler_UsbHsMicTopoNodeEvent]"));
+
+ // Validate the node.
+ if (EventRequest->Node != KSNODE_TOPO_VOLUME &&
+ EventRequest->Node != KSNODE_TOPO_MUTE)
+ return STATUS_INVALID_PARAMETER;
+
+ return PropertyHandler_UsbHsTopoNodeEvent(EventRequest);
+}
+
+//=============================================================================
+#pragma code_seg()
+NTSTATUS
+PropertyHandler_UsbHsMicTopoFilterEvent
+(
+ _In_ PPCEVENT_REQUEST EventRequest
+)
+{
+ ASSERT(EventRequest);
+
+ DPF_ENTER(("[PropertyHandler_UsbHsMicTopoFilterEvent]"));
+
+ return PropertyHandler_UsbHsTopoNodeEvent(EventRequest);
+}
+
+#pragma code_seg()
+#endif // SYSVAD_USB_SIDEBAND
+
+
diff --git a/audio/sysvad/EndpointsCommon/usbhsmictopo.h b/audio/sysvad/EndpointsCommon/usbhsmictopo.h
new file mode 100644
index 00000000..e2a872c5
--- /dev/null
+++ b/audio/sysvad/EndpointsCommon/usbhsmictopo.h
@@ -0,0 +1,40 @@
+/*++
+
+Copyright (c) Microsoft Corporation All Rights Reserved
+
+Module Name:
+
+ usbhsmictopo.h
+
+Abstract:
+
+ Declaration of topology miniport for the mic (external: headphone).
+
+--*/
+
+#ifndef _SYSVAD_USBHSMICTOPO_H_
+#define _SYSVAD_USBHSMICTOPO_H_
+
+// Function declarations.
+NTSTATUS
+PropertyHandler_UsbHsMicTopoFilter(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest
+ );
+
+NTSTATUS
+PropertyHandler_UsbHsMicTopoNode(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest
+ );
+
+NTSTATUS
+PropertyHandler_UsbHsMicTopoNodeEvent(
+ _In_ PPCEVENT_REQUEST EventRequest
+ );
+
+NTSTATUS
+PropertyHandler_UsbHsMicTopoFilterEvent(
+ _In_ PPCEVENT_REQUEST EventRequest
+ );
+
+#endif // _SYSVAD_USBHSMICTOPO_H_
+
diff --git a/audio/sysvad/EndpointsCommon/usbhsmictoptable.h b/audio/sysvad/EndpointsCommon/usbhsmictoptable.h
new file mode 100644
index 00000000..ac3c89d0
--- /dev/null
+++ b/audio/sysvad/EndpointsCommon/usbhsmictoptable.h
@@ -0,0 +1,297 @@
+/*++
+
+Copyright (c) Microsoft Corporation All Rights Reserved
+
+Module Name:
+
+ usbhsmictopotable.h
+
+Abstract:
+
+ Declaration of topology table for the USB Headset mic (external)
+
+--*/
+
+#ifndef _SYSVAD_USBHSMICTOPTABLE_H_
+#define _SYSVAD_USBHSMICTOPTABLE_H_
+
+#include "usbhsmictopo.h"
+
+// Function declarations.
+NTSTATUS
+PropertyHandler_UsbHsMicTopoFilter(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest
+ );
+
+//=============================================================================
+static
+KSDATARANGE UsbHsMicTopoPinDataRangesBridge[] =
+{
+ {
+ sizeof(KSDATARANGE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_ANALOG),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE)
+ }
+};
+
+//=============================================================================
+static
+PKSDATARANGE UsbHsMicTopoPinDataRangePointersBridge[] =
+{
+ &UsbHsMicTopoPinDataRangesBridge[0]
+};
+
+//=============================================================================
+static
+PCPIN_DESCRIPTOR UsbHsMicTopoMiniportPins[] =
+{
+ // KSPIN_TOPO_MIC_ELEMENTS
+ {
+ 0,
+ 0,
+ 0, // InstanceCount
+ NULL, // AutomationTable
+ { // KsPinDescriptor
+ 0, // InterfacesCount
+ NULL, // Interfaces
+ 0, // MediumsCount
+ NULL, // Mediums
+ SIZEOF_ARRAY(UsbHsMicTopoPinDataRangePointersBridge),// DataRangesCount
+ UsbHsMicTopoPinDataRangePointersBridge, // DataRanges
+ KSPIN_DATAFLOW_IN, // DataFlow
+ KSPIN_COMMUNICATION_NONE, // Communication
+ &KSNODETYPE_HEADSET_MICROPHONE, // Category
+ NULL, // Name
+ 0 // Reserved
+ }
+ },
+
+ // KSPIN_TOPO_BRIDGE
+ {
+ 0,
+ 0,
+ 0, // InstanceCount
+ NULL, // AutomationTable
+ { // KsPinDescriptor
+ 0, // InterfacesCount
+ NULL, // Interfaces
+ 0, // MediumsCount
+ NULL, // Mediums
+ SIZEOF_ARRAY(UsbHsMicTopoPinDataRangePointersBridge),// DataRangesCount
+ UsbHsMicTopoPinDataRangePointersBridge, // DataRanges
+ KSPIN_DATAFLOW_OUT, // DataFlow
+ KSPIN_COMMUNICATION_NONE, // Communication
+ &KSCATEGORY_AUDIO, // Category
+ NULL, // Name
+ 0 // Reserved
+ }
+ }
+};
+
+//=============================================================================
+static
+KSJACK_DESCRIPTION UsbHsMicJackDesc =
+{
+ KSAUDIO_SPEAKER_MONO,
+ JACKDESC_RGB(0, 0, 0),
+ eConnTypeOtherDigital,
+ eGeoLocBottom,
+ eGenLocPrimaryBox,
+ ePortConnJack,
+ FALSE // NOTE: For convenience, wired headset jacks will be "unplugged" at boot.
+};
+
+//=============================================================================
+// Only return a KSJACK_DESCRIPTION for the physical bridge pin.
+static
+PKSJACK_DESCRIPTION UsbHsMicJackDescriptions[] =
+{
+ &UsbHsMicJackDesc,
+ NULL
+};
+
+//=============================================================================
+static
+PCPROPERTY_ITEM UsbHsMicPropertiesVolume[] =
+{
+ {
+ &KSPROPSETID_Audio,
+ KSPROPERTY_AUDIO_VOLUMELEVEL,
+ KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_BASICSUPPORT,
+ PropertyHandler_UsbHsMicTopoNode
+ }
+};
+
+static
+PCEVENT_ITEM UsbHsMicPropertiesVolumeEvent[] =
+{
+ // This is a generic event for nearly every node property.
+ {
+ &KSEVENTSETID_AudioControlChange, // Something changed!
+ KSEVENT_CONTROL_CHANGE, // The only event-property defined.
+ KSEVENT_TYPE_ENABLE | KSEVENT_TYPE_BASICSUPPORT,
+ PropertyHandler_UsbHsMicTopoNodeEvent
+ }
+};
+
+DEFINE_PCAUTOMATION_TABLE_PROP_EVENT(AutomationUsbHsMicVolumeWithEvent,
+ UsbHsMicPropertiesVolume,
+ UsbHsMicPropertiesVolumeEvent);
+
+
+//=============================================================================
+static
+PCPROPERTY_ITEM UsbHsMicPropertiesMute[] =
+{
+ {
+ &KSPROPSETID_Audio,
+ KSPROPERTY_AUDIO_MUTE,
+ KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_BASICSUPPORT,
+ PropertyHandler_UsbHsMicTopoNode
+ }
+};
+
+static
+PCEVENT_ITEM UsbHsMicPropertiesMuteEvent[] =
+{
+ // This is a generic event for nearly every node property.
+ {
+ &KSEVENTSETID_AudioControlChange, // Something changed!
+ KSEVENT_CONTROL_CHANGE, // The only event-property defined.
+ KSEVENT_TYPE_ENABLE | KSEVENT_TYPE_BASICSUPPORT,
+ PropertyHandler_UsbHsMicTopoNodeEvent
+ }
+};
+
+DEFINE_PCAUTOMATION_TABLE_PROP_EVENT(AutomationUsbHsMicMuteWithEvent,
+ UsbHsMicPropertiesMute,
+ UsbHsMicPropertiesMuteEvent);
+
+//=============================================================================
+static
+PCPROPERTY_ITEM UsbHsMicPropertiesPeakMeter[] =
+{
+ {
+ &KSPROPSETID_Audio,
+ KSPROPERTY_AUDIO_PEAKMETER2,
+ 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(AutomationUsbHsMicPeakMeter, UsbHsMicPropertiesPeakMeter);
+
+//=============================================================================
+static
+PCNODE_DESCRIPTOR UsbHsMicTopologyNodes[] =
+{
+ // KSNODE_TOPO_VOLUME
+ {
+ 0, // Flags
+ &AutomationUsbHsMicVolumeWithEvent, // AutomationTable
+ &KSNODETYPE_VOLUME, // Type
+ &KSAUDFNAME_MIC_VOLUME // Name
+ },
+ // KSNODE_TOPO_MUTE
+ {
+ 0, // Flags
+ &AutomationUsbHsMicMuteWithEvent, // AutomationTable
+ &KSNODETYPE_MUTE, // Type
+ &KSAUDFNAME_MIC_MUTE // Name
+ },
+ // KSNODE_TOPO_PEAKMETER
+ {
+ 0, // Flags
+ &AutomationUsbHsMicPeakMeter, // AutomationTable
+ &KSNODETYPE_PEAKMETER, // Type
+ &KSAUDFNAME_PEAKMETER // Name
+ }
+};
+
+C_ASSERT( KSNODE_TOPO_VOLUME == 0 );
+C_ASSERT( KSNODE_TOPO_MUTE == 1 );
+C_ASSERT( KSNODE_TOPO_PEAKMETER == 2 );
+
+//=============================================================================
+static
+PCCONNECTION_DESCRIPTOR UsbHsMicMiniportConnections[] =
+{
+ // FromNode, FromPin, ToNode, ToPin
+ { PCFILTER_NODE, KSPIN_TOPO_MIC_ELEMENTS, KSNODE_TOPO_VOLUME, 1 },
+ { KSNODE_TOPO_VOLUME, 0, KSNODE_TOPO_MUTE, 1 },
+ { KSNODE_TOPO_MUTE, 0, KSNODE_TOPO_PEAKMETER, 1 },
+ { KSNODE_TOPO_PEAKMETER, 0, PCFILTER_NODE, KSPIN_TOPO_BRIDGE }
+};
+
+
+//=============================================================================
+static
+PCPROPERTY_ITEM UsbHsMicPropertiesTopoFilter[] =
+{
+ {
+ &KSPROPSETID_Jack,
+ KSPROPERTY_JACK_DESCRIPTION,
+ KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_BASICSUPPORT,
+ PropertyHandler_UsbHsMicTopoFilter
+ },
+ {
+ &KSPROPSETID_Jack,
+ KSPROPERTY_JACK_DESCRIPTION2,
+ KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_BASICSUPPORT,
+ PropertyHandler_UsbHsMicTopoFilter
+ },
+ {
+ &KSPROPSETID_Jack,
+ KSPROPERTY_JACK_CONTAINERID,
+ KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_BASICSUPPORT,
+ PropertyHandler_UsbHsMicTopoFilter
+ }
+
+};
+
+static
+PCEVENT_ITEM UsbHsMicTopoPropertiesFilterEvent[] =
+{
+ {
+ &KSEVENTSETID_PinCapsChange, // Something changed!
+ KSEVENT_PINCAPS_JACKINFOCHANGE, // The only event-property defined.
+ KSEVENT_TYPE_ENABLE | KSEVENT_TYPE_BASICSUPPORT,
+ PropertyHandler_UsbHsMicTopoFilterEvent
+ }
+};
+
+DEFINE_PCAUTOMATION_TABLE_PROP_EVENT(AutomationUsbHsMicTopoFilterWithEvent,
+ UsbHsMicPropertiesTopoFilter,
+ UsbHsMicTopoPropertiesFilterEvent);
+
+
+//=============================================================================
+static
+PCFILTER_DESCRIPTOR UsbHsMicTopoMiniportFilterDescriptor =
+{
+ 0, // Version
+ &AutomationUsbHsMicTopoFilterWithEvent, // AutomationTable
+ sizeof(PCPIN_DESCRIPTOR), // PinSize
+ SIZEOF_ARRAY(UsbHsMicTopoMiniportPins), // PinCount
+ UsbHsMicTopoMiniportPins, // Pins
+ sizeof(PCNODE_DESCRIPTOR), // NodeSize
+ SIZEOF_ARRAY(UsbHsMicTopologyNodes), // NodeCount
+ UsbHsMicTopologyNodes, // Nodes
+ SIZEOF_ARRAY(UsbHsMicMiniportConnections),// ConnectionCount
+ UsbHsMicMiniportConnections, // Connections
+ 0, // CategoryCount
+ NULL // Categories
+};
+
+#endif // _SYSVAD_USBHSMICTOPTABLE_H_
+
diff --git a/audio/sysvad/EndpointsCommon/usbhsmicwavtable.h b/audio/sysvad/EndpointsCommon/usbhsmicwavtable.h
new file mode 100644
index 00000000..2b456747
--- /dev/null
+++ b/audio/sysvad/EndpointsCommon/usbhsmicwavtable.h
@@ -0,0 +1,483 @@
+/*++
+
+Copyright (c) Microsoft Corporation All Rights Reserved
+
+Module Name:
+
+ usbhsmicwavtable.h
+
+Abstract:
+
+ Declaration of wave miniport tables for the USB Headset Mic (external).
+
+--*/
+
+#ifndef _SYSVAD_USBHSMICWAVTABLE_H_
+#define _SYSVAD_USBHSMICWAVTABLE_H_
+
+//
+// Function prototypes.
+//
+NTSTATUS PropertyHandler_UsbHsWaveFilter(_In_ PPCPROPERTY_REQUEST PropertyRequest);
+
+//
+// USB Headset Mic (external) range.
+//
+#define USBHSMIC_DEVICE_MAX_CHANNELS 1 // Max Channels.
+#define USBHSMIC_MIN_BITS_PER_SAMPLE_PCM 16 // Min Bits Per Sample
+#define USBHSMIC_MAX_BITS_PER_SAMPLE_PCM 24 // Max Bits Per Sample
+#define USBHSMIC_MIN_SAMPLE_RATE 8000 // Min Sample Rate
+#define USBHSMIC_MAX_SAMPLE_RATE 48000 // Max Sample Rate
+
+//
+// Max # of pin instances.
+//
+#define USBHSMIC_MAX_INPUT_STREAMS 4
+
+//=============================================================================
+static
+KSDATAFORMAT_WAVEFORMATEXTENSIBLE UsbHsMicPinSupportedDeviceFormats[] =
+{
+ { // 0
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 1,
+ 8000,
+ 16000,
+ 2,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_MONO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 1
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 1,
+ 11025,
+ 22050,
+ 2,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_MONO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 2
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 1,
+ 16000,
+ 32000,
+ 2,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_MONO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 3
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 1,
+ 22050,
+ 44100,
+ 2,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_MONO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 4
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 1,
+ 24000,
+ 48000,
+ 2,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_MONO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 5
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 1,
+ 32000,
+ 64000,
+ 2,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_MONO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 6
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 1,
+ 44100,
+ 88200,
+ 2,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_MONO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 7
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 1,
+ 48000,
+ 96000,
+ 2,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_MONO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 8
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 1,
+ 48000,
+ 144000,
+ 3,
+ 24,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 24,
+ KSAUDIO_SPEAKER_MONO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ }
+};
+
+//
+// Supported modes (only on streaming pins).
+//
+static
+MODE_AND_DEFAULT_FORMAT UsbHsMicPinSupportedDeviceModes[] =
+{
+ {
+ STATIC_AUDIO_SIGNALPROCESSINGMODE_RAW,
+ &UsbHsMicPinSupportedDeviceFormats[SIZEOF_ARRAY(UsbHsMicPinSupportedDeviceFormats) - 1].DataFormat, // 48KHz
+ },
+ {
+ STATIC_AUDIO_SIGNALPROCESSINGMODE_DEFAULT,
+ &UsbHsMicPinSupportedDeviceFormats[SIZEOF_ARRAY(UsbHsMicPinSupportedDeviceFormats) - 1].DataFormat, // 48KHz
+ },
+ {
+ STATIC_AUDIO_SIGNALPROCESSINGMODE_SPEECH,
+ &UsbHsMicPinSupportedDeviceFormats[2].DataFormat, // 16KHz
+ },
+ {
+ STATIC_AUDIO_SIGNALPROCESSINGMODE_COMMUNICATIONS,
+ &UsbHsMicPinSupportedDeviceFormats[4].DataFormat, // 24KHz
+ }
+};
+
+//
+// The entries here must follow the same order as the filter's pin
+// descriptor array.
+//
+static
+PIN_DEVICE_FORMATS_AND_MODES UsbHsMicPinDeviceFormatsAndModes[] =
+{
+ {
+ BridgePin,
+ NULL,
+ 0,
+ NULL,
+ 0
+ },
+ {
+ SystemCapturePin,
+ UsbHsMicPinSupportedDeviceFormats,
+ SIZEOF_ARRAY(UsbHsMicPinSupportedDeviceFormats),
+ UsbHsMicPinSupportedDeviceModes,
+ SIZEOF_ARRAY(UsbHsMicPinSupportedDeviceModes)
+ }
+};
+
+//=============================================================================
+static
+KSDATARANGE_AUDIO UsbHsMicPinDataRangesStream[] =
+{
+ {
+ {
+ sizeof(KSDATARANGE_AUDIO),
+ KSDATARANGE_ATTRIBUTES, // An attributes list follows this data range
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ USBHSMIC_DEVICE_MAX_CHANNELS,
+ USBHSMIC_MIN_BITS_PER_SAMPLE_PCM,
+ USBHSMIC_MAX_BITS_PER_SAMPLE_PCM,
+ USBHSMIC_MIN_SAMPLE_RATE,
+ USBHSMIC_MAX_SAMPLE_RATE
+ },
+};
+
+static
+PKSDATARANGE UsbHsMicPinDataRangePointersStream[] =
+{
+ PKSDATARANGE(&UsbHsMicPinDataRangesStream[0]),
+ PKSDATARANGE(&PinDataRangeAttributeList)
+};
+
+//=============================================================================
+static
+KSDATARANGE UsbHsMicPinDataRangesBridge[] =
+{
+ {
+ sizeof(KSDATARANGE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_ANALOG),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE)
+ }
+};
+
+static
+PKSDATARANGE UsbHsMicPinDataRangePointersBridge[] =
+{
+ &UsbHsMicPinDataRangesBridge[0]
+};
+
+//=============================================================================
+static
+PCPIN_DESCRIPTOR UsbHsMicWaveMiniportPins[] =
+{
+ // Wave In Bridge Pin (Capture - From Topology) KSPIN_WAVE_BRIDGE
+ {
+ 0,
+ 0,
+ 0,
+ NULL,
+ {
+ 0,
+ NULL,
+ 0,
+ NULL,
+ SIZEOF_ARRAY(UsbHsMicPinDataRangePointersBridge),
+ UsbHsMicPinDataRangePointersBridge,
+ KSPIN_DATAFLOW_IN,
+ KSPIN_COMMUNICATION_NONE,
+ &KSCATEGORY_AUDIO,
+ NULL,
+ 0
+ }
+ },
+
+ // Wave In Streaming Pin (Capture) KSPIN_WAVEIN_HOST
+ {
+ USBHSMIC_MAX_INPUT_STREAMS,
+ USBHSMIC_MAX_INPUT_STREAMS,
+ 0,
+ NULL,
+ {
+ 0,
+ NULL,
+ 0,
+ NULL,
+ SIZEOF_ARRAY(UsbHsMicPinDataRangePointersStream),
+ UsbHsMicPinDataRangePointersStream,
+ KSPIN_DATAFLOW_OUT,
+ KSPIN_COMMUNICATION_SINK,
+ &KSCATEGORY_AUDIO,
+ &KSAUDFNAME_RECORDING_CONTROL,
+ 0
+ }
+ }
+};
+
+//=============================================================================
+static
+PCNODE_DESCRIPTOR UsbHsMicWaveMiniportNodes[] =
+{
+ // KSNODE_WAVE_ADC
+ {
+ 0, // Flags
+ NULL, // AutomationTable
+ &KSNODETYPE_ADC, // Type
+ NULL // Name
+ }
+};
+
+//=============================================================================
+static
+PCCONNECTION_DESCRIPTOR UsbHsMicWaveMiniportConnections[] =
+{
+ { PCFILTER_NODE, KSPIN_WAVE_BRIDGE, KSNODE_WAVE_ADC, 1 },
+ { KSNODE_WAVE_ADC, 0, PCFILTER_NODE, KSPIN_WAVEIN_HOST }
+};
+
+//=============================================================================
+static
+PCPROPERTY_ITEM PropertiesUsbHsMicWaveFilter[] =
+{
+ {
+ &KSPROPSETID_General,
+ KSPROPERTY_GENERAL_COMPONENTID,
+ KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_BASICSUPPORT,
+ PropertyHandler_WaveFilter
+ },
+ {
+ &KSPROPSETID_Pin,
+ KSPROPERTY_PIN_PROPOSEDATAFORMAT,
+ KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_BASICSUPPORT,
+ PropertyHandler_UsbHsWaveFilter
+ },
+ {
+ &KSPROPSETID_Pin,
+ KSPROPERTY_PIN_PROPOSEDATAFORMAT2,
+ KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_BASICSUPPORT,
+ PropertyHandler_UsbHsWaveFilter
+ },
+ {
+ &KSPROPSETID_AudioEffectsDiscovery,
+ KSPROPERTY_AUDIOEFFECTSDISCOVERY_EFFECTSLIST,
+ KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_BASICSUPPORT,
+ PropertyHandler_UsbHsWaveFilter
+ }
+};
+
+DEFINE_PCAUTOMATION_TABLE_PROP(AutomationUsbHsMicWaveFilter, PropertiesUsbHsMicWaveFilter);
+
+//=============================================================================
+static
+PCFILTER_DESCRIPTOR UsbHsMicWaveMiniportFilterDescriptor =
+{
+ 0, // Version
+ &AutomationUsbHsMicWaveFilter, // AutomationTable
+ sizeof(PCPIN_DESCRIPTOR), // PinSize
+ SIZEOF_ARRAY(UsbHsMicWaveMiniportPins), // PinCount
+ UsbHsMicWaveMiniportPins, // Pins
+ sizeof(PCNODE_DESCRIPTOR), // NodeSize
+ SIZEOF_ARRAY(UsbHsMicWaveMiniportNodes), // NodeCount
+ UsbHsMicWaveMiniportNodes, // Nodes
+ SIZEOF_ARRAY(UsbHsMicWaveMiniportConnections), // ConnectionCount
+ UsbHsMicWaveMiniportConnections, // Connections
+ 0, // CategoryCount
+ NULL // Categories - use defaults (audio, render, capture)
+};
+
+#endif // _SYSVAD_USBHSMICWAVTABLE_H_
diff --git a/audio/sysvad/EndpointsCommon/usbhsminipairs.h b/audio/sysvad/EndpointsCommon/usbhsminipairs.h
new file mode 100644
index 00000000..0b71bce9
--- /dev/null
+++ b/audio/sysvad/EndpointsCommon/usbhsminipairs.h
@@ -0,0 +1,204 @@
+/*++
+
+Copyright (c) Microsoft Corporation All Rights Reserved
+
+Module Name:
+
+ usbhsminipairs.h
+
+Abstract:
+
+ USB Sideband Audio endpoint filter definitions.
+
+--*/
+
+#ifndef _SYSVAD_USBHSMINIPAIRS_H_
+#define _SYSVAD_USBHSMINIPAIRS_H_
+
+#include "usbhsspeakertopo.h"
+#include "usbhsspeakertoptable.h"
+#include "usbhsspeakerwavtable.h"
+
+#include "usbhsmictopo.h"
+#include "usbhsmictoptable.h"
+#include "usbhsmicwavtable.h"
+
+NTSTATUS
+CreateMiniportWaveRTSYSVAD
+(
+ _Out_ PUNKNOWN *,
+ _In_ REFCLSID,
+ _In_opt_ PUNKNOWN,
+ _In_ POOL_TYPE,
+ _In_ PUNKNOWN,
+ _In_opt_ PVOID,
+ _In_ PENDPOINT_MINIPAIR
+);
+
+NTSTATUS
+CreateMiniportTopologySYSVAD
+(
+ _Out_ PUNKNOWN *,
+ _In_ REFCLSID,
+ _In_opt_ PUNKNOWN,
+ _In_ POOL_TYPE,
+ _In_ PUNKNOWN,
+ _In_opt_ PVOID,
+ _In_ PENDPOINT_MINIPAIR
+);
+
+/*
+* USB Headset speaker miniports.
+*
+**********************************************************************************************
+* Topology/Wave bridge connection for USB Headset Speaker *
+* *
+* +---------------------------------+ +-------+ *
+* | Wave | | Topo | *
+* | | | | *
+* | +---------------------+ | | | *
+* | | | | | | *
+* System --->|0-----|1 HW Audio Engine 3|---2|---> Loopback | | *
+* | | Node | | | | *
+* Offload --->|1-----|2 0|---3|===============>|0---->1|---> Line Out *
+* | +---------------------+ | | | *
+* | | | | *
+* +---------------------------------+ +-------+ *
+* *
+**********************************************************************************************/
+
+static
+PHYSICALCONNECTIONTABLE UsbHsSpeakerTopologyPhysicalConnections[] =
+{
+ {
+ KSPIN_TOPO_WAVEOUT_SOURCE, // TopologyIn
+ KSPIN_WAVE_RENDER_SOURCE, // WaveOut
+ CONNECTIONTYPE_WAVE_OUTPUT
+ }
+};
+
+// A subdevice is created for each HFP device using the reference string in the form of:
+// <Base_Reference_String>-<Hashcode>
+// where Base_Reference_String is one of the following template names
+#define USBHS_SPEAKER_TOPO_NAME L"TopologyUsbHsSpeaker"
+#define USBHS_SPEAKER_WAVE_NAME L"WaveUsbHsSpeaker"
+#define USBHS_MIC_TOPO_NAME L"TopologyUsbHsMic"
+#define USBHS_MIC_WAVE_NAME L"WaveUsbHsMic"
+// And Hashcode is 8-character long hexadecimal value
+
+// A reference string max length is being set to a value to accommodate them both
+#define USBHS_INTERFACE_REFSTRING_MAX_LENGTH 100
+
+static
+ENDPOINT_MINIPAIR UsbHsSpeakerMiniports =
+{
+ eUsbHsSpeakerDevice,
+ NULL, // Will be generated based on BTHHFP_SPEAKER_TOPO_NAME and made unique for each side band interface
+ USBHS_SPEAKER_TOPO_NAME, // template name matches with KSNAME_TopologyBthHfpSpeaker in the inf's [Strings] section
+ CreateMiniportTopologySYSVAD,
+ &UsbHsSpeakerTopoMiniportFilterDescriptor,
+ 0, NULL, // Interface properties
+ NULL, // Will be generated based on BTHHFP_SPEAKER_WAVE_NAME and made unique for each side band interface
+ USBHS_SPEAKER_WAVE_NAME, // template name matches with KSNAME_WaveBthHfpSpeaker in the inf's [Strings] section
+ CreateMiniportWaveRTSYSVAD,
+ &UsbHsSpeakerWaveMiniportFilterDescriptor,
+ 0, NULL, // Interface properties
+ 1,
+ UsbHsSpeakerPinDeviceFormatsAndModes,
+ SIZEOF_ARRAY(UsbHsSpeakerPinDeviceFormatsAndModes),
+ UsbHsSpeakerTopologyPhysicalConnections,
+ SIZEOF_ARRAY(UsbHsSpeakerTopologyPhysicalConnections),
+ ENDPOINT_OFFLOAD_SUPPORTED
+};
+
+
+/*
+* Headset Microphone miniports.
+*
+*
+************************************************************************************************************************************************
+* Topology/Wave bridge connection for USB Headset Microphone *
+* +---------------------------------+ +---------------------------------------------------------+ *
+* | +-------------+ | | +-------------+ +-------+ +--------+ | *
+* Capture <---|1<-------|0 ADC 1|<-------0|<===============|1<----| peak meter |<----| mute |<----| volume |<---- 0|<---- Mic in *
+* | +-------------+ | | +-------------+ +-------+ +--------+ | *
+* +---------------------------------+ +---------------------------------------------------------+ *
+* *
+************************************************************************************************************************************************/
+static
+PHYSICALCONNECTIONTABLE UsbHsMicTopologyPhysicalConnections[] =
+{
+ {
+ KSPIN_TOPO_BRIDGE, // TopologyOut
+ KSPIN_WAVE_BRIDGE, // WaveIn
+ CONNECTIONTYPE_TOPOLOGY_OUTPUT
+ }
+};
+
+static
+ENDPOINT_MINIPAIR UsbHsMicMiniports =
+{
+ eUsbHsMicDevice,
+ NULL, // Will be generated based on BTHHFP_MIC_TOPO_NAME and made unique for each side band interface
+ USBHS_MIC_TOPO_NAME, // template name matches with KSNAME_TopologyBthHfpMic in the inf's [Strings] section
+ CreateMiniportTopologySYSVAD,
+ &UsbHsMicTopoMiniportFilterDescriptor,
+ 0, NULL, // Interface properties
+ NULL, // Will be generated based on BTHHFP_SPEAKER_WAVE_NAME and made unique for each side band interface
+ USBHS_MIC_WAVE_NAME, // template name matches with KSNAME_WaveBthHfpMic in the inf's [Strings] section
+ CreateMiniportWaveRTSYSVAD,
+ &UsbHsMicWaveMiniportFilterDescriptor,
+ 0, NULL, // Interface properties
+ 1,
+ UsbHsMicPinDeviceFormatsAndModes,
+ SIZEOF_ARRAY(UsbHsMicPinDeviceFormatsAndModes),
+ UsbHsMicTopologyPhysicalConnections,
+ SIZEOF_ARRAY(UsbHsMicTopologyPhysicalConnections),
+ ENDPOINT_NO_FLAGS
+};
+
+//=============================================================================
+//
+// Render miniport pairs.
+//
+static
+PENDPOINT_MINIPAIR g_UsbHsRenderEndpoints[] =
+{
+ &UsbHsSpeakerMiniports
+};
+
+#define g_cUsbHsRenderEndpoints (SIZEOF_ARRAY(g_UsbHsRenderEndpoints))
+
+// If the count of Render endpoints changes, update formula below
+C_ASSERT(g_cUsbHsRenderEndpoints == 1);
+
+//=============================================================================
+//
+// Capture miniport pairs.
+//
+static
+PENDPOINT_MINIPAIR g_UsbHsCaptureEndpoints[] =
+{
+ &UsbHsMicMiniports
+};
+
+#define g_cUsbHsCaptureEndpoints (SIZEOF_ARRAY(g_UsbHsCaptureEndpoints))
+
+// If the count of Capture endpoints changes, update formula below
+C_ASSERT(g_cUsbHsCaptureEndpoints == 1);
+
+//=============================================================================
+//
+// Total miniports = # endpoints * 2 (topology + wave)
+//
+//
+// Allow 5 USB Headset Endpoints.
+//
+#define MAX_USBHS_DEVICES (5)
+#define g_MaxUsbHsMiniports ((g_cUsbHsRenderEndpoints + g_cUsbHsCaptureEndpoints) * 2 * MAX_USBHS_DEVICES)
+
+// g_MaxUsbHsMiniports is used when calculating the MaxObjects inside AddDevice.
+C_ASSERT(g_MaxUsbHsMiniports == 20);
+
+#endif // _SYSVAD_USBHSMINIPAIRS_H_
+
diff --git a/audio/sysvad/EndpointsCommon/usbhsminwavert.cpp b/audio/sysvad/EndpointsCommon/usbhsminwavert.cpp
new file mode 100644
index 00000000..a1fa3f15
--- /dev/null
+++ b/audio/sysvad/EndpointsCommon/usbhsminwavert.cpp
@@ -0,0 +1,211 @@
+/*++
+
+Copyright (c) Microsoft Corporation All Rights Reserved
+
+Module Name:
+
+ usbhsminwavert.cpp
+
+Abstract:
+
+ Implementation of wavert miniport.
+
+--*/
+#ifdef SYSVAD_USB_SIDEBAND
+
+#pragma warning (disable : 4127)
+
+#include <sysvad.h>
+#include <limits.h>
+#include "simple.h"
+#include "minwavert.h"
+#include "minwavertstream.h"
+#include "IHVPrivatePropertySet.h"
+
+
+//=============================================================================
+#pragma code_seg("PAGE")
+NTSTATUS
+CMiniportWaveRT::PropertyHandler_UsbHsAudioEffectsDiscoveryEffectsList
+(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest
+)
+/*++
+
+Routine Description:
+
+ Handles ( KSPROPSETID_AudioEffectsDiscovery, KSPROPERTY_AUDIOEFFECTSDISCOVERY_EFFECTSLIST )
+
+Arguments:
+
+ PropertyRequest -
+
+Return Value:
+
+ NT status code.
+
+--*/
+{
+ PAGED_CODE();
+
+ DPF_ENTER(("[PropertyHandler_UsbHsAudioEffectsDiscoveryEffectsList]"));
+
+ NTSTATUS ntStatus = STATUS_INVALID_PARAMETER;
+ ULONG nPinId = (ULONG)-1;
+
+ //
+ // Validate Pin ID.
+ //
+ if (PropertyRequest->InstanceSize >= sizeof(ULONG))
+ {
+ nPinId = *(PULONG(PropertyRequest->Instance));
+
+ // This prop is valid only on streaming pins.
+ if (IsSystemRenderPin(nPinId) || IsSystemCapturePin(nPinId))
+ {
+ ntStatus = STATUS_SUCCESS;
+ }
+ else if (IsBridgePin(nPinId) ||
+ IsLoopbackPin(nPinId) ||
+ IsOffloadPin(nPinId))
+ {
+ ntStatus = STATUS_NOT_SUPPORTED;
+ }
+ }
+
+ IF_FAILED_JUMP(ntStatus, Done);
+
+ //
+ // Valid actions: get and basicsupport.
+ //
+ ntStatus = STATUS_INVALID_PARAMETER;
+
+ if (PropertyRequest->Verb & KSPROPERTY_TYPE_BASICSUPPORT)
+ {
+ ntStatus =
+ PropertyHandler_BasicSupport
+ (
+ PropertyRequest,
+ KSPROPERTY_TYPE_BASICSUPPORT | KSPROPERTY_TYPE_GET,
+ VT_ILLEGAL
+ );
+ }
+ else if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET)
+ {
+ ASSERT(m_pSidebandDevice != NULL);
+
+
+ // If it is render pin (data flow in),
+ // return size 0 effect list
+ if (IsSystemRenderPin(nPinId))
+ {
+ PropertyRequest->ValueSize = 0;
+ ntStatus = STATUS_SUCCESS;
+ }
+ else
+ {
+ // Compute total size, two effects: NS and EC (see below).
+ ULONG cbMinSize = sizeof(GUID) * 2;
+
+ if (PropertyRequest->ValueSize == 0)
+ {
+ PropertyRequest->ValueSize = cbMinSize;
+ ntStatus = STATUS_BUFFER_OVERFLOW;
+ }
+ else if (PropertyRequest->ValueSize < cbMinSize)
+ {
+ ntStatus = STATUS_BUFFER_TOO_SMALL;
+ }
+ else
+ {
+ PGUID effectList = PGUID(PropertyRequest->Value);
+
+ *effectList = AUDIO_EFFECT_TYPE_ACOUSTIC_ECHO_CANCELLATION;
+ *(effectList + 1) = AUDIO_EFFECT_TYPE_NOISE_SUPPRESSION;
+
+ PropertyRequest->ValueSize = cbMinSize;
+ ntStatus = STATUS_SUCCESS;
+ }
+ }
+ }
+
+Done:
+
+ return ntStatus;
+}
+
+//=============================================================================
+#pragma code_seg("PAGE")
+NTSTATUS
+PropertyHandler_UsbHsWaveFilter
+(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest
+)
+/*++
+
+Routine Description:
+
+ Redirects general property request to miniport object
+
+Arguments:
+
+ PropertyRequest -
+
+Return Value:
+
+ NT status code.
+
+--*/
+{
+ PAGED_CODE();
+
+ NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST;
+ CMiniportWaveRT* waveRt = reinterpret_cast<CMiniportWaveRT*>(PropertyRequest->MajorTarget);
+
+ if (waveRt == NULL)
+ {
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ waveRt->AddRef();
+
+ if (IsEqualGUIDAligned(*PropertyRequest->PropertyItem->Set, KSPROPSETID_Pin))
+ {
+ switch (PropertyRequest->PropertyItem->Id)
+ {
+ case KSPROPERTY_PIN_PROPOSEDATAFORMAT:
+ ntStatus = waveRt->PropertyHandlerProposedFormat(PropertyRequest);
+ break;
+
+ case KSPROPERTY_PIN_PROPOSEDATAFORMAT2:
+ ntStatus = waveRt->PropertyHandlerProposedFormat2(PropertyRequest);
+ break;
+
+ default:
+ DPF(D_TERSE, ("[PropertyHandler_UsbHsWaveFilter: Invalid Device Request]"));
+ }
+ }
+ else if (IsEqualGUIDAligned(*PropertyRequest->PropertyItem->Set, KSPROPSETID_AudioEffectsDiscovery))
+ {
+ switch(PropertyRequest->PropertyItem->Id)
+ {
+ case KSPROPERTY_AUDIOEFFECTSDISCOVERY_EFFECTSLIST:
+ ntStatus = waveRt->PropertyHandler_UsbHsAudioEffectsDiscoveryEffectsList(PropertyRequest);
+ break;
+
+ default:
+ DPF(D_TERSE, ("[PropertyHandler_UsbHsWaveFilter: Invalid Device Request]"));
+ }
+ }
+
+ waveRt->Release();
+
+ return ntStatus;
+} // PropertyHandler_UsbHsWaveFilter
+
+#pragma code_seg("PAGE")
+#endif // SYSVAD_USB_SIDEBAND
+
+
+
+
diff --git a/audio/sysvad/EndpointsCommon/usbhsspeakertopo.cpp b/audio/sysvad/EndpointsCommon/usbhsspeakertopo.cpp
new file mode 100644
index 00000000..21d5fa8c
--- /dev/null
+++ b/audio/sysvad/EndpointsCommon/usbhsspeakertopo.cpp
@@ -0,0 +1,113 @@
+/*++
+
+Copyright (c) Microsoft Corporation All Rights Reserved
+
+Module Name:
+
+ usbhsspeakertopo.cpp
+
+Abstract:
+
+ Implementation of topology miniport for the USB Headset speaker (external).
+
+--*/
+#ifdef SYSVAD_USB_SIDEBAND
+
+#pragma warning (disable : 4127)
+
+#include <sysvad.h>
+#include "simple.h"
+#include "mintopo.h"
+#include "usbhstopo.h"
+#include "usbhsspeakertopo.h"
+#include "usbhsspeakertoptable.h"
+
+//=============================================================================
+#pragma code_seg("PAGE")
+NTSTATUS
+PropertyHandler_UsbHsSpeakerTopoFilter
+(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest
+)
+/*++
+
+Routine Description:
+
+ Redirects property request to miniport object
+
+Arguments:
+
+ PropertyRequest -
+
+Return Value:
+
+ NT status code.
+
+--*/
+{
+ PAGED_CODE();
+
+ ASSERT(PropertyRequest);
+
+ DPF_ENTER(("[PropertyHandler_UsbHsSpeakerTopoFilter]"));
+
+ // PropertryRequest structure is filled by portcls.
+ // MajorTarget is a pointer to miniport object for miniports.
+ //
+ NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST;
+
+ //
+ // This line shows how to get a pointer to the miniport topology object.
+ //
+ PCMiniportTopology pMiniport = (PCMiniportTopology)PropertyRequest->MajorTarget;
+ UNREFERENCED_VAR(pMiniport);
+
+ if (IsEqualGUIDAligned(*PropertyRequest->PropertyItem->Set, KSPROPSETID_Jack))
+ {
+ switch(PropertyRequest->PropertyItem->Id)
+ {
+ case KSPROPERTY_JACK_DESCRIPTION:
+ ntStatus = PropertyHandler_UsbHsJackDescription(
+ PropertyRequest,
+ ARRAYSIZE(UsbHsSpeakerJackDescriptions),
+ UsbHsSpeakerJackDescriptions);
+ break;
+
+ case KSPROPERTY_JACK_DESCRIPTION2:
+ ntStatus = PropertyHandler_UsbHsJackDescription2(
+ PropertyRequest,
+ ARRAYSIZE(UsbHsSpeakerJackDescriptions),
+ UsbHsSpeakerJackDescriptions);
+ break;
+
+ case KSPROPERTY_JACK_CONTAINERID:
+ ntStatus = PropertyHandler_UsbHsJackContainerId(
+ PropertyRequest,
+ ARRAYSIZE(UsbHsSpeakerJackDescriptions),
+ UsbHsSpeakerJackDescriptions);
+ break;
+ }
+ }
+
+ return ntStatus;
+} // PropertyHandler_UsbHsSpeakerTopoFilter
+
+//=============================================================================
+#pragma code_seg()
+NTSTATUS
+PropertyHandler_UsbHsSpeakerTopoFilterEvent
+(
+ _In_ PPCEVENT_REQUEST EventRequest
+)
+{
+ ASSERT(EventRequest);
+
+ DPF_ENTER(("[PropertyHandler_UsbHsSpeakerTopoFilterEvent]"));
+
+ return PropertyHandler_UsbHsTopoNodeEvent(EventRequest);
+}
+
+#pragma code_seg()
+#endif // SYSVAD_USB_SIDEBAND
+
+
diff --git a/audio/sysvad/EndpointsCommon/usbhsspeakertopo.h b/audio/sysvad/EndpointsCommon/usbhsspeakertopo.h
new file mode 100644
index 00000000..4e87253a
--- /dev/null
+++ b/audio/sysvad/EndpointsCommon/usbhsspeakertopo.h
@@ -0,0 +1,30 @@
+/*++
+
+Copyright (c) Microsoft Corporation All Rights Reserved
+
+Module Name:
+
+ usbhsspeakertopo.h
+
+Abstract:
+
+ Declaration of topology miniport for the USB Headset speaker (external).
+
+--*/
+
+#ifndef _SYSVAD_USBHSSPEAKERTOPO_H_
+#define _SYSVAD_USBHSSPEAKERTOPO_H_
+
+// Function declarations.
+NTSTATUS
+PropertyHandler_UsbHsSpeakerTopoFilter(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest
+ );
+
+NTSTATUS
+PropertyHandler_UsbHsSpeakerTopoFilterEvent(
+ _In_ PPCEVENT_REQUEST EventRequest
+ );
+
+#endif // _SYSVAD_USBHSSPEAKERTOPO_H_
+
diff --git a/audio/sysvad/EndpointsCommon/usbhsspeakertoptable.h b/audio/sysvad/EndpointsCommon/usbhsspeakertoptable.h
new file mode 100644
index 00000000..2f79024f
--- /dev/null
+++ b/audio/sysvad/EndpointsCommon/usbhsspeakertoptable.h
@@ -0,0 +1,176 @@
+/*++
+
+Copyright (c) Microsoft Corporation All Rights Reserved
+
+Module Name:
+
+ usbhsspeakertoptable.h
+
+Abstract:
+
+ Declaration of topology tables for the USB Headset speaker (external).
+
+--*/
+
+#ifndef _SYSVAD_USBHSSPEAKERTOPTABLE_H_
+#define _SYSVAD_USBHSSPEAKERTOPTABLE_H_
+
+#include "usbhsspeakertopo.h"
+
+//=============================================================================
+static
+KSDATARANGE UsbHsSpeakerTopoPinDataRangesBridge[] =
+{
+ {
+ sizeof(KSDATARANGE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_ANALOG),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE)
+ }
+};
+
+//=============================================================================
+static
+PKSDATARANGE UsbHsSpeakerTopoPinDataRangePointersBridge[] =
+{
+ &UsbHsSpeakerTopoPinDataRangesBridge[0]
+};
+
+//=============================================================================
+static
+PCPIN_DESCRIPTOR UsbHsSpeakerTopoMiniportPins[] =
+{
+ // KSPIN_TOPO_WAVEOUT_SOURCE
+ {
+ 0,
+ 0,
+ 0, // InstanceCount
+ NULL, // AutomationTable
+ { // KsPinDescriptor
+ 0, // InterfacesCount
+ NULL, // Interfaces
+ 0, // MediumsCount
+ NULL, // Mediums
+ SIZEOF_ARRAY(UsbHsSpeakerTopoPinDataRangePointersBridge),// DataRangesCount
+ UsbHsSpeakerTopoPinDataRangePointersBridge, // DataRanges
+ KSPIN_DATAFLOW_IN, // DataFlow
+ KSPIN_COMMUNICATION_NONE, // Communication
+ &KSCATEGORY_AUDIO, // Category
+ NULL, // Name
+ 0 // Reserved
+ }
+ },
+ // KSPIN_TOPO_LINEOUT_DEST
+ {
+ 0,
+ 0,
+ 0, // InstanceCount
+ NULL, // AutomationTable
+ { // KsPinDescriptor
+ 0, // InterfacesCount
+ NULL, // Interfaces
+ 0, // MediumsCount
+ NULL, // Mediums
+ SIZEOF_ARRAY(UsbHsSpeakerTopoPinDataRangePointersBridge),// DataRangesCount
+ UsbHsSpeakerTopoPinDataRangePointersBridge, // DataRanges
+ KSPIN_DATAFLOW_OUT, // DataFlow
+ KSPIN_COMMUNICATION_NONE, // Communication
+ &KSNODETYPE_HEADSET_SPEAKERS, // Category
+ NULL, // Name
+ 0 // Reserved
+ }
+ }
+};
+
+//=============================================================================
+static
+KSJACK_DESCRIPTION UsbHsSpeakerJackDesc =
+{
+ KSAUDIO_SPEAKER_STEREO,
+ 0, // color
+ eConnTypeOtherDigital,
+ eGeoLocBottom,
+ eGenLocPrimaryBox,
+ ePortConnJack,
+ FALSE // run-time code sets this value.
+};
+
+// Only return a KSJACK_DESCRIPTION for the physical bridge pin.
+static
+PKSJACK_DESCRIPTION UsbHsSpeakerJackDescriptions[] =
+{
+ NULL,
+ &UsbHsSpeakerJackDesc
+};
+
+//=============================================================================
+static
+PCCONNECTION_DESCRIPTOR UsbHsSpeakerTopoMiniportConnections[] =
+{
+ // FromNode, FromPin, ToNode, ToPin
+ { PCFILTER_NODE, KSPIN_TOPO_WAVEOUT_SOURCE, PCFILTER_NODE, KSPIN_TOPO_LINEOUT_DEST }
+};
+
+//=============================================================================
+static
+PCPROPERTY_ITEM UsbHsSpeakerPropertiesTopoFilter[] =
+{
+ {
+ &KSPROPSETID_Jack,
+ KSPROPERTY_JACK_DESCRIPTION,
+ KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_BASICSUPPORT,
+ PropertyHandler_UsbHsSpeakerTopoFilter
+ },
+ {
+ &KSPROPSETID_Jack,
+ KSPROPERTY_JACK_DESCRIPTION2,
+ KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_BASICSUPPORT,
+ PropertyHandler_UsbHsSpeakerTopoFilter
+ },
+ {
+ &KSPROPSETID_Jack,
+ KSPROPERTY_JACK_CONTAINERID,
+ KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_BASICSUPPORT,
+ PropertyHandler_UsbHsSpeakerTopoFilter
+ }
+};
+
+static
+PCEVENT_ITEM UsbHsSpeakerPropertiesTopoFilterEvent[] =
+{
+ {
+ &KSEVENTSETID_PinCapsChange, // Something changed!
+ KSEVENT_PINCAPS_JACKINFOCHANGE, // The only event-property defined.
+ KSEVENT_TYPE_ENABLE | KSEVENT_TYPE_BASICSUPPORT,
+ PropertyHandler_UsbHsSpeakerTopoFilterEvent
+ }
+};
+
+DEFINE_PCAUTOMATION_TABLE_PROP_EVENT(AutomationUsbHsSpeakerTopoFilterWithEvent,
+ UsbHsSpeakerPropertiesTopoFilter,
+ UsbHsSpeakerPropertiesTopoFilterEvent);
+
+//=============================================================================
+static
+PCFILTER_DESCRIPTOR UsbHsSpeakerTopoMiniportFilterDescriptor =
+{
+ 0, // Version
+ &AutomationUsbHsSpeakerTopoFilterWithEvent, // AutomationTable
+ sizeof(PCPIN_DESCRIPTOR), // PinSize
+ SIZEOF_ARRAY(UsbHsSpeakerTopoMiniportPins), // PinCount
+ UsbHsSpeakerTopoMiniportPins, // Pins
+ sizeof(PCNODE_DESCRIPTOR), // NodeSize
+ 0, // NodeCount
+ NULL, // Nodes
+ SIZEOF_ARRAY(UsbHsSpeakerTopoMiniportConnections), // ConnectionCount
+ UsbHsSpeakerTopoMiniportConnections, // Connections
+ 0, // CategoryCount
+ NULL // Categories
+};
+
+#endif // _SYSVAD_USBHSSPEAKERTOPTABLE_H_
+
+
diff --git a/audio/sysvad/EndpointsCommon/usbhsspeakerwavtable.h b/audio/sysvad/EndpointsCommon/usbhsspeakerwavtable.h
new file mode 100644
index 00000000..619dd325
--- /dev/null
+++ b/audio/sysvad/EndpointsCommon/usbhsspeakerwavtable.h
@@ -0,0 +1,815 @@
+/*++
+
+Copyright (c) Microsoft Corporation All Rights Reserved
+
+Module Name:
+
+ usbhsspeakerwavtable.h
+
+Abstract:
+
+ Declaration of wave miniport tables for the USB Headset speaker (external).
+
+--*/
+
+#ifndef _SYSVAD_USBHSSPEAKERWAVTABLE_H_
+#define _SYSVAD_USBHSSPEAKERWAVTABLE_H_
+
+//
+// Function prototypes.
+//
+NTSTATUS PropertyHandler_UsbHsWaveFilter(_In_ PPCPROPERTY_REQUEST PropertyRequest);
+
+
+
+#define USBHSSPEAKER_DEVICE_MAX_CHANNELS 2 // Max Channels.
+
+#define USBHSSPEAKER_HOST_MAX_CHANNELS 2 // Max Channels.
+#define USBHSSPEAKER_HOST_MIN_BITS_PER_SAMPLE 16 // Min Bits Per Sample
+#define USBHSSPEAKER_HOST_MAX_BITS_PER_SAMPLE 24 // Max Bits Per Sample
+#define USBHSSPEAKER_HOST_MIN_SAMPLE_RATE 24000 // Min Sample Rate
+#define USBHSSPEAKER_HOST_MAX_SAMPLE_RATE 96000 // Max Sample Rate
+
+#define USBHSSPEAKER_OFFLOAD_MAX_CHANNELS 2 // Max Channels.
+#define USBHSSPEAKER_OFFLOAD_MIN_BITS_PER_SAMPLE 16 // Min Bits Per Sample
+#define USBHSSPEAKER_OFFLOAD_MAX_BITS_PER_SAMPLE 16 // Max Bits Per Sample
+#define USBHSSPEAKER_OFFLOAD_MIN_SAMPLE_RATE 44100 // Min Sample Rate
+#define USBHSSPEAKER_OFFLOAD_MAX_SAMPLE_RATE 48000 // Max Sample Rate
+
+#define USBHSSPEAKER_LOOPBACK_MAX_CHANNELS USBHSSPEAKER_HOST_MAX_CHANNELS // Must be equal to host pin's Max Channels.
+#define USBHSSPEAKER_LOOPBACK_MIN_BITS_PER_SAMPLE USBHSSPEAKER_HOST_MIN_BITS_PER_SAMPLE // Must be equal to host pin's Min Bits Per Sample
+#define USBHSSPEAKER_LOOPBACK_MAX_BITS_PER_SAMPLE USBHSSPEAKER_HOST_MAX_BITS_PER_SAMPLE // Must be equal to host pin's Max Bits Per Sample
+#define USBHSSPEAKER_LOOPBACK_MIN_SAMPLE_RATE USBHSSPEAKER_HOST_MIN_SAMPLE_RATE // Must be equal to host pin's Min Sample Rate
+#define USBHSSPEAKER_LOOPBACK_MAX_SAMPLE_RATE USBHSSPEAKER_HOST_MAX_SAMPLE_RATE // Must be equal to host pin's Max Sample Rate
+
+#define USBHSSPEAKER_DOLBY_DIGITAL_MAX_CHANNELS 2 // Max Channels.
+#define USBHSSPEAKER_DOLBY_DIGITAL_MIN_BITS_PER_SAMPLE 16 // Min Bits Per Sample
+#define USBHSSPEAKER_DOLBY_DIGITAL_MAX_BITS_PER_SAMPLE 16 // Max Bits Per Sample
+#define USBHSSPEAKER_DOLBY_DIGITAL_MIN_SAMPLE_RATE 44100 // Min Sample Rate
+#define USBHSSPEAKER_DOLBY_DIGITAL_MAX_SAMPLE_RATE 44100 // Max Sample Rate
+
+//
+// Max # of pin instances.
+//
+#define USBHSSPEAKER_MAX_INPUT_SYSTEM_STREAMS 6
+#define USBHSSPEAKER_MAX_INPUT_OFFLOAD_STREAMS MAX_INPUT_OFFLOAD_STREAMS
+#define USBHSSPEAKER_MAX_OUTPUT_LOOPBACK_STREAMS MAX_OUTPUT_LOOPBACK_STREAMS
+
+//=============================================================================
+static
+KSDATAFORMAT_WAVEFORMATEXTENSIBLE UsbHsSpeakerAudioEngineSupportedDeviceFormats[] =
+{
+ { // 0
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 2,
+ 44100,
+ 176400,
+ 4,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_STEREO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 1
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 2,
+ 24000,
+ 96000,
+ 4,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_STEREO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 2
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 2,
+ 48000,
+ 192000,
+ 4,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_STEREO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 3
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 2,
+ 48000,
+ 288000,
+ 6,
+ 24,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 24,
+ KSAUDIO_SPEAKER_STEREO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 4
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 2,
+ 88200,
+ 352800,
+ 4,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_STEREO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 5
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 2,
+ 96000,
+ 384000,
+ 4,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_STEREO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ }
+};
+
+static
+KSDATAFORMAT_WAVEFORMATEXTENSIBLE UsbHsSpeakerHostPinSupportedDeviceFormats[] =
+{
+ { // 0
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 2,
+ 24000,
+ 96000,
+ 4,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_STEREO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 1
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 2,
+ 32000,
+ 128000,
+ 4,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_STEREO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 2
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 2,
+ 44100,
+ 176400,
+ 4,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_STEREO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 3
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 2,
+ 48000,
+ 192000,
+ 4,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_STEREO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 4
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 2,
+ 48000,
+ 288000,
+ 6,
+ 24,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 24,
+ KSAUDIO_SPEAKER_STEREO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 5
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 2,
+ 88200,
+ 352800,
+ 4,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_STEREO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 6
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 2,
+ 96000,
+ 384000,
+ 4,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_STEREO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ }
+};
+
+static
+KSDATAFORMAT_WAVEFORMATEXTENSIBLE UsbHsSpeakerOffloadPinSupportedDeviceFormats[] =
+{
+ { // 0
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 2,
+ 44100,
+ 176400,
+ 4,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_STEREO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ },
+ { // 1
+ {
+ sizeof(KSDATAFORMAT_WAVEFORMATEXTENSIBLE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ {
+ {
+ WAVE_FORMAT_EXTENSIBLE,
+ 2,
+ 48000,
+ 192000,
+ 4,
+ 16,
+ sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)
+ },
+ 16,
+ KSAUDIO_SPEAKER_STEREO,
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM)
+ }
+ }
+};
+
+//
+// Supported modes (only on streaming pins).
+//
+static
+MODE_AND_DEFAULT_FORMAT UsbHsSpeakerHostPinSupportedDeviceModes[] =
+{
+ {
+ STATIC_AUDIO_SIGNALPROCESSINGMODE_RAW,
+ &UsbHsSpeakerHostPinSupportedDeviceFormats[3].DataFormat // 48KHz
+ },
+ {
+ STATIC_AUDIO_SIGNALPROCESSINGMODE_DEFAULT,
+ &UsbHsSpeakerHostPinSupportedDeviceFormats[4].DataFormat // 48KHz
+ },
+ {
+ STATIC_AUDIO_SIGNALPROCESSINGMODE_MEDIA,
+ &UsbHsSpeakerHostPinSupportedDeviceFormats[3].DataFormat // 48KHz
+ },
+ {
+ STATIC_AUDIO_SIGNALPROCESSINGMODE_MOVIE,
+ &UsbHsSpeakerHostPinSupportedDeviceFormats[3].DataFormat // 48KHz
+ },
+ {
+ STATIC_AUDIO_SIGNALPROCESSINGMODE_COMMUNICATIONS,
+ &UsbHsSpeakerHostPinSupportedDeviceFormats[0].DataFormat // 24KHz
+ },
+ {
+ STATIC_AUDIO_SIGNALPROCESSINGMODE_NOTIFICATION,
+ &UsbHsSpeakerHostPinSupportedDeviceFormats[3].DataFormat // 48KHz
+ }
+};
+
+static
+MODE_AND_DEFAULT_FORMAT UsbHsSpeakerOffloadPinSupportedDeviceModes[] =
+{
+ {
+ STATIC_AUDIO_SIGNALPROCESSINGMODE_DEFAULT,
+ &UsbHsSpeakerOffloadPinSupportedDeviceFormats[1].DataFormat // 48KHz
+ },
+ {
+ STATIC_AUDIO_SIGNALPROCESSINGMODE_MEDIA,
+ &UsbHsSpeakerOffloadPinSupportedDeviceFormats[1].DataFormat // 48KHz
+ }
+};
+
+//
+// The entries here must follow the same order as the filter's pin
+// descriptor array.
+//
+static
+PIN_DEVICE_FORMATS_AND_MODES UsbHsSpeakerPinDeviceFormatsAndModes[] =
+{
+ {
+ SystemRenderPin,
+ UsbHsSpeakerHostPinSupportedDeviceFormats,
+ SIZEOF_ARRAY(UsbHsSpeakerHostPinSupportedDeviceFormats),
+ UsbHsSpeakerHostPinSupportedDeviceModes,
+ SIZEOF_ARRAY(UsbHsSpeakerHostPinSupportedDeviceModes)
+ },
+ {
+ OffloadRenderPin,
+ UsbHsSpeakerOffloadPinSupportedDeviceFormats,
+ SIZEOF_ARRAY(UsbHsSpeakerOffloadPinSupportedDeviceFormats),
+ UsbHsSpeakerOffloadPinSupportedDeviceModes,
+ SIZEOF_ARRAY(UsbHsSpeakerOffloadPinSupportedDeviceModes),
+ },
+ {
+ RenderLoopbackPin,
+ UsbHsSpeakerHostPinSupportedDeviceFormats, // Must support all the formats supported by host pin
+ SIZEOF_ARRAY(UsbHsSpeakerHostPinSupportedDeviceFormats),
+ NULL, // loopback doesn't support modes.
+ 0
+ },
+ {
+ BridgePin,
+ NULL,
+ 0,
+ NULL,
+ 0
+ },
+ {
+ NoPin, // For convenience, offload engine device formats appended here
+ UsbHsSpeakerAudioEngineSupportedDeviceFormats,
+ SIZEOF_ARRAY(UsbHsSpeakerAudioEngineSupportedDeviceFormats),
+ NULL, // no modes for this entry.
+ 0
+ }
+};
+
+//=============================================================================
+static
+KSDATARANGE_AUDIO UsbHsSpeakerPinDataRangesStream[] =
+{
+ { // 0
+ {
+ sizeof(KSDATARANGE_AUDIO),
+ KSDATARANGE_ATTRIBUTES, // An attributes list follows this data range
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ USBHSSPEAKER_HOST_MAX_CHANNELS,
+ USBHSSPEAKER_HOST_MIN_BITS_PER_SAMPLE,
+ USBHSSPEAKER_HOST_MAX_BITS_PER_SAMPLE,
+ USBHSSPEAKER_HOST_MIN_SAMPLE_RATE,
+ USBHSSPEAKER_HOST_MAX_SAMPLE_RATE
+ },
+ { // 1
+ {
+ sizeof(KSDATARANGE_AUDIO),
+ KSDATARANGE_ATTRIBUTES, // An attributes list follows this data range
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ USBHSSPEAKER_OFFLOAD_MAX_CHANNELS,
+ USBHSSPEAKER_OFFLOAD_MIN_BITS_PER_SAMPLE,
+ USBHSSPEAKER_OFFLOAD_MAX_BITS_PER_SAMPLE,
+ USBHSSPEAKER_OFFLOAD_MIN_SAMPLE_RATE,
+ USBHSSPEAKER_OFFLOAD_MAX_SAMPLE_RATE
+ },
+ { // 2
+ {
+ sizeof(KSDATARANGE_AUDIO),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
+ },
+ USBHSSPEAKER_LOOPBACK_MAX_CHANNELS,
+ USBHSSPEAKER_LOOPBACK_MIN_BITS_PER_SAMPLE,
+ USBHSSPEAKER_LOOPBACK_MAX_BITS_PER_SAMPLE,
+ USBHSSPEAKER_LOOPBACK_MIN_SAMPLE_RATE,
+ USBHSSPEAKER_LOOPBACK_MAX_SAMPLE_RATE
+ }
+};
+
+static
+PKSDATARANGE UsbHsSpeakerPinDataRangePointersStream[] =
+{
+ PKSDATARANGE(&UsbHsSpeakerPinDataRangesStream[0]),
+ PKSDATARANGE(&PinDataRangeAttributeList)
+};
+
+static
+PKSDATARANGE UsbHsSpeakerPinDataRangePointersOffloadStream[] =
+{
+ PKSDATARANGE(&UsbHsSpeakerPinDataRangesStream[1]),
+ PKSDATARANGE(&PinDataRangeAttributeList)
+};
+
+static
+PKSDATARANGE UsbHsSpeakerPinDataRangePointersLoopbackStream[] =
+{
+ PKSDATARANGE(&UsbHsSpeakerPinDataRangesStream[2])
+};
+
+//=============================================================================
+static
+KSDATARANGE UsbHsSpeakerPinDataRangesBridge[] =
+{
+ {
+ sizeof(KSDATARANGE),
+ 0,
+ 0,
+ 0,
+ STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
+ STATICGUIDOF(KSDATAFORMAT_SUBTYPE_ANALOG),
+ STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE)
+ }
+};
+
+static
+PKSDATARANGE UsbHsSpeakerPinDataRangePointersBridge[] =
+{
+ &UsbHsSpeakerPinDataRangesBridge[0]
+};
+
+//=============================================================================
+
+static
+PCPROPERTY_ITEM PropertiesUsbHsSpeakerOffloadPin[] =
+{
+ {
+ &KSPROPSETID_OffloadPin, // define new property set
+ KSPROPERTY_OFFLOAD_PIN_GET_STREAM_OBJECT_POINTER, // define properties
+ KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_BASICSUPPORT,
+ PropertyHandler_OffloadPin
+ },
+ {
+ &KSPROPSETID_OffloadPin, // define new property set
+ KSPROPERTY_OFFLOAD_PIN_VERIFY_STREAM_OBJECT_POINTER, // define properties
+ KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_BASICSUPPORT,
+ PropertyHandler_OffloadPin
+ }
+};
+
+DEFINE_PCAUTOMATION_TABLE_PROP(AutomationUsbHsSpeakerOffloadPin, PropertiesUsbHsSpeakerOffloadPin);
+
+//=============================================================================
+static
+PCPIN_DESCRIPTOR UsbHsSpeakerWaveMiniportPins[] =
+{
+ // Wave Out Streaming Pin (Renderer) KSPIN_WAVE_RENDER_SINK_SYSTEM
+ {
+ USBHSSPEAKER_MAX_INPUT_SYSTEM_STREAMS,
+ USBHSSPEAKER_MAX_INPUT_SYSTEM_STREAMS,
+ 0,
+ NULL,
+ {
+ 0,
+ NULL,
+ 0,
+ NULL,
+ SIZEOF_ARRAY(UsbHsSpeakerPinDataRangePointersStream),
+ UsbHsSpeakerPinDataRangePointersStream,
+ KSPIN_DATAFLOW_IN,
+ KSPIN_COMMUNICATION_SINK,
+ &KSCATEGORY_AUDIO,
+ NULL,
+ 0
+ }
+ },
+ // Wave Out Streaming Pin (Renderer) KSPIN_WAVE_RENDER_SINK_OFFLOAD
+ {
+ USBHSSPEAKER_MAX_INPUT_OFFLOAD_STREAMS,
+ USBHSSPEAKER_MAX_INPUT_OFFLOAD_STREAMS,
+ 0,
+ &AutomationUsbHsSpeakerOffloadPin, // AutomationTable
+ {
+ 0,
+ NULL,
+ 0,
+ NULL,
+ SIZEOF_ARRAY(UsbHsSpeakerPinDataRangePointersOffloadStream),
+ UsbHsSpeakerPinDataRangePointersOffloadStream,
+ KSPIN_DATAFLOW_IN,
+ KSPIN_COMMUNICATION_SINK,
+ &KSCATEGORY_AUDIO,
+ NULL,
+ 0
+ }
+ },
+ // Wave Out Streaming Pin (Renderer) KSPIN_WAVE_RENDER_SINK_LOOPBACK
+ {
+ USBHSSPEAKER_MAX_OUTPUT_LOOPBACK_STREAMS,
+ USBHSSPEAKER_MAX_OUTPUT_LOOPBACK_STREAMS,
+ 0,
+ NULL,
+ {
+ 0,
+ NULL,
+ 0,
+ NULL,
+ SIZEOF_ARRAY(UsbHsSpeakerPinDataRangePointersLoopbackStream),
+ UsbHsSpeakerPinDataRangePointersLoopbackStream,
+ KSPIN_DATAFLOW_OUT,
+ KSPIN_COMMUNICATION_SINK,
+ &KSNODETYPE_AUDIO_LOOPBACK,
+ NULL,
+ 0
+ }
+ },
+ // Wave Out Bridge Pin (Renderer) KSPIN_WAVE_RENDER_SOURCE
+ {
+ 0,
+ 0,
+ 0,
+ NULL,
+ {
+ 0,
+ NULL,
+ 0,
+ NULL,
+ SIZEOF_ARRAY(UsbHsSpeakerPinDataRangePointersBridge),
+ UsbHsSpeakerPinDataRangePointersBridge,
+ KSPIN_DATAFLOW_OUT,
+ KSPIN_COMMUNICATION_NONE,
+ &KSCATEGORY_AUDIO,
+ NULL,
+ 0
+ }
+ },
+};
+
+//=============================================================================
+static
+PCNODE_DESCRIPTOR UsbHsSpeakerWaveMiniportNodes[] =
+{
+ // KSNODE_WAVE_AUDIO_ENGINE
+ {
+ 0, // Flags
+ NULL, // AutomationTable
+ &KSNODETYPE_AUDIO_ENGINE, // Type KSNODETYPE_AUDIO_ENGINE
+ NULL // Name
+ }
+};
+//=============================================================================
+//
+// ----------------------------
+// | |
+// System Pin 0-->| |--> 2 Loopback Pin
+// | HW Audio Engine node |
+// Offload Pin 1-->| |--> 3 KSPIN_WAVE_RENDER_SOURCE
+// | |
+// ----------------------------
+static
+PCCONNECTION_DESCRIPTOR UsbHsSpeakerWaveMiniportConnections[] =
+{
+ { PCFILTER_NODE, KSPIN_WAVE_RENDER_SINK_SYSTEM, KSNODE_WAVE_AUDIO_ENGINE, 1 },
+ { PCFILTER_NODE, KSPIN_WAVE_RENDER_SINK_OFFLOAD, KSNODE_WAVE_AUDIO_ENGINE, 2 },
+ { KSNODE_WAVE_AUDIO_ENGINE, 3, PCFILTER_NODE, KSPIN_WAVE_RENDER_SINK_LOOPBACK },
+ { KSNODE_WAVE_AUDIO_ENGINE, 0, PCFILTER_NODE, KSPIN_WAVE_RENDER_SOURCE },
+};
+
+//=============================================================================
+static
+PCPROPERTY_ITEM PropertiesUsbHsSpeakerWaveFilter[] =
+{
+ {
+ &KSPROPSETID_Pin,
+ KSPROPERTY_PIN_PROPOSEDATAFORMAT,
+ KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_BASICSUPPORT,
+ PropertyHandler_UsbHsWaveFilter
+ },
+ {
+ &KSPROPSETID_Pin,
+ KSPROPERTY_PIN_PROPOSEDATAFORMAT2,
+ KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_BASICSUPPORT,
+ PropertyHandler_UsbHsWaveFilter
+ },
+ {
+ &KSPROPSETID_AudioEffectsDiscovery,
+ KSPROPERTY_AUDIOEFFECTSDISCOVERY_EFFECTSLIST,
+ KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_BASICSUPPORT,
+ PropertyHandler_UsbHsWaveFilter
+ }
+};
+
+DEFINE_PCAUTOMATION_TABLE_PROP(AutomationUsbHsSpeakerWaveFilter, PropertiesUsbHsSpeakerWaveFilter);
+
+//=============================================================================
+static
+PCFILTER_DESCRIPTOR UsbHsSpeakerWaveMiniportFilterDescriptor =
+{
+ 0, // Version
+ &AutomationUsbHsSpeakerWaveFilter, // AutomationTable
+ sizeof(PCPIN_DESCRIPTOR), // PinSize
+ SIZEOF_ARRAY(UsbHsSpeakerWaveMiniportPins), // PinCount
+ UsbHsSpeakerWaveMiniportPins, // Pins
+ sizeof(PCNODE_DESCRIPTOR), // NodeSize
+ SIZEOF_ARRAY(UsbHsSpeakerWaveMiniportNodes), // NodeCount
+ UsbHsSpeakerWaveMiniportNodes, // Nodes
+ SIZEOF_ARRAY(UsbHsSpeakerWaveMiniportConnections),// ConnectionCount
+ UsbHsSpeakerWaveMiniportConnections, // Connections
+ 0, // CategoryCount
+ NULL // Categories - use defaults (audio, render, capture)
+};
+
+#endif // _SYSVAD_USBHSSPEAKERWAVTABLE_H_
+
diff --git a/audio/sysvad/EndpointsCommon/usbhstopo.cpp b/audio/sysvad/EndpointsCommon/usbhstopo.cpp
new file mode 100644
index 00000000..e32f2027
--- /dev/null
+++ b/audio/sysvad/EndpointsCommon/usbhstopo.cpp
@@ -0,0 +1,538 @@
+/*++
+
+Copyright (c) Microsoft Corporation All Rights Reserved
+
+Module Name:
+
+ usbhstopo.cpp
+
+Abstract:
+
+ Implementation of topology miniport for the USB Headset (external).
+
+--*/
+#ifdef SYSVAD_USB_SIDEBAND
+
+#pragma warning (disable : 4127)
+
+#include <sysvad.h>
+#include "simple.h"
+#include "mintopo.h"
+#include "usbhstopo.h"
+
+//=============================================================================
+#pragma code_seg("PAGE")
+NTSTATUS
+PropertyHandler_UsbHsVolumeLevel_BasicSupport
+(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest
+)
+/*++
+
+Routine Description:
+
+ Handles basic support for USB Headset ( KSPROPSETID_Audio, KSPROPERTY_AUDIO_VOLUMELEVEL )
+
+Arguments:
+
+ PropertyRequest -
+
+Return Value:
+
+ NT status code.
+
+--*/
+{
+ PAGED_CODE();
+ DPF_ENTER(("[%!FUNC!]"));
+
+ NTSTATUS ntStatus = STATUS_SUCCESS;
+ ULONG cbDescriptionSize = sizeof(KSPROPERTY_DESCRIPTION);
+ ASSERT(PropertyRequest);
+
+ if (PropertyRequest->ValueSize >= cbDescriptionSize)
+ {
+ PCMiniportTopology miniport = (PCMiniportTopology)PropertyRequest->MajorTarget;
+ ULONG volumeSettingsSize = 0;
+ PKSPROPERTY_DESCRIPTION volumeSettings;
+ PKSPROPERTY_DESCRIPTION propDesc;
+ PSIDEBANDDEVICECOMMON usbHsDevice;
+
+ propDesc = PKSPROPERTY_DESCRIPTION(PropertyRequest->Value);
+ usbHsDevice = miniport->GetSidebandDevice(); // weak ref.
+ ASSERT(usbHsDevice != NULL);
+
+ volumeSettings = (PKSPROPERTY_DESCRIPTION)usbHsDevice->GetVolumeSettings(miniport->m_DeviceType, &volumeSettingsSize);
+ ASSERT(volumeSettings != NULL);
+ ASSERT(volumeSettingsSize != 0);
+
+ ULONG cbFullProperty = volumeSettings->DescriptionSize;
+
+ // if return buffer can hold a range description, return it
+ if(PropertyRequest->ValueSize >= cbFullProperty)
+ {
+ RtlCopyMemory(propDesc, volumeSettings, volumeSettings->DescriptionSize);
+ // set the return value size
+ PropertyRequest->ValueSize = cbFullProperty;
+ }
+ else
+ {
+ // otherwise only return description header
+ RtlCopyMemory(propDesc, volumeSettings, cbDescriptionSize);
+ // set the return value size
+ PropertyRequest->ValueSize = cbDescriptionSize;
+ }
+ }
+ else if(PropertyRequest->ValueSize >= sizeof(ULONG))
+ {
+ // if return buffer can hold a ULONG, return the access flags
+ PULONG AccessFlags = PULONG(PropertyRequest->Value);
+
+ PropertyRequest->ValueSize = sizeof(ULONG);
+ *AccessFlags = KSPROPERTY_TYPE_ALL;
+ }
+ else
+ {
+ PropertyRequest->ValueSize = 0;
+ ntStatus = STATUS_BUFFER_TOO_SMALL;
+ }
+
+ return ntStatus;
+}
+
+//=============================================================================
+#pragma code_seg("PAGE")
+NTSTATUS
+PropertyHandler_UsbHsMute_BasicSupport
+(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest
+)
+/*++
+
+Routine Description:
+
+ Handles basic support for USB Headset ( KSPROPSETID_Audio, KSPROPERTY_AUDIO_MUTE )
+
+Arguments:
+
+ PropertyRequest -
+
+Return Value:
+
+ NT status code.
+
+--*/
+{
+ PAGED_CODE();
+ DPF_ENTER(("[%!FUNC!]"));
+
+ NTSTATUS ntStatus = STATUS_SUCCESS;
+ ULONG cbDescriptionSize = sizeof(KSPROPERTY_DESCRIPTION);
+ ASSERT(PropertyRequest);
+
+ if (PropertyRequest->ValueSize >= cbDescriptionSize)
+ {
+ PCMiniportTopology miniport = (PCMiniportTopology)PropertyRequest->MajorTarget;
+ ULONG muteSettingsSize = 0;
+ PKSPROPERTY_DESCRIPTION muteSettings;
+ PKSPROPERTY_DESCRIPTION propDesc;
+ PSIDEBANDDEVICECOMMON usbHsDevice;
+
+ propDesc = PKSPROPERTY_DESCRIPTION(PropertyRequest->Value);
+ usbHsDevice = miniport->GetSidebandDevice(); // weak ref.
+ ASSERT(usbHsDevice != NULL);
+
+ muteSettings = (PKSPROPERTY_DESCRIPTION)usbHsDevice->GetMuteSettings(miniport->m_DeviceType, &muteSettingsSize);
+ ASSERT(muteSettings != NULL);
+ ASSERT(muteSettingsSize != 0);
+
+ ULONG cbFullProperty = muteSettings->DescriptionSize;
+
+ // if return buffer can hold mute description, return it
+ if(PropertyRequest->ValueSize >= cbFullProperty)
+ {
+ RtlCopyMemory(propDesc, muteSettings, muteSettings->DescriptionSize);
+ // set the return value size
+ PropertyRequest->ValueSize = cbFullProperty;
+ }
+ else
+ {
+ // otherwise only return description header
+ RtlCopyMemory(propDesc, muteSettings, cbDescriptionSize);
+ // set the return value size
+ PropertyRequest->ValueSize = cbDescriptionSize;
+ }
+ }
+ else if(PropertyRequest->ValueSize >= sizeof(ULONG))
+ {
+ // if return buffer can hold a ULONG, return the access flags
+ PULONG AccessFlags = PULONG(PropertyRequest->Value);
+
+ PropertyRequest->ValueSize = sizeof(ULONG);
+ *AccessFlags = KSPROPERTY_TYPE_ALL;
+ }
+ else
+ {
+ PropertyRequest->ValueSize = 0;
+ ntStatus = STATUS_BUFFER_TOO_SMALL;
+ }
+
+ return ntStatus;
+}
+
+//=============================================================================
+#pragma code_seg("PAGE")
+NTSTATUS
+PropertyHandler_UsbHsJackDescription
+(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest,
+ _In_ ULONG cJackDescriptions,
+ _In_reads_(cJackDescriptions) PKSJACK_DESCRIPTION * JackDescriptions
+)
+/*++
+
+Routine Description:
+
+ Handles ( KSPROPSETID_Jack, KSPROPERTY_JACK_DESCRIPTION )
+
+Arguments:
+
+ PropertyRequest -
+
+ cJackDescriptions -
+
+ JackDescriptions -
+
+Return Value:
+
+ NT status code.
+
+--*/
+{
+ PAGED_CODE();
+
+ ASSERT(PropertyRequest);
+
+ DPF_ENTER(("[%!FUNC!]"));
+
+ NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST;
+ ULONG nPinId = (ULONG)-1;
+ PCMiniportTopology miniport = (PCMiniportTopology)PropertyRequest->MajorTarget;
+
+ if (PropertyRequest->InstanceSize >= sizeof(ULONG))
+ {
+ nPinId = *(PULONG(PropertyRequest->Instance));
+
+ if ((nPinId < cJackDescriptions) && (JackDescriptions[nPinId] != NULL))
+ {
+ if (PropertyRequest->Verb & KSPROPERTY_TYPE_BASICSUPPORT)
+ {
+ ntStatus =
+ PropertyHandler_BasicSupport
+ (
+ PropertyRequest,
+ KSPROPERTY_TYPE_BASICSUPPORT | KSPROPERTY_TYPE_GET,
+ VT_ILLEGAL
+ );
+ }
+ else
+ {
+ ULONG cbNeeded = sizeof(KSMULTIPLE_ITEM) + sizeof(KSJACK_DESCRIPTION);
+
+ 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)
+ {
+ PSIDEBANDDEVICECOMMON usbHsDevice = NULL;
+ PKSMULTIPLE_ITEM pMI = (PKSMULTIPLE_ITEM)PropertyRequest->Value;
+ PKSJACK_DESCRIPTION pDesc = (PKSJACK_DESCRIPTION)(pMI+1);
+
+ usbHsDevice = miniport->GetSidebandDevice(); // weak ref.
+ ASSERT(usbHsDevice != NULL);
+
+ pMI->Size = cbNeeded;
+ pMI->Count = 1;
+
+ RtlCopyMemory(pDesc, JackDescriptions[nPinId], sizeof(KSJACK_DESCRIPTION));
+
+ pDesc->IsConnected = usbHsDevice->GetConnectionStatus() ? TRUE : FALSE;
+
+ ntStatus = STATUS_SUCCESS;
+ }
+ }
+ }
+ }
+ }
+
+ return ntStatus;
+}
+
+//=============================================================================
+#pragma code_seg("PAGE")
+NTSTATUS
+PropertyHandler_UsbHsJackDescription2
+(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest,
+ _In_ ULONG cJackDescriptions,
+ _In_reads_(cJackDescriptions) PKSJACK_DESCRIPTION * JackDescriptions
+)
+/*++
+
+Routine Description:
+
+ Handles ( KSPROPSETID_Jack, KSPROPERTY_JACK_DESCRIPTION2 )
+
+Arguments:
+
+ PropertyRequest -
+
+ cJackDescriptions -
+
+ JackDescriptions -
+
+Return Value:
+
+ NT status code.
+
+--*/
+{
+ PAGED_CODE();
+
+ ASSERT(PropertyRequest);
+
+ DPF_ENTER(("[%!FUNC!]"));
+
+ NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST;
+ ULONG nPinId = (ULONG)-1;
+
+ if (PropertyRequest->InstanceSize >= sizeof(ULONG))
+ {
+ nPinId = *(PULONG(PropertyRequest->Instance));
+
+ if ((nPinId < cJackDescriptions) && (JackDescriptions[nPinId] != NULL))
+ {
+ if (PropertyRequest->Verb & KSPROPERTY_TYPE_BASICSUPPORT)
+ {
+ ntStatus =
+ PropertyHandler_BasicSupport
+ (
+ PropertyRequest,
+ KSPROPERTY_TYPE_BASICSUPPORT | KSPROPERTY_TYPE_GET,
+ VT_ILLEGAL
+ );
+ }
+ else
+ {
+ ULONG cbNeeded = sizeof(KSMULTIPLE_ITEM) + sizeof(KSJACK_DESCRIPTION2);
+
+ 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_DESCRIPTION2 pDesc = (PKSJACK_DESCRIPTION2)(pMI+1);
+
+ pMI->Size = cbNeeded;
+ pMI->Count = 1;
+
+ RtlZeroMemory(pDesc, sizeof(KSJACK_DESCRIPTION2));
+
+ //
+ // Specifies the lower 16 bits of the DWORD parameter. This parameter indicates whether
+ // the jack is currently active, streaming, idle, or hardware not ready.
+ //
+ pDesc->DeviceStateInfo = 0;
+
+ //
+ // From MSDN:
+ // "If an audio device lacks jack presence detection, the IsConnected member of
+ // the KSJACK_DESCRIPTION structure must always be set to TRUE. To remove the
+ // ambiguity that results from this dual meaning of the TRUE value for IsConnected,
+ // a client application can call IKsJackDescription2::GetJackDescription2 to read
+ // the JackCapabilities flag of the KSJACK_DESCRIPTION2 structure. If this flag has
+ // the JACKDESC2_PRESENCE_DETECT_CAPABILITY bit set, it indicates that the endpoint
+ // does in fact support jack presence detection. In that case, the return value of
+ // the IsConnected member can be interpreted to accurately reflect the insertion status
+ // of the jack."
+ //
+ // Bit definitions:
+ // 0x00000001 - JACKDESC2_PRESENCE_DETECT_CAPABILITY
+ // 0x00000002 - JACKDESC2_DYNAMIC_FORMAT_CHANGE_CAPABILITY
+ //
+ pDesc->JackCapabilities = JACKDESC2_PRESENCE_DETECT_CAPABILITY;
+
+ ntStatus = STATUS_SUCCESS;
+ }
+ }
+ }
+ }
+ }
+
+ return ntStatus;
+}
+
+//=============================================================================
+#pragma code_seg("PAGE")
+NTSTATUS
+PropertyHandler_UsbHsJackContainerId
+(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest,
+ _In_ ULONG cJackDescriptions,
+ _In_reads_(cJackDescriptions) PKSJACK_DESCRIPTION * JackDescriptions
+)
+/*++
+
+Routine Description:
+
+ Handles ( KSPROPSETID_Jack, KSPROPERTY_JACK_CONTAINERID )
+
+Arguments:
+
+ PropertyRequest -
+
+ cJackDescriptions -
+
+ JackDescriptions -
+
+Return Value:
+
+ NT status code.
+
+--*/
+{
+ PAGED_CODE();
+
+ ASSERT(PropertyRequest);
+
+ DPF_ENTER(("[%!FUNC!]"));
+
+ NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST;
+ PCMiniportTopology miniport = (PCMiniportTopology)PropertyRequest->MajorTarget;
+ ULONG nPinId = (ULONG)-1;
+
+ if (PropertyRequest->InstanceSize >= sizeof(ULONG))
+ {
+ nPinId = *(PULONG(PropertyRequest->Instance));
+
+ // This property is only valid on bridge pins.
+ if ((nPinId < cJackDescriptions) && (JackDescriptions[nPinId] != NULL))
+ {
+ if (PropertyRequest->Verb & KSPROPERTY_TYPE_BASICSUPPORT)
+ {
+ ntStatus =
+ PropertyHandler_BasicSupport
+ (
+ PropertyRequest,
+ KSPROPERTY_TYPE_BASICSUPPORT | KSPROPERTY_TYPE_GET,
+ VT_ILLEGAL
+ );
+ }
+ else
+ {
+ ULONG cbNeeded = sizeof(GUID);
+
+ 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)
+ {
+ PSIDEBANDDEVICECOMMON usbHsDevice = NULL;
+
+ GUID* guid = (GUID *)PropertyRequest->Value;
+
+ usbHsDevice = miniport->GetSidebandDevice(); // weak ref.
+ ASSERT(usbHsDevice != NULL);
+
+ *guid = usbHsDevice->GetContainerId(miniport->m_DeviceType);
+
+ ntStatus = STATUS_SUCCESS;
+ }
+ }
+ }
+ }
+ }
+
+ return ntStatus;
+}
+
+//=============================================================================
+#pragma code_seg()
+NTSTATUS
+PropertyHandler_UsbHsTopoNodeEvent
+(
+ _In_ PPCEVENT_REQUEST EventRequest
+)
+{
+ ASSERT(EventRequest);
+
+ DPF_ENTER(("[%!FUNC!]"));
+
+ // The major target is the object pointer to the topology miniport.
+ PCMiniportTopology pMiniport = (PCMiniportTopology)EventRequest->MajorTarget;
+ ASSERT (pMiniport);
+
+ switch (EventRequest->Verb)
+ {
+ // Do we support event handling?!?
+ case PCEVENT_VERB_SUPPORT:
+ DPF(D_VERBOSE, ("BasicSupport Query for event."));
+ break;
+
+ // We should add the event now!
+ case PCEVENT_VERB_ADD:
+ DPF(D_VERBOSE, ("Adding event."));
+
+ // If we have the interface and EventEntry is defined ...
+ if (EventRequest->EventEntry)
+ {
+ pMiniport->AddEventToEventList(EventRequest->EventEntry);
+ }
+ else
+ {
+ return STATUS_UNSUCCESSFUL;
+ }
+ break;
+
+ case PCEVENT_VERB_REMOVE:
+ // We cannot remove the event but we can stop generating the
+ // events. However, it also doesn't hurt to always generate them ...
+ DPF(D_VERBOSE, ("Removing event."));
+ break;
+
+ default:
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ return STATUS_SUCCESS;
+}
+
+#pragma code_seg()
+#endif //SYSVAD_USB_SIDEBAND
+
+
diff --git a/audio/sysvad/EndpointsCommon/usbhstopo.h b/audio/sysvad/EndpointsCommon/usbhstopo.h
new file mode 100644
index 00000000..d3a3adab
--- /dev/null
+++ b/audio/sysvad/EndpointsCommon/usbhstopo.h
@@ -0,0 +1,65 @@
+/*++
+
+Copyright (c) Microsoft Corporation All Rights Reserved
+
+Module Name:
+
+ usbhstopo.h
+
+Abstract:
+
+ Declaration of topology miniport for the mic (external: USB headphone).
+
+--*/
+
+#ifndef _SYSVAD_USBHSTOPO_H_
+#define _SYSVAD_USBHSTOPO_H_
+
+NTSTATUS
+PropertyHandler_UsbHsVolumeLevel_BasicSupport(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest
+ );
+
+NTSTATUS
+PropertyHandler_UsbHsMicVolumeLevel(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest
+ );
+
+NTSTATUS
+PropertyHandler_UsbHsMute_BasicSupport(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest
+ );
+
+NTSTATUS
+PropertyHandler_UsbHsMicMute(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest
+ );
+
+NTSTATUS
+PropertyHandler_UsbHsJackDescription(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest,
+ _In_ ULONG cJackDescriptions,
+ _In_reads_(cJackDescriptions) PKSJACK_DESCRIPTION * JackDescriptions
+ );
+
+NTSTATUS
+PropertyHandler_UsbHsJackDescription2(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest,
+ _In_ ULONG cJackDescriptions,
+ _In_reads_(cJackDescriptions) PKSJACK_DESCRIPTION * JackDescriptions
+ );
+
+NTSTATUS
+PropertyHandler_UsbHsJackContainerId(
+ _In_ PPCPROPERTY_REQUEST PropertyRequest,
+ _In_ ULONG cJackDescriptions,
+ _In_reads_(cJackDescriptions) PKSJACK_DESCRIPTION * JackDescriptions
+ );
+
+NTSTATUS
+PropertyHandler_UsbHsTopoNodeEvent(
+ _In_ PPCEVENT_REQUEST EventRequest
+ );
+
+#endif // _SYSVAD_USBHSTOPO_H_
+