Chinaunix首页 | 论坛 | 博客
  • 博客访问: 138150
  • 博文数量: 29
  • 博客积分: 2017
  • 博客等级: 大尉
  • 技术积分: 272
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-18 11:23
文章分类

全部博文(29)

文章存档

2011年(11)

2010年(18)

我的朋友

分类: 嵌入式

2011-04-12 10:33:38

最近在做 Ad-Hoc 网络上的语音通信实验,实验程序分 采集--压缩--传输--接收--解码--播放 几个部分,四个线程(采集、压缩传送、接收解码、播放),采集、传输两个线程竞争一个缓冲区,接收播放竞争一个缓冲区,双向通信。


void *audio_rec(void *data)
{
    //unsigned int i;

    unsigned int reclen;
    //short recpcm[AUDIOBLK/2];

    
    while(1)
    {
        if(recbuf.len <NMAX)
        {
            pthread_mutex_lock(&rec_lock);
            reclen = Dsp_Read(devfd, recbuf.buffer+recbuf.iput, AUDIOBLK);
            //if((recbuf.iput + AUDIOBLK) >= NMAX)

            //。。。

            sem_post(&recsem);
            pthread_mutex_unlock(&rec_lock);
        }
    }
}

void *audio_send(void *data)
{
    unsigned int i;
    unsigned int nBlock = 0;
    unsigned char sendbuf[AUDIOBLK];
    unsigned int ToAddrLen = sizeof(ToAddr);

    while(1)
    {
        sem_wait(&recsem);
        pthread_mutex_lock(&rec_lock);

        nBlock = recbuf.len/AUDIOBLK;
        for(i=0; i<nBlock; i++)
        {
            MyEncode(recbuf.buffer+recbuf.iget, sendbuf, AUDIOBLK);
          

            //。。。

            sendto(sockfd, sendbuf, AUDIOBLK/2, 0, (struct sockaddr *)&ToAddr, ToAddrLen);
        }
        
        pthread_mutex_unlock(&rec_lock);
    }
}

void *audio_receive(void *data)
{
    unsigned recvLen = 0;
    unsigned char recvBuf[NMAX/2];
    int RemoteAddrLen = sizeof(RemoteAddr);

    while(1)
    {
        pthread_mutex_lock(&play_lock);
        recvLen = recvfrom(sockfd, recvBuf, sizeof(recvBuf), 0, (struct sockaddr *)&RemoteAddr, &RemoteAddrLen);
        MyDecode(recvBuf, playbuf.buffer + playbuf.iput, recvLen);


        //。。。

        sem_post(&playsem);
        pthread_mutex_unlock(&play_lock);
    }
}

void *audio_play(void *data)
{
    unsigned int i;
    unsigned int nBlock = 0;

    while(1)
    {
        sem_wait(&playsem);
        pthread_mutex_lock(&play_lock);
        nBlock = playbuf.len/AUDIOBLK;
        for(i=0; i<nBlock; i++)
        {
            Dsp_Write(devfd, playbuf.buffer+playbuf.iget, AUDIOBLK);


            //。。。

        }
        pthread_mutex_unlock(&play_lock);
    }
}


先在pc和开发板上进行有线网络传输的测试,头痛,语音总有2s左右的延迟,接收端播放的是采集端2s前的声音。开始还怀疑是线程竞争的问题,找了很久也没找出个原因来。后来才发现是PCM设置的问题,最初采样设置是:8K,16bit,单通道,(没有设置内核音频缓冲区大小);修改44.1K,16bit,单通道, 延迟的问题就感觉不那么明显了。
分析:实验一次采集128byte,采用(8K,16bit,单通道)的话一次8ms,采用(44.1K,16bit,单通道)的话一次大约1.43ms。延迟的原因在哪里???
阅读(3541) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-05-16 15:40:15

参考:http://www.ibm.com/developerworks/cn/linux/l-ossdev/