bool VDAudioOutputWaveOutW32::WaitBuffers(uint32 timeout) { if (mCurState == kStateSilent) return true; if (mhWaveOut && timeout) { for(;;) { if (WAIT_OBJECT_0 != WaitForSingleObject(mhWaveEvent, timeout)) return false; if (CheckBuffers()) return true; } } return CheckBuffers(); }
static A_STATUS DoOneMboxHWTest(AR6K_DEVICE *pDev, int mbox) { A_STATUS status; do { /* send out buffers */ status = SendBuffers(pDev,mbox); if (status != A_OK) { AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Sending buffers Failed : %d mbox:%d\n",status,mbox)); break; } /* go get them, this will block */ status = RecvBuffers(pDev, mbox); if (status != A_OK) { AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Recv buffers Failed : %d mbox:%d\n",status,mbox)); break; } /* check the returned data patterns */ if (!CheckBuffers()) { AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Buffer Verify Failed : mbox:%d\n",mbox)); status = A_ERROR; break; } AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, (" Send/Recv success! mailbox : %d \n",mbox)); } while (FALSE); return status; }
static int DoOneMboxHWTest(struct ar6k_device *pDev, int mbox) { int status; do { /* send out buffers */ status = SendBuffers(pDev,mbox); if (status) { AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Sending buffers Failed : %d mbox:%d\n",status,mbox)); break; } /* go get them, this will block */ status = RecvBuffers(pDev, mbox); if (status) { AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Recv buffers Failed : %d mbox:%d\n",status,mbox)); break; } /* check the returned data patterns */ if (!CheckBuffers()) { AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Buffer Verify Failed : mbox:%d\n",mbox)); status = A_ERROR; break; } AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, (" Send/Recv success! mailbox : %d \n",mbox)); } while (false); return status; }
bool VDAudioOutputWaveOutW32::IsFrozen() { if (mCurState != kStatePlaying) return true; CheckBuffers(); return !mBlocksPending; }
uint32 VDAudioOutputWaveOutW32::GetBufferLevel() { CheckBuffers(); uint32 level = mBlocksPending * mBlockSize; if (mBlockWriteOffset) { level -= mBlockSize; level += mBlockWriteOffset; } return level; }
bool VDAudioOutputWaveOutW32::Finalize(uint32 timeout) { if (mCurState == kStateSilent) return true; Flush(); while(CheckBuffers(), mBlocksPending) { if (WAIT_OBJECT_0 != WaitForSingleObject(mhWaveEvent, timeout)) return false; } return true; }
bool VDAudioOutputWaveOutW32::Stop() { if (mCurState == kStateSilent) return true; if (mCurState >= kStateOpened) { if (MMSYSERR_NOERROR != waveOutReset(mhWaveOut)) return false; mCurState = kStateOpened; CheckBuffers(); } return true; }
bool VDAudioOutputWaveOutW32::Write(const void *data, uint32 len) { if (mCurState == kStateSilent) return true; CheckBuffers(); while(len) { if (mBlocksPending >= mBlockCount) { if (mCurState == kStateOpened) { if (!Start()) return false; } if (!WaitBuffers(0)) { if (!WaitBuffers(INFINITE)) { return false; } continue; } break; } WAVEHDR& hdr = mHeaders[mBlockTail]; uint32 tc = mBlockSize - mBlockWriteOffset; if (tc > len) tc = len; if (tc) { if (data) { memcpy((char *)hdr.lpData + mBlockWriteOffset, data, tc); data = (const char *)data + tc; } else memset((char *)hdr.lpData + mBlockWriteOffset, 0, tc); mBlockWriteOffset += tc; len -= tc; } if (mBlockWriteOffset >= mBlockSize) { if (!Flush()) return false; } } return true; }
uint32 VDAudioOutputWaveOutW32::GetAvailSpace() { CheckBuffers(); return (mBlockCount - mBlocksPending) * mBlockSize - mBlockWriteOffset; }