
放音:播放软件将音频文件解码,并通过待续3中snd_pcm_writei接口逐渐传递到和dma相关的内存,经过待续2中dma传递给cpu的fifo,再经过ac97等接口传递给dac,最后传给连接在codec上的speaker。
心得:
1.ac97数据传输颇复杂,分时复用,cpu端fifo和codec端adc/dac关系要对应好。比如,cpu端的pcm left fifo占用slot3,那么adc只有配置成slot3才能把数据传递给它,如果配置成slot6,那就传给cpu的mic in fifo了。录音单声道通常选择slot6,录音双声道通常两个adc分别选择slot3和slot4。
2.wav音频文件大小计算:要测试录音是否丢祯,就必然要计算文件大小,通常的方法是:根据录音时间,用公式:录音时间(单位s)x采样率x(采样位数/8)x通道数。比如,录音时间5秒,采样率8kHz,位数16位,通道数1,那么5x8000x(16/8)x1=80k,实际的wav文件大小稍大于80k就对了。还有一种计算文件大小的方法:通常音频系统要用dma,也会用到dma中断,可以在dma中断中打印计数,次数xdma中断周期字节就行了。
3.数据交换的大小问题:待续1中DMA传输必须和FIFO的特性匹配:若FIFO位宽是16位,深度是16,并且半满时向DMA发出请求(握手),则链表式DMA必须配置成传输位宽16位,1次突发16字节,才能保证不丢失位数和数据个数。待续2中cpu端FIFO位数要和codec端adc/dac采样位数匹配,i2s/pcm接口可以配置成一样的值,比如16位,ac97接口复杂一点,cpu端不用配置,那么采样位数是多少呢?若cpu端fifo一个声道位宽16位,codec端adc/dac位宽18位,ac97通道20位,则传输到fifo端就被截取到有效的16位,整体采样位数16位,adc/dac的性能没有充分发挥而已。待续3中snd_pcm_readi、snd_pcm_writei函数第三个参数表示读写数据的大小,单位是祯,不是字节。双声道16位格式一祯大小为4字节
ptlib 就是指pwlibPWLib是Portable Windows
Library的缩写,翻译为轻便的Windows类库.PWLib采用C++编写,设计初衷是为了能让Openh323在Windows和Unix的
X-Windows下运行,
不过随着一步步的完善PWLib已经被跨平台的程序所广泛采用.在最新的Pandora版本中,Equivalence已经停止了PWLib中GUI部分
的开发,全面转向了更能为Openh323所利用的PTLib,GUI部分交给了wxWindows来完成.PWLib主要功能侧向网络,I/O和多线
程,主要用在高性能的可移植网络程序.
PWLib分为两部分:基类部分和控制台部分.基类部分主要包括网络,多线程,ASN等...,所有使用PWLib的应用程序必然用到基类部分.而控制台部分则定义了一些基本的数据和设备类型,它是可选的,不过要方便移植的话还是要用到它.
下面从Hello World开始说PWLib框架:
#include //所用使用PWLib都用包含的头文件
class Hello : public PProcess //继承主线程类PProcess
{
PCLASSINFO(Hello, PProcess) //连接PProcess的运行时函数
public:
void Main() //主线程是从PProcess的Main()开始的
}
PCREATE_PROCESS(Hello) //定义Main()函数和初始化Hello类
void Hello::Main()
{
cout <<"Hello world!\n"
}
下面详细介绍各个类:
基本对象类:
PObject - PWLib中的根类,所有的类都派生于此
PContainer - 抽象容器类
PAbstractArray - 所有数组对象的基类
PAbstractList - 所有列表对象的基类
PAbstractDictionary - 字典对象的基类
PString - 字符类,在Openh323中随处可见
I/O通道类
PChannel - I/O通道的基类,下面类都派生于此
PIndirectChannel - 可以交换的 *** 作不同的I/O通道
PConsoleChannel - 进入系统命令行的通道
PPipeChannel - 在当前进程和子进程剪建立管道
PSerialChannel - 串口通信通道
PFile - 文件 *** 作类.
PTextFile - 文本文件 *** 作类
PStructuredFile - 结构文件 *** 作类,不同 *** 作文件类型都不尽相同
PFilePath -对文件的路径描述的类
PVideoChannel - 视频的输入,输出通道,采用YUV格式
PSoundChannel - 音频的输入,输出通道,使用线性的PCM通道
套接字类:
PSocket - 套接字的基类,所有网络 *** 作类派生于此
PIPSocket - IP协议层的描述类
PUDPSocket - IP协议中UDP描述类
PTCPSocket - IP协议中TCP/IP描述类
PICMPSocket - IP协议中ICMP描述类
PIPXSocket - IPX协议的基类
PEthSocket - 底层的以为网接口类,可以直接 *** 作底层数据包
进程和线程类:
PProcess - 实现程序的主线程控制类
PServiceProcess - 后台程序或系统进程使用的类
PThread - 普通线程的控制类
PSemaphore - 使用信号量的线程同步类
PMutex - 使用互斥对象的线程同步类
PCriticalSection - 使用临界区的线程同步类
PSyncPoint - 使用事件的线程同步类
PAtomicInteger - 描述了信号量及PV *** 作
其他杂类:
PArgList - 命令行参数类
PConfig - 存储应用程序的配置内容
PTime - 时间和日期的抽象类
PTimeInterval - 以毫秒为单位的记时类
PDynaLink - 动态连接类
PRemoteConnection - 网络连接控制类
PMail - 调用系统默认程序发邮件
PPluginManager - 插件管理模块
PSmartPointer - 智能指令类
PNotifier - 通告类,可以调用任何类的任何函数
PSmartNotifierFunction - 智能的通告函数类,使用对象ID
控制台部分:
HTTP协议类:
PHTTP - HTTP协议基类
PURL - URL的具体描述
PHTML - HTML的具体描述
PHTTPServiceProcess - 后台的HTTP服务程序类
其他协议类
PInternetProtocol - Interner文本协议基类
PPOP3 - POP3协议的基类
PSMTMP - SMTP协议的基类
PFTP - FTP协议的基类
PMIMEInfo - 描述MIME信息
PTelnetSocket - 描述TELNET协议
PSocksProtocol - Socks协议的基类
PSTUNClient - 实现STUN登陆 *** 作
PSNMP - SNMP协议的基类
PSSLChannel - 在OpenSSL基础上建立的SSL协议类
PSASL - 在Cyrus SASL基础上建立的SAS协议L类
PXMLRPC - 在XML和HTTP基础上建立的XMLRPC协议描述
PSOAPClient - 实现SOAP登陆
PLDAPSession - 使用OpenLDAP进行LDAP登陆
PILSSession - 使用OpenLDAP进行ILS登陆
XMPP::Stream - 实现XMPP(Jabber)流
其他杂类:
PModem - *** 作Modem,使用AT命令和Modem串口通信
PIpAccessControlList - 子网掩码的描述
PRandom - 产生随机数类
PCypher - 不同编码的解码和编码
PWAVFile - AIFF格式的WAV文件 *** 作类
PDTMFDecoder - 对PCM流进行DTMF解码
PMemoryFile - 让数据存储在内存中
PSDLVideoDevice - 使用SDL库实现视频设备
PXML - XML的解析器
PVXMLChannel - VXML的解析器
PTextToSpeech - 实现文本到语音的语音合成转换
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)