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

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

?? ringbuffer.c

?? mediastreamer2是開源的網絡傳輸媒體流的庫
?? C
字號:
/* * $Id: ringbuffer.c 90 2002-01-22 00:51:49Z phil $ * ringbuffer.c * Ring Buffer utility.. * * Author: Phil Burk, http://www.softsynth.com * modified for SMP safety on Mac OS X by Bjorn Roche * also, alowed for const where possible * Note that this is safe only for a single-thread reader and a * single-thread writer. * * This program uses the PortAudio Portable Audio Library. * For more information see: http://www.audiomulch.com/portaudio/ * Copyright (c) 1999-2000 Ross Bencina and Phil Burk * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * Any person wishing to distribute modifications to the Software is * requested to send the modifications to the original developer so that * they can be incorporated into the canonical version. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */#include <stdio.h>#include <stdlib.h>#include <math.h>#include "ringbuffer.h"#include <string.h>/* * We can undefine this, to turn off memory barriers, but that * is only useful if we know we don't need to be MP safe or * we are interested in doing some kind of tests. */#define MPSAFE/**************** * First, we'll define some memory barrier primitives based on the system. * right now only OS X and FreeBSD are supported. In addition to providing * memory barriers, these functions should ensure that data cached in registers * is written out to cache where it can be snooped by other CPUs. (ie, the volatile * keyword should not be required) * * the primitives that must be defined are: * * FullMemoryBarrier() * ReadMemoryBarrier() * WriteMemoryBarrier() * ****************/#if defined(__APPLE__) || defined(__FreeBSD__)#   include <libkern/OSAtomic.h>    /* Here are the memory barrier functions. Mac OS X and FreeBSD only provide       full memory barriers, so the three types of barriers are the same.       The asm volatile may be redundant with the memory barrier, but       until I have proof of that, I'm leaving it. */#   define FullMemoryBarrier()  do{ asm volatile("":::"memory"); OSMemoryBarrier(); }while(false)#   define ReadMemoryBarrier()  do{ asm volatile("":::"memory"); OSMemoryBarrier(); }while(false)#   define WriteMemoryBarrier() do{ asm volatile("":::"memory"); OSMemoryBarrier(); }while(false)#else#   error Memory Barriers not defined on this system or system unknown#endif/*************************************************************************** * Initialize FIFO. * numBytes must be power of 2, returns -1 if not. */long RingBuffer_Init( RingBuffer *rbuf, long numBytes, void *dataPtr ){    if( ((numBytes-1) & numBytes) != 0) return -1; /* Not Power of two. */    rbuf->bufferSize = numBytes;    rbuf->buffer = (char *)dataPtr;    RingBuffer_Flush( rbuf );    rbuf->bigMask = (numBytes*2)-1;    rbuf->smallMask = (numBytes)-1;    return 0;}/***************************************************************************** Return number of bytes available for reading. */long RingBuffer_GetReadAvailable( RingBuffer *rbuf ){#ifdef MPSAFE    ReadMemoryBarrier();#endif    return ( (rbuf->writeIndex - rbuf->readIndex) & rbuf->bigMask );}/***************************************************************************** Return number of bytes available for writing. */long RingBuffer_GetWriteAvailable( RingBuffer *rbuf ){    /* Since we are calling RingBuffer_GetReadAvailable, we don't need an aditional MB */    return ( rbuf->bufferSize - RingBuffer_GetReadAvailable(rbuf));}/***************************************************************************** Clear buffer. Should only be called when buffer is NOT being read. */void RingBuffer_Flush( RingBuffer *rbuf ){    rbuf->writeIndex = rbuf->readIndex = 0;}/***************************************************************************** Get address of region(s) to which we can write data.** If the region is contiguous, size2 will be zero.** If non-contiguous, size2 will be the size of second region.** Returns room available to be written or numBytes, whichever is smaller.*/long RingBuffer_GetWriteRegions( RingBuffer *rbuf, long numBytes,                                 void **dataPtr1, long *sizePtr1,                                 void **dataPtr2, long *sizePtr2 ){    long   index;    long   available = RingBuffer_GetWriteAvailable( rbuf );    if( numBytes > available ) numBytes = available;    /* Check to see if write is not contiguous. */    index = rbuf->writeIndex & rbuf->smallMask;    if( (index + numBytes) > rbuf->bufferSize )    {        /* Write data in two blocks that wrap the buffer. */        long   firstHalf = rbuf->bufferSize - index;        *dataPtr1 = &rbuf->buffer[index];        *sizePtr1 = firstHalf;        *dataPtr2 = &rbuf->buffer[0];        *sizePtr2 = numBytes - firstHalf;    }    else    {        *dataPtr1 = &rbuf->buffer[index];        *sizePtr1 = numBytes;        *dataPtr2 = NULL;        *sizePtr2 = 0;    }    return numBytes;}/****************************************************************************/long RingBuffer_AdvanceWriteIndex( RingBuffer *rbuf, long numBytes ){#ifdef MPSAFE    /* we need to ensure that previous writes are seen before we update the write index */    WriteMemoryBarrier();    return rbuf->writeIndex = (rbuf->writeIndex + numBytes) & rbuf->bigMask;#else    return rbuf->writeIndex = (rbuf->writeIndex + numBytes) & rbuf->bigMask;#endif}/***************************************************************************** Get address of region(s) from which we can read data.** If the region is contiguous, size2 will be zero.** If non-contiguous, size2 will be the size of second region.** Returns room available to be written or numBytes, whichever is smaller.*/long RingBuffer_GetReadRegions( RingBuffer *rbuf, long numBytes,                                void **dataPtr1, long *sizePtr1,                                void **dataPtr2, long *sizePtr2 ){    long   index;    long   available = RingBuffer_GetReadAvailable( rbuf );    if( numBytes > available ) numBytes = available;    /* Check to see if read is not contiguous. */    index = rbuf->readIndex & rbuf->smallMask;    if( (index + numBytes) > rbuf->bufferSize )    {        /* Write data in two blocks that wrap the buffer. */        long firstHalf = rbuf->bufferSize - index;        *dataPtr1 = &rbuf->buffer[index];        *sizePtr1 = firstHalf;        *dataPtr2 = &rbuf->buffer[0];        *sizePtr2 = numBytes - firstHalf;    }    else    {        *dataPtr1 = &rbuf->buffer[index];        *sizePtr1 = numBytes;        *dataPtr2 = NULL;        *sizePtr2 = 0;    }    return numBytes;}/****************************************************************************/long RingBuffer_AdvanceReadIndex( RingBuffer *rbuf, long numBytes ){#ifdef MPSAFE    /* we need to ensure that previous writes are always seen before updating the index. */    WriteMemoryBarrier();    return rbuf->readIndex = (rbuf->readIndex + numBytes) & rbuf->bigMask;#else    return rbuf->readIndex = (rbuf->readIndex + numBytes) & rbuf->bigMask;#endif}/***************************************************************************** Return bytes written. */long RingBuffer_Write( RingBuffer *rbuf, const void *data, long numBytes ){    long size1, size2, numWritten;    void *data1, *data2;    numWritten = RingBuffer_GetWriteRegions( rbuf, numBytes, &data1, &size1, &data2, &size2 );    if( size2 > 0 )    {        memcpy( data1, data, size1 );        data = ((char *)data) + size1;        memcpy( data2, data, size2 );    }    else    {        memcpy( data1, data, size1 );    }    RingBuffer_AdvanceWriteIndex( rbuf, numWritten );    return numWritten;}/***************************************************************************** Return bytes read. */long RingBuffer_Read( RingBuffer *rbuf, void *data, long numBytes ){    long size1, size2, numRead;    void *data1, *data2;    numRead = RingBuffer_GetReadRegions( rbuf, numBytes, &data1, &size1, &data2, &size2 );    if( size2 > 0 )    {        memcpy( data, data1, size1 );        data = ((char *)data) + size1;        memcpy( data, data2, size2 );    }    else    {        memcpy( data, data1, size1 );    }    RingBuffer_AdvanceReadIndex( rbuf, numRead );    return numRead;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美视频精品在线| 韩国av一区二区三区在线观看| 日韩伦理电影网| 一区二区三区小说| 欧美在线免费视屏| 亚洲成在人线免费| 日韩一区二区视频| 国产一区在线看| 中文字幕制服丝袜成人av| 色综合久久中文字幕综合网| 亚洲国产视频网站| 久久免费国产精品| 99re热视频精品| 婷婷六月综合亚洲| 久久久亚洲国产美女国产盗摄 | 亚洲国产aⅴ成人精品无吗| 欧美色图第一页| 精品一区二区三区在线播放| 国产精品天美传媒| 欧美日韩久久久久久| 国产精品综合av一区二区国产馆| 日韩理论片中文av| 欧美大胆人体bbbb| 色综合 综合色| 蓝色福利精品导航| 亚洲免费观看高清在线观看| 在线成人午夜影院| 成人免费黄色大片| 久久嫩草精品久久久精品一| 99re这里只有精品视频首页| 麻豆精品一区二区综合av| 国产精品美女视频| 欧美一区二区精品| 7777精品久久久大香线蕉| 国产一区二区免费看| 伊人婷婷欧美激情| 国产欧美日韩在线观看| 在线成人av网站| 99这里都是精品| 久久99国内精品| 亚洲成人www| 中文字幕免费一区| 欧美成人欧美edvon| 91国产精品成人| 福利一区二区在线| 青青草原综合久久大伊人精品 | 九色|91porny| 亚洲午夜精品一区二区三区他趣| 日本一区二区电影| 精品国产伦一区二区三区观看方式 | 欧美一级片在线| 91浏览器入口在线观看| 国产凹凸在线观看一区二区| 麻豆免费精品视频| 亚洲成人免费视| 一区二区理论电影在线观看| 国产精品乱码一区二区三区软件| 精品日韩在线观看| 91精品国产91久久久久久一区二区| 色综合天天狠狠| 91在线小视频| av动漫一区二区| 成人久久久精品乱码一区二区三区| 久久国产精品99久久久久久老狼 | 亚洲欧美一区二区三区极速播放| 久久久精品国产免大香伊| 欧美成人女星排名| 这里是久久伊人| 91麻豆精品久久久久蜜臀| 欧美日韩高清一区| 欧美日韩精品久久久| 欧美视频一区二区在线观看| 日本高清不卡aⅴ免费网站| av网站免费线看精品| 粉嫩一区二区三区性色av| 国产精品亚洲成人| 国产乱码精品一区二区三区五月婷| 久久精品国产精品青草| 狠狠色丁香婷综合久久| 99精品热视频| 国产激情视频一区二区三区欧美| 麻豆一区二区三| 精品亚洲国产成人av制服丝袜| 日本亚洲天堂网| 久久99精品久久只有精品| 极品少妇xxxx精品少妇| 精品亚洲免费视频| 成人综合婷婷国产精品久久| 成人精品国产免费网站| 91欧美激情一区二区三区成人| 一本大道久久a久久精二百| 欧美在线|欧美| 91精品国产综合久久香蕉麻豆| 日韩三级伦理片妻子的秘密按摩| 亚洲精品在线观| 欧美韩国日本一区| 一区二区三区中文字幕电影| 日韩成人av影视| 国产精品一区二区在线播放| 不卡的看片网站| 欧美视频完全免费看| 538在线一区二区精品国产| 国产日韩一级二级三级| 日本一区二区三区高清不卡| 亚洲男人的天堂在线观看| 五月激情综合网| 精品无人码麻豆乱码1区2区| 97久久超碰精品国产| 911精品国产一区二区在线| 亚洲精品在线三区| 亚洲精品国产视频| 老司机精品视频一区二区三区| 成人妖精视频yjsp地址| 欧美午夜宅男影院| 久久网这里都是精品| 一区二区三区在线播放| 国产一区二区三区综合| 色婷婷精品久久二区二区蜜臀av| 日韩午夜三级在线| 日韩毛片视频在线看| 久久99精品国产麻豆婷婷洗澡| 99精品国产99久久久久久白柏| 欧美一区午夜视频在线观看| 国产精品色在线| 日本不卡一区二区三区高清视频| 成人性生交大片免费看视频在线 | 欧美日韩国产首页在线观看| 久久久不卡影院| 亚洲欧美日韩在线不卡| 麻豆久久久久久久| 色综合久久久久| 国产日韩v精品一区二区| 亚洲成人手机在线| 色综合中文字幕国产 | 午夜精品在线视频一区| 国产精品一级片| 3atv在线一区二区三区| 亚洲三级在线免费观看| 日本韩国一区二区三区视频| 国产亚洲欧美一区在线观看| 午夜激情综合网| 色婷婷狠狠综合| 中文字幕一区免费在线观看| 成人永久免费视频| 欧美日韩一级片在线观看| 欧美高清在线视频| 国产乱人伦精品一区二区在线观看| 欧美日韩二区三区| 亚洲天堂av一区| 不卡一区二区三区四区| 国产午夜精品一区二区三区视频| 婷婷久久综合九色综合绿巨人| 色综合天天综合在线视频| 国产午夜精品福利| 国产一区二区女| 日韩免费看的电影| 奇米色777欧美一区二区| 欧日韩精品视频| 亚洲美女视频在线观看| av激情亚洲男人天堂| 国产精品午夜免费| 国产99久久久国产精品免费看 | 中文天堂在线一区| 国产精品影视网| 26uuu国产电影一区二区| 久久99热国产| 久久夜色精品国产欧美乱极品| 久久99精品久久久| 精品欧美一区二区三区精品久久| 日本亚洲视频在线| 精品免费一区二区三区| 国产一区二区三区久久久| 久久精品人人做| 丁香另类激情小说| 国产精品丝袜一区| 岛国av在线一区| 国产精品情趣视频| 色综合中文综合网| 亚洲精品一区二区三区99| 久久黄色级2电影| 国产成都精品91一区二区三| 久久久久久久久久久久电影| 蜜桃91丨九色丨蝌蚪91桃色| 日韩午夜电影在线观看| 日韩高清在线观看| 精品日韩一区二区三区| 国产成人免费视频网站 | 3atv在线一区二区三区| 久久精品国产**网站演员| 久久午夜羞羞影院免费观看| 国产91富婆露脸刺激对白| 亚洲色图制服诱惑| 欧美日韩午夜影院| 久久电影网电视剧免费观看| 国产欧美日韩另类视频免费观看| 97久久久精品综合88久久| 亚洲成年人影院| 久久女同精品一区二区| 色94色欧美sute亚洲线路一久| 天堂久久久久va久久久久|