linux中用socket双向传输声音

要解决linux中音频编程的问题。linux中关于音频的API有OSS和ALSA。有的声卡是用OSS写的驱动,有的是ALSA驱动,具体还得看机器的实际情况。OSS是指open sound system,属于unix比较老的声卡驱动标准,而且是不完全开放源代码的商业产品。ALSA是指Advanced Linux Sound Architecture则是比较新,代表了Linux未来的主流。而且完全开放源码,他把底层的I/O操作和文件操作封装成了库的形式,开发的时候可以不用纠结在底层的细节上。当然,ALSA还是保留了和OSS兼容的内核驱动模块,也就是说,ALSA和OSS某些接口部分是完全一样的。目前我所用的板子提供的声卡驱动的接口就是和OSS兼容的,因而音频的开发用到的就是兼容的那部分。关于Linux音频编程的详细介绍参考这里

其次

要解决双向传输的问题。知道了socket有这样一个很好的特性后,就会觉得双向传输很简单了。我们知道,socket建立的流本身就是双工的,既可以发送又可以接收。开始时候我在想,如果对socket文件描述符进行写之,紧接着就读,会不会读到刚才写进去的数据,会不会把接收到的和要发送的数据混在一起。为了验证想法,写了个测试程序,结果发现,根本不会出现我所担心的情况。socket里发送和接收数据是完全独立的,各自有自己的缓冲区,不会出现混淆。所以,可以在服务器端和客户端对socket流进行写和读,以实现双向的传输。
代码如下:(两端完全一样)
#include
#include
#include
#include
#include

extern int quitflag;
int fwriten(int fd, void *vptr, size_t n);
int freadn(int fd, void *vptr, size_t n);
static unsigned char send_buff[256];
static unsigned char recv_buff[256];

int
audio_encdec(void* sockfd){

int *pfd=(int*)sockfd;
int fd=*pfd;

int speed = 8000;
int format = AFMT_S16_LE;
int channels = 1;
int count=256;
int nread,nwrite;
int mask;
int audio_fd;


audio_fd=open(”/dev/sound/dsp”, O_RDWR,0);
if(audio_fd==-1){
perror(”/dev/sound/dsp”);
return -1;
}


if (ioctl(audio_fd,SNDCTL_DSP_GETFMTS,&mask)==-1){
perror(”SNDCTL_DSP_GETFMTS”);
return -1;
}
if(mask&format==0){
printf(”format %d is not supported \n”,format);
return -1;
}
else if (ioctl(audio_fd, SNDCTL_DSP_SETFMT, &format) == -1) {
perror(”SNDCTL_DSP_SETFMT”);
return -1;
}


if (ioctl(audio_fd,SNDCTL_DSP_CHANNELS,&channels)==-1){
perror(”SNDCTL_DSP_CHANNELS”);
return -1;
}


if (ioctl(audio_fd,SNDCTL_DSP_SPEED,&speed)==-1){
perror(”SNDCTL_DSP_SPEED”);
return -1;
}


while (1){

if ((nread=freadn(audio_fd,send_buff,count))==-1){
perror(”freadn”);
return -1;
}

if((nwrite=fwriten(fd,send_buff,count))==-1){
perror(”fwriten”);
return -1;
}

if ((nread=freadn(fd,recv_buff,count))==-1){
perror(”freadn”);
return -1;
}

if((nwrite=fwriten(audio_fd,recv_buff,count))==-1){
perror(”fwriten”);
return -1;
}

if(quitflag) break;
}
return 0;
}

需要说明的是,声音失真的比较厉害,把采样频率调到16000HZ可能会好一些。还有,声音部分的其他功能,比如设置声音大小,选择输入源等,再用另外的程序专门来实现比较好。

http://blog.sina.com.cn/s/blog_4da4ea3c0100q6z0.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值