- Don't release object which drivers should release

- Fixes a few crashes when starting another audio stream

svn path=/trunk/; revision=41512
This commit is contained in:
Johannes Anderwald 2009-06-21 10:48:09 +00:00
parent 88b93de202
commit 93a8c8a165
3 changed files with 4 additions and 16 deletions

View file

@ -692,8 +692,6 @@ CloseStreamRoutine(
} }
This->ServiceGroup->lpVtbl->RemoveMember(This->ServiceGroup, (PSERVICESINK)&This->lpVtblServiceSink); This->ServiceGroup->lpVtbl->RemoveMember(This->ServiceGroup, (PSERVICESINK)&This->lpVtblServiceSink);
This->ServiceGroup->lpVtbl->Release(This->ServiceGroup);
This->DmaChannel->lpVtbl->Release(This->DmaChannel);
Status = This->Port->lpVtbl->QueryInterface(This->Port, &IID_ISubdevice, (PVOID*)&ISubDevice); Status = This->Port->lpVtbl->QueryInterface(This->Port, &IID_ISubdevice, (PVOID*)&ISubDevice);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
@ -735,7 +733,6 @@ CloseStreamRoutine(
This->Filter->lpVtbl->FreePin(This->Filter, (IPortPinWaveCyclic*)This); This->Filter->lpVtbl->FreePin(This->Filter, (IPortPinWaveCyclic*)This);
DPRINT1("Closing stream at Irql %u\n", KeGetCurrentIrql()); DPRINT1("Closing stream at Irql %u\n", KeGetCurrentIrql());
Stream->lpVtbl->Release(Stream); Stream->lpVtbl->Release(Stream);
/* this line is never reached */
} }
} }
@ -1064,8 +1061,8 @@ IPortPinWaveCyclic_fnInit(
Status = This->Stream->lpVtbl->SetNotificationFreq(This->Stream, 10, &This->FrameSize); Status = This->Stream->lpVtbl->SetNotificationFreq(This->Stream, 10, &This->FrameSize);
//This->Stream->lpVtbl->SetFormat(This->Stream, (PKSDATAFORMAT)This->Format); //This->Stream->lpVtbl->SetFormat(This->Stream, (PKSDATAFORMAT)This->Format);
DPRINT1("Setting state to acquire %x\n", This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_ACQUIRE)); DPRINT1("Setting state to acquire %x\n", This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_ACQUIRE));
DPRINT1("Setting state to pause %x\n", This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_PAUSE)); DPRINT1("Setting state to pause %x\n", This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_PAUSE));
This->State = KSSTATE_PAUSE; This->State = KSSTATE_PAUSE;

View file

@ -391,14 +391,12 @@ CloseStreamRoutine(
if (This->State != KSSTATE_STOP) if (This->State != KSSTATE_STOP)
{ {
This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_STOP); This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_STOP);
KeStallExecutionProcessor(10);
} }
} }
if (This->ServiceGroup) if (This->ServiceGroup)
{ {
This->ServiceGroup->lpVtbl->RemoveMember(This->ServiceGroup, (PSERVICESINK)&This->lpVtblServiceSink); This->ServiceGroup->lpVtbl->RemoveMember(This->ServiceGroup, (PSERVICESINK)&This->lpVtblServiceSink);
This->ServiceGroup->lpVtbl->Release(This->ServiceGroup);
} }
Status = This->Port->lpVtbl->QueryInterface(This->Port, &IID_ISubdevice, (PVOID*)&ISubDevice); Status = This->Port->lpVtbl->QueryInterface(This->Port, &IID_ISubdevice, (PVOID*)&ISubDevice);
@ -407,9 +405,9 @@ CloseStreamRoutine(
Status = ISubDevice->lpVtbl->GetDescriptor(ISubDevice, &Descriptor); Status = ISubDevice->lpVtbl->GetDescriptor(ISubDevice, &Descriptor);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
ISubDevice->lpVtbl->Release(ISubDevice);
Descriptor->Factory.Instances[This->ConnectDetails->PinId].CurrentPinInstanceCount--; Descriptor->Factory.Instances[This->ConnectDetails->PinId].CurrentPinInstanceCount--;
} }
ISubDevice->lpVtbl->Release(ISubDevice);
} }
if (This->Format) if (This->Format)
@ -418,11 +416,6 @@ CloseStreamRoutine(
This->Format = NULL; This->Format = NULL;
} }
if (This->WaveStream)
{
This->WaveStream->lpVtbl->Release(This->WaveStream);
}
/* complete the irp */ /* complete the irp */
Ctx->Irp->IoStatus.Information = 0; Ctx->Irp->IoStatus.Information = 0;
Ctx->Irp->IoStatus.Status = STATUS_SUCCESS; Ctx->Irp->IoStatus.Status = STATUS_SUCCESS;
@ -440,7 +433,6 @@ CloseStreamRoutine(
This->Stream = NULL; This->Stream = NULL;
DPRINT1("Closing stream at Irql %u\n", KeGetCurrentIrql()); DPRINT1("Closing stream at Irql %u\n", KeGetCurrentIrql());
Stream->lpVtbl->Release(Stream); Stream->lpVtbl->Release(Stream);
/* this line is never reached */
} }
} }

View file

@ -702,9 +702,9 @@ CloseStreamRoutine(
Status = ISubDevice->lpVtbl->GetDescriptor(ISubDevice, &Descriptor); Status = ISubDevice->lpVtbl->GetDescriptor(ISubDevice, &Descriptor);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
ISubDevice->lpVtbl->Release(ISubDevice);
Descriptor->Factory.Instances[This->ConnectDetails->PinId].CurrentPinInstanceCount--; Descriptor->Factory.Instances[This->ConnectDetails->PinId].CurrentPinInstanceCount--;
} }
ISubDevice->lpVtbl->Release(ISubDevice);
} }
if (This->Format) if (This->Format)
@ -735,7 +735,6 @@ CloseStreamRoutine(
This->Stream = NULL; This->Stream = NULL;
DPRINT1("Closing stream at Irql %u\n", KeGetCurrentIrql()); DPRINT1("Closing stream at Irql %u\n", KeGetCurrentIrql());
Stream->lpVtbl->Release(Stream); Stream->lpVtbl->Release(Stream);
/* this line is never reached */
} }
} }