移植linphonec后程序的奇怪问题!!

linlan999 2008-12-31 05:53:56
将linphonec移植到开发板上EM83系列的处理器上,当使用linphonec和PC上的VOIP客户端(比如zoiper)通话时,
效果还好,开发板上的USB声卡很少死掉;
但使用开发板上的linphonec相互通话时,讲几句后,
在写声卡时声卡的灯就由闪烁(通话时,要对声卡进行读写操作,
此时声卡的指示灯正常情况为闪烁)变为一直亮着(在函数oss_thread()
中调用write()向声卡写数据时失败,且出现的错误代码为Broken pipe),之后声卡的灯熄灭。
哪位老大有过类似的经历、经验,不论是USB驱动方面的,还是文件读写方面的 或是相关的注意事项请提示一下。。。。
十万火急啊。。。。。
3q
各位新年快乐!
...全文
253 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangcuizhi 2009-12-26
  • 打赏
  • 举报
回复
你好,最近我也在研究linphonec,我把linphonec编译成静态的移植到mini2440开发板上(架构是arm9),出现问题,说下具体的环境:我编译是在 ubuntu下,交叉工具用的是mini2440自带的交叉编译工具链是4.3.2版本。移植以后我用了一台pc和一块板子(mini2440)打电话测试,板子的ip是192.168.1.230,我把pc的设为192.168.1.220,然后板子打给pc能打通能,pc上能听到振铃,pc接起来后显示connected。但是说话就没声音了。反过来,如果是pc打给板子,则能打通,能connect,但是板子不能听到振铃,也不能对话,没声音。不知道能不能给点意见
linlan999 2009-01-21
  • 打赏
  • 举报
回复

下面的代码就是oss_thread实现读写声卡循环
while(d->read_started || d->write_started)
{
if (d->pcmfd>=0){
if (d->read_started){
struct timeval timeout;
fd_set read_fds;
audio_buf_info info;
if (rm==NULL) rm=allocb(bsize,0);

timeout.tv_sec = 0;
timeout.tv_usec = 0;
FD_ZERO( &read_fds );
FD_SET( d->pcmfd, &read_fds );
if( select( d->pcmfd + 1, &read_fds, NULL, NULL, &timeout ) == -1 ) {
}
if (FD_ISSET( d->pcmfd, &read_fds ) && ioctl( d->pcmfd, SNDCTL_DSP_GETISPACE, &info ) != -1)
{
if (info.bytes>=bsize)
{
err=read(d->pcmfd,rm->b_wptr,bsize);
if (err<0){
ms_warning("Fail to read %i bytes from soundcard: %s",
bsize,strerror(errno));
}else{
rm->b_wptr+=err;
ms_mutex_lock(&d->mutex);
putq(&d->rq,rm);
ms_mutex_unlock(&d->mutex);
rm=NULL;
}
}
else
{
timeout.tv_sec = 0;
timeout.tv_usec = 5000;
select(0, 0, NULL, NULL, &timeout );
}
}
else
{
timeout.tv_sec = 0;
timeout.tv_usec = 5000;
select(0, 0, NULL, NULL, &timeout );
}
}else {
int sz = read(d->pcmfd,rtmpbuff,bsize);
if( sz!=bsize) ms_warning("sound device read returned %i !",sz);
}
if (d->write_started){

audio_buf_info info;
if( ms_bufferizer_get_avail(d->bufferizer)>=bsize && ioctl( d->pcmfd, SNDCTL_DSP_GETOSPACE, &info ) == 0 ) {
if( info.fragstotal - info.fragments > 15 ) {
static int c=0;
/* drop the fragment if the buffer starts to fill up */
/* we got too much data: I prefer to empty the incoming buffer */
while (ms_bufferizer_get_avail(d->bufferizer)>bsize*4){
ms_mutex_lock(&d->mutex);
err=ms_bufferizer_read(d->bufferizer,wtmpbuff,bsize);
err=ms_bufferizer_read(d->bufferizer,wtmpbuff,bsize);
err=ms_bufferizer_read(d->bufferizer,wtmpbuff,bsize);
err=ms_bufferizer_read(d->bufferizer,wtmpbuff,bsize);
ms_mutex_unlock(&d->mutex);
c=c+err*4;
ms_warning("drop fragment when buffer gets too much data (%i - discarded:%i)", info.fragstotal - info.fragments, c);
if (err==0)
break;
}

}else {
ms_mutex_lock(&d->mutex);
err=ms_bufferizer_read(d->bufferizer,wtmpbuff,bsize);
ms_mutex_unlock(&d->mutex);
err=write(d->pcmfd,wtmpbuff,bsize);
if (err<0){
ms_warning("Fail to write %i bytes from soundcard: %s",
bsize,strerror(errno));
}
}
}

}else {
int sz;
memset(wtmpbuff,0,bsize);
sz = write(d->pcmfd,wtmpbuff,bsize);
if( sz!=bsize) ms_warning("sound device write returned %i !",sz);
}
}else usleep(20000);
}
linlan999 2009-01-21
  • 打赏
  • 举报
回复
还有就是将程序修改一些:将原来写声卡的操作移到线程将要退出的地方,在挂断电话后才将收到的语音数据写入声卡(也就是“录音”)听到是就是对方的声音
linlan999 2009-01-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sxcong 的回复:]
linphone开始通话后启用本地的音视频设备,内部实现的编码解码,是不是这里出的问题?
听说LINUX下的软电话,对声卡都有些要求,有些声卡支持的不够好。
[/Quote]

谢谢回复。

但linphonec和PC机上的VOIP终端通话时,几乎没有问题。
而且,程序的问题在:
err=write(d->pcmfd,wtmpbuff,bsize);

这一句出错,老是说
errno,strerror(errno) 信息为 32 ,Broken pipe

但那个d->pcmfd就是声卡的文件描述符,在程序中也没发现其他进程、线程操作声卡。
更奇怪的是和PC机上的VOIP电话通话时几乎没有碰到过这样的错误。。。
  • 打赏
  • 举报
回复
帮顶
sxcong 2009-01-15
  • 打赏
  • 举报
回复
linphone开始通话后启用本地的音视频设备,内部实现的编码解码,是不是这里出的问题?
听说LINUX下的软电话,对声卡都有些要求,有些声卡支持的不够好。

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧