0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术Linux工控主板音频应用简介

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-02-03 09:03 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

随着技术的发展,在工控领域中,也有许多地方出现了音频的身影,为了满足客户的需求,英创公司也推出了音频的方案。考虑到成本的问题,我们选用了市面上很便宜的USB音频模块,Linux内核中已经集成了使用ALSA架构的音频模块的驱动,市面上支持ALSA音频驱动的USB音频模块都能够直接使用,接上后就能够识别出音频设备。本篇文章中使用罗技型号为5572A的音频模块来作为示例,来介绍对USB音频模块的支持。

1、Linux内核配置

内核配置如下:
Device Drivers --->
<*> Sound card support --->
<*> Advanced Linux Sound Architecture --->
[*] USB sound devices --->
<*> USB Audio/MIDI driver

由于系统中已经集成了驱动,所以插上USB音频模块后,系统就能识别出声卡设备,在目录/dev/snd下可以查看接口,使用命令cat /proc/asound/device可以查看声卡设备。要控制声卡设备,需要使用内核提供的接口,接口都是由ALSA驱动提供的。

查看声卡设备

2、ALSA库的移植

ALSA标准是一个先进的linux声音体系,表示高级Linux声音体系结构(Advanced Linux Sound Architecture)。它包含内核驱动集合,API库和工具对Linux声音进行支持。ALSA 包含一系列内核驱动对不同的声卡进行支持,还提供了libasound的API库。

因为使用了ALSA库,我们在编译程序的时候要用到相关的头文件和动态链接库,所以在程序开发前,需要移植alsa-lib。

alsa-lib的移植过程:

1、下载源码:http://www.alsa-project.org/main/index.php/Download

2、转入工作目录:cd alsa-lib-1.0.28

3、配置,生成Makefile
./configure --host=arm-none-linux-gnueabi --prefix=/home/hzc/alsa_lib --with-configdir=/etc --with-plugindir=/lib
4、编译 make
5、安装 make install

编译成功后将生成的libasound.so库文件,将libasound.so这个库文件放到根文件系统/lib目录下。必须还要把安装生成的 alsa.conf(在--with-configdir所指向目录下)拷贝到英创主板文件系统中--with-configdir所指向目录下,否则程序执行会报错,建议将--with-configdir指定到/etc目录下。到此英创linux主板环境下alsa-lib库的移植就完成了。

3、音频应用程序简介

ALSA由许多声卡的声卡驱动程序组成。应用程序开发需要使用libasound的API库。libasound提供最高级并且编程方便的编程接口。并且提供一个设备逻辑命名功能,这样开发者甚至不需要知道类似设备文件这样的低层接口。

ALSA API 被主要分为以下几种接口:
控制接口:提供管理声卡注册和请求可用设备的通用功能
PCM接口:管理数字音频回放(playback)和录音(capture)的接口。它是开发数字音频程序最常用到的接口。
定时器(Timer)接口:为同步音频事件提供对声卡上时间处理硬件的访问。

使用ALSA接口控制声卡播放的典型流程为:

下面来看具体的程序,按照流程图,首先应该是打开接口。API库使用逻辑设备名而不是设备文件。设备名字可以是真实的硬件名字也可以是插件名字。硬件名字使用hw:i,j这样的格式。其中i是卡号,j是这块声卡上的设备号。第一个声音设备是hw:0,0这个别名默认引用第一块声音设备。插件使用另外的唯一名字。比如 plughw:0,0表示一个插件,这个插件不提供对硬件设备的访问,而是提供像采样率转换这样的软件特性,硬件本身并不支持这样的特性。

使用“plughw”接口,程序员不必过多关心硬件,而且如果设置的配置参数和实际硬件支持的参数不一致,ALSA 会自动转换数据。如果使用“hw”接口,我们就必须检测硬件是否支持设置的参数了。所以打开设备使用如下代码:

char name[20]=' plughw:0,0';
rc=snd_pcm_open(&handle, name , SND_PCM_STREAM_PLAYBACK, 0);
if(rc<0)
{
perror('\nopen PCM device failed:');
exit(1);
}

接下来是设置硬件参数,常用的参数介绍如下:
样本长度(sample):样本是记录音频数据最基本的单位,常见的有8位和16位。
通道数(channel):该参数为1表示单声道,2则是立体声。
帧(frame):桢记录了一个声音单元,其长度为样本长度与通道数的乘积。
采样率(rate):每秒钟采样次数,该次数是针对帧而言。

为了设置音频流的硬件参数,我们需要分配一个类型为snd_pcm_hw_param的变量。分配用到函数宏 snd_pcm_hw_params_alloca。
snd_pcm_hw_params_alloca(¶ms);

下一步,我们使用函数snd_pcm_hw_params_any来初始化这个变量,传递先前打开的 PCM流句柄。
snd_pcm_hw_params_any(handle, params);

然后就可以调用API来设置我们所需的硬件参数。这些函数需要三个参数:PCM流句柄,参数类型,参数值。我们将需要播放的wav格式文件中的这些参数读取出来设置到硬件中。对于采样率而言,声音硬件并不一定就精确地支持我们所定的采样率,但是我们可以使用函数 snd_pcm_hw_params_set_rate_near来设置最接近我们指定的采样率的采样率。其实只有当我们调用函数 snd_pcm_hw_params后,硬件参数才会起作用。

具体的代码如下:

snd_pcm_hw_params_alloca(¶ms);//分配params结构体
if(rc<0)
{
perror('\nsnd_pcm_hw_params_alloca:');
exit(1);
}
rc=snd_pcm_hw_params_any(handle, params);//初始化params
if(rc<0)
{
perror('\nsnd_pcm_hw_params_any:');
exit(1);
}
rc=snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED);/*初始化访问权限,采用交错模式。交错访问:在缓冲区的每个 PCM 帧都包含所有设置的声道的连续的采样数据。比如声卡要播放采样长度是 16-bit 的 PCM 立体声数据,表示每个 PCM 帧中有 16-bit 的左声道数据,然后是 16-bit 右声道数据。
非交错访问:每个 PCM 帧只是一个声道需要的数据,如果使用多个声道,那么第一帧是第一个声道的数据,第二帧是第二个声道的数据,依此类推。*/

if(rc<0)
{
perror('\nsed_pcm_hw_set_access:');
exit(1);
}
//采样位数
switch(bit/8)
{
case 1:snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_U8);
break ;
case 2:snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE);
break ;
case 3:snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S24_LE);
break ;
}
rc=snd_pcm_hw_params_set_channels(handle, params, channels);//设置声道,1表示单声道,2表示立体声
if(rc<0)
{
perror('\nsnd_pcm_hw_params_set_channels:');
exit(1);
}
val = frequency;
rc=snd_pcm_hw_params_set_rate_near(handle, params, &val, &dir);//设置频率
if(rc<0)
{
perror('\nsnd_pcm_hw_params_set_rate_near:');
exit(1);
}
rc = snd_pcm_hw_params(handle, params);
if(rc<0)
{
perror('\nsnd_pcm_hw_params: ');
exit(1);
}

最后进行数据处理,播放选定的文件。每个声卡都有一个硬件缓存区来保存记录下来的样本。当缓存区足够满时,声卡将产生一个中断。内核声卡驱动然后使用直接内存(DMA)访问通道将样本传送到内存中的应用程序缓存区。类似地,对于回放,任何应用程序使用DMA将自己的缓存区数据传送到声卡的硬件缓存区中。

这样硬件缓存区是环缓存。也就是说当数据到达缓存区末尾时将重新回到缓存区的起始位置。ALSA维护一个指针来指向硬件缓存以及应用程序缓存区中数据操作的当前位置。从内核外部看,我们只对应用程序的缓存区感兴趣,应用程序缓存区的大小可以通过ALSA库函数调用来控制。缓存区可以很大,一次传输操作可能会导致不可接受的延迟,我们把它称为延时(latency)。为了解决这个问题,ALSA将缓存区拆分成一系列周期(period)。

ALSA以period为单元来传送数据。peroid_size 是PCM DMA单次传送数据帧的大小。通过snd_pcm_hw_params_get_period_size()取得peroid_size,注意在ALSA中peroid_size是以frame为单位的,而 frame = channels * sample_size. 所以缓冲区大小的计算公式为:chunk_byte = period_size * bit_per_sample * hw_params.channels / 8(字节数(bytes) = 每周期的帧数* 样本长度(bit) * 通道数 / 8 )

rc=snd_pcm_hw_params_get_period_size(params, &frames, &dir);/*获取周期长度*/
if(rc<0)
{
perror('\nsnd_pcm_hw_params_get_period_size:');
exit(1);
}
size = frames * datablock;/*字节数(bytes) = 每周期的帧数* 样本长度(bit) * 通道数 / 8 ,假设采样率为16即size=frames*16*2/8*/

buffer =(char*)malloc(size);
fseek(fp,58,SEEK_SET);//定位歌曲到数据区

while (1)
{
memset(buffer,0,sizeof(buffer));
ret = fread(buffer, 1, size, fp);
if(ret == 0)
{
printf('歌曲写入结束\n');
break;
}
else if (ret != size)
{
}
//写音频数据到PCM设备,播放
while((ret = snd_pcm_writei(handle, buffer, frames))<0)
{
usleep(2000);
if (ret == -EPIPE)
{
/*EPIPE means underrun*/
fprintf(stderr, 'underrun occurred\n');
//完成硬件参数设置,使设备准备好
snd_pcm_prepare(handle);
}
else if (ret < 0)
{
fprintf(stderr, 'error from writei: %s\n',snd_strerror(ret));
}
}
}

这样,我们便完成了一个具有播放wav文件功能的音频程序,详细的程序可以参考光盘中的例程。

在进行应用程序开发时,还需要将alsa-lib相关的头文件添加到编译工具的相关include目录下,对应英创公司提供eclipse编译环境,即如下图所示,需要将 alsa-lib安装目录中 include目录下的alsa文件夹复制到 PC机的C:\Program Files (x86)\CodeSourcery\Sourcery G++ Lite\arm-none-linux-gnueabi\libc\usr\include目录下。

alsa的应用需要用到专用的动态库libasound.so两个文件,所以需要将这两个文件复制到应用程序工程文件project目录下,同时在eclipse环境对此程序编译时,需要设置相应的编译属性。在Project Explorer视窗下,选择需要设置的工程文件,然后点击鼠标右键,选择 Properties项,在窗口中选择C/C++ Build -> Settings -> Tool Settings -> Sourcery G++ C++ Linker -> Libraries,如下图所示。其中的一个窗口用于指定库文件的名称,一个用于指定库文件的路径。

这样就能够在eclipse的环境下进行应用程序的开发了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    88

    文章

    11854

    浏览量

    219820
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6107

    浏览量

    37204
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【高能新品】龙芯3B5000工控主板!筑牢彩票与自助终端安全底座

    信息技术自主可控的浪潮下,国产化是芯片、主板的实际行动。对于彩票电脑、自助终端这类高频运行、对安全要求极高的设备而言,一款靠谱的国产化工控主板,正是筑牢安全防线的核心底气。
    的头像 发表于 05-06 14:23 189次阅读

    龙芯2K3000国产信工控机,8核澎湃算力融合国密安全与星闪互联

    信息技术应用创新产业纵深推进的当下,从核心处理器到基础软件的全面自主可控,已成为保障关键基础设施安全的必要条件。 康仕工控基于龙芯2K3000平台的NIS-LS5133嵌入式工控
    的头像 发表于 05-06 10:19 393次阅读
    龙芯2K3000国产信<b class='flag-5'>创</b><b class='flag-5'>工控</b>机,8核澎湃算力融合国密安全与星闪互联

    全面适配国产操作系统的龙芯平台工控机,构建信产业坚实硬件底座

    产业,即信息技术应用创新产业,是当前国家信息化发展的战略重点。其核心目标是构建自主可控的信息技术体系,从芯片、操作系统到整机、应用软件,实现全链路的国产化替代。在这一宏伟蓝图中,
    的头像 发表于 04-08 17:14 592次阅读
    全面适配国产操作系统的龙芯平台<b class='flag-5'>工控</b>机,构建信<b class='flag-5'>创</b>产业坚实硬件底座

    龙芯主板——信体系的智慧硬核基石

    信息技术飞速发展的当下,信体系的自主可控与创新升级已成为国家战略层面的关键任务。作为信产业发展的重要基础硬件支撑,国产工控主板的自主可
    的头像 发表于 03-11 10:44 304次阅读
    龙芯<b class='flag-5'>主板</b>——信<b class='flag-5'>创</b>体系的智慧硬核基石

    产业驶入快车道,国产工控主板成自主可控关键支撑

    当前,我国信产业规模大幅突破,信息技术应用创新产业迎来高速发展期。发展信,早已超越单纯的技术升级范畴,成为保障国家信息安全、推动经济高质
    的头像 发表于 03-04 14:18 250次阅读
    信<b class='flag-5'>创</b>产业驶入快车道,国产<b class='flag-5'>工控</b><b class='flag-5'>主板</b>成自主可控关键支撑

    国产金融主板:赋能智慧金融,驱动信产业升级

    随着信息技术的飞速迭代,信产业已在全球范围内崛起,成为拉动经济增长、激活创新动能的核心力量。在信产业的关键布局中,智慧金融建设是重中之重,而国产金融主板的规模化应用,正为智慧金融建
    的头像 发表于 12-31 09:03 293次阅读
    国产金融<b class='flag-5'>主板</b>:赋能智慧金融,驱动信<b class='flag-5'>创</b>产业升级

    国产芯筑基,飞腾主板赋能信未来

    信息技术自主可控成为国家战略的今天,信产业正从“政策驱动”迈向“市场驱动”的高质量发展新阶段。作为信产业链的核心硬件基石,主板的国产化水平直接决定着整个
    的头像 发表于 12-30 09:49 460次阅读
    国产芯筑基,飞腾<b class='flag-5'>主板</b>赋能信<b class='flag-5'>创</b>未来

    3A6000四核龙芯工控主板,推动信工控深度融合

    当今信科技快速发展,技术的不断演进和市场需求的变化,在工控领域也在进行源源不断地创新,其中最引人注目的是国产龙芯主板在其中的发展应用。
    的头像 发表于 11-14 09:10 546次阅读

    工控主板的设计特性

    在工业自动化、智能装备、物联网等领域,工控主板作为核心控制单元,其设计质量直接决定了整个系统的稳定性、可靠性与运行效率。与消费级主板不同,工控主板
    的头像 发表于 11-13 08:58 646次阅读
    <b class='flag-5'>工控</b><b class='flag-5'>主板</b>的设计特性

    新时代的硬核基石:龙芯工控主板助力信产业新基建

    在数字技术重塑产业格局的今天,信产业已成为保障国家信息技术安全的核心战略。作为工业自动化系统的大脑,工控主板的自主可控程度直接决定信创新基
    的头像 发表于 11-05 13:54 438次阅读

    工控主板的三大核心技术

    在工业自动化的浪潮中,工控主板如同“工业大脑”的核心载体,支撑着各类设备的稳定运行与智能升级。相较于消费级主板工控主板需在复杂工况下实现长
    的头像 发表于 10-16 11:05 531次阅读

    智慧新核心,龙芯主板助力信体系再升级

    信息技术飞速发展的当下,信体系的自主可控与创新升级已成为国家战略层面的关键任务。作为信产业发展的重要基础硬件支撑,国产工控主板正发挥着
    的头像 发表于 08-11 09:14 859次阅读

    飞腾主板为信产业发展提高硬实力

    信息技术飞速发展的当下,信产业已成为我国实现科技自立自强、保障国家信息安全的关键领域。信,即信息技术应用创新,其核心目标是实现
    的头像 发表于 07-22 18:20 882次阅读

    科普|信是什么?一文读懂“信息技术应用创新”战略

    什么是信?信,即“信息技术应用创新”,是国家推动IT系统自主可控、安全可控的重要战略工程。它不仅是技术层面的创新,更承载着保障国家网络安全、推动产业升级和实现数字主权的重任。简单来
    的头像 发表于 06-13 10:06 9887次阅读
    科普|信<b class='flag-5'>创</b>是什么?一文读懂“<b class='flag-5'>信息技术</b>应用创新”战略