mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 08:55:19 +00:00
[PORTCLS]
- More cleanup - Only copy audio bytes to common buffer when the audio pin is in the running state - Only notify miniport when the audio pin is in the running state svn path=/trunk/; revision=45860
This commit is contained in:
parent
e3fb834a19
commit
95f5adb673
6 changed files with 34 additions and 47 deletions
|
@ -320,8 +320,6 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown)
|
|||
|
||||
STDMETHOD_(NTSTATUS, Init)(THIS_
|
||||
IN KSPIN_CONNECT *ConnectDetails,
|
||||
IN PKSDATAFORMAT DataFormat,
|
||||
IN PDEVICE_OBJECT DeviceObject,
|
||||
IN ULONG FrameSize,
|
||||
IN ULONG Alignment,
|
||||
IN PVOID SilenceBuffer) PURE;
|
||||
|
@ -359,8 +357,6 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown)
|
|||
#define IMP_IIrpQueue \
|
||||
STDMETHODIMP_(NTSTATUS) Init(THIS_ \
|
||||
IN KSPIN_CONNECT *ConnectDetails, \
|
||||
IN PKSDATAFORMAT DataFormat, \
|
||||
IN PDEVICE_OBJECT DeviceObject, \
|
||||
IN ULONG FrameSize, \
|
||||
IN ULONG Alignment, \
|
||||
IN PVOID SilenceBuffer); \
|
||||
|
|
|
@ -38,10 +38,7 @@ protected:
|
|||
volatile ULONG m_CurrentOffset;
|
||||
LONG m_NumMappings;
|
||||
ULONG m_NumDataAvailable;
|
||||
BOOL m_StartStream;
|
||||
PKSPIN_CONNECT m_ConnectDetails;
|
||||
PKSDATAFORMAT_WAVEFORMATEX m_DataFormat;
|
||||
|
||||
KSPIN_LOCK m_IrpListLock;
|
||||
LIST_ENTRY m_IrpList;
|
||||
LIST_ENTRY m_FreeIrpList;
|
||||
|
@ -51,7 +48,6 @@ protected:
|
|||
ULONG m_OutOfMapping;
|
||||
ULONG m_MaxFrameSize;
|
||||
ULONG m_Alignment;
|
||||
ULONG m_MinimumDataThreshold;
|
||||
|
||||
LONG m_Ref;
|
||||
|
||||
|
@ -87,18 +83,14 @@ NTSTATUS
|
|||
NTAPI
|
||||
CIrpQueue::Init(
|
||||
IN KSPIN_CONNECT *ConnectDetails,
|
||||
IN PKSDATAFORMAT DataFormat,
|
||||
IN PDEVICE_OBJECT DeviceObject,
|
||||
IN ULONG FrameSize,
|
||||
IN ULONG Alignment,
|
||||
IN PVOID SilenceBuffer)
|
||||
{
|
||||
m_ConnectDetails = ConnectDetails;
|
||||
m_DataFormat = (PKSDATAFORMAT_WAVEFORMATEX)DataFormat;
|
||||
m_MaxFrameSize = FrameSize;
|
||||
m_SilenceBuffer = SilenceBuffer;
|
||||
m_Alignment = Alignment;
|
||||
m_MinimumDataThreshold = ((PKSDATAFORMAT_WAVEFORMATEX)DataFormat)->WaveFormatEx.nAvgBytesPerSec / 3;
|
||||
|
||||
InitializeListHead(&m_IrpList);
|
||||
InitializeListHead(&m_FreeIrpList);
|
||||
|
@ -273,10 +265,6 @@ CIrpQueue::GetMapping(
|
|||
// no irp available, use silence buffer
|
||||
*Buffer = (PUCHAR)m_SilenceBuffer;
|
||||
*BufferSize = m_MaxFrameSize;
|
||||
// flag for port wave pci driver
|
||||
m_OutOfMapping = TRUE;
|
||||
// indicate flag to restart fast buffering
|
||||
m_StartStream = FALSE;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -436,8 +424,6 @@ CIrpQueue::CancelBuffers()
|
|||
|
||||
// cancel all irps
|
||||
KsCancelIo(&m_IrpList, &m_IrpListLock);
|
||||
// reset stream start flag
|
||||
m_StartStream = FALSE;
|
||||
// reset number of mappings
|
||||
m_NumMappings = 0;
|
||||
// reset number of data available
|
||||
|
@ -470,7 +456,6 @@ CIrpQueue::GetMappingWithTag(
|
|||
{
|
||||
// no irp available
|
||||
m_OutOfMapping = TRUE;
|
||||
m_StartStream = FALSE;
|
||||
return STATUS_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
|
|
@ -605,7 +605,7 @@ CPortPinDMus::Init(
|
|||
m_ServiceGroup->SupportDelayedService();
|
||||
}
|
||||
|
||||
Status = m_IrpQueue->Init(ConnectDetails, m_Format, DeviceObject, 0, 0, NULL);
|
||||
Status = m_IrpQueue->Init(ConnectDetails, 0, 0, NULL);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT("IrpQueue_Init failed with %x\n", Status);
|
||||
|
|
|
@ -780,29 +780,32 @@ CPortPinWaveCyclic::RequestService()
|
|||
|
||||
PC_ASSERT_IRQL(DISPATCH_LEVEL);
|
||||
|
||||
Status = m_IrpQueue->GetMapping(&Buffer, &BufferSize);
|
||||
if (!NT_SUCCESS(Status))
|
||||
if (m_State == KSSTATE_RUN)
|
||||
{
|
||||
return;
|
||||
Status = m_IrpQueue->GetMapping(&Buffer, &BufferSize);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Status = m_Stream->GetPosition(&Position);
|
||||
DPRINT("Position %u Buffer %p BufferSize %u ActiveIrpOffset %u Capture %u\n", Position, Buffer, m_CommonBufferSize, BufferSize, m_Capture);
|
||||
|
||||
OldOffset = m_Position.PlayOffset;
|
||||
|
||||
if (Position < m_CommonBufferOffset)
|
||||
{
|
||||
UpdateCommonBufferOverlap(Position, m_FrameSize);
|
||||
}
|
||||
else if (Position >= m_CommonBufferOffset)
|
||||
{
|
||||
UpdateCommonBuffer(Position, m_FrameSize);
|
||||
}
|
||||
|
||||
NewOffset = m_Position.PlayOffset;
|
||||
|
||||
GeneratePositionEvents(OldOffset, NewOffset);
|
||||
}
|
||||
|
||||
Status = m_Stream->GetPosition(&Position);
|
||||
DPRINT("Position %u Buffer %p BufferSize %u ActiveIrpOffset %u Capture %u\n", Position, Buffer, m_CommonBufferSize, BufferSize, m_Capture);
|
||||
|
||||
OldOffset = m_Position.PlayOffset;
|
||||
|
||||
if (Position < m_CommonBufferOffset)
|
||||
{
|
||||
UpdateCommonBufferOverlap(Position, m_FrameSize);
|
||||
}
|
||||
else if (Position >= m_CommonBufferOffset)
|
||||
{
|
||||
UpdateCommonBuffer(Position, m_FrameSize);
|
||||
}
|
||||
|
||||
NewOffset = m_Position.PlayOffset;
|
||||
|
||||
GeneratePositionEvents(OldOffset, NewOffset);
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
|
@ -1239,7 +1242,7 @@ CPortPinWaveCyclic::Init(
|
|||
m_Stream->Silence(SilenceBuffer, m_FrameSize);
|
||||
m_Stream->Silence(m_CommonBuffer, m_CommonBufferSize);
|
||||
|
||||
Status = m_IrpQueue->Init(ConnectDetails, DataFormat, DeviceObject, m_FrameSize, 0, SilenceBuffer);
|
||||
Status = m_IrpQueue->Init(ConnectDetails, m_FrameSize, 0, SilenceBuffer);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
m_IrpQueue->Release();
|
||||
|
|
|
@ -432,9 +432,12 @@ CPortPinWavePci::RequestService()
|
|||
{
|
||||
PC_ASSERT_IRQL(DISPATCH_LEVEL);
|
||||
|
||||
m_Stream->Service();
|
||||
//TODO
|
||||
//generate events
|
||||
if (m_State == KSSTATE_RUN)
|
||||
{
|
||||
m_Stream->Service();
|
||||
//TODO
|
||||
//generate events
|
||||
}
|
||||
}
|
||||
|
||||
//==================================================================================================================================
|
||||
|
@ -829,7 +832,7 @@ CPortPinWavePci::Init(
|
|||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
|
||||
Status = m_IrpQueue->Init(ConnectDetails, m_Format, DeviceObject, m_AllocatorFraming.FrameSize, m_AllocatorFraming.FileAlignment, NULL);
|
||||
Status = m_IrpQueue->Init(ConnectDetails, m_AllocatorFraming.FrameSize, m_AllocatorFraming.FileAlignment, NULL);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT("IrpQueue_Init failed with %x\n", Status);
|
||||
|
|
|
@ -587,7 +587,7 @@ CPortPinWaveRT::Init(
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
Status = m_IrpQueue->Init(ConnectDetails, DataFormat, DeviceObject, 0, 0, NULL);
|
||||
Status = m_IrpQueue->Init(ConnectDetails, 0, 0, NULL);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
goto cleanup;
|
||||
|
|
Loading…
Reference in a new issue