DeviceSource::~DeviceSource() { Stop(); UnloadFilters(); FlushSamples(); SafeReleaseLogRef(capture); SafeReleaseLogRef(graph); if(hConvertThreads) Free(hConvertThreads); if(convertData) Free(convertData); if(hSampleMutex) OSCloseMutex(hSampleMutex); }
void DeviceSource::UnloadFilters() { if(texture) { delete texture; texture = NULL; } int numThreads = MAX(OSGetTotalCores()-2, 1); for(int i=0; i<numThreads; i++) { if(hConvertThreads[i]) { convertData[i].bKillThread = true; SetEvent(convertData[i].hSignalConvert); OSTerminateThread(hConvertThreads[i], 10000); hConvertThreads[i] = NULL; } convertData[i].bKillThread = false; if(convertData[i].hSignalConvert) { CloseHandle(convertData[i].hSignalConvert); convertData[i].hSignalConvert = NULL; } if(convertData[i].hSignalComplete) { CloseHandle(convertData[i].hSignalComplete); convertData[i].hSignalComplete = NULL; } } if(bFiltersLoaded) { graph->RemoveFilter(captureFilter); graph->RemoveFilter(deviceFilter); graph->RemoveFilter(audioDeviceFilter); if(audioFilter) graph->RemoveFilter(audioFilter); SafeReleaseLogRef(captureFilter); SafeReleaseLogRef(deviceFilter); SafeReleaseLogRef(audioDeviceFilter); SafeReleaseLogRef(audioFilter); bFiltersLoaded = false; } if(audioOut) { API->RemoveAudioSource(audioOut); delete audioOut; audioOut = NULL; } if(colorConvertShader) { delete colorConvertShader; colorConvertShader = NULL; } if(lpImageBuffer) { Free(lpImageBuffer); lpImageBuffer = NULL; } SafeRelease(control); }