diff options
| author | Girish Pattabiraman <[email protected]> | 2018-11-12 18:08:19 -0800 |
|---|---|---|
| committer | Adonais Romero González <[email protected]> | 2018-11-12 18:08:19 -0800 |
| commit | 995e20f6dbca7ad10a039fa62a2de69eed092ffc (patch) | |
| tree | 67075f06fd8aaedad732d6c73b682c6e0fda9dba /audio/sysvad/EndpointsCommon | |
| parent | c9110a3bc1634a5be8e7922119ad383311104095 (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')
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_ + |
