您的位置:首页 > 移动开发 > Android开发

Android添加iPod USB PCM音频

2014-10-02 14:26 337 查看
在Apple的MFI文档中说明了,USB接口的播放器是需要接入USB的HID接口以及USB PCM接口。

驱动部分暂时先不说了,直接说framwork部分的添加PCM接口部分的事情了。

1.在android的源码中提供了pcm部分的接口,源码位置;\external\tinyalsa.这里面就有pcm部分的代码了。

a.打开audio设备:struct pcm *pcm_open(unsigned int card, unsigned int device,unsigned int flags, struct pcm_config *config)

参数说明:

card 声卡编号。 这个可以在 proc/asound/下看到card0 、card1、cards。 如果你有两个声卡设备你才看得到card1,也就是说,如果ipod的usb pcm驱动成功的话在这个里面你就可以看到了card1了。

devices这个就是接口设备、按照实际需要修改了。

flags:这个参数填入 PCM_IN,因为我们需要的是PCM输入设备。

config:这个就是配置信息项目了重点配置项目: format : PCM_FORMAT_S16_LE; channels : 2;还有就是rates:我们先默认配置44100.这个参数是需要根据ipod发送过来的参数实时调整的。

在pcm_open的源码里面我们可以看到,实际上是直接打开设备:

snprintf(fn, sizeof(fn), "/dev/snd/pcmC%uD%u%c", card, device,flags & PCM_IN ? 'c' : 'p');

也就是dev/snd/目录下的接口。注意这个地方,我们查看一下/dev/snd下的权限是属于system的,也就是说如果我们的程序没有系统的签名,这个设备是不能打开的。这里在写应用的时候就需要注意了。在程序中声明一下使用uid.system,这个不明白就再google一下吧。

这里需要注意一下:写代码的时候应该按照标准写,返回值pcm指针需要判断是否会null然后判断fd,不能只判断是否等于null,因为在错误的时候返回的是bad_pcm

static struct pcm bad_pcm = {

.fd = -1,

};

剩下的事情就比较简单了。pcm读取的流程是:pcm_read然后将读取的数据写入到pcm_write就可以了。关于buff设置大小的问题就可以参考alsa的资料了。

这样子音频就出来了。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐