#include <WinAudioStream.h>
Public Member Functions | |
CWinAudioStream (IMediaObject *pObj) | |
virtual | ~CWinAudioStream (void) |
BOOL | startCapture (WAVEFORMATEX *format=NULL) |
void | stopCapture (void) |
Buffer | input (void) |
BOOL | openOutput (ULONG bufcount=100, WAVEFORMATEX *format=NULL) |
void | closeOutput (void) |
void | output (Buffer buf) |
STDMETHODIMP_ (ULONG) AddRef(void) | |
STDMETHODIMP_ (ULONG) Release(void) | |
STDMETHODIMP | QueryInterface (REFIID riid, void **ppv) |
STDMETHODIMP | Read (void *, ULONG, ULONG *) |
STDMETHODIMP | Seek (LARGE_INTEGER, DWORD, ULARGE_INTEGER *) |
STDMETHODIMP | Write (const void *, ULONG, ULONG *) |
STDMETHODIMP | SetSize (ULARGE_INTEGER) |
STDMETHODIMP | CopyTo (IStream *, ULARGE_INTEGER, ULARGE_INTEGER *, ULARGE_INTEGER *) |
STDMETHODIMP | Commit (DWORD) |
STDMETHODIMP | Revert (void) |
STDMETHODIMP | LockRegion (ULARGE_INTEGER, ULARGE_INTEGER, DWORD) |
STDMETHODIMP | UnlockRegion (ULARGE_INTEGER, ULARGE_INTEGER, DWORD) |
STDMETHODIMP | Stat (STATSTG *, DWORD) |
STDMETHODIMP | Clone (IStream **) |
Private Member Functions | |
void | freeOutputHeaders (void) |
CWinMediaBuffer * | GetWriteBuffer (void) |
void | Back2BufferStack (CWinMediaBuffer *pMediaBuf) |
void | Back2BufferStackAll (void) |
void | QueueCapturedData (BYTE *pData, UINT cbData) |
void | QueueCapturedBuffer (CWinMediaBuffer *pMediaBuf) |
void | ReadOneBuffer (BYTE **ppbData, ULONG *pcbData) |
UINT | CaptureThread (void) |
BOOL | IsCapturing (void) |
Static Private Member Functions | |
static UINT | CaptureThread (LPVOID pParam) |
Private Attributes | |
CRITICAL_SECTION | m_lock |
UINT | m_cRef |
IMediaObject * | m_pMediaObj |
HANDLE | m_hStopEvent |
HANDLE | m_hDataReady |
CWinThread * | m_captureThread |
MediaBufferStack | m_bufferStack |
MediaBufferQueue | m_bufferQueue |
CWinMediaBuffer * | m_writeBuffer |
CWinMediaBuffer * | m_readBuffer |
ULONG | m_readBufferSize |
ULONG | m_readBufferCount |
ULONG | m_readBufferIndex |
HWAVEOUT | m_hWave |
WAVEHDR * | m_waveHeaders |
ULONG | m_outputBufferNum |
ULONG | m_outputBufferIndex |
Buffer | m_streamData |
Static Private Attributes | |
static const UINT | MaxReadBuffers = 20 |
static const UINT | MaxOutputBuffers = 2*1024*1024 |
Definition at line 30 of file WinAudioStream.h.
CWinAudioStream | ( | IMediaObject * | pObj | ) |
Definition at line 29 of file WinAudioStream.cpp.
References CWinAudioStream::m_captureThread, CWinAudioStream::m_cRef, CWinAudioStream::m_hDataReady, CWinAudioStream::m_hStopEvent, CWinAudioStream::m_hWave, CWinAudioStream::m_lock, CWinAudioStream::m_outputBufferIndex, CWinAudioStream::m_outputBufferNum, CWinAudioStream::m_pMediaObj, CWinAudioStream::m_readBuffer, CWinAudioStream::m_readBufferCount, CWinAudioStream::m_readBufferIndex, CWinAudioStream::m_readBufferSize, CWinAudioStream::m_streamData, CWinAudioStream::m_waveHeaders, and CWinAudioStream::m_writeBuffer.
00030 { 00031 m_cRef = 1; 00032 m_pMediaObj = pObj; 00033 00034 m_writeBuffer = NULL; 00035 m_readBuffer = NULL; 00036 m_readBufferSize = 0; 00037 m_readBufferCount = 0; 00038 m_readBufferIndex = 0; 00039 // 00040 m_hStopEvent = NULL; 00041 m_hDataReady = NULL; 00042 // 00043 m_captureThread = NULL; 00044 00045 m_hWave = NULL; 00046 m_waveHeaders = NULL; 00047 m_outputBufferNum = 0; 00048 m_outputBufferIndex = 0; 00049 00050 m_streamData = init_Buffer(); 00051 00052 if (m_pMediaObj!=NULL) m_pMediaObj->AddRef(); 00053 00054 InitializeCriticalSection(&m_lock); 00055 }
~CWinAudioStream | ( | void | ) | [virtual] |
Definition at line 59 of file WinAudioStream.cpp.
References CWinAudioStream::closeOutput(), CWinAudioStream::m_lock, and CWinAudioStream::stopCapture().
00060 { 00061 DEBUG_INFO("DESTRUCTOR: CWinAudioStream: START\n"); 00062 // 00063 closeOutput(); 00064 stopCapture(); 00065 00066 DeleteCriticalSection(&m_lock); 00067 00068 DEBUG_INFO("DESTRUCTOR: CWinAudioStream: END\n"); 00069 }
void Back2BufferStack | ( | CWinMediaBuffer * | pMediaBuf | ) | [private] |
Definition at line 333 of file WinAudioStream.cpp.
References CWinAudioStream::m_bufferStack, CWinAudioStream::m_lock, and CWinMediaBuffer::SetLength().
Referenced by CWinAudioStream::Back2BufferStackAll(), and CWinAudioStream::ReadOneBuffer().
00334 { 00335 if (pMediaBuf!=NULL) { 00336 EnterCriticalSection(&m_lock); 00337 // 00338 pMediaBuf->SetLength(0); 00339 m_bufferStack.push(pMediaBuf); 00340 // 00341 LeaveCriticalSection(&m_lock); 00342 } 00343 }
void Back2BufferStackAll | ( | void | ) | [private] |
Definition at line 347 of file WinAudioStream.cpp.
References CWinAudioStream::Back2BufferStack(), CWinAudioStream::m_bufferQueue, CWinAudioStream::m_lock, CWinAudioStream::m_readBuffer, and CWinAudioStream::m_readBufferIndex.
Referenced by CWinAudioStream::stopCapture().
00348 { 00349 EnterCriticalSection(&m_lock); 00350 00351 while (m_bufferQueue.size()>0) { 00352 CWinMediaBuffer* pMediaBuf = m_bufferQueue.front(); 00353 m_bufferQueue.pop(); 00354 Back2BufferStack(pMediaBuf); 00355 } 00356 00357 if (m_readBuffer!=NULL) Back2BufferStack(m_readBuffer); 00358 00359 m_readBufferIndex = 0; 00360 m_readBuffer = NULL; 00361 // 00362 LeaveCriticalSection(&m_lock); 00363 }
UINT CaptureThread | ( | void | ) | [private] |
Definition at line 463 of file WinAudioStream.cpp.
References CWinMediaBuffer::clear(), CWinMediaBuffer::GetBufferAndLength(), CWinAudioStream::m_hDataReady, CWinAudioStream::m_hStopEvent, CWinAudioStream::m_pMediaObj, CWinAudioStream::m_readBufferSize, and CWinAudioStream::QueueCapturedData().
Referenced by CWinAudioStream::startCapture().
00464 { 00465 HANDLE mmHandle = NULL; 00466 DWORD mmTaskIndex = 0; 00467 00468 HRESULT hr = S_OK; 00469 bool bContinue = true; 00470 00471 BYTE* pbOutputBuffer = NULL; 00472 CWinMediaBuffer outputBuffer(m_readBufferSize); 00473 00474 DMO_OUTPUT_DATA_BUFFER OutputBufferStruct = {0}; 00475 OutputBufferStruct.pBuffer = (IMediaBuffer*)&outputBuffer; 00476 00477 DWORD dwStatus = 0; 00478 ULONG cbProduced = 0; 00479 00480 // 00481 mmHandle = AvSetMmThreadCharacteristics(_T("Audio"), &mmTaskIndex); 00482 00483 while(bContinue) { 00484 // 00485 if (WaitForSingleObject(m_hStopEvent, 0)==WAIT_OBJECT_0) { 00486 bContinue = false; 00487 continue; 00488 } 00489 00490 do { 00491 outputBuffer.clear(); 00492 OutputBufferStruct.dwStatus = 0; 00493 00494 hr = m_pMediaObj->ProcessOutput(0, 1, &OutputBufferStruct, &dwStatus); 00495 if (FAILED(hr)) { 00496 bContinue = false; 00497 break; 00498 } 00499 else if (hr==S_FALSE) { 00500 cbProduced = 0; 00501 } 00502 else { 00503 outputBuffer.GetBufferAndLength(&pbOutputBuffer, &cbProduced); 00504 } 00505 00506 // Queue にデータを保存 00507 if (cbProduced>0) { 00508 QueueCapturedData(pbOutputBuffer, cbProduced); 00509 //Write(pbOutputBuffer, cbProduced, NULL); // for TEST 00510 } 00511 00512 } while (OutputBufferStruct.dwStatus & DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE); 00513 00514 // 00515 Sleep(10); 00516 } 00517 00518 // 00519 SetEvent(m_hDataReady); 00520 AvRevertMmThreadCharacteristics(mmHandle); 00521 00522 // 00523 if (FAILED(hr)) return FALSE; 00524 return TRUE; 00525 }
UINT CaptureThread | ( | LPVOID | pParam | ) | [static, private] |
Definition at line 455 of file WinAudioStream.cpp.
References CWinAudioStream::CaptureThread().
Referenced by CWinAudioStream::CaptureThread().
00456 { 00457 CWinAudioStream* pthis = (CWinAudioStream*)pParam; 00458 return pthis->CaptureThread(); 00459 }
STDMETHODIMP Clone | ( | IStream ** | ) | [inline] |
Definition at line 94 of file WinAudioStream.h.
void closeOutput | ( | void | ) |
Definition at line 188 of file WinAudioStream.cpp.
References CWinAudioStream::freeOutputHeaders(), and CWinAudioStream::m_hWave.
Referenced by CWinAudioTool::closeOutput(), and CWinAudioStream::~CWinAudioStream().
00189 { 00190 freeOutputHeaders(); 00191 00192 if (m_hWave!=NULL) { 00193 ::waveOutPause(m_hWave); 00194 ::waveOutClose(m_hWave); 00195 m_hWave = NULL; 00196 } 00197 }
STDMETHODIMP Commit | ( | DWORD | ) | [inline] |
Definition at line 89 of file WinAudioStream.h.
STDMETHODIMP CopyTo | ( | IStream * | , | |
ULARGE_INTEGER | , | |||
ULARGE_INTEGER * | , | |||
ULARGE_INTEGER * | ||||
) | [inline] |
Definition at line 88 of file WinAudioStream.h.
void freeOutputHeaders | ( | void | ) | [private] |
Definition at line 223 of file WinAudioStream.cpp.
References CWinAudioStream::m_outputBufferNum, and CWinAudioStream::m_waveHeaders.
Referenced by CWinAudioStream::closeOutput().
00224 { 00225 if (m_waveHeaders==NULL) return; 00226 00227 for (ULONG i=0; i<m_outputBufferNum; i++) { 00228 if (m_waveHeaders[i].lpData!=NULL) { 00229 ::free(m_waveHeaders[i].lpData); 00230 m_waveHeaders[i].lpData = NULL; 00231 } 00232 } 00233 freeNull(m_waveHeaders); 00234 }
CWinMediaBuffer * GetWriteBuffer | ( | void | ) | [private] |
Definition at line 309 of file WinAudioStream.cpp.
References CWinAudioStream::m_bufferQueue, CWinAudioStream::m_bufferStack, CWinAudioStream::m_lock, and CWinMediaBuffer::SetLength().
Referenced by CWinAudioStream::QueueCapturedData().
00310 { 00311 CWinMediaBuffer* pMediaBuf = NULL; 00312 00313 EnterCriticalSection(&m_lock); 00314 00315 if (m_bufferStack.size()>0) { 00316 pMediaBuf = m_bufferStack.top(); 00317 m_bufferStack.pop(); 00318 pMediaBuf->SetLength(0); 00319 } 00320 else if (m_bufferQueue.size()>0) { 00321 pMediaBuf = m_bufferQueue.front(); 00322 m_bufferQueue.pop(); 00323 pMediaBuf->SetLength(0); 00324 } 00325 00326 LeaveCriticalSection(&m_lock); 00327 00328 return pMediaBuf; 00329 }
Buffer input | ( | void | ) |
Definition at line 201 of file WinAudioStream.cpp.
References CWinAudioStream::m_streamData, and CWinAudioStream::Read().
Referenced by CWinAudioTool::getAudioData().
00202 { 00203 if (m_streamData.buf!=NULL) { 00204 ULONG len = 0; 00205 Read((void*)m_streamData.buf, (ULONG)m_streamData.bufsz, &len); 00206 m_streamData.vldsz = (int)len; 00207 } 00208 return m_streamData; 00209 }
BOOL IsCapturing | ( | void | ) | [inline, private] |
Definition at line 145 of file WinAudioStream.h.
References CWinAudioStream::m_hStopEvent.
Referenced by CWinAudioStream::Read().
00146 { 00147 return (m_hStopEvent!=NULL) && (WaitForSingleObject(m_hStopEvent,0)!=WAIT_OBJECT_0); 00148 }
STDMETHODIMP LockRegion | ( | ULARGE_INTEGER | , | |
ULARGE_INTEGER | , | |||
DWORD | ||||
) | [inline] |
Definition at line 91 of file WinAudioStream.h.
BOOL openOutput | ( | ULONG | bufcount = 100 , |
|
WAVEFORMATEX * | format = NULL | |||
) |
Definition at line 153 of file WinAudioStream.cpp.
References CWinAudioStream::m_hWave, CWinAudioStream::m_outputBufferNum, CWinAudioStream::m_pMediaObj, CWinAudioStream::m_waveHeaders, and CWinAudioStream::MaxOutputBuffers.
Referenced by CWinAudioTool::openOutput().
00154 { 00155 if (m_pMediaObj==NULL && fmt==NULL) return FALSE; 00156 00157 // 00158 WAVEFORMATEX format; 00159 if (fmt!=NULL) { 00160 format = *fmt; 00161 } 00162 else { 00163 DMO_MEDIA_TYPE media; 00164 m_pMediaObj->GetOutputCurrentType(0, &media); 00165 format = *(WAVEFORMATEX*)media.pbFormat; 00166 } 00167 00168 // 00169 MMRESULT ret = ::waveOutOpen(&m_hWave, WAVE_MAPPER, &format, NULL, NULL, 0); 00170 if (ret!=MMSYSERR_NOERROR) return FALSE; 00171 00172 m_outputBufferNum = bufcount; 00173 ULONG bufsz = sizeof(WAVEHDR)*m_outputBufferNum; 00174 m_waveHeaders = (WAVEHDR*)malloc(bufsz); 00175 memset(m_waveHeaders, 0, bufsz); 00176 00177 for (ULONG i=0; i<m_outputBufferNum; i++) { 00178 m_waveHeaders[i].lpData = (LPSTR)malloc(MaxOutputBuffers); 00179 m_waveHeaders[i].dwUser = i; 00180 m_waveHeaders[i].dwFlags = WHDR_DONE; 00181 } 00182 00183 return TRUE; 00184 }
void output | ( | Buffer | buf | ) |
Definition at line 213 of file WinAudioStream.cpp.
References CWinAudioStream::Write().
00214 { 00215 if (buf.buf==NULL || buf.vldsz<=0) return; 00216 00217 Write((const void*)buf.buf, (ULONG)buf.vldsz, NULL); 00218 return; 00219 }
STDMETHODIMP QueryInterface | ( | REFIID | riid, | |
void ** | ppv | |||
) | [inline] |
Definition at line 63 of file WinAudioStream.h.
Referenced by CWinAudioTool::init(), and CWinAudioTool::setMediaType().
00064 { 00065 if (riid==IID_IUnknown) { 00066 AddRef(); 00067 *ppv = (IUnknown*)this; 00068 return S_OK; 00069 } 00070 else if (riid==IID_IStream) { 00071 AddRef(); 00072 *ppv = (IStream*)this; 00073 return S_OK; 00074 } 00075 else return E_NOINTERFACE; 00076 }
void QueueCapturedBuffer | ( | CWinMediaBuffer * | pMediaBuf | ) | [private] |
Definition at line 400 of file WinAudioStream.cpp.
References CWinAudioStream::m_bufferQueue, CWinAudioStream::m_hDataReady, and CWinAudioStream::m_lock.
Referenced by CWinAudioStream::QueueCapturedData().
00401 { 00402 EnterCriticalSection(&m_lock); 00403 00404 m_bufferQueue.push(pMediaBuf); 00405 SetEvent(m_hDataReady); 00406 00407 LeaveCriticalSection(&m_lock); 00408 }
void QueueCapturedData | ( | BYTE * | pData, | |
UINT | cbData | |||
) | [private] |
Definition at line 367 of file WinAudioStream.cpp.
References CWinMediaBuffer::GetBufferAndLength(), CWinMediaBuffer::GetMaxLength(), CWinAudioStream::GetWriteBuffer(), CWinAudioStream::m_writeBuffer, CWinAudioStream::QueueCapturedBuffer(), and CWinMediaBuffer::SetLength().
Referenced by CWinAudioStream::CaptureThread().
00368 { 00369 if (cbData<=0) return; 00370 00371 if (m_writeBuffer==NULL) m_writeBuffer = GetWriteBuffer(); 00372 if (m_writeBuffer==NULL) return; 00373 00374 // 00375 BYTE* pWriteData = NULL; 00376 DWORD cbWriteData = 0; 00377 DWORD cbMaxLength = 0; 00378 00379 // 00380 m_writeBuffer->GetBufferAndLength(&pWriteData, &cbWriteData); 00381 m_writeBuffer->GetMaxLength(&cbMaxLength); 00382 00383 if (cbWriteData+cbData<cbMaxLength) { 00384 memcpy(pWriteData+cbWriteData, pData, cbData); 00385 m_writeBuffer->SetLength(cbWriteData + cbData); 00386 } 00387 else { 00388 QueueCapturedBuffer(m_writeBuffer); 00389 // 00390 m_writeBuffer = GetWriteBuffer(); 00391 m_writeBuffer->GetBufferAndLength(&pWriteData, &cbWriteData); 00392 // 00393 memcpy(pWriteData, pData, cbData); 00394 m_writeBuffer->SetLength(cbData); 00395 } 00396 }
STDMETHODIMP Read | ( | void * | pData, | |
ULONG | cbBuffer, | |||
ULONG * | pcbRead | |||
) |
Definition at line 242 of file WinAudioStream.cpp.
References CWinAudioStream::IsCapturing(), CWinAudioStream::m_hDataReady, CWinAudioStream::m_readBuffer, CWinAudioStream::m_readBufferCount, and CWinAudioStream::ReadOneBuffer().
Referenced by CWinAudioStream::input().
00243 { 00244 if (pcbRead==NULL) return E_INVALIDARG; 00245 00246 ULONG bytesPendingToRead = cbBuffer; // バッファの残り 00247 00248 while (bytesPendingToRead>0 && IsCapturing()) { 00249 ReadOneBuffer((BYTE**)&pData, &bytesPendingToRead); 00250 if (m_readBuffer==NULL) WaitForSingleObject(m_hDataReady, INFINITE); 00251 } 00252 00253 ULONG bytesRead = cbBuffer - bytesPendingToRead; // 読み込んだデータ長 00254 m_readBufferCount += bytesRead; 00255 00256 *pcbRead = bytesRead; 00257 00258 return S_OK; 00259 }
void ReadOneBuffer | ( | BYTE ** | ppbData, | |
ULONG * | pcbData | |||
) | [private] |
Definition at line 412 of file WinAudioStream.cpp.
References CWinAudioStream::Back2BufferStack(), CWinMediaBuffer::GetBufferAndLength(), CWinAudioStream::m_bufferQueue, CWinAudioStream::m_lock, CWinAudioStream::m_readBuffer, and CWinAudioStream::m_readBufferIndex.
Referenced by CWinAudioStream::Read().
00413 { 00414 EnterCriticalSection(&m_lock); 00415 00416 // 00417 if (m_readBuffer==NULL) { 00418 if(m_bufferQueue.size()!=0) { 00419 m_readBuffer = m_bufferQueue.front(); 00420 m_bufferQueue.pop(); 00421 } 00422 } 00423 00424 // 00425 if (m_readBuffer!=NULL) { 00426 //Copy as much data as we can or need 00427 BYTE* pData = NULL; 00428 DWORD dwDataLength = 0; 00429 m_readBuffer->GetBufferAndLength(&pData, &dwDataLength); 00430 00431 ULONG cbToCopy = min(dwDataLength-m_readBufferIndex, *pcbData); 00432 memcpy(*ppbData, pData+m_readBufferIndex, cbToCopy); 00433 *ppbData = (*ppbData) + cbToCopy; 00434 *pcbData = (*pcbData) - cbToCopy; 00435 m_readBufferIndex += cbToCopy; 00436 00437 // 00438 if (m_readBufferIndex>=dwDataLength) { 00439 Back2BufferStack(m_readBuffer); 00440 m_readBuffer = NULL; 00441 m_readBufferIndex = 0; 00442 00443 if (m_bufferQueue.size()!=0) { 00444 m_readBuffer = m_bufferQueue.front(); 00445 m_bufferQueue.pop(); 00446 } 00447 } 00448 } 00449 00450 LeaveCriticalSection(&m_lock); 00451 }
STDMETHODIMP Revert | ( | void | ) | [inline] |
Definition at line 90 of file WinAudioStream.h.
STDMETHODIMP Seek | ( | LARGE_INTEGER | dlibMove, | |
DWORD | dwOrigin, | |||
ULARGE_INTEGER * | plibNewPosition | |||
) |
Definition at line 263 of file WinAudioStream.cpp.
References CWinAudioStream::m_readBufferCount.
00264 { 00265 if (plibNewPosition!=NULL) plibNewPosition->QuadPart = m_readBufferCount + dlibMove.QuadPart; 00266 00267 return S_OK; 00268 }
STDMETHODIMP SetSize | ( | ULARGE_INTEGER | ) | [inline] |
Definition at line 87 of file WinAudioStream.h.
BOOL startCapture | ( | WAVEFORMATEX * | format = NULL |
) |
Definition at line 73 of file WinAudioStream.cpp.
References CWinAudioStream::CaptureThread(), CWinAudioStream::m_bufferStack, CWinAudioStream::m_captureThread, CWinAudioStream::m_hDataReady, CWinAudioStream::m_hStopEvent, CWinAudioStream::m_pMediaObj, CWinAudioStream::m_readBufferCount, CWinAudioStream::m_readBufferSize, CWinAudioStream::m_streamData, CWinAudioStream::m_writeBuffer, and CWinAudioStream::MaxReadBuffers.
Referenced by CWinAudioTool::startCapture().
00074 { 00075 if (m_pMediaObj==NULL && fmt==NULL) return FALSE; 00076 00077 m_hStopEvent = CreateEvent(NULL, FALSE, FALSE, NULL); 00078 m_hDataReady = CreateEvent(NULL, FALSE, FALSE, NULL); 00079 m_writeBuffer = NULL; 00080 m_readBufferCount = 0; 00081 00082 // 00083 WAVEFORMATEX format; 00084 if (fmt!=NULL) { 00085 format = *fmt; 00086 } 00087 else { 00088 DMO_MEDIA_TYPE media; 00089 m_pMediaObj->GetOutputCurrentType(0, &media); 00090 format = *(WAVEFORMATEX*)media.pbFormat; 00091 } 00092 00093 // make Stack 00094 m_readBufferSize = format.nSamplesPerSec*format.nBlockAlign; 00095 for (UINT i=0; i<MaxReadBuffers; i++) { 00096 CWinMediaBuffer* pMediaBuf = new CWinMediaBuffer(m_readBufferSize); 00097 m_bufferStack.push(pMediaBuf); 00098 } 00099 m_streamData = make_Buffer(m_readBufferSize); 00100 00101 // スレッドの起動 00102 m_captureThread = AfxBeginThread(CaptureThread, (LPVOID)this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); 00103 m_captureThread->m_bAutoDelete = FALSE; 00104 m_captureThread->ResumeThread(); 00105 ::Sleep(10); 00106 00107 return TRUE; 00108 }
STDMETHODIMP Stat | ( | STATSTG * | , | |
DWORD | ||||
) | [inline] |
Definition at line 93 of file WinAudioStream.h.
STDMETHODIMP_ | ( | ULONG | ) | [inline] |
Definition at line 56 of file WinAudioStream.h.
References CWinAudioStream::m_cRef.
00057 { 00058 UINT ref = InterlockedDecrement(&m_cRef); 00059 if (ref==0) delete this; 00060 return ref; 00061 }
STDMETHODIMP_ | ( | ULONG | ) | [inline] |
Definition at line 54 of file WinAudioStream.h.
References CWinAudioStream::m_cRef.
00054 { return InterlockedIncrement(&m_cRef);}
void stopCapture | ( | void | ) |
Definition at line 112 of file WinAudioStream.cpp.
References CWinAudioStream::Back2BufferStackAll(), CWinAudioStream::m_bufferStack, CWinAudioStream::m_captureThread, CWinAudioStream::m_hDataReady, CWinAudioStream::m_hStopEvent, and CWinAudioStream::m_streamData.
Referenced by CWinAudioTool::stopCapture(), and CWinAudioStream::~CWinAudioStream().
00113 { 00114 if (m_hStopEvent!=NULL) { 00115 SetEvent(m_hStopEvent); 00116 // 00117 if (m_captureThread!=NULL) { 00118 // スレッドが終了するまで待つ 00119 WaitForSingleObject(m_captureThread->m_hThread, INFINITE); 00120 CloseHandle(m_captureThread->m_hThread); 00121 delete m_captureThread; 00122 m_captureThread = NULL; 00123 } 00124 CloseHandle(m_hStopEvent); 00125 m_hStopEvent = NULL; 00126 } 00127 00128 // 00129 if (m_hDataReady!=NULL) { 00130 SetEvent(m_hDataReady); 00131 CloseHandle(m_hDataReady); 00132 m_hDataReady = NULL; 00133 } 00134 00135 // 00136 Back2BufferStackAll(); 00137 00138 // delete Stack 00139 while(!m_bufferStack.empty()) { 00140 CWinMediaBuffer* pMediaBuf = m_bufferStack.top(); 00141 delete pMediaBuf; 00142 m_bufferStack.pop(); 00143 } 00144 00145 // 00146 free_Buffer(&m_streamData); 00147 00148 return; 00149 }
STDMETHODIMP UnlockRegion | ( | ULARGE_INTEGER | , | |
ULARGE_INTEGER | , | |||
DWORD | ||||
) | [inline] |
Definition at line 92 of file WinAudioStream.h.
STDMETHODIMP Write | ( | const void * | pbuf, | |
ULONG | bufsz, | |||
ULONG * | dummy | |||
) |
Definition at line 272 of file WinAudioStream.cpp.
References CWinAudioStream::m_hWave, CWinAudioStream::m_outputBufferIndex, CWinAudioStream::m_outputBufferNum, CWinAudioStream::m_waveHeaders, and CWinAudioStream::MaxOutputBuffers.
Referenced by CWinAudioStream::output().
00273 { 00274 if (pbuf==NULL || bufsz==0 || bufsz>MaxOutputBuffers) return E_INVALIDARG; 00275 00276 WAVEHDR* header = &m_waveHeaders[m_outputBufferIndex]; 00277 if (!(header->dwFlags & WHDR_DONE)) return E_FAIL ; 00278 00279 MMRESULT ret = ::waveOutUnprepareHeader(m_hWave, header, sizeof(WAVEHDR)); 00280 if (ret!=MMSYSERR_NOERROR) return E_FAIL; 00281 00282 header->dwBufferLength = (DWORD)bufsz; 00283 header->dwFlags = 0; 00284 memcpy(header->lpData, pbuf, bufsz); 00285 00286 ret = ::waveOutPrepareHeader(m_hWave, header, sizeof(WAVEHDR)); 00287 if (ret!=MMSYSERR_NOERROR) { 00288 header->dwFlags = WHDR_DONE; 00289 return E_FAIL; 00290 } 00291 00292 ret = ::waveOutWrite(m_hWave, header, sizeof(WAVEHDR)); 00293 if (ret!=MMSYSERR_NOERROR) { 00294 header->dwFlags = WHDR_DONE; 00295 return E_FAIL; 00296 } 00297 00298 m_outputBufferIndex = (m_outputBufferIndex + 1) % m_outputBufferNum; 00299 00300 return S_OK; 00301 }
MediaBufferQueue m_bufferQueue [private] |
Definition at line 111 of file WinAudioStream.h.
Referenced by CWinAudioStream::Back2BufferStackAll(), CWinAudioStream::GetWriteBuffer(), CWinAudioStream::QueueCapturedBuffer(), and CWinAudioStream::ReadOneBuffer().
MediaBufferStack m_bufferStack [private] |
Definition at line 110 of file WinAudioStream.h.
Referenced by CWinAudioStream::Back2BufferStack(), CWinAudioStream::GetWriteBuffer(), CWinAudioStream::startCapture(), and CWinAudioStream::stopCapture().
CWinThread* m_captureThread [private] |
Definition at line 108 of file WinAudioStream.h.
Referenced by CWinAudioStream::CWinAudioStream(), CWinAudioStream::startCapture(), and CWinAudioStream::stopCapture().
UINT m_cRef [private] |
Definition at line 99 of file WinAudioStream.h.
Referenced by CWinAudioStream::CWinAudioStream(), and CWinAudioStream::STDMETHODIMP_().
HANDLE m_hDataReady [private] |
Definition at line 106 of file WinAudioStream.h.
Referenced by CWinAudioStream::CaptureThread(), CWinAudioStream::CWinAudioStream(), CWinAudioStream::QueueCapturedBuffer(), CWinAudioStream::Read(), CWinAudioStream::startCapture(), and CWinAudioStream::stopCapture().
HANDLE m_hStopEvent [private] |
Definition at line 105 of file WinAudioStream.h.
Referenced by CWinAudioStream::CaptureThread(), CWinAudioStream::CWinAudioStream(), CWinAudioStream::IsCapturing(), CWinAudioStream::startCapture(), and CWinAudioStream::stopCapture().
HWAVEOUT m_hWave [private] |
Definition at line 123 of file WinAudioStream.h.
Referenced by CWinAudioStream::closeOutput(), CWinAudioStream::CWinAudioStream(), CWinAudioStream::openOutput(), and CWinAudioStream::Write().
CRITICAL_SECTION m_lock [private] |
Definition at line 97 of file WinAudioStream.h.
Referenced by CWinAudioStream::Back2BufferStack(), CWinAudioStream::Back2BufferStackAll(), CWinAudioStream::CWinAudioStream(), CWinAudioStream::GetWriteBuffer(), CWinAudioStream::QueueCapturedBuffer(), CWinAudioStream::ReadOneBuffer(), and CWinAudioStream::~CWinAudioStream().
ULONG m_outputBufferIndex [private] |
Definition at line 127 of file WinAudioStream.h.
Referenced by CWinAudioStream::CWinAudioStream(), and CWinAudioStream::Write().
ULONG m_outputBufferNum [private] |
Definition at line 126 of file WinAudioStream.h.
Referenced by CWinAudioStream::CWinAudioStream(), CWinAudioStream::freeOutputHeaders(), CWinAudioStream::openOutput(), and CWinAudioStream::Write().
IMediaObject* m_pMediaObj [private] |
Definition at line 100 of file WinAudioStream.h.
Referenced by CWinAudioStream::CaptureThread(), CWinAudioStream::CWinAudioStream(), CWinAudioStream::openOutput(), and CWinAudioStream::startCapture().
CWinMediaBuffer* m_readBuffer [private] |
Definition at line 114 of file WinAudioStream.h.
Referenced by CWinAudioStream::Back2BufferStackAll(), CWinAudioStream::CWinAudioStream(), CWinAudioStream::Read(), and CWinAudioStream::ReadOneBuffer().
ULONG m_readBufferCount [private] |
Definition at line 117 of file WinAudioStream.h.
Referenced by CWinAudioStream::CWinAudioStream(), CWinAudioStream::Read(), CWinAudioStream::Seek(), and CWinAudioStream::startCapture().
ULONG m_readBufferIndex [private] |
Definition at line 118 of file WinAudioStream.h.
Referenced by CWinAudioStream::Back2BufferStackAll(), CWinAudioStream::CWinAudioStream(), and CWinAudioStream::ReadOneBuffer().
ULONG m_readBufferSize [private] |
Definition at line 116 of file WinAudioStream.h.
Referenced by CWinAudioStream::CaptureThread(), CWinAudioStream::CWinAudioStream(), and CWinAudioStream::startCapture().
Buffer m_streamData [private] |
Definition at line 129 of file WinAudioStream.h.
Referenced by CWinAudioStream::CWinAudioStream(), CWinAudioStream::input(), CWinAudioStream::startCapture(), and CWinAudioStream::stopCapture().
WAVEHDR* m_waveHeaders [private] |
Definition at line 124 of file WinAudioStream.h.
Referenced by CWinAudioStream::CWinAudioStream(), CWinAudioStream::freeOutputHeaders(), CWinAudioStream::openOutput(), and CWinAudioStream::Write().
CWinMediaBuffer* m_writeBuffer [private] |
Definition at line 113 of file WinAudioStream.h.
Referenced by CWinAudioStream::CWinAudioStream(), CWinAudioStream::QueueCapturedData(), and CWinAudioStream::startCapture().
const UINT MaxOutputBuffers = 2*1024*1024 [static, private] |
Definition at line 121 of file WinAudioStream.h.
Referenced by CWinAudioStream::openOutput(), and CWinAudioStream::Write().
const UINT MaxReadBuffers = 20 [static, private] |
Definition at line 103 of file WinAudioStream.h.
Referenced by CWinAudioStream::startCapture().