二. 编程细节
按照上面的流程,其中有许多细节我们可以加以控制,这里仅仅指出应用程序需要关心的:
1.1 设备层次
在alsa驱动这一层,目前为止,抽象出了4层设备:
一是hw:0,0;
二是plughw:0,0;
三是default:0;
四是default。
至于一是清楚了,二和二以上可以做数据转换,以支持一个动态的范围,比如你要播放7000hz的东西,那么就可以用二和二以上的。而你用7000hz作为参数,去设置一,就会报错。三和四,支持软件混音。我觉得default:0表示对第一个声卡软件混音,default表示对整个系统软件混音。
这里提出两点:
1.1.1 一般为了让所有的程序都可以发音,为使用更多的默认策略,我们选用三和四,这样少一些控制权,多一些方便。
1.1.2 对不同的层次的设备,相同的函数,结果可能是不一样的。比如,设置Hardware Parameters里的period和buffer size,这个是对硬件的设置,所以,default和default:0这两种设备是不能设置的。
如果直接操作hw:0,0,那么snd_pcm_writei只能写如8的倍数的frame,比如16、24等,否则就会剩下一点不写入而退回,而 default,就可以想写多少就写多少,我们也不必要关心里面具体的策略。
[Loong]:之前都是使用了default,还真没留意过这些