summaryrefslogtreecommitdiff
path: root/audio/sysvad/EndpointsCommon/MiniportAudioEngineNode.cpp
diff options
context:
space:
mode:
authorDaniel Rugerio <[email protected]>2021-08-13 15:05:12 -0700
committerGitHub <[email protected]>2021-08-13 15:05:12 -0700
commit7895dd22785ddba5e973662ed942be3b3452b89d (patch)
tree5c4572d5bfd076d3776a88c5757e37f3ed50c0e7 /audio/sysvad/EndpointsCommon/MiniportAudioEngineNode.cpp
parentdf47b2d284558fa9aacd19257153037e4ebba60e (diff)
audio: Updates for Windows 10 22000 (#655)
* Updates for Windows 10 22000. * Change how WIL is consumed.
Diffstat (limited to 'audio/sysvad/EndpointsCommon/MiniportAudioEngineNode.cpp')
-rw-r--r--audio/sysvad/EndpointsCommon/MiniportAudioEngineNode.cpp207
1 files changed, 80 insertions, 127 deletions
diff --git a/audio/sysvad/EndpointsCommon/MiniportAudioEngineNode.cpp b/audio/sysvad/EndpointsCommon/MiniportAudioEngineNode.cpp
index 5f45d15a..34477606 100644
--- a/audio/sysvad/EndpointsCommon/MiniportAudioEngineNode.cpp
+++ b/audio/sysvad/EndpointsCommon/MiniportAudioEngineNode.cpp
@@ -57,9 +57,9 @@ Remarks:
} KSAUDIOENGINE_DESCRIPTOR, *PKSAUDIOENGINE_DESCRIPTOR;
The fields are defined as:
- nHostPinId � The ID of the pin factory connected to the audio engine node that is intended for host processed audio data. This is the pin factory on which a software audio engine will run.
- nOffloadPinId � The ID of the pin factory connected to the audio engine node that is intended for offloaded streams.
- nLoopbackPinId � The ID of the pin factory connected to the audio engine that is intended for supplying a post-mix loopback or reference stream.
+ nHostPinId – The ID of the pin factory connected to the audio engine node that is intended for host processed audio data. This is the pin factory on which a software audio engine will run.
+ nOffloadPinId – The ID of the pin factory connected to the audio engine node that is intended for offloaded streams.
+ nLoopbackPinId – The ID of the pin factory connected to the audio engine that is intended for supplying a post-mix loopback or reference stream.
All pin ids need to be unique for each audio engine node.
@@ -587,13 +587,10 @@ STDMETHODIMP_(NTSTATUS) CMiniportWaveRT::SetDeviceChannelVolume(_In_ ULONG _ulN
PAGED_CODE ();
- DPF_ENTER(("[CMiniportWaveRT::SetEndpointChannelVolume]"));
+ DPF_ENTER(("[CMiniportWaveRT::SetDeviceChannelVolume]"));
IF_TRUE_ACTION_JUMP(_ulNodeId != KSNODE_WAVE_AUDIO_ENGINE, ntStatus = STATUS_INVALID_DEVICE_REQUEST, Exit);
- // Snap the volume level to our range of steppings.
- LONG lVolume = VOLUME_NORMALIZE_IN_RANGE(_Volume);
-
- ntStatus = SetChannelVolume(_uiChannel, lVolume);
+ ntStatus = SetChannelVolume(_uiChannel, _Volume);
Exit:
return ntStatus;
@@ -764,27 +761,20 @@ NTSTATUS CMiniportWaveRT::GetBufferSizeRange(_In_ ULONG _ulNodeId, _In_ KSDATAF
NTSTATUS CMiniportWaveRT::GetVolumeChannelCount(_Out_ UINT32 *_pulChannelCount)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- BOOL bHandledInSideband = FALSE;
PAGED_CODE ();
ASSERT (_pulChannelCount);
DPF_ENTER(("[CMiniportWaveRT::GetVolumeChannelCount]"));
- if (IsSidebandDevice())
+ if (IsSidebandDevice() && m_pSidebandDevice->IsVolumeSupported(m_DeviceType))
{
- if (m_pSidebandDevice->IsVolumeSupported(m_DeviceType))
- {
- ULONG propSize = 0;
- PKSPROPERTY_DESCRIPTION pPropDesc = (PKSPROPERTY_DESCRIPTION)m_pSidebandDevice->GetVolumeSettings(m_DeviceType, &propSize);
- ASSERT(propSize >= sizeof(KSPROPERTY_DESCRIPTION) + sizeof(KSPROPERTY_MEMBERSHEADER) + sizeof(KSPROPERTY_STEPPING_LONG));
- PKSPROPERTY_MEMBERSHEADER pMembers = (PKSPROPERTY_MEMBERSHEADER)(pPropDesc + 1);
- *_pulChannelCount = pMembers->MembersCount;
-
- bHandledInSideband = TRUE;
- }
+ ULONG propSize = 0;
+ PKSPROPERTY_DESCRIPTION pPropDesc = (PKSPROPERTY_DESCRIPTION)m_pSidebandDevice->GetVolumeSettings(m_DeviceType, &propSize);
+ ASSERT(propSize >= sizeof(KSPROPERTY_DESCRIPTION) + sizeof(KSPROPERTY_MEMBERSHEADER) + sizeof(KSPROPERTY_STEPPING_LONG));
+ PKSPROPERTY_MEMBERSHEADER pMembers = (PKSPROPERTY_MEMBERSHEADER)(pPropDesc + 1);
+ *_pulChannelCount = pMembers->MembersCount;
}
-
- if(!bHandledInSideband)
+ else
{
*_pulChannelCount = m_DeviceMaxChannels;
}
@@ -796,41 +786,34 @@ NTSTATUS CMiniportWaveRT::GetVolumeSteppings(_Out_writes_bytes_(_ui32DataSize) P
{
PAGED_CODE ();
UINT32 ulChannelCount = _ui32DataSize / sizeof(KSPROPERTY_STEPPING_LONG);
- BOOL bHandledInSideband = FALSE;
ASSERT (_pKsPropStepLong);
DPF_ENTER(("[CMiniportWaveRT::GetVolumeSteppings]"));
- if (IsSidebandDevice())
+ if (IsSidebandDevice() && m_pSidebandDevice->IsVolumeSupported(m_DeviceType))
{
- if (m_pSidebandDevice->IsVolumeSupported(m_DeviceType))
- {
- // For Sideband Devices copy values from the Sideband DDI property descriptor
- ULONG propSize = 0;
- PKSPROPERTY_DESCRIPTION pPropDesc = (PKSPROPERTY_DESCRIPTION)m_pSidebandDevice->GetVolumeSettings(m_DeviceType, &propSize);
+ // For Sideband Devices copy values from the Sideband DDI property descriptor
+ ULONG propSize = 0;
+ PKSPROPERTY_DESCRIPTION pPropDesc = (PKSPROPERTY_DESCRIPTION)m_pSidebandDevice->GetVolumeSettings(m_DeviceType, &propSize);
- ASSERT(propSize >= sizeof(KSPROPERTY_DESCRIPTION) + sizeof(KSPROPERTY_MEMBERSHEADER) + sizeof(KSPROPERTY_STEPPING_LONG));
+ ASSERT(propSize >= sizeof(KSPROPERTY_DESCRIPTION) + sizeof(KSPROPERTY_MEMBERSHEADER) + sizeof(KSPROPERTY_STEPPING_LONG));
- PKSPROPERTY_MEMBERSHEADER pMembers = (PKSPROPERTY_MEMBERSHEADER)(pPropDesc + 1);
+ PKSPROPERTY_MEMBERSHEADER pMembers = (PKSPROPERTY_MEMBERSHEADER)(pPropDesc + 1);
- ASSERT(ulChannelCount <= pMembers->MembersCount);
-
- if (ulChannelCount > pMembers->MembersCount)
- {
- return STATUS_INVALID_PARAMETER;
- }
+ ASSERT(ulChannelCount <= pMembers->MembersCount);
- PKSPROPERTY_STEPPING_LONG pRange = (PKSPROPERTY_STEPPING_LONG)(pMembers + 1);
+ if (ulChannelCount > pMembers->MembersCount)
+ {
+ return STATUS_INVALID_PARAMETER;
+ }
- for (UINT i = 0; i < ulChannelCount; i++)
- {
- RtlCopyMemory(&_pKsPropStepLong[i], &pRange[i], sizeof(KSPROPERTY_STEPPING_LONG));
- }
+ PKSPROPERTY_STEPPING_LONG pRange = (PKSPROPERTY_STEPPING_LONG)(pMembers + 1);
- bHandledInSideband = TRUE;
+ for (UINT i = 0; i < ulChannelCount; i++)
+ {
+ RtlCopyMemory(&_pKsPropStepLong[i], &pRange[i], sizeof(KSPROPERTY_STEPPING_LONG));
}
}
-
- if(!bHandledInSideband)
+ else
{
ASSERT(ulChannelCount <= m_DeviceMaxChannels);
if (ulChannelCount > m_DeviceMaxChannels)
@@ -869,22 +852,11 @@ NTSTATUS CMiniportWaveRT::GetChannelVolume(_In_ UINT32 _uiChannel, _Out_ LONG *
NTSTATUS status = STATUS_SUCCESS;
- BOOL bHandledInSideband = FALSE;
-
- if (IsSidebandDevice())
+ if (IsSidebandDevice() && m_pSidebandDevice->IsVolumeSupported(m_DeviceType))
{
- if (m_pSidebandDevice->IsVolumeSupported(m_DeviceType))
- {
- if (m_pSidebandDevice->IsVolumeSupported(m_DeviceType))
- {
- status = m_pSidebandDevice->GetVolume(m_DeviceType, _uiChannel, _pVolume);
- }
-
- bHandledInSideband = TRUE;
- }
+ status = m_pSidebandDevice->GetVolume(m_DeviceType, _uiChannel, _pVolume);
}
-
- if(!bHandledInSideband)
+ else
{
if (_uiChannel == ALL_CHANNELS_ID)
{
@@ -905,26 +877,32 @@ NTSTATUS CMiniportWaveRT::SetChannelVolume(_In_ UINT32 _uiChannel, _In_ LONG _
PAGED_CODE ();
DPF_ENTER(("[CMiniportWaveRT::SetChannelVolume]"));
- if (IsSidebandDevice())
+ if (IsSidebandDevice() && m_pSidebandDevice->IsVolumeSupported(m_DeviceType))
{
- if (m_pSidebandDevice->IsVolumeSupported(m_DeviceType))
- {
- return m_pSidebandDevice->SetVolume(m_DeviceType, _uiChannel, _Volume);
- }
+ return m_pSidebandDevice->SetVolume(m_DeviceType, _uiChannel, _Volume);
}
-
- // Will reach here only if not handled through Sideband
- if (_uiChannel == ALL_CHANNELS_ID)
+ else
{
- for (int i = 0; i < m_DeviceMaxChannels; i++)
+ // Normalize volume only for non-sideband devices.
+ // Volume levels are governed by Sideband provider
+ // e.g. USB, A2DP, HFP, etc.
+
+ // Snap the volume level to our range of steppings.
+ LONG lVolume = VOLUME_NORMALIZE_IN_RANGE(_Volume);
+
+ // Will reach here only if not handled through Sideband
+ if (_uiChannel == ALL_CHANNELS_ID)
{
- m_plVolumeLevel[i] = _Volume;
+ for (int i = 0; i < m_DeviceMaxChannels; i++)
+ {
+ m_plVolumeLevel[i] = lVolume;
+ }
+ }
+ else
+ {
+ ASSERT(_uiChannel <= m_DeviceMaxChannels);
+ m_plVolumeLevel[_uiChannel] = lVolume;
}
- }
- else
- {
- ASSERT(_uiChannel <= m_DeviceMaxChannels);
- m_plVolumeLevel[_uiChannel] = _Volume;
}
return STATUS_SUCCESS;
@@ -996,27 +974,20 @@ NTSTATUS CMiniportWaveRT::GetChannelPeakMeter(_In_ UINT32 _uiChannel, _Out_ LO
NTSTATUS CMiniportWaveRT::GetMuteChannelCount(_Out_ UINT32 *_pulChannelCount)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- BOOL bHandledInSideband = FALSE;
PAGED_CODE ();
ASSERT (_pulChannelCount);
DPF_ENTER(("[CMiniportWaveRT::GetMuteChannelCount]"));
- if (IsSidebandDevice())
+ if (IsSidebandDevice() && m_pSidebandDevice->IsMuteSupported(m_DeviceType))
{
- if (m_pSidebandDevice->IsMuteSupported(m_DeviceType))
- {
- ULONG propSize = 0;
- PKSPROPERTY_DESCRIPTION pPropDesc = (PKSPROPERTY_DESCRIPTION)m_pSidebandDevice->GetMuteSettings(m_DeviceType, &propSize);
- ASSERT(propSize >= sizeof(KSPROPERTY_DESCRIPTION) + sizeof(KSPROPERTY_MEMBERSHEADER) + sizeof(KSPROPERTY_STEPPING_LONG));
- PKSPROPERTY_MEMBERSHEADER pMembers = (PKSPROPERTY_MEMBERSHEADER)(pPropDesc + 1);
- *_pulChannelCount = pMembers->MembersCount;
-
- bHandledInSideband = TRUE;
- }
+ ULONG propSize = 0;
+ PKSPROPERTY_DESCRIPTION pPropDesc = (PKSPROPERTY_DESCRIPTION)m_pSidebandDevice->GetMuteSettings(m_DeviceType, &propSize);
+ ASSERT(propSize >= sizeof(KSPROPERTY_DESCRIPTION) + sizeof(KSPROPERTY_MEMBERSHEADER) + sizeof(KSPROPERTY_STEPPING_LONG));
+ PKSPROPERTY_MEMBERSHEADER pMembers = (PKSPROPERTY_MEMBERSHEADER)(pPropDesc + 1);
+ *_pulChannelCount = pMembers->MembersCount;
}
-
- if(!bHandledInSideband)
+ else
{
*_pulChannelCount = m_DeviceMaxChannels;
}
@@ -1027,43 +998,36 @@ NTSTATUS CMiniportWaveRT::GetMuteSteppings(_Out_writes_bytes_(_ui32DataSize) PK
{
PAGED_CODE ();
UINT32 ulChannelCount = _ui32DataSize / sizeof(KSPROPERTY_STEPPING_LONG);
- BOOL bHandledInSideband = FALSE;
ASSERT (_pKsPropStepLong);
DPF_ENTER(("[CMiniportWaveRT::GetMuteSteppings]"));
- if (IsSidebandDevice())
+ if (IsSidebandDevice() && m_pSidebandDevice->IsMuteSupported(m_DeviceType))
{
- if (m_pSidebandDevice->IsMuteSupported(m_DeviceType))
- {
- // For Sideband Devices copy values from the Sideband DDI property descriptor
- ULONG propSize = 0;
- PKSPROPERTY_DESCRIPTION pPropDesc = (PKSPROPERTY_DESCRIPTION)m_pSidebandDevice->GetMuteSettings(m_DeviceType, &propSize);
+ // For Sideband Devices copy values from the Sideband DDI property descriptor
+ ULONG propSize = 0;
+ PKSPROPERTY_DESCRIPTION pPropDesc = (PKSPROPERTY_DESCRIPTION)m_pSidebandDevice->GetMuteSettings(m_DeviceType, &propSize);
- ASSERT(propSize >= sizeof(KSPROPERTY_DESCRIPTION) + sizeof(KSPROPERTY_MEMBERSHEADER) + sizeof(KSPROPERTY_STEPPING_LONG));
+ ASSERT(propSize >= sizeof(KSPROPERTY_DESCRIPTION) + sizeof(KSPROPERTY_MEMBERSHEADER) + sizeof(KSPROPERTY_STEPPING_LONG));
- PKSPROPERTY_MEMBERSHEADER pMembers = (PKSPROPERTY_MEMBERSHEADER)(pPropDesc + 1);
+ PKSPROPERTY_MEMBERSHEADER pMembers = (PKSPROPERTY_MEMBERSHEADER)(pPropDesc + 1);
- ASSERT(ulChannelCount <= pMembers->MembersCount);
-
- if (ulChannelCount > pMembers->MembersCount)
- {
- return STATUS_INVALID_PARAMETER;
- }
+ ASSERT(ulChannelCount <= pMembers->MembersCount);
- PKSPROPERTY_STEPPING_LONG pRange = (PKSPROPERTY_STEPPING_LONG)(pMembers + 1);
+ if (ulChannelCount > pMembers->MembersCount)
+ {
+ return STATUS_INVALID_PARAMETER;
+ }
- for (UINT i = 0; i < ulChannelCount; i++)
- {
- RtlCopyMemory(&_pKsPropStepLong[i], &pRange[i], sizeof(KSPROPERTY_STEPPING_LONG));
- }
+ PKSPROPERTY_STEPPING_LONG pRange = (PKSPROPERTY_STEPPING_LONG)(pMembers + 1);
- bHandledInSideband = TRUE;
+ for (UINT i = 0; i < ulChannelCount; i++)
+ {
+ RtlCopyMemory(&_pKsPropStepLong[i], &pRange[i], sizeof(KSPROPERTY_STEPPING_LONG));
}
}
-
- if(!bHandledInSideband)
+ else
{
ASSERT(ulChannelCount <= m_DeviceMaxChannels);
@@ -1088,19 +1052,11 @@ NTSTATUS CMiniportWaveRT::GetChannelMute(_In_ UINT32 _uiChannel, _Out_ BOOL *_
ASSERT (_pbMute);
DPF_ENTER(("[CMiniportWaveRT::GetChannelMute]"));
- BOOL bHandledInSideband = FALSE;
-
- if (IsSidebandDevice())
+ if (IsSidebandDevice() && m_pSidebandDevice->IsMuteSupported(m_DeviceType))
{
- if (m_pSidebandDevice->IsMuteSupported(m_DeviceType))
- {
- *_pbMute = m_pSidebandDevice->GetMute(m_DeviceType, _uiChannel);
-
- bHandledInSideband = TRUE;
- }
+ *_pbMute = m_pSidebandDevice->GetMute(m_DeviceType, _uiChannel);
}
-
- if (!bHandledInSideband)
+ else
{
if (_uiChannel == ALL_CHANNELS_ID)
{
@@ -1121,12 +1077,9 @@ NTSTATUS CMiniportWaveRT::SetChannelMute(_In_ UINT32 _uiChannel, _In_ BOOL _bM
PAGED_CODE ();
DPF_ENTER(("[CMiniportWaveRT::SetChannelMute]"));
- if (IsSidebandDevice())
+ if (IsSidebandDevice() && m_pSidebandDevice->IsMuteSupported(m_DeviceType))
{
- if (m_pSidebandDevice->IsMuteSupported(m_DeviceType))
- {
- return m_pSidebandDevice->SetMute(m_DeviceType, _uiChannel, _bMute);
- }
+ return m_pSidebandDevice->SetMute(m_DeviceType, _uiChannel, _bMute);
}
// Will reach here only if not handled through Sideband