嵌入式系统语音采集与播放程序设计(通信08128王彬)-1

2026/1/27 6:48:17

(2)函数说明:把参数buffer所指的内存写入count个字节到参数file所指的文件内。当然,文件读写位置也会随之移动;

(3)返回值:若正确会返回实际写入的字节数;当有错误发生时则返回-1,错误代码存入errno中。

3)open()函数:打开音频设备。

(1)函数定义:int(*open)( struct inode *inode, struct file *file);

(2)函数说明:参数inode为设备特殊文件的incode(索引结点)结构的指针,参数file是指向这一设备的文件结构的指针。open()的主要任务是确定硬件是否处在就绪状态,验证次设备号的合法性,控制使用设备的进程数;

(3)返回值:如果打开文件成功,open会返回一个文件描述符,以后对文件的所有操作就可以对这个文件描述符进行操作。比如程序中open()函数的返回值赋给了应用程序中的devfd,后面则可以对其进行操作;若打开失败返回负数。

4)ioctl()函数:用于设置编码比特、采样频率和选择声道。

(1)函数定义:int ioctl(struct inode *inode, struct file *file,unsigned int cmd, unsigned long arg);

(2)函数说明:设备驱动程序中对设备的I/O通道进行管理的特殊控制函数,可以通过它向设备传递控制信息或从设备取得状态信息,实现用户程序命令和驱动命令的相互联系;

(3)返回值:执行成功返回正数,失败返回-1。

5)s3c2410_uda1341_init()函数:动态加载驱动模块时的初始化函数。 (1)函数定义:int __init s3c2410_uda1341_init(void);

(2)函数说明:该函数首先会初始化I/O和UDA1341 芯片,然后申请2个DMA 通道用于音频传输。将输出音频缓冲区的DMA通道设为通道2,输入音频缓冲区的DMA 通道设为通道1。最后调用register_sound_dsp()和register_sound_mixer() 两个函数来分别注册驱动设备;

(3)返回值:初始化成功,返回0;DMA 通道初始化设置失败,返回负数。 6)void __exit s3c2410_uda1341_exit()函数:动态卸载驱动模块时调用的函数。 (1)函数定义:void __exit s3c2410_uda1341_exit(void);

(2)函数说明:注销音频设备,分两次调用audio_clear_dma()函数来分别释放已申请的音频输入和音频输出的DMA 通道;

(3)返回值:无。

19

第六章 根文件系统建立与文件系统下载

6.1 根文件系统分析

6.1.1 cramfs 目录结构

一个完整的根文件系统通常包含以下几个目录: /bin 应用程序存放目录。

/sbin 系统管理员服务程序,其中最重要的就是供内核初始化之后执行的/sbin/init 进程。

/lib 存放程序运行所需要的动态库。 /proc 系统状态文件目录。 /dev 驱动程序存放目录。

/etc 系统配置文件及用户数据存放目录。

/mnt 用于设备安装的目录,通常包含etc 子目录和为块设备安装保留目录。 /usr 用于存放用户程序和配置文件的目录,可以根据需要进行设置。

一般情况下都要把已经规划好的目录结构转换成一个映象文件,即使用命令工具mkcramfs(cygwin下为mkcramfs.exe),把相应的cramfs 目录树压缩为单一的映象文件。其命令格式为:

mkcramfs [-h] [-e edition] [-i file] [-n name] dirname outfile

使用mkcramfs.exe 在cygwin 下编译生成文件系统映象文件root.cramfs,再固化到开发系统FLASH 上运行。 6.1.2 构建cramfs 文件系统

按照本节实验原理中自行构建一个cramfs 文件系统。运行cygwin,执行以下命令解压安装:

$> source /tmp/edukit-2410/set_env_linux.sh //Linux 编译环境变量设置 $> cd $WORKDIR/

$> tar -xvjf /tmp/edukit-2410/root.cramfs.tar.bz2 $> ls

? root ? root 文件夹中就是我们想要的cramfs 文件系统

6.2 文件系统映像文件生成

6.2.1 编译一个应用测试程序test.c

按设计原理要求编写一个应用程序test.c,存放在/home/app/audio目录下,进入该目录后执行以下命令编译链接测试程序:

$> cd /home/app/audio

$> arm-linux-gcc -o test test.c (也可以编写Makefile 来编译)

20

图6.1 应用程序生产映像文件

test源程序

#include //C的输入输出函数的库,定义输入输出函数 #include //定义杂项函数及内存分配函数

#include //英文名:unix standard header ,是linux/unix的系统调用,定义了对文件操作的函数

#include \自定义的函数库 int main() //主函数 {

char *buf; int i; int dwSize;

if(!OpenSnd())//调用了OpenSnd()函数,打开声音设备 {

printf(\若打开失败,退出 exit(-1); }

SetFormat(FMT16BITS, FMT8K); //调用SetFormat()函数,设置格式 SetChannel(MONO); //调用SetChannel()函数,选择声道 buf = (char *)malloc(640);//定义缓冲buf,长度为640个字节 if(buf == NULL)//如果缓冲为空,退出 exit(-1);

for(i = 0; i <5000; i++)//程序调用的次数 {

dwSize = Record(buf, 640); //调用Record()函数,将录制的长度赋给dwSize dwSize = Play(buf, dwSize); //调用Play()函数,进行播放 }

exit (1); }

sndtoolsc源程序及说明:

21

#include

#include //定义了系统调用实现锁定的函数,fcntl()用来操作文件描述词的一些特性

#include #include #include #define VAR_STATIC #include \int devfd = 0; /*

* Open Sound device

* Return 1 if success, else return 0. */

int OpenSnd(/* add by new version */int nWhich) {

devfd = open(\//调用open()函数打开文件,返回文件描述符并赋给devfd

if(devfd > 0) //打开声音设备成功,调用close()关闭文件,并返回1 close(devfd);

if(devfd < 0) //打开声音设备失败,返回0 return 0;

return 1; } /*

* Close Sound device

* return 1 if success, else return 0. */

int CloseSnd(/* add by new version */int nWhich) {

close(devfd); devfd = 0; return 1; } /*

* Set Record an Playback format * return 1 if success, else return 0. * bits -- FMT8BITS(8bits), FMT16BITS(16bits)

22

//关闭文件,并返回1


嵌入式系统语音采集与播放程序设计(通信08128王彬)-1.doc 将本文的Word文档下载到电脑
搜索更多关于: 嵌入式系统语音采集与播放程序设计(通信08128王彬)-1 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219