explicit WinsockInitialization(int major = 2, int minor = 2) { WSADATA wsaData = {0}; int rc = WSAStartup(MAKEWORD(major, minor), &wsaData); if (rc != 0) ThrowWin32Error(rc, "WSAStartup"); }
CAudio::CAudio(WORD channels, DWORD sample_rate, WORD bits_per_sample, bool &_audioStart, bool &_videoStart, HANDLE &_hStartEvent) : m_hWaveOut(NULL) , m_dwStart(0) , m_dwCur(0) , m_dwEnd(0) , m_dwWaveHdrIndex(0) , m_dwCount(0) , m_hDataEvent(NULL) , m_hNotFullEvent(NULL) , m_hNotEmptyEvent(NULL) , m_hThread(NULL) , m_bContinue(FALSE) , m_bForce(FALSE) , m_bAudioStart(_audioStart) , m_bVideoStart(_videoStart) , m_hStartEvent(_hStartEvent) { if (!_hStartEvent)ThrowWin32Error(CAudio::CVideo, ERROR_BAD_ARGUMENTS); MMRESULT mmResult; WAVEFORMATEX wfex = { WAVE_FORMAT_PCM,channels,sample_rate }; wfex.wBitsPerSample = bits_per_sample; wfex.cbSize = sizeof(WAVEFORMATEX); wfex.nBlockAlign = (wfex.wBitsPerSample >> 3)*wfex.nChannels; wfex.nAvgBytesPerSec = wfex.nBlockAlign*wfex.nSamplesPerSec; TestWin32Throw(m_hDataEvent = CreateEvent(NULL, FALSE, FALSE, NULL)); TestWin32Throw(m_hNotFullEvent = CreateEvent(NULL, FALSE, FALSE, NULL)); TestWin32Throw(m_hNotEmptyEvent = CreateEvent(NULL, FALSE, FALSE, NULL)); mmResult = waveOutOpen(&m_hWaveOut, WAVE_MAPPER, &wfex, (DWORD_PTR)waveOutProc, (DWORD_PTR)m_hDataEvent, CALLBACK_FUNCTION); if (MMSYSERR_NOERROR != mmResult)throw mmResult; ZeroMemory(m_cWaveHdr, sizeof m_cWaveHdr); for (int i = 0; i < MAX_WAVE_COUNT; ++i) m_cWaveHdr[i].dwUser = (DWORD_PTR)&m_dwCount; m_bContinue = TRUE; m_hThread = CreateThread(NULL, 0, ThreadProc, this, 0, NULL); }
DWORD CALLBACK CAudio::ThreadProc(LPVOID lp) { if (nullptr == lp)ThrowWin32Error(CAudio::ThreadProc, ERROR_BAD_ARGUMENTS); CAudio * audio = static_cast<CAudio*>(lp); return audio->AudioThreadProc(); }
void CheckHr(HRESULT hr) { if (FAILED(hr)) ThrowWin32Error(hr); }
void ThrowLastError(const std::string& what) { ThrowWin32Error(GetLastError(), what); }