ringbuffer剖析
2016-01-14 17:25
519 查看
#include <stdio.h> #define WAVEOUT_BUF_GUARD 1 #define MAX_QUEUE 1 #define WAVEOUT_BUF_BLK_NUM 16 #define WAVEOUT_BUF_BLK_SIZE 1024 int audio_dma_has_worked = 0; typedef struct { int read; int write; int lastsize; unsigned char *buf; }_wave_buf; _wave_buf WaveBuffer; void Audio_MAL_Play(unsigned int Addr, unsigned int Size) { int read = WaveBuffer.read; int write = WaveBuffer.write; int lastsize = WaveBuffer.lastsize; int queued; if(write >= read) queued = write - read; else queued = WAVEOUT_BUF_BLK_NUM - (read - write); if(queued >0) { /*after send data ,we need to update buffer*/ if(WaveBuffer.read != WaveBuffer.write) { WaveBuffer.read ++; if(WaveBuffer.read >= WAVEOUT_BUF_BLK_NUM) { WaveBuffer.read = 0; } } } } void WaveOut_Init(void) { WaveBuffer.read = 0; WaveBuffer.write = 0; WaveBuffer.lastsize = 0; WaveBuffer.buf = (unsigned char *)malloc(WAVEOUT_BUF_BLK_SIZE*WAVEOUT_BUF_BLK_NUM); if( 0 != WaveBuffer.buf ) { printf(" WaveOut_Init malloc successl\n"); memset(WaveBuffer.buf, 0, WAVEOUT_BUF_BLK_SIZE*WAVEOUT_BUF_BLK_NUM); } else { printf(" WaveOut_Init malloc fail\r\n"); WaveBuffer.buf = NULL; } } void A2dp_WaveOut_Close() { printf("A2dp_WaveOut_Close\r\n"); WaveBuffer.read = 0; WaveBuffer.write = 0; WaveBuffer.lastsize = 0; if(0 != WaveBuffer.buf) { printf("free wave buffer\n"); free(WaveBuffer.buf); WaveBuffer.buf = NULL; } } void A2dp_WaveOut_GetBuffer(unsigned char **outBufPtr, int *outBufSize) { int read = WaveBuffer.read; int write = WaveBuffer.write; int lastsize = WaveBuffer.lastsize; int queued; if((write + 1) % WAVEOUT_BUF_BLK_NUM == read) { printf("WARNING : ring buffer is FUll\n"); *outBufPtr = 0; *outBufSize = 0; } printf("A2dp_WaveOut_GetBuffer read is %d,write is %d,lastsize is %d\n",read,write,lastsize); if(write >= read) { queued = write - read; } else queued = WAVEOUT_BUF_BLK_NUM - (read - write); *outBufPtr = WaveBuffer.buf + write*WAVEOUT_BUF_BLK_SIZE + lastsize; *outBufSize = WAVEOUT_BUF_BLK_SIZE; } void A2dp_WaveOut_Write(int waveOutSize) { int queued; int read = WaveBuffer.read; int write = WaveBuffer.write; int lastsize = WaveBuffer.lastsize; printf("A2dp_WaveOut_Write read is %d,write is %d,lastsize is %d\n",read,write,lastsize); lastsize += waveOutSize; printf("A2dp_WaveOut_Write read is %d,write is %d,lastsize is %d\n",read,write,lastsize); if(lastsize >= WAVEOUT_BUF_BLK_SIZE) { lastsize -= WAVEOUT_BUF_BLK_SIZE; write++; if(write >= WAVEOUT_BUF_BLK_NUM) { //return to the frist buffer if(lastsize) { memcpy(WaveBuffer.buf, WaveBuffer.buf + (WAVEOUT_BUF_BLK_NUM)*WAVEOUT_BUF_BLK_SIZE, lastsize); } write = 0; } } WaveBuffer.write = write; WaveBuffer.lastsize = lastsize; if(write >= read) queued = write - read; else queued = WAVEOUT_BUF_BLK_NUM - (read - write); if(queued >= 1) Audio_MAL_Play((unsigned int)(WaveBuffer.buf + WaveBuffer.read*WAVEOUT_BUF_BLK_SIZE), WAVEOUT_BUF_BLK_SIZE/*/2*/ ); } int main() { unsigned char *waveOutBufPtr; int waveOutBufSize; unsigned char music_data1[222] = {0}; unsigned char music_data2[888] = {0}; unsigned char music_data3[1024] = {0}; unsigned char music_data4[1222] = {0}; unsigned char music_data5[2500] = {0}; memset(&music_data1,1,sizeof(music_data1)); memset(&music_data2,2,sizeof(music_data2)); memset(&music_data3,3,sizeof(music_data3)); memset(&music_data4,4,sizeof(music_data4)); memset(&music_data5,5,sizeof(music_data5)); WaveOut_Init(); //模拟五次来MUSIC STREAM A2dp_WaveOut_GetBuffer(&waveOutBufPtr, &waveOutBufSize); if(waveOutBufPtr != NULL) { memcpy(waveOutBufPtr,music_data1,sizeof(music_data1)); A2dp_WaveOut_Write(sizeof(music_data1)); } A2dp_WaveOut_GetBuffer(&waveOutBufPtr, &waveOutBufSize); if(waveOutBufPtr != NULL) { memcpy(waveOutBufPtr,music_data2,sizeof(music_data2)); A2dp_WaveOut_Write(sizeof(music_data2)); } A2dp_WaveOut_GetBuffer(&waveOutBufPtr, &waveOutBufSize); if(waveOutBufPtr != NULL) { memcpy(waveOutBufPtr,music_data3,sizeof(music_data3)); A2dp_WaveOut_Write(sizeof(music_data3)); } A2dp_WaveOut_GetBuffer(&waveOutBufPtr, &waveOutBufSize); if(waveOutBufPtr != NULL) { memcpy(waveOutBufPtr,music_data4,sizeof(music_data4)); A2dp_WaveOut_Write(sizeof(music_data4)); } A2dp_WaveOut_GetBuffer(&waveOutBufPtr, &waveOutBufSize); if(waveOutBufPtr != NULL) { memcpy(waveOutBufPtr,music_data5,sizeof(music_data5)); A2dp_WaveOut_Write(sizeof(music_data5)); } A2dp_WaveOut_Close(); return 0; }
相关文章推荐
- js 正则身份证校验
- Ionic基础——js指令布局
- string 转 json数据
- Microsoft Windows 系统上安装Node.js
- Mac环境下装node.js,npm,express
- Angularjs实例5
- 前端不为人知的一面--前端冷知识集锦
- SharePoint Server 2016 Beta 中已弃用的功能
- angularjs select 循环中出现第一个 option 为空格问题
- 学习JavaScript设计模式之中介者模式
- css 常用总结
- arcmap json转feacture
- json转换成list map集合
- 读《编写可维护的JavaScript》第六章总结
- 用node-webkit把web应用打包成桌面应用
- HTML5新格式
- 130 js javascrtipt DOM编程艺术1~6章
- 获取和设置select的选中项的值
- Jquery常用表单元素操作总结
- (翻译)React Container Components