CWinAudioStream Class Reference

#include <WinAudioStream.h>

Collaboration diagram for CWinAudioStream:
Collaboration graph
[legend]

List of all members.

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)
CWinMediaBufferGetWriteBuffer (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
CWinMediaBufferm_writeBuffer
CWinMediaBufferm_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

Detailed Description

Definition at line 30 of file WinAudioStream.h.


Constructor & Destructor Documentation

CWinAudioStream ( IMediaObject *  pObj  ) 
~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 }

Here is the call graph for this function:


Member Function Documentation

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

STDMETHODIMP Clone ( IStream **   )  [inline]

Definition at line 94 of file WinAudioStream.h.

00094 { return E_NOTIMPL;}

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

STDMETHODIMP Commit ( DWORD   )  [inline]

Definition at line 89 of file WinAudioStream.h.

00089 { return E_NOTIMPL;}

STDMETHODIMP CopyTo ( IStream *  ,
ULARGE_INTEGER  ,
ULARGE_INTEGER *  ,
ULARGE_INTEGER *   
) [inline]

Definition at line 88 of file WinAudioStream.h.

00088 { return E_NOTIMPL;}

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 }

Here is the caller graph for this function:

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

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     }

Here is the caller graph for this function:

STDMETHODIMP LockRegion ( ULARGE_INTEGER  ,
ULARGE_INTEGER  ,
DWORD   
) [inline]

Definition at line 91 of file WinAudioStream.h.

00091 { return E_NOTIMPL;}

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 }

Here is the caller graph for this function:

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 }

Here is the call graph for this function:

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     }

Here is the caller graph for this function:

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 }

Here is the caller graph for this function:

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

STDMETHODIMP Revert ( void   )  [inline]

Definition at line 90 of file WinAudioStream.h.

00090 { return E_NOTIMPL;}

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.

00087 { return E_NOTIMPL;}

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

STDMETHODIMP Stat ( STATSTG *  ,
DWORD   
) [inline]

Definition at line 93 of file WinAudioStream.h.

00093 { return E_NOTIMPL;}

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

STDMETHODIMP UnlockRegion ( ULARGE_INTEGER  ,
ULARGE_INTEGER  ,
DWORD   
) [inline]

Definition at line 92 of file WinAudioStream.h.

00092 { return E_NOTIMPL;}

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 }

Here is the caller graph for this function:


Member Data Documentation

CWinThread* m_captureThread [private]
UINT m_cRef [private]
HANDLE m_hDataReady [private]
HANDLE m_hStopEvent [private]
HWAVEOUT m_hWave [private]
CRITICAL_SECTION m_lock [private]
ULONG m_outputBufferIndex [private]

Definition at line 127 of file WinAudioStream.h.

Referenced by CWinAudioStream::CWinAudioStream(), and CWinAudioStream::Write().

ULONG m_outputBufferNum [private]
IMediaObject* m_pMediaObj [private]
ULONG m_readBufferCount [private]
ULONG m_readBufferIndex [private]
ULONG m_readBufferSize [private]
Buffer m_streamData [private]
WAVEHDR* m_waveHeaders [private]
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().


The documentation for this class was generated from the following files:

Generated on 15 Nov 2023 for JunkBox_Win_Lib by  doxygen 1.6.1