读书人

音频hal层小结+frameworks 概要

发布时间: 2013-01-21 10:15:39 作者: rapoo

音频hal层总结+frameworks 概要

音频hal层总结+frameworks概要

第一部分

三个文件,其中所有类,都为根类.文件地址:

1:Audio.h有四个类

①.audio_stream_out:主要有四个成员函数: *get_latency set_volume write get_render_position 并且包含: struct audio_stream common;

②.audio_stream_in:主要有三个成员函数:set_gain(调音) read get_input_frames_lost

函数getInputFramesLost,调用checkRecordThread_l获取录音线程,然后调用线程的getInputFramesLost函数。

并且包含: struct audio_stream common;

③.struct audio_module { struct hw_module_t common; };

④. audio_hw_device包含很多成员函数

2: audio_effect.h音效文件先不表.

3: audio_policy.h策略管理

①. audio_policy:

②. audio_policy_service_ops

③.typedef struct audio_policy_module { struct hw_module_t common;} audio_policy_module_t;

④.audio_policy_device:

第二部分: STUB(模拟测试)程序

文件目录: 两个文件

1:audio_hw.c

2:audio_policy.c

这两个程序,其实就是两个Stub(模拟测试)程序.我们hal层可以参照来写.

第三部分:兼容2.3以前的程序文件目录:

1: AudioSystemLegacy.h

从namespace来看,确实4.0以后可能不用到. Using 使用名字空间表示以下代表在status_t和 AudioParameter空间可见..

2: AudioHardwareBase.h

3:AudioHardwareInterface.h

有三个类,AudioStreamOut AudioStreamIn AudioHardwareInterface

例AudioStreamIn 成员函员包括以下

其中Read和 Write函数是最关键的了.

4: AudioPolicyInterface.h

5: AudioPolicyManagerBase.h

上面两个都是音频软硬件策略文件了.

功能如:可以看出包括软硬件的策略管理.

第三部分之二(兼容2.3之前代码)文件路径:

从以下文件名可以知道程序功能:

以前的主程序,主要分为stub hw_hal a2dp policy 等四大块功能.

兼容的方法为如下:

/*

兼容以前的设计,4.0实现一个中间层:hardware/libhardware_legacy/audio/audio_hw_hal.cpp,

结构与其他的audio_hw.c大同小异,差别在于open方法:

[cpp] view plaincopystatic int legacy_adev_open(const hw_module_t* module, const char* name,

hw_device_t** device)

{

......

ladev->hwif = createAudioHardware();

if (!ladev->hwif) {

ret = -EIO;

goto err_create_audio_hw;

}

......

}

看到那个熟悉的createAudioHardware()没有?这是以前我提到的Vendor Specific Audio接口,

然后新的接口再调用ladev->hwif的函数就是了。

因此老一套的alsa-lib、alsa-utils和alsa_sound也可以照搬过来,这里的文件被编译成静态库的,

因此你需要修改alsa_sound里面的Android.mk文件,链接这个静态库。还有alsa_sound的命名空间原来是“android”,

现在需要改成“android_audio_legacy”---注意!!!

*/

第四部分:ALSA管理.代码目录:

文件结构

承接frameworks层服务端的总体接口.

如alsa_default.cpp的内容,为s_init s_open s_close等等, s_open里面调用了s_route,设置软硬件参数.

从内容上看这是amlogic在2.3之前的代码的现用程序.重点分析这一部分的数据流走向.

ALSA其实也就代表一种管理方法,简单地说就是这里的程序就是alsa , alsa就是这里.感觉和V4L2还是有一点小小的区别.

这部分代码现在google用tinyalsa来代替它,但是仍然保留了接口,可以供厂商不用tinyalsa(功能不够强大)时来代替它,只需要改一下*.mk文件即可.其实看一下也就十个文件,也不是很复杂的.当然,上层flinger和下层 kernel适配的地方同样要复杂一些.

ALSA要比v4l2复杂一些.它的内容主要是一些软件方法.而v4l2的内容是一些标准的接口命令.

同样,由于现在版本是4.0,不用这部分代码了,而用了\external\tinyalsa\.而tinyalsa则简单很多!

调用方法为: ./hardware/libhardware_legacy/audio/、hardware/libhardware/modules/audio/、device/samsung/tuna/audio/是同层的。

之一是legacy audio,用于兼容2.2时代的alsa_sound;之二是stub audio接口;之三是Samsung Tuna的音频抽象层实现。

调用层次:AudioFlinger -> audio_hw -> tinyalsa。

以上除了ALSA部分以外,

全部是audio_hw的处理内容,下面讲第四部分,具体的执行者,tinyslsa.

第五部分:具体执行者 TinyALSA的分析.

1:下文件asoundlib.h.功能如下

其中: 为主体实现文件,为c语言编写的应用工具.

仅仅两个文件pcm.c和mixer.c,看来TinyALSA确实要简单很多!

而且两个文件都不大,加起来1200行代码. mixer.c主要是一些ioctl open memset等函数.

如:ioctl(ctl->mixer->fd, SNDRV_CTL_IOCTL_ELEM_WRITE, &ev);

Pcm.c主要是对数据流的一些操作;

主要函数有:pcm_bytes_to_frames; pcm_frames_to_bytes;

pcm_hw_mmap_status(struct pcm *pcm)中以下两个函数是关键函数.

pcm->mmap_control = mmap(NULL, page_size, PROT_READ | PROT_WRITE,

MAP_FILE | MAP_SHARED, pcm->fd, SNDRV_PCM_MMAP_OFFSET_CONTROL);

munmap(pcm->mmap_status, page_size);

mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。munmap执行相反的操作,删除特定地址区域的对象映射。

pcm_mmap_writeàpcm_mmap_write_areasàpcm_areas_copyàmemcpy.

Mmap的写过程就是以上.

而pcm_mmap_commità pcm_sync_ptrà ioctl(pcm->fd, SNDRV_PCM_IOCTL_SYNC_PTR, pcm->sync_ptr);

这就是几个关键的pcm流操作函数,包括memcpy之内,最终由底层硬件实现具体功能.

而音频的响应速度,可以测一下 memcpy 这里的用法,看有没有启用cache等.

当然最重要的函数为:pcm_read pcm_write.

最终通过ioctl(pcm->fd, SNDRV_PCM_IOCTL_PREPARE);操作pcm->fd;

具体就到了/kernel/sound/core/pcm_native.c里面了.

如有疑问请参见以下网址:http://blog.csdn.net/myarrow/article/details/8228437

这个网址所说的alsa库调用方法,需要我们认真掌握.

附记一点,在kernel 里面也是可以使用ioctl的snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_START, NULL);

我这里在kernel中搜出来SNDRV_PCM_IOCTL_START的结果:

可见\kernel\include\sound\Asound.h这个头文件基本上定义了,所有的ALSA接口命令.

到目前为止没有看到音频格式转化函数.

第六部分: aml Kernel层代码分析

1:代码树

2:代码功能模块

3:硬件数据流及名词解析

4:ALSA设备文件结构

我们从alsa在linux中的设备文件结构开始我们的alsa之旅.看看我的电脑中的alsa驱动的设备文件结构:

$ cd /dev/snd
$ ls -l

crw-rw----+ 1 root audio 116, 8 2011-02-23 21:38 controlC0
crw-rw----+ 1 root audio 116, 4 2011-02-23 21:38 midiC0D0
crw-rw----+ 1 root audio 116, 7 2011-02-23 21:39 pcmC0D0c
crw-rw----+ 1 root audio 116, 6 2011-02-23 21:56 pcmC0D0p
crw-rw----+ 1 root audio 116, 5 2011-02-23 21:38 pcmC0D1p
crw-rw----+ 1 root audio 116, 3 2011-02-23 21:38 seq
crw-rw----+ 1 root audio 116, 2 2011-02-23 21:38 timer

我们可以看到以下设备文件:

读书人网 >.NET Framework

热点推荐