日期:2014-05-16  浏览次数:20684 次

高分求助有关利用Linux的系统调用read()实现
做一个简单的linux系统下音频的输入,需要调用
int   read(int   fd,   char   *buf,   size_t   count);来实现语音从麦克风的输入,但是一般的做法就是单独设置一个缓冲区例如:buffer[100],但是我想作一个循环队列来实现,能让录音源源不断的输入,在输入的同时进行其他的对语音的分析,分析完的语音就可以抛弃,这样循环队列中永远不会满,但是我遇到的困难是你采用read的时候要输入缓冲区的地址以及字节的大小,如果循环队列的话如何实现read调用永不停止一直在输入,循环队列的front指针和rear指针如何配合以及read调用count如何选择,因为你的count一旦指定,当read完count个字节数后,系统read调用就停止,这是我遇到的困难,那位高手可以说一下思路。
比如说我的循环队列是
tyedef   struct{
char   *   base;
int   front;
int   rear;
}sq;
sq.base=(char   *)malloc(MAXSIZE);
那系统调用read()如何实现这一功能


------解决方案--------------------
sq.front=0;
sq.rear=MAXSIZE;

while ( 1 )
{
read ( fd , buf , count );
if ( sq.front+count > = sq.rear )
sq.front = 0;
memcpy ( sq.base+sq.front , buf , count );
sq.front += count;

}
这样行不?

------解决方案--------------------
楼上做的很对。最好初始化一下链表,最开始的时候头指向尾,还要做一个循环判断,万一尾巴赶上了头要做一些处理