亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cpi_circlebuffer.c

?? < VC++視頻音頻開發>> 這本書的源碼
?? C
字號:




#include "stdafx.h"
#include "globals.h"
#include "CPI_CircleBuffer.h"


#define CIC_WAITTIMEOUT		3000
void CircleBufferUninitialise(CPs_CircleBuffer* pCBuffer);
void CircleBufferWrite(CPs_CircleBuffer* pCBuffer, const void* pSourceBuffer, const unsigned int iNumBytes);
BOOL CircleBufferRead(CPs_CircleBuffer* pCBuffer, void* pDestBuffer, const unsigned int iBytesToRead, unsigned int* pbBytesRead);
void CircleFlush(CPs_CircleBuffer* pCBuffer);
unsigned int CircleGetFreeSpace(CPs_CircleBuffer* pCBuffer);
unsigned int CircleGetUsedSpace(CPs_CircleBuffer* pCBuffer);
void CircleSetComplete(CPs_CircleBuffer* pCBuffer);
BOOL CircleIsComplete(CPs_CircleBuffer* pCBuffer);
////////////////////////////////////////////////////////////////////////////////

CPs_CircleBuffer* CP_CreateCircleBuffer(const unsigned int iBufferSize)
{
    CPs_CircleBuffer* pNewBuffer = (CPs_CircleBuffer*)malloc(sizeof(CPs_CircleBuffer));

    pNewBuffer->Uninitialise = CircleBufferUninitialise;
    pNewBuffer->Write = CircleBufferWrite;
    pNewBuffer->Read = CircleBufferRead;
    pNewBuffer->Flush = CircleFlush;
    pNewBuffer->GetUsedSize = CircleGetUsedSpace;
    pNewBuffer->GetFreeSize = CircleGetFreeSpace;
    pNewBuffer->SetComplete = CircleSetComplete;
    pNewBuffer->IsComplete = CircleIsComplete;

    pNewBuffer->m_iBufferSize = iBufferSize;
    pNewBuffer->m_pBuffer = (BYTE*)malloc(iBufferSize);
    pNewBuffer->m_iReadCursor = 0;
    pNewBuffer->m_iWriteCursor = 0;
    pNewBuffer->m_bComplete = FALSE;
    pNewBuffer->m_evtDataAvailable = CreateEvent(NULL, FALSE, FALSE, NULL);
    InitializeCriticalSection(&pNewBuffer->m_csCircleBuffer);

    return pNewBuffer;
}
//
//
//
void CircleBufferUninitialise(CPs_CircleBuffer* pCBuffer)
{
    CP_CHECKOBJECT(pCBuffer);
    DeleteCriticalSection(&pCBuffer->m_csCircleBuffer);
    CloseHandle(pCBuffer->m_evtDataAvailable);
    free(pCBuffer->m_pBuffer);
    free(pCBuffer);
}
//
//
//
void CircleBufferWrite(CPs_CircleBuffer* pCBuffer, const void* _pSourceBuffer, const unsigned int _iNumBytes)
{
    unsigned int iBytesToWrite = _iNumBytes;
    BYTE* pReadCursor = (BYTE*)_pSourceBuffer;

    CP_ASSERT(iBytesToWrite <= pCBuffer->GetFreeSize(pCBuffer));
    CP_ASSERT(pCBuffer->m_bComplete == FALSE);

    EnterCriticalSection(&pCBuffer->m_csCircleBuffer);

    if(pCBuffer->m_iWriteCursor >= pCBuffer->m_iReadCursor)
    {
        unsigned int iChunkSize = pCBuffer->m_iBufferSize - pCBuffer->m_iWriteCursor;
        if(iChunkSize > iBytesToWrite)
            iChunkSize = iBytesToWrite;

        memcpy(pCBuffer->m_pBuffer + pCBuffer->m_iWriteCursor,
               pReadCursor, iChunkSize);
        pReadCursor += iChunkSize;
        iBytesToWrite -= iChunkSize;

        pCBuffer->m_iWriteCursor += iChunkSize;
        if(pCBuffer->m_iWriteCursor >= pCBuffer->m_iBufferSize)
            pCBuffer->m_iWriteCursor -= pCBuffer->m_iBufferSize;
    }

    if(iBytesToWrite)
    {
        memcpy(pCBuffer->m_pBuffer + pCBuffer->m_iWriteCursor,
               pReadCursor, iBytesToWrite);
        pCBuffer->m_iWriteCursor += iBytesToWrite;
        CP_ASSERT(pCBuffer->m_iWriteCursor < pCBuffer->m_iBufferSize);
    }

    SetEvent(pCBuffer->m_evtDataAvailable);
    LeaveCriticalSection(&pCBuffer->m_csCircleBuffer);
}
//

BOOL CircleBufferRead(CPs_CircleBuffer* pCBuffer, void* pDestBuffer, const unsigned int _iBytesToRead, unsigned int* pbBytesRead)
{
    unsigned int iBytesToRead = _iBytesToRead;
    unsigned int iBytesRead = 0;
    DWORD dwWaitResult;
    BOOL bComplete = FALSE;
    CP_CHECKOBJECT(pCBuffer);

    while(iBytesToRead > 0 && bComplete == FALSE)
    {
        dwWaitResult = WaitForSingleObject(pCBuffer->m_evtDataAvailable, CIC_WAITTIMEOUT);
        if(dwWaitResult == WAIT_TIMEOUT)
        {
            CP_TRACE0("Circle buffer - did not fill in time!");
            *pbBytesRead = iBytesRead;
            return FALSE;
        }

        EnterCriticalSection(&pCBuffer->m_csCircleBuffer);

        if(pCBuffer->m_iReadCursor > pCBuffer->m_iWriteCursor)
        {
            unsigned int iChunkSize = pCBuffer->m_iBufferSize - pCBuffer->m_iReadCursor;
            if(iChunkSize > iBytesToRead)
                iChunkSize = iBytesToRead;

            memcpy((BYTE*)pDestBuffer + iBytesRead,
                   pCBuffer->m_pBuffer + pCBuffer->m_iReadCursor,
                   iChunkSize);

            iBytesRead += iChunkSize;
            iBytesToRead -= iChunkSize;

            pCBuffer->m_iReadCursor += iChunkSize;
            if(pCBuffer->m_iReadCursor >= pCBuffer->m_iBufferSize)
                pCBuffer->m_iReadCursor -= pCBuffer->m_iBufferSize;
        }

        if(iBytesToRead && pCBuffer->m_iReadCursor < pCBuffer->m_iWriteCursor)
        {
            unsigned int iChunkSize = pCBuffer->m_iWriteCursor - pCBuffer->m_iReadCursor;
            if(iChunkSize > iBytesToRead)
                iChunkSize = iBytesToRead;

            memcpy((BYTE*)pDestBuffer + iBytesRead,
                   pCBuffer->m_pBuffer + pCBuffer->m_iReadCursor,
                   iChunkSize);

            iBytesRead += iChunkSize;
            iBytesToRead -= iChunkSize;
            pCBuffer->m_iReadCursor += iChunkSize;
        }

        if(pCBuffer->m_iReadCursor == pCBuffer->m_iWriteCursor)
        {
            if(pCBuffer->m_bComplete)
                bComplete = TRUE;
        }
        else
            SetEvent(pCBuffer->m_evtDataAvailable);

        LeaveCriticalSection(&pCBuffer->m_csCircleBuffer);
    }

    *pbBytesRead = iBytesRead;
    return bComplete ? FALSE : TRUE;
}
//
//
//
void CircleFlush(CPs_CircleBuffer* pCBuffer)
{
    CP_CHECKOBJECT(pCBuffer);

    EnterCriticalSection(&pCBuffer->m_csCircleBuffer);
    pCBuffer->m_iReadCursor = 0;
    pCBuffer->m_iWriteCursor = 0;
    LeaveCriticalSection(&pCBuffer->m_csCircleBuffer);
}
//
//
//
unsigned int CircleGetFreeSpace(CPs_CircleBuffer* pCBuffer)
{
    unsigned int iNumBytesFree;

    CP_CHECKOBJECT(pCBuffer);
    EnterCriticalSection(&pCBuffer->m_csCircleBuffer);

    if(pCBuffer->m_iWriteCursor < pCBuffer->m_iReadCursor)
        iNumBytesFree = (pCBuffer->m_iReadCursor-1) - pCBuffer->m_iWriteCursor;
    else if(pCBuffer->m_iWriteCursor == pCBuffer->m_iReadCursor)
        iNumBytesFree = pCBuffer->m_iBufferSize;
    else
        iNumBytesFree = (pCBuffer->m_iReadCursor-1) + (pCBuffer->m_iBufferSize - pCBuffer->m_iWriteCursor);

    LeaveCriticalSection(&pCBuffer->m_csCircleBuffer);
    return iNumBytesFree;
}
//
//
//
unsigned int CircleGetUsedSpace(CPs_CircleBuffer* pCBuffer)
{
    return pCBuffer->m_iBufferSize - CircleGetFreeSpace(pCBuffer);
}
//
//
//
void CircleSetComplete(CPs_CircleBuffer* pCBuffer)
{
    CP_CHECKOBJECT(pCBuffer);

    EnterCriticalSection(&pCBuffer->m_csCircleBuffer);
    pCBuffer->m_bComplete = TRUE;
    SetEvent(pCBuffer->m_evtDataAvailable);
    LeaveCriticalSection(&pCBuffer->m_csCircleBuffer);
}
//
//
//
BOOL CircleIsComplete(CPs_CircleBuffer* pCBuffer)
{
    return pCBuffer->m_bComplete;
}
//
//
//

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产欧美在线| 色综合久久中文字幕综合网| 国产喷白浆一区二区三区| 大美女一区二区三区| 国产精品久久99| 色94色欧美sute亚洲线路一ni | 麻豆一区二区三区| 亚洲精品在线观| 国产精华液一区二区三区| 国产精品三级av| 欧美在线综合视频| 免费高清不卡av| 国产亚洲欧美在线| 色综合久久中文字幕| 日本中文字幕一区| 久久精品夜夜夜夜久久| 91丨porny丨国产入口| 午夜影视日本亚洲欧洲精品| 精品处破学生在线二十三| 成人激情视频网站| 亚洲高清免费在线| 久久新电视剧免费观看| 91片黄在线观看| 蜜臀91精品一区二区三区| 国产午夜亚洲精品不卡| 欧美亚洲一区三区| 久久99国产精品久久99| 亚洲同性同志一二三专区| 欧美人与性动xxxx| 国产不卡视频在线观看| 亚洲尤物视频在线| 久久免费偷拍视频| 欧美图区在线视频| 99精品视频在线免费观看| 波多野结衣中文字幕一区| 国产精品中文字幕日韩精品| 欧洲日韩一区二区三区| 精品一区二区三区在线观看国产| 亚洲欧洲精品成人久久奇米网| 欧美人妖巨大在线| 成人免费毛片嘿嘿连载视频| 午夜在线成人av| 国产偷国产偷精品高清尤物| 欧美日韩在线播放三区四区| 国产99久久久久久免费看农村| 午夜欧美2019年伦理| 欧美极品少妇xxxxⅹ高跟鞋| 欧美人妖巨大在线| 99久久久精品免费观看国产蜜| 免费在线观看一区| 亚洲欧美视频在线观看视频| 26uuu精品一区二区| 欧美性大战久久| 成人网页在线观看| 美脚の诱脚舐め脚责91| 亚洲免费观看高清完整版在线 | 日韩免费高清电影| 日本高清不卡视频| 国产福利一区二区| 日韩精品亚洲一区| 亚洲乱码国产乱码精品精小说| 精品国产麻豆免费人成网站| 欧美日韩综合在线| av电影在线观看不卡| 久久国产尿小便嘘嘘尿| 亚洲伊人色欲综合网| 中文字幕一区二区三区精华液 | 久久国产综合精品| 伊人色综合久久天天人手人婷| 久久综合久久综合久久| 欧美精品第1页| 91麻豆免费视频| 成人一区在线看| 国产一区二区不卡| 麻豆中文一区二区| 亚洲一区二区高清| 日韩久久一区二区| 中文字幕免费不卡| 久久免费精品国产久精品久久久久| 欧美卡1卡2卡| 在线视频欧美精品| k8久久久一区二区三区| 国产成人精品亚洲午夜麻豆| 精品一区二区三区在线观看 | 欧美一区二区私人影院日本| 专区另类欧美日韩| 中文字幕不卡三区| 久久久久9999亚洲精品| 日韩免费一区二区| 88在线观看91蜜桃国自产| 在线观看亚洲成人| 91久久国产综合久久| 99久久久精品| 91一区在线观看| 99久久伊人网影院| 成人理论电影网| 高清视频一区二区| 成人免费视频视频| 国产99精品国产| 丁香啪啪综合成人亚洲小说| 国产成人av影院| 高清国产一区二区| 成人白浆超碰人人人人| 丁香激情综合国产| 国产剧情在线观看一区二区| 国产精品羞羞答答xxdd| 国产精品亚洲一区二区三区妖精 | 91麻豆精品国产| 3751色影院一区二区三区| 91精品久久久久久久99蜜桃| 91精品国产91久久综合桃花| 日韩你懂的在线播放| 精品国产一区二区三区四区四 | 狠狠色丁香婷综合久久| 狠狠狠色丁香婷婷综合激情| 国产在线视频一区二区三区| 国产伦精品一区二区三区免费迷| 国产精品一区久久久久| 国产v日产∨综合v精品视频| 成人av资源在线观看| 91在线精品一区二区三区| 色八戒一区二区三区| 欧美日韩美女一区二区| 日韩午夜激情电影| 久久久99久久| 中文字幕一区二区三区四区| 一区二区在线观看av| 亚洲成av人在线观看| 麻豆久久一区二区| 国产福利一区在线| 99视频一区二区三区| 欧美丝袜丝交足nylons图片| 91精品欧美一区二区三区综合在| 欧美精品一区二区久久婷婷| 中文字幕乱码日本亚洲一区二区| 亚洲欧美另类小说| 日韩二区三区四区| 国产精品一二三四五| 91网站最新网址| 91精品久久久久久久久99蜜臂| 欧美精品一区二区三区高清aⅴ | 国产精品白丝jk白祙喷水网站 | 欧美一级在线视频| 久久这里只有精品6| 亚洲天堂免费在线观看视频| 亚洲第一av色| 黄色资源网久久资源365| 成人黄色在线看| 欧美日韩一区成人| 久久综合99re88久久爱| www.日韩av| 91精品国产综合久久久久久久| 久久久久久免费网| 亚洲最色的网站| 狠狠色综合播放一区二区| 99国产欧美久久久精品| 欧美日本一道本在线视频| 国产午夜精品理论片a级大结局| 国产精品夫妻自拍| 日日摸夜夜添夜夜添国产精品| 国产一区二区日韩精品| 欧洲av一区二区嗯嗯嗯啊| 精品国产电影一区二区| 最新日韩av在线| 男人的j进女人的j一区| 91亚洲大成网污www| 日韩欧美你懂的| 亚洲三级视频在线观看| 久久国产乱子精品免费女| 色美美综合视频| 久久久久九九视频| 亚洲第一主播视频| 处破女av一区二区| 欧美军同video69gay| 亚洲欧洲无码一区二区三区| 日本美女一区二区三区| eeuss鲁一区二区三区| 91精品国产综合久久婷婷香蕉 | 国产精品美女久久久久久久久| 午夜精品123| 不卡视频一二三四| 日韩免费看网站| 亚洲女同ⅹxx女同tv| 国产麻豆一精品一av一免费 | 成人久久18免费网站麻豆| 在线成人av影院| 亚洲欧美日韩成人高清在线一区| 韩国女主播成人在线| 欧美日韩中文字幕精品| 国产精品丝袜久久久久久app| 日韩不卡一区二区| 91亚洲永久精品| 国产偷v国产偷v亚洲高清| 蜜桃一区二区三区在线| 欧美在线视频不卡| 国产精品成人一区二区艾草 | 日韩电影在线一区二区| 91精品福利视频| 国产精品美女一区二区| 国产美女av一区二区三区|