(FAILED(m_pDSBuf->Lock( m_dwNextPlayOffset, lLockSize, &pvStreamData1, &dwStreamLength1, &pvStreamData2, &dwStreamLength2, 0L))) return FALSE; if(m_stream_handler) m_stream_handler->AdoStreamData((BYTE *)pvStreamData1, dwStreamLength1) ; m_dwNextPlayOffset += dwStreamLength1; m_dwNextPlayOffset %= m_dwPlayBufSize; if(pvStreamData2 != NULL) { if(m_stream_handler) m_stream_handler->AdoStreamData((BYTE *)pvStreamData2, dwStreamLength2) ; m_dwNextPlayOffset += dwStreamLength2; m_dwNextPlayOffset %= m_dwPlayBufSize; } m_pDSBuf->Unlock(pvStreamData1, dwStreamLength1, pvStreamData2, dwStreamLength2) ; return TRUE; } BOOL CStreamAudio::CtrlStream(BOOL bPlaying) { HRESULT hr ; int i; m_bPlaying = bPlaying ; if(m_bPlaying) { m_pDSBuf = CreateStreamBuffer(m_pDS, &m_wfxOutput) ; if(m_pDSBuf == NULL) return FALSE ; if(FAILED(m_pDSBuf->QueryInterface(IID_IDirectSoundNotify8, (void**)(&m_pDSNotify)))) return FALSE ; m_hNotifyEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); for( i = 0; i < NUM_REC_NOTIFICATIONS; i++ ) { m_aPosNotify[i].dwOffset = (m_dwNotifySize * i) + m_dwNotifySize - 1; m_aPosNotify[i].hEventNotify = m_hNotifyEvent; } if( FAILED( hr = m_pDSNotify->SetNotificationPositions( NUM_REC_NOTIFICATIONS, m_aPosNotify ) ) ) return S_FALSE ; m_dwNextPlayOffset = 0 ; LoadStreamData() ; m_pDSBuf->SetCurrentPosition(0); m_pDSBuf->SetVolume(DSBVOLUME_MAX); m_pDSBuf->Play(0,0,DSBPLAY_LOOPING); AfxBeginThread(CStreamAudio::notify_stream_thd, (LPVOID)(this)) ; } else { Sleep(500) ; if(m_pDSBuf) m_pDSBuf->Stop(); if(m_hNotifyEvent) { CloseHandle(m_hNotifyEvent) ; m_hNotifyEvent = NULL ; } SAFE_RELEASE(m_pDSBuf) ; } return TRUE ; } BOOL CStreamAudio::SetWavFormat(WAVEFORMATEX * wfx) { ZeroMemory(wfx, sizeof(WAVEFORMATEX)) ; wfx->wFormatTag = WAVE_FORMAT_PCM; wfx->nSamplesPerSec = 8000 ; wfx->wBitsPerSample = 16 ; wfx->nChannels = 1 ; wfx->nBlockAlign = wfx->nChannels * ( wfx->wBitsPerSample / 8 ) ; wfx->nAvgBytesPerSec = wfx->nBlockAlign * wfx->nSamplesPerSec; return TRUE ; }
(陈罡) |