免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1962 | 回复: 2
打印 上一主题 下一主题

[C] 音频设备没有关闭? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-22 21:49 |只看该作者 |倒序浏览
我写了个音频收发程序,一个线程收,一个线程发,收线程中用的是recvfrom的阻塞方式,当进程收到退出信号时,我会给一个全局变量置位,从而使两个线程退出。
可是现在的问题是:由于recvfrom工作在阻塞方式,因为非阻塞方式会产生一定的延时。当它收不到数时就会一直阻塞在那里,如果我在主进程里使用 pthread_join函数的话,程序就会死在那儿。于是我没用pthread_join等待线程的退出,而是直接让主进程退出。这样又有一个问题,那就是音频设备有时候没有释放,下次调用的时候就显示device busy,没有声音。有没有方法让程序强制释放某设备?

我把问题详细说一下:
main.c
调用audio程序
ret=vfork();
if(ret==0) execl("audio"........);
else m_handle=ret;
结束audio程序
kill(m_handle,SIG_INT);
waitpid(m_handle..........);

audio.c

int main()
{.............
signal(SIGINT,sig_quit);
pthread_create (&recvthread, NULL, &recvproc,NULL);  //接收线程  
pthread_create (&sendthread, NULL, &sendproc,NULL);  //发送线程

pthread_detach(sendthread);
pthread_detach(recvthread);
while(quit_flag==0) ;
if(0==pthread_cancel(sendthread)) printf("sendthread canceled...\n");   
if(0==pthread_cancel(recvthread)) printf("recvthread canceled...\n");

if(-1!=close(fd)) printf("close /dev/dsp success...\n"); //关闭设备
}

void sig_quit(int sig)
{
quit_flag=1;
}

void * sendproc()
{
while(quit_flag!=1)
{
read();//从/dev/dsp中读录音数据
sendto();//发送出去
}
}

void * recvproc()
{
while(quit_flag!=1)
{
recvfrom();//接收数据
write();//写到/dev/dsp中发出声音
}
}

论坛徽章:
0
2 [报告]
发表于 2009-09-22 22:21 |只看该作者
程序退出就应该会自动释放资源了吧??

论坛徽章:
0
3 [报告]
发表于 2009-09-22 23:06 |只看该作者
原帖由 net_robber 于 2009-9-22 22:21 发表
程序退出就应该会自动释放资源了吧??

您是说audio程序被kill掉后,/dev/dsp音频设备就会自动关闭,释放资源,我想也是这样,可是有时候再次调用audio程序的时候就是说device is busy.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP