Home | Info | Community | Development | myReactOS | Contact Us
Definition at line 471 of file capturebuffer.c.
{ KSPROPERTY Property; KSSTREAM_HEADER Header; DWORD Result, BytesTransferred; OVERLAPPED Overlapped; KSSTATE State; HANDLE hThread; LPCDirectSoundCaptureBufferImpl This = (LPCDirectSoundCaptureBufferImpl)CONTAINING_RECORD(iface, CDirectSoundCaptureBufferImpl, lpVtbl); DPRINT("IDirectSoundCaptureBufferImpl_Start Flags %x\n", dwFlags); ASSERT(dwFlags == DSCBSTART_LOOPING); /* check if pin is already running */ if (This->State == KSSTATE_RUN) return DS_OK; /* check if there is a pin instance */ if (!This->hPin) return DSERR_GENERIC; /* setup request */ Property.Set = KSPROPSETID_Connection; Property.Id = KSPROPERTY_CONNECTION_STATE; Property.Flags = KSPROPERTY_TYPE_SET; State = KSSTATE_RUN; /* set pin to run */ Result = SyncOverlappedDeviceIoControl(This->hPin, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&State, sizeof(KSSTATE), &BytesTransferred); ASSERT(Result == ERROR_SUCCESS); if (Result == ERROR_SUCCESS) { /* store result */ This->State = State; } /* initialize overlapped struct */ ZeroMemory(&Overlapped, sizeof(OVERLAPPED)); Overlapped.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); /* clear stream header */ ZeroMemory(&Header, sizeof(KSSTREAM_HEADER)); /* initialize stream header */ Header.FrameExtent = This->BufferSize; Header.DataUsed = 0; Header.Data = (This->bMix ? This->MixBuffer : This->Buffer); Header.Size = sizeof(KSSTREAM_HEADER); Header.PresentationTime.Numerator = 1; Header.PresentationTime.Denominator = 1; Result = DeviceIoControl(This->hPin, IOCTL_KS_WRITE_STREAM, NULL, 0, &Header, sizeof(KSSTREAM_HEADER), &BytesTransferred, &Overlapped); if (Result != ERROR_SUCCESS) { DPRINT("Failed submit buffer with %lx\n", Result); return DSERR_GENERIC; } if (This->bMix) { if (!This->hStopEvent) { /* create stop event */ This->hStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (!This->hStopEvent) { DPRINT1("Failed to create event object with %x\n", GetLastError()); return DSERR_GENERIC; } } /* set state to stop false */ This->StopMixerThread = FALSE; hThread = CreateThread(NULL, 0, MixerThreadRoutine, (PVOID)This, 0, NULL); if (!hThread) { DPRINT1("Failed to create thread with %x\n", GetLastError()); return DSERR_GENERIC; } /* close thread handle */ CloseHandle(hThread); } return DS_OK; }