[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:
Johannes Anderwald 2010-03-05 09:43:42 +00:00
parent e3fb834a19
commit 95f5adb673
6 changed files with 34 additions and 47 deletions

View file

@ -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); \

View file

@ -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;
}

View file

@ -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);

View file

@ -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();

View file

@ -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);

View file

@ -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;