void wf_peer_context_free(freerdp_peer* client, wfPeerContext* context) { wf_info_peer_unregister(context->info, context); if (context->rdpsnd) { wf_rdpsnd_lock(); context->info->snd_stop = TRUE; rdpsnd_server_context_free(context->rdpsnd); wf_rdpsnd_unlock(); } WTSDestroyVirtualChannelManager(context->vcm); }
void wf_peer_context_free(freerdp_peer* client, wfPeerContext* context) { wf_info_peer_unregister(context->info, context); if (context->rdpsnd) { wf_rdpsnd_lock(); context->info->snd_stop = TRUE; rdpsnd_server_context_free(context->rdpsnd); wf_rdpsnd_unlock(); } WTSCloseServer(context->vcm); }
DWORD WINAPI wf_rdpsnd_directsound_thread(LPVOID lpParam) { HRESULT hr; DWORD beg = 0; DWORD end = 0; DWORD diff, rate; wfPeerContext* context; wfInfo* wfi; VOID* pbCaptureData = NULL; DWORD dwCaptureLength = 0; VOID* pbCaptureData2 = NULL; DWORD dwCaptureLength2 = 0; VOID* pbPlayData = NULL; DWORD dwReadPos = 0; LONG lLockSize = 0; wfi = wf_info_get_instance(); context = (wfPeerContext*)lpParam; rate = 1000 / 24; _tprintf(_T("Trying to start capture\n")); hr = capBuf->lpVtbl->Start(capBuf, DSCBSTART_LOOPING); if (FAILED(hr)) { _tprintf(_T("Failed to start capture\n")); } _tprintf(_T("Capture started\n")); while (1) { end = GetTickCount(); diff = end - beg; if (diff < rate) { Sleep(rate - diff); } beg = GetTickCount(); if (wf_rdpsnd_lock() > 0) { //check for main exit condition if (wfi->snd_stop == TRUE) { wf_rdpsnd_unlock(); break; } hr = capBuf->lpVtbl->GetCurrentPosition(capBuf, NULL, &dwReadPos); if (FAILED(hr)) { _tprintf(_T("Failed to get read pos\n")); wf_rdpsnd_unlock(); break; } lLockSize = dwReadPos - lastPos;//dscbd.dwBufferBytes; if (lLockSize < 0) lLockSize += dscbd.dwBufferBytes; //printf("Last, read, lock = [%d, %d, %d]\n", lastPos, dwReadPos, lLockSize); if (lLockSize == 0) { wf_rdpsnd_unlock(); continue; } hr = capBuf->lpVtbl->Lock(capBuf, lastPos, lLockSize, &pbCaptureData, &dwCaptureLength, &pbCaptureData2, &dwCaptureLength2, 0L); if (FAILED(hr)) { _tprintf(_T("Failed to lock sound capture buffer\n")); wf_rdpsnd_unlock(); break; } //fwrite(pbCaptureData, 1, dwCaptureLength, pFile); //fwrite(pbCaptureData2, 1, dwCaptureLength2, pFile); //FIXME: frames = bytes/(bytespersample * channels) context->rdpsnd->SendSamples(context->rdpsnd, pbCaptureData, dwCaptureLength/4, (UINT16)(beg & 0xffff)); context->rdpsnd->SendSamples(context->rdpsnd, pbCaptureData2, dwCaptureLength2/4, (UINT16)(beg & 0xffff)); hr = capBuf->lpVtbl->Unlock(capBuf, pbCaptureData, dwCaptureLength, pbCaptureData2, dwCaptureLength2); if (FAILED(hr)) { _tprintf(_T("Failed to unlock sound capture buffer\n")); wf_rdpsnd_unlock(); return 0; } //TODO keep track of location in buffer lastPos += dwCaptureLength; lastPos %= dscbd.dwBufferBytes; lastPos += dwCaptureLength2; lastPos %= dscbd.dwBufferBytes; wf_rdpsnd_unlock(); } } _tprintf(_T("Trying to stop sound capture\n")); hr = capBuf->lpVtbl->Stop(capBuf); if (FAILED(hr)) { _tprintf(_T("Failed to stop capture\n")); } _tprintf(_T("Capture stopped\n")); capBuf->lpVtbl->Release(capBuf); cap->lpVtbl->Release(cap); lastPos = 0; return 0; }