4ip电话详细设计说明书wiphone.docx
- 文档编号:4367575
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:45
- 大小:116.46KB
4ip电话详细设计说明书wiphone.docx
《4ip电话详细设计说明书wiphone.docx》由会员分享,可在线阅读,更多相关《4ip电话详细设计说明书wiphone.docx(45页珍藏版)》请在冰豆网上搜索。
4ip电话详细设计说明书wiphone
详细设计说明书
题目:
基于ARM的语音通信系统
项目提出者:
Wiphone开发小组
班级:
嵌入式1班
撰写人:
SA09225155邹恩岑
SG09225009胡征犀
SA09225113刘少旭
详细设计说明书
1引言
1.1编写目的
编写本程序设计主要给开发人员参阅,以及日后软件维护是用。
1.2背景
说明:
a.基于ARM的语音通信系统;
b.任务提出者:
Wiphone开发小组;
c.开发者:
邹恩岑、胡征犀、魏平、刘少旭;
d.用户:
希望在300米范围内进行无线通话的用户。
e.运行软件的计算站:
ARM计算机和PC机
1.3参考资料
a.韦东山.嵌入式Linux应用开发.北京:
人民邮电出版社,2008
b.宋宝华.Linux设备驱动开发详解.北京:
人民邮电出版社,2008
c.[美]蒂文斯,[美]拉戈,尤晋元等.Unix环境高级编程.北京:
人民邮电出版社,2006,
d.[美]JimGeier,王群等.无线局域网.北京:
人民邮电出版社,2001
e.徐英慧,马忠梅等.ARM9嵌入式系统设计.北京:
北京航空航天大学出版社,2007
f.[美]DavidJ.Katz,RickGentile,陈喆等.嵌入式媒体处理.北京:
电子工业出版社,2007
g.[美]BehrouzA.Forouzan,SophiaChungFegan,谢希仁等.TCP/IP协议族(第三版).北京:
电子工业出版社,2007
2程序系统的结构
2.1声卡驱动应用模块结构
2.2GSM语音压缩解压模块结构
2.3网络收发模块结构
2.4Wiphone程序主控制模块结构
2.5Qt/Qtopia用户图形接口模块结构
2.6Start无线环境配置模块结构
3声卡驱动应用模块设计说明
3.1程序功能描述
声卡驱动应用模块使整个程序能够操作声卡进行录音和放音。
3.2输入项
声卡API函数的调用参数和指令,声音数据。
3.3输出项
录音数据。
3.4限制条件
在PC机上的Linux操作系统使用本程序时,需要使用ALSA的OSS仿真库,即aoss工具。
3.5设计说明
auddev.c:
1.audpaud_new(constchar*devname,intsample_rate,size_tbufsamples);过程
分配内存,创建出一个新的声卡对象实例,并关联相应的声卡read、write、open、close函数;
2.voidaud_destroy(audpad);过程
释放声卡对象实例,回收分配的内存;
3.voidaud_get_property(structaud_property*props);过程
声卡的工作方式为非全双工,本函数另props->duplex=0;
oss.c:
4.intoss_set_fragments(intfd,intfragsize,intfragnum,intignore_err);过程
声卡驱动程序中的内核缓冲区的大小,默认设置是64fragments*128bytes;
5.intoss_get_fragments(intfd,intcmd,constchar*type);过程
获取声卡内核缓冲区的信息,能够得到总fragment数,每个fragment分配了多少字节,还有多少fragment没用,当前有多少有效的空间(字节)
6.intoss_set_params(intfd,intsample_rate,intsample_size,intchannels,
constchar*type,intignore_err);过程
设置声卡工作数据格式,频率,声道数等参数;
auddev_oss.c:
7.intaud_oss_open(structaud*ad,intflags);
按照传入参数,以录音、放音、录放音三种不同的方式打开声卡;
8.intaud_oss_close(structaud*ad);
关闭声卡;
9.intaud_oss_write(structaud*ad,constshort*buf,size_tspnum);
将单声道数据转为双声道数据,把双声道数据写到声卡放音,并判断声卡状态是正常、过载还是欠载。
10.intaud_oss_read(structaud*ad,short*buf,size_tspnum);
从声卡读取双声道数据,并把双声道数据转为单声道数据,以此减少数据量。
3.6源代码清单
3.6.1auddev.c文件
/*
*Author:
zhengxihu(ezrasa),huzhengxi@
*ZouEncen(eczou),eczou@
*Company:
SSEofUSTC
*/
#include"auddev.h"
#include"oss.h"
#include"wiphone_config.h"
#include
#include
//#defineDEFAULT_DEV"/dev/audio"
#defineDEFAULT_DEV"/dev/dsp"
structaud*aud_new(constchar*devname,intsample_rate,size_tbufsamples)
{
structaud*ad=(structaud*)malloc(sizeof(structaud));
ad->op=(structaud_operations*)malloc(sizeof(structaud_operations));
if(devname==NULL)
devname=DEFAULT_DEV;
ad->fd=-1;
ad->devname=strdup(devname);
ad->sample_rate=sample_rate;
ad->bufsamples=bufsamples;
#ifdefCONFIG_OSS
ad->op->aud_read=aud_oss_read;
ad->op->aud_write=aud_oss_write;
ad->op->aud_close=aud_oss_close;
ad->op->aud_open=aud_oss_open;
#endif
#ifdefCONFIG_ALSA
/*havenotimplemented
ad->op->aud_read=aud_alsa_read;
ad->op->aud_write=aud_alsa_write;
ad->op->aud_close=aud_alsa_close;
ad->op->aud_open=aud_alsa_open;
*/
#endif
returnad;
}
voidaud_destroy(audpad)
{
free(ad->devname);
free(ad->op);
free(ad);
}
voidaud_get_property(structaud_property*props)
{
props->duplex=0;
}
3.6.2oss.c文件
/*
*Author:
zhengxihu(ezrasa),huzhengxi@
*Company:
SSEofUSTC
*/
#include
#include
#include
#include"oss.h"
#include"libxi.h"
#undefFRAG
#defineFRAG(x,y)((((x)&0xFFFF)<<16)|((y)&0xFFFF))
intoss_set_fragments(intfd,intfragsize,intfragnum,intignore_err)
{
intbuffarg;
intfrag;
intres;
fragnum&=0xFFFF;
if(fragnum<2)
fragnum=2;
for(buffarg=0;fragsize>1;buffarg++,fragsize>>=1);;
frag=FRAG(fragnum,buffarg);
/*
*64fragments,128bytesperfrag
fragmentsallocby32-times,suchas3264128256
*/
res=ioctl(fd,SNDCTL_DSP_SETFRAGMENT,&frag);
if(res<0&&!
ignore_err){
perror("failedtosetfragmentsize");
return-1;
}
return0;
}
intoss_get_fragments(intfd,intcmd,constchar*type)
{
intres;
/*
typedefstructaudio_buf_info{
intfragments;//ofavailablefragments(partiallyusendonesnotcounted)
intfragstotal;//Total#offragmentsallocated
intfragsize;//Sizeofafragmentinbytes
intbytes;//Availablespaceinbytes(includespartiallyusedfragments)
//Note!
'bytes'couldbemorethanfragments*fragsize
}audio_buf_info;
*/
audio_buf_infoinfo;
res=ioctl(fd,cmd,&info);
if(res==-1){
perror("gettingfragmentinfo");
return-1;
}
fprintf(stderr,"%sfragments:
%i,fragsize:
%i\n",type,
info.fragstotal,info.fragsize);
return0;
}
intoss_set_params(intfd,intsample_rate,intsample_size,
intchannels,constchar*type,intignore_err)
{
intparm;
intres;
parm=sample_size;//16bit
res=ioctl(fd,SNDCTL_DSP_SETFMT,&parm);
if(res<0&&!
ignore_err){
perror("failedtosetsamplesize");
return-1;
}
sample_size=parm;
parm=channels;//2ch
res=ioctl(fd,SNDCTL_DSP_CHANNELS,&parm);
if(res<0&&!
ignore_err){
perror("failedtosetchannels");
return-1;
}
channels=parm;
parm=sample_rate;//8K
res=ioctl(fd,SNDCTL_DSP_SPEED,&parm);
if(res<0&&!
ignore_err){
perror("failedtosetsamplerate");
return-1;
}
sample_rate=parm;
fprintf(stderr,"%srate:
%i,bits:
%i,channels:
%i\n",
type,sample_rate,sample_size,channels);
return0;
}
3.6.3auddev_oss.c文件
/*
*Author:
zhengxihu(ezrasa),huzhengxi@
*ZouEncen(eczou),eczou@
*Company:
SSEofUSTC
*/
#include"auddev.h"
#include"oss.h"
#include"errhandle.h"
#include
#include
#include
#include
#include
#include
#include
#defineNUMCHANEL2
/*Bytespersample
*shortis2bytesinx86(linux)
*soBPS=2*2channelsbytes*/
#defineBPS(sizeof(short)*NUMCHANEL)
#defineSPSIZE16
intaud_oss_open(structaud*ad,intflags)
{
constchar*type;
intres;
intfragnum;
intmode;
size_tfragsp=32;
if((flags&AUD_O_PLAY)&&(flags&AUD_O_REC))
{
type="play+record";
mode=O_RDWR;
}
elseif((flags&AUD_O_REC))
{
type="record";
mode=O_RDONLY;
}
else
{
type="play";
mode=O_WRONLY;
}
ad->fd=open(ad->devname,mode);
//printf("fd=%d\n",ad->fd);
if(ad->fd==-1)
err_sys("openningsounddevice");
if(flags&AUD_O_PLAY)
fragnum=ad->bufsamples/fragsp;//160*8/32=40
else
fragnum=-1;
//printf("ad->bufsamples:
%d,fragnum:
%d\n",ad->bufsamples,fragnum);
res=oss_set_fragments(ad->fd,fragsp*BPS,fragnum,
(flags&AUD_O_IGNORE_ERR));
if(res==-1)
{
aud_oss_close(ad);
return-1;
}
res=oss_set_params(ad->fd,ad->sample_rate,SPSIZE,NUMCHANEL,
type,(flags&AUD_O_IGNORE_ERR));
if(res==-1)
{
aud_oss_close(ad);
return-1;
}
if((flags&AUD_O_REC))
oss_get_fragments(ad->fd,SNDCTL_DSP_GETISPACE,"record");
if((flags&AUD_O_PLAY))
oss_get_fragments(ad->fd,SNDCTL_DSP_GETOSPACE,"play");
return0;
}
intaud_oss_close(structaud*ad)
{
close(ad->fd);
ad->fd=-1;
return0;
}
intaud_oss_write(structaud*ad,constshort*buf,size_tspnum)
{
size_ti;
intres;
size_tspacesp;
size_tfragsp;
size_tremsp;
shortdblbuf[1024];
audio_buf_infobi;
for(i=0;i { dblbuf[2*i]=buf[i]; dblbuf[2*i+1]=buf[i]; } res=ioctl(ad->fd,SNDCTL_DSP_GETOSPACE,&bi); if(res==-1) { perror("SNDCTL_DSP_GETOSPACE"); return-1; } /*Note: *Theaudio_buf_infofieldcontainsthefollowingfields: *bytesreturnsthenumberofbytesthatcanbewrittenwithoutblocking. *fragments(obsolete)returnsthenumberoffullfragmentsthatcanbewrittenwithoutblocking. *fragsizeisthecurrentfragmentsizeinplaybackdirection. *fragstotalisthenumberofbufferfragmentsallocatedforplayback. */ fragsp=bi.fragsize/BPS;//howmanysamplesinafragment spacesp=bi.bytes/BPS;//howmanysamplescanbewritten if(spacesp printf("playoverrun\n");//playspeedtooslow,soplzwriteslowly res=write(ad->fd,dblbuf,spnum*BPS); //printf("write%dsamples\n",res/BPS); if(res==-1) err_quit("auddev: writingaudiodeviceerror"); remsp=fragsp*bi.fragstotal-spacesp;/*totalsample-writesample*/ //printf("canbewritten: %d,remsp%d,fragsp: %d,fragstotal: %d\n",spacesp,remsp,fragsp,bi.fragstotal); if(remsp<3*fragsp) { fprintf(stderr,"playunderrun\n");//playspeedtoohigh,soplzwritequickly res=write(ad->fd,dblbuf,spnum*BPS); if(res==-1) err_quit("auddev: writingaudiodeviceerror"); } return0; } intaud_oss_read(structaud*ad,short*buf,size_tspnum) { size_ti; intres; shortdblbuf[1024]; res=read(ad->fd,dblbuf,spnum*BPS); if(res==-1) err_quit("auddev: readingaudioerror"); for(i=0;i buf[i]=((int)dblbuf[2*i]+(int)dblbuf[2*i+1])/2; return0; } 4GSM语音压缩解压模块设计说明 4.1程序功能描述 GSM语音压缩解压模块为开源语音编码库,该库用于对音频进行压缩编码和恢复解码。 4.2输入项 wav未压缩音频数据,GSM压缩音频数据。 4.3输出项 GSM压缩音频数据,wav解压音频数据 4.4限制条件 请参照GSM开源库的限制条件。 4.5设计说明 libgsm.a voidgsm_encode(gsm,gsm_signal*,gsm_byte*); GSM编码; intgsm_decode(gsm,gsm_byte*,gsm_signal*); GSM解码; 4.6源代码清单 由于本模块使用的是开源库中的小部分功能,故不提供源代码清单。 5网络收发模块设计说明 5.1程序功能描述 网络设置,Socket的初始化、关闭,网络数据的发送与接收。 5.2输入项 要发送的网络数据和相关参数。 5.3输出项 接收到的网络数据和相关信息。 5.4限制条件 请参阅Socket编程的限制条件。 5.5设计说明 netsocket.c: 1.intnetsock_open(constchar*hostname,co
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ip 电话 详细 设计 说明书 wiphone
![提示](https://static.bdocx.com/images/bang_tan.gif)