本文整理汇总了C++中VDSignal类的典型用法代码示例。如果您正苦于以下问题:C++ VDSignal类的具体用法?C++ VDSignal怎么用?C++ VDSignal使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了VDSignal类的12个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: GetTickCount
bool VDAudioOutputDirectSoundW32::Finalize(uint32 timeout) {
DWORD deadline = GetTickCount() + timeout;
mMutex.Lock();
for(;;) {
if (mThreadState != kThreadStatePlay || !isThreadAttached() || mDSStreamPlayPosition == mStreamWritePosition)
break;
mMutex.Unlock();
if (timeout == (uint32)-1)
mResponseEvent.wait();
else {
uint32 timeNow = GetTickCount();
sint32 delta = deadline - timeNow;
if (delta < 0)
return false;
mResponseEvent.tryWait(delta);
}
mMutex.Lock();
}
mMutex.Unlock();
return true;
}
开发者ID:KGE-INC,项目名称:VirtualDub,代码行数:27,代码来源:audioout.cpp
示例2: FastWrite
void VDFileAsyncNT::FastWrite(const void *pData, uint32 bytes) {
if (mhFileFast == INVALID_HANDLE_VALUE) {
if (pData)
Write(mClientFastPointer, pData, bytes);
else
WriteZero(mClientFastPointer, bytes);
} else {
if (mpError)
ThrowError();
uint32 bytesLeft = bytes;
while(bytesLeft) {
uint32 actual = mBufferSize - mBufferLevel;
if (actual > bytesLeft)
actual = bytesLeft;
if (mWriteOffset + actual > mBufferSize)
actual = mBufferSize - mWriteOffset;
if (!actual) {
mReadOccurred.wait();
if (mpError)
ThrowError();
continue;
}
if (pData) {
memcpy(&mBuffer[mWriteOffset], pData, actual);
pData = (const char *)pData + actual;
} else {
memset(&mBuffer[mWriteOffset], 0, actual);
}
uint32 oldWriteOffset = mWriteOffset;
mWriteOffset += actual;
if (mWriteOffset >= mBufferSize)
mWriteOffset = 0;
mBufferLevel += actual;
// only bother signaling if the write offset crossed a block boundary
if (oldWriteOffset % mBlockSize + actual >= mBlockSize) {
mWriteOccurred.signal();
if (mpError)
ThrowError();
}
bytesLeft -= actual;
}
}
mClientFastPointer += bytes;
}
开发者ID:Cyberbeing,项目名称:xy-VSFilter,代码行数:53,代码来源:fileasync.cpp
示例3:
bool VDAudioOutputDirectSoundW32::Write(const void *data, uint32 len) {
if (!len)
return true;
mStreamWritePosition += len;
bool wroteData = false;
mMutex.Lock();
while(len > 0) {
uint32 tc = mBufferSize - mBufferLevel;
if (!tc) {
mMutex.Unlock();
if (wroteData) {
mUpdateEvent.signal();
wroteData = false;
}
mResponseEvent.wait();
mMutex.Lock();
continue;
}
if (tc > len)
tc = len;
uint32 contigLeft = mBufferSize - mBufferWriteOffset;
if (tc > contigLeft)
tc = contigLeft;
memcpy(mBuffer.data() + mBufferWriteOffset, data, tc);
mBufferWriteOffset += tc;
if (mBufferWriteOffset >= mBufferSize)
mBufferWriteOffset = 0;
data = (const char *)data + tc;
len -= tc;
wroteData = true;
mBufferLevel += tc;
}
mMutex.Unlock();
if (wroteData)
mUpdateEvent.signal();
return true;
}
开发者ID:KGE-INC,项目名称:VirtualDub,代码行数:51,代码来源:audioout.cpp
示例4: ThreadRun
void ThreadRun() {
mReady.signal();
// There is a race condition here that can allow two log windows to appear,
// but that is not a big deal.
if (!g_hwndLogWindow) {
DialogBox(g_hInst, MAKEINTRESOURCE(IDD_LOG), NULL, LogDlgProc);
g_hwndLogWindow = 0;
} else
SetWindowPos(g_hwndLogWindow, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
}
开发者ID:fishman,项目名称:virtualdub,代码行数:10,代码来源:auxdlg.cpp
示例5:
void VDFileAsync9x::FastWriteEnd() {
FastWrite(NULL, mSectorSize - 1);
mState = kStateFlush;
mWriteOccurred.signal();
ThreadWait();
if (mpError)
ThrowError();
}
开发者ID:Cyberbeing,项目名称:xy-VSFilter,代码行数:10,代码来源:fileasync.cpp
示例6: FastWriteEnd
void VDFileAsyncNT::FastWriteEnd() {
if (mhFileFast != INVALID_HANDLE_VALUE) {
FastWrite(NULL, mSectorSize - 1);
mState = kStateFlush;
mWriteOccurred.signal();
ThreadWait();
}
if (mpError)
ThrowError();
}
开发者ID:Cyberbeing,项目名称:xy-VSFilter,代码行数:11,代码来源:fileasync.cpp
示例7: SafeTruncateAndClose
void VDFileAsyncNT::SafeTruncateAndClose(sint64 pos) {
if (isThreadAttached()) {
mState = kStateAbort;
mWriteOccurred.signal();
ThreadWait();
if (mpError) {
delete mpError;
mpError = NULL;
}
}
if (mhFileSlow != INVALID_HANDLE_VALUE) {
Extend(pos);
Close();
}
}
开发者ID:Cyberbeing,项目名称:xy-VSFilter,代码行数:17,代码来源:fileasync.cpp
示例8: Close
void VDFileAsyncNT::Close() {
mState = kStateAbort;
mWriteOccurred.signal();
ThreadWait();
if (mpError) {
delete mpError;
mpError = NULL;
}
if (mhFileSlow != INVALID_HANDLE_VALUE) {
CloseHandle(mhFileSlow);
mhFileSlow = INVALID_HANDLE_VALUE;
}
if (mhFileFast != INVALID_HANDLE_VALUE) {
CloseHandle(mhFileFast);
mhFileFast = INVALID_HANDLE_VALUE;
}
mpBlocks = NULL;
}
开发者ID:Cyberbeing,项目名称:xy-VSFilter,代码行数:21,代码来源:fileasync.cpp
示例9: sizeof
bool VDAudioOutputDirectSoundW32::Init(uint32 bufsize, uint32 bufcount, const tWAVEFORMATEX *wf, const wchar_t *preferredDevice) {
mBufferSize = bufsize * bufcount;
mBuffer.resize(mBufferSize);
mBufferReadOffset = 0;
mBufferWriteOffset = 0;
mBufferLevel = 0;
if (wf->wFormatTag == WAVE_FORMAT_PCM) {
mInitFormat.resize(sizeof(tWAVEFORMATEX));
memcpy(&*mInitFormat, wf, sizeof(PCMWAVEFORMAT));
mInitFormat->cbSize = 0;
} else
mInitFormat.assign(wf, sizeof(tWAVEFORMATEX) + wf->cbSize);
mMutex.Lock();
mbThreadInited = false;
mbThreadInitSucceeded = false;
mMutex.Unlock();
if (!ThreadStart())
return false;
mMutex.Lock();
while(!mbThreadInited) {
mMutex.Unlock();
HANDLE h[2] = { getThreadHandle(), mUpdateEvent.getHandle() };
if (WaitForMultipleObjects(2, h, FALSE, INFINITE) != WAIT_OBJECT_0 + 1)
break;
mMutex.Lock();
}
bool succeeded = mbThreadInitSucceeded;
mMutex.Unlock();
return succeeded;
}
开发者ID:KGE-INC,项目名称:VirtualDub,代码行数:37,代码来源:audioout.cpp
示例10: if
void VDAudioOutputDirectSoundW32::ThreadRun() {
if (!InitDirectSound()) {
ShutdownDirectSound();
mMutex.Lock();
mbThreadInited = true;
mbThreadInitSucceeded = false;
mMutex.Unlock();
mUpdateEvent.signal();
return;
}
ThreadState threadState = kThreadStateStop;
uint32 lastInitCount = 0;
bool underflow = false;
bool playing = false;
uint32 dsStreamWritePosition = 0;
if (!InitPlayback()) {
ShutdownDirectSound();
mMutex.Lock();
mbThreadInited = true;
mbThreadInitSucceeded = false;
mMutex.Unlock();
mUpdateEvent.signal();
return;
}
mMutex.Lock();
mbThreadInited = true;
mbThreadInitSucceeded = true;
mUpdateEvent.signal();
mMutex.Unlock();
for(;;) {
if (playing)
mUpdateEvent.tryWait(10);
else
mUpdateEvent.wait();
mMutex.Lock();
threadState = (ThreadState)mThreadState;
mMutex.Unlock();
if (threadState == kThreadStatePlay) {
if (!underflow) {
StartPlayback();
playing = true;
}
} else {
StopPlayback();
playing = false;
}
if (threadState == kThreadStateExit)
break;
if (!playing)
continue;
Cursors cursors;
if (!ReadCursors(cursors))
continue;
uint32 level;
mMutex.Lock();
level = mBufferLevel;
// Compute current buffering level.
sint32 bufferedLevel = mDSWriteCursor - cursors.mPlayCursor;
if (bufferedLevel > (sint32)mDSBufferSizeHalf)
bufferedLevel -= mDSBufferSize;
else if (bufferedLevel < -(sint32)mDSBufferSizeHalf)
bufferedLevel += mDSBufferSize;
if (bufferedLevel < 0) {
bufferedLevel = 0;
mDSWriteCursor = cursors.mWriteCursor;
}
// Compute the stream play position. This should never go backward. If it
// has, we have underflowed.
uint32 newDSStreamPlayPos = dsStreamWritePosition - bufferedLevel;
if (newDSStreamPlayPos < mDSStreamPlayPosition) {
mDSStreamPlayPosition = dsStreamWritePosition;
bufferedLevel = 0;
}
mDSBufferedBytes = bufferedLevel;
mMutex.Unlock();
if (!level) {
if (!underflow && playing) {
// Check for underflow.
if (!bufferedLevel) {
StopPlayback();
playing = false;
}
//.........这里部分代码省略.........
开发者ID:KGE-INC,项目名称:VirtualDub,代码行数:101,代码来源:audioout.cpp
示例11: GetLastError
void VDFileAsync9x::ThreadRun() {
bool bPreemptiveExtend = mbPreemptiveExtend;
sint64 currentSize;
sint64 pos = 0;
uint32 bufferSize = mBlockCount * mBlockSize;
HANDLE hFile = mhFileFast != INVALID_HANDLE_VALUE ? mhFileFast : mhFileSlow;
try {
if (bPreemptiveExtend && !VDGetFileSizeW32(hFile, currentSize))
throw MyWin32Error("I/O error on file \"%s\": %%s", GetLastError(), mFilename.c_str());
for(;;) {
int state = mState;
if (state == kStateAbort)
break;
int actual;
const void *p = mBuffer.LockRead(mBlockSize, actual);
if ((uint32)actual < mBlockSize) {
if (state == kStateNormal) {
mWriteOccurred.wait();
continue;
}
VDASSERT(state == kStateFlush);
actual &= ~(mSectorSize-1);
if (!actual)
break;
} else {
if (bPreemptiveExtend) {
sint64 checkpt = pos + mBlockSize + bufferSize;
if (checkpt > currentSize) {
currentSize += bufferSize;
if (currentSize < checkpt)
currentSize = checkpt;
if (!VDSetFilePointerW32(hFile, currentSize, FILE_BEGIN)
|| !SetEndOfFile(hFile))
mbPreemptiveExtend = bPreemptiveExtend = false;
if (!VDSetFilePointerW32(hFile, pos, FILE_BEGIN))
throw MyWin32Error("Seek error occurred on file \"%s\": %%s\n", GetLastError(), mFilename.c_str());
}
}
}
DWORD dwActual;
if (!WriteFile(hFile, p, actual, &dwActual, NULL) || dwActual != actual) {
DWORD dwError = GetLastError();
throw MyWin32Error("Write error occurred on file \"%s\": %%s\n", dwError, mFilename.c_str());
}
pos += actual;
mBuffer.UnlockRead(actual);
mReadOccurred.signal();
}
} catch(MyError& e) {
MyError *p = new MyError;
p->TransferFrom(e);
delete mpError.xchg(p);
mReadOccurred.signal();
}
}
开发者ID:Cyberbeing,项目名称:xy-VSFilter,代码行数:70,代码来源:fileasync.cpp
示例12: ThreadRun
void VDFileAsyncNT::ThreadRun() {
int requestHead = 0;
int requestTail = 0;
int requestCount = mBlockCount;
uint32 pendingLevel = 0;
uint32 readOffset = 0;
bool bPreemptiveExtend = mbPreemptiveExtend;
sint64 currentSize;
try {
if (!VDGetFileSizeW32(mhFileFast, currentSize))
throw MyWin32Error("I/O error on file \"%s\": %%s", GetLastError(), mFilename.c_str());
for(;;) {
int state = mState;
if (state == kStateAbort) {
typedef BOOL (WINAPI *tpCancelIo)(HANDLE);
static const tpCancelIo pCancelIo = (tpCancelIo)GetProcAddress(GetModuleHandle(L"kernel32"), "CancelIo");
pCancelIo(mhFileFast);
// Wait for any pending blocks to complete.
for(int i=0; i<requestCount; ++i) {
VDFileAsyncNTBuffer& buf = mpBlocks[i];
if (buf.mbActive) {
WaitForSingleObject(buf.hEvent, INFINITE);
buf.mbActive = false;
}
}
break;
}
uint32 actual = mBufferLevel - pendingLevel;
VDASSERT((int)actual >= 0);
if (readOffset + actual > mBufferSize)
actual = mBufferSize - readOffset;
if (actual < mBlockSize) {
if (state == kStateNormal || actual < mSectorSize) {
// check for blocks that have completed
bool blocksCompleted = false;
for(;;) {
VDFileAsyncNTBuffer& buf = mpBlocks[requestTail];
if (!buf.mbActive) {
if (state == kStateFlush)
goto all_done;
if (!blocksCompleted) {
// wait for further writes
mWriteOccurred.wait();
}
break;
}
if (buf.mbPending) {
HANDLE h[2] = {buf.hEvent, mWriteOccurred.getHandle()};
DWORD waitResult = WaitForMultipleObjects(2, h, FALSE, INFINITE);
if (waitResult == WAIT_OBJECT_0+1) // write pending
break;
DWORD dwActual;
if (!GetOverlappedResult(mhFileFast, &buf, &dwActual, TRUE))
throw MyWin32Error("Write error occurred on file \"%s\": %%s", GetLastError(), mFilename.c_str());
}
buf.mbActive = false;
blocksCompleted = true;
if (++requestTail >= requestCount)
requestTail = 0;
mBufferLevel -= buf.mLength;
pendingLevel -= buf.mLength;
VDASSERT((int)mBufferLevel >= 0);
VDASSERT((int)pendingLevel >= 0);
mReadOccurred.signal();
}
continue;
}
VDASSERT(state == kStateFlush);
actual &= ~(mSectorSize-1);
VDASSERT(actual > 0);
} else {
actual = mBlockSize;
if (bPreemptiveExtend) {
sint64 checkpt = mFastPointer + mBlockSize + mBufferSize;
if (checkpt > currentSize) {
currentSize += mBufferSize;
//.........这里部分代码省略.........
开发者ID:Cyberbeing,项目名称:xy-VSFilter,代码行数:101,代码来源:fileasync.cpp
注:本文中的VDSignal类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论