1. 程式人生 > >android如何實現環形緩衝區

android如何實現環形緩衝區

當我在開發一款關於音訊通訊的sdk時通過蒐集的資料,觀看大神的部落格,以及再加上個人的見解實現的環形緩衝區,思路是生產者消費者模式,用的是阻塞式佇列BlockingQueue(詳情參見http://blog.csdn.net/zlb824/article/details/7091814),我的buffer程式碼

/*
 * Copyright (C) 2013 liujian
 * 
 * Licensed under the GPL License Version 2.0;
 * you may not use this file except in compliance with the License.
 * 
 * If you have any question, please contact me.
 * 
 *************************************************************************
 **                   Author information                                **
 *************************************************************************
 ** Email: 
[email protected]
** ** QQ :<span style="font-family: Arial, Helvetica, sans-serif;">1187502892</span> ************************************************************************* */ package com.zhifutong.zhangxinbao.tool; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; public class Buffer { private final static String TAG = "Buffer"; private BlockingQueue<BufferData> mProducerQueue; private BlockingQueue<BufferData> mConsumeQueue; private int mBufferCount; private int mBufferSize; public static BufferData mBufferData = new BufferData( Global.bufferSizeInBytes); // when mData is null, means it is end of input public static class BufferData { public byte mData[]; private int mFilledSize; private int mMaxBufferSize; private static BufferData sEmptyBuffer = new BufferData(0); public BufferData(int maxBufferSize) { mMaxBufferSize = maxBufferSize; reset(); if (maxBufferSize > 0) { mMaxBufferSize = maxBufferSize; mData = new byte[mMaxBufferSize]; } else { mData = null; } } public static BufferData getEmptyBuffer() { return sEmptyBuffer; } final public void reset() { mFilledSize = 0; } final public int getMaxBufferSize() { return mMaxBufferSize; } final public void setFilledSize(int size) { mFilledSize = size; } final public int getFilledSize() { return mFilledSize; } } public Buffer() { this(3, Global.bufferSizeInBytes); } public Buffer(int bufferCount, int bufferSize) { mBufferSize = bufferSize; mBufferCount = bufferCount; mProducerQueue = new LinkedBlockingQueue<BufferData>(mBufferCount); // we want to put the end buffer, so need to add 1 mConsumeQueue = new LinkedBlockingQueue<BufferData>(mBufferCount); for (int i = 0; i < mBufferCount; ++i) { try { mProducerQueue.put(new BufferData(mBufferSize)); } catch (InterruptedException e) { e.printStackTrace(); } } } public void reset() { int size = mProducerQueue.size(); for (int i = 0; i < size; ++i) { BufferData data = mProducerQueue.peek(); if (null == data || null == data.mData) { mProducerQueue.poll(); } } size = mConsumeQueue.size(); for (int i = 0; i < size; ++i) { BufferData data = mConsumeQueue.poll(); if (null != data && null != data.mData) { mProducerQueue.add(data); } } // LogHelper.d(TAG, "reset ProducerQueue Size:" + mProducerQueue.size() // + " ConsumeQueue Size:" + mConsumeQueue.size()); } final public int getEmptyCount() { return mProducerQueue.size(); } final public int getFullCount() { return mConsumeQueue.size(); } public BufferData getEmpty() { // try { // if (mProducerQueue.size() == 0) { // for (int i = 0; i < mBufferCount; i++) { // mProducerQueue // .put(new BufferData(Global.bufferSizeInBytes)); // } // } // // } catch (InterruptedException e1) { // // TODO Auto-generated catch block // e1.printStackTrace(); // } return getImpl(mProducerQueue); } public boolean putEmpty(BufferData data) { return putImpl(data, mProducerQueue); } public BufferData getFull() { return getImpl(mConsumeQueue); } public boolean putFull(BufferData data) { return putImpl(data, mConsumeQueue); } private BufferData getImpl(BlockingQueue<BufferData> queue) { if (null != queue) { try { return queue.take(); } catch (InterruptedException e) { e.printStackTrace(); } } return null; } private boolean putImpl(BufferData data, BlockingQueue<BufferData> queue) { if (null != queue && null != data) { try { queue.put(data); return true; } catch (InterruptedException e) { e.printStackTrace(); } } return false; } }
上面程式碼能夠實現簡單的環形緩衝區的角色,

把消費者用過的data在放入生產這種迴圈利用。

相關推薦

android如何實現環形緩衝區

當我在開發一款關於音訊通訊的sdk時通過蒐集的資料,觀看大神的部落格,以及再加上個人的見解實現的環形緩衝區,思路是生產者消費者模式,用的是阻塞式佇列BlockingQueue(詳情參見http://blog.csdn.net/zlb824/article/details/7

Qt實現環形緩衝區的兩種方法

一個環形buffer,在尾部追加資料,從頭部讀取資料,適合用作IO的緩衝區。 一.使用QList和QByteArray 這個方法參考的是Qt原始碼中的QRingBuffer類,這個類不是Qt API的一部分,所以Qt助手裡是查不到的,它的存在只是為了服務其他的原始碼。 Q

基於環形緩衝區的deque實現方法

眾所周知,C++ STL中有一個叫做deque的容器,實現的是雙端佇列資料結構,這種佇列允許同時從佇列的首部和尾部插入和刪除資料。 然而在STL中這種資料結構是用”分段連續”的物理結構實現的(可以參考侯捷老師的《STL原始碼剖析》)。網上分析STL中這種容器的文章很多,如:http://b

通過Canvas的疊加實現Android環形View的顏色填充動畫效果

最近看到很多國內和國外的APP很多表示資料的方式都是通過一個圓環和數字動態展現,很是生動啊,由此也想做個簡單的模型試一試效果! 在Android中實現一種效果的方式有很多種,本人使用繼承View類,通過Paint和Canvas繪圖疊加的方式實現。 首先新建一個RingVie

環形緩衝區的C語言實現

#include <stdio.h>   #include <stdlib.h>   #include <string.h>   #include <unistd.h>   #include <pthread.h>

環形緩衝區C語言實現

  1. 環形緩衝區的特性  1、先進新出  2、當緩衝區被使用完,且又有新的資料需要儲存時,丟掉歷史最久的資料,儲存最新資料  現實中的儲存介質都是線性的,因此我們需要做一下處理,才能在功能上實現環形緩衝區  演算法說明:&nbs

STM32進階之串列埠環形緩衝區實現

佇列的概念在此之前,我們來回顧一下佇列的基本概念:佇列 (Queue):是一種先進先出(First In First Out ,簡稱 FIFO)的線性表,只允許在一端插入(入隊),在另一端進行刪除(出隊)。佇列的特點類似售票排隊視窗,先到的人看到能先買到票,然後先走,後來的人

Android 實現異步加載圖片

nba while amp android pub 數據 bool 一段時間 代碼 麥洛開通博客以來,有一段時間沒有更新博文了.主要是麥洛這段時間因項目開發實在太忙了.今天周六還在公司加班,苦逼程序猿都是這樣生活的. 今天在做項目的時候,有一個實現異步加載圖片的功能,雖然比

Android實現音樂播放器(一)

simple ani call ket 打開文件 界面 方式 .cn 點擊 Graphical User Interface 本篇文章記錄了我實現Android簡單音樂播放器的過程,(一)中介紹了怎麽構建音樂播放器的前端頁面。首先大家看一下,界面最後是這樣的(界面有

使用canvas實現環形進度條

cti anim 效果 math png utf-8 context request var html代碼: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta

Android實現一個自己定義相機的界面

content pic 圖片 log das img lis boolean xtend 我們先實現拍照button的圓形效果哈。Android開發中,當然能夠找美工人員設計圖片,然後直接拿進來。只是我們能夠自己寫代碼實現這個效果哈。最經常使用的的是用layout-

Android實現RecyclerView的下拉刷新和上拉載入很多其它

listen gre scheme void fadein 有一個 hot [] study 需求 先上效果圖, Material Design風格的下拉刷新和上拉載入很多其它。 源代碼地址(歡迎star) https://github.com

aNDROID實現aEs加密技術

android java .com and androi aid ava lis 加密 JaVa%E9%9D%A2%E8%AF%95%E7%AC%94%E8%AF%95%E9%A2%98%E5%A4%A7%E6%B1%87%E6%80%BB%282%29 http://m

Android實現App版本自動更新

enqueue 返回值 watermark iss 界面 點擊 itl rar 執行 現在很多的App中都會有一個檢查版本的功能。例如鬥魚TV App的設置界面下: 當我們點擊檢查更新的時候,就會向服務器發起版本檢測的請求。一般的處理

Android實現推送方式解決方案

都是 device andro broker dev 常見 剛才 設置 互聯網  本文介紹在Android中實現推送方式的基礎知識及相關解決方案。推送功能在手機開發中應用的場景是越來起來了,不說別的,就我們手機上的新聞客戶端就時不j時的推送過來新的消息,很方便的閱讀最新的新

android——實現跨程序訪問數據

允許 selection stat 查詢 add provider null roi auth 使用之前的SQLite存儲的應用程序。首先需要在這個應用程序中創建內容提供器,右擊com.example.administrator.exp7包→New→Other→Conten

Android 實現手寫板技術

play eve sig event current put null 去除 imageview Android手寫板和塗鴉的功能,代碼如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/r

Android------實現圖片雙擊放大,縮小,左右滑動的多種方式

params getcount androi nullable per try out 多圖 tro 項目中常常有圖片瀏覽功能。像微信朋友圈圖片瀏覽,QQ空間照片瀏覽 的功能。 實現圖片雙擊放大,縮小,左右滑動等效果。 來看看我的效果圖,希望能滿足你的要求 前

android--------實現Activity和Fragment通信的面向對象的萬能接口

inter strong .sh state alt mage 技術 content allow 前言 開發一個app時,常用Activity和Fragment,由於操作方便Fragment越來越受歡迎,這樣就避免不了Activity和Fragment、Fragment和F

android 實現微信分享多張圖片的功能

files gui 功能實現 pen ring row 還要 bsp sha 昨天公司老大通知客戶改需求了,原來的微信分享改成分享多張圖片,然後屁顛屁顛跑到微信平臺看了以後 心裏千萬只草泥馬狂奔而過,微信平臺沒有提供分享多張的SDK有木有啊,我們只能自己調用系統自帶的分享