Android如何找到正确的ALSA底层kcontrol接口?
16lz
2021-01-26
转:http://blog.csdn.net/sepnic/article/details/6152792
昨天分析了一把snd_kcontrol,可以认为上层应用的确是通过名称标识name来遍历底层的snd_kcontrol链表,从而找到相匹配的kcontrol。见snd_ctl_find_id函数
[cpp] view plain copy
- /**
- *snd_ctl_find_id-findthecontrolinstancewiththegivenid
- *@card:thecardinstance
- *@id:theidtosearch
- *
- *Findsthecontrolinstancewiththegivenidfromthecard.
- *
- *Returnsthepointeroftheinstanceiffound,orNULLifnot.
- *
- *Thecallermustdowncard->controls_rwsembeforecallingthisfunction
- *(iftheraceconditioncanhappen).
- */
- structsnd_kcontrol*snd_ctl_find_id(structsnd_card*card,
- structsnd_ctl_elem_id*id)
- {
- structsnd_kcontrol*kctl;
- if(snd_BUG_ON(!card||!id))
- returnNULL;
- if(id->numid!=0)
- returnsnd_ctl_find_numid(card,id->numid);
- list_for_each_entry(kctl,&card->controls,list){
- if(kctl->id.iface!=id->iface)
- continue;
- if(kctl->id.device!=id->device)
- continue;
- if(kctl->id.subdevice!=id->subdevice)
- continue;
- if(strncmp(kctl->id.name,id->name,sizeof(kctl->id.name)))
- continue;
- if(kctl->id.index>id->index)
- continue;
- if(kctl->id.index+kctl->count<=id->index)
- continue;
- returnkctl;
- }
- returnNULL;
- }
看起来有点像是通过numid来控制的,《Android音频HAL移植》一文有提到:“设备的切换就需要和驱动联调。例如,目前earpiece的id为10,那么就可以通过ALSA的amixer设置earpiece的开和关,以及大小。而id的值就需要做驱动的同事提供。”但是还不能就此肯定。目前也没有找到保存这些值的脚本文件。
继续以上问题,我在调节音量时,打印Codec寄存器的值,发现volume寄存器的值根本不会发生变化,但是音量确确实实是变化的。那时就在怀疑我们Android的音量调节不是通过硬件来实现的,而是有自身的sw mixer机制。晚上和Vic一起吃饭时,聊起这个,肯定了我的猜测。
[cpp] view plain copy
- status_tAudioFlinger::setMasterVolume(floatvalue)
- {
- //checkcallingpermissions
- if(!settingsAllowed()){
- returnPERMISSION_DENIED;
- }
- //whenhwsupportsmastervolume,don'tscaleinswmixer
- AutoMutexlock(mHardwareLock);
- mHardwareStatus=AUDIO_HW_SET_MASTER_VOLUME;
- if(mAudioHardware->setMasterVolume(value)==NO_ERROR){
- value=1.0f;
- }
- mHardwareStatus=AUDIO_HW_IDLE;
- mMasterVolume=value;
- for(uint32_ti=0;i<mPlaybackThreads.size();i++)
- mPlaybackThreads.valueAt(i)->setMasterVolume(value);
- returnNO_ERROR;
- }
以后实现hw mixer看看(反正到时也要实现EQ)效果,现在这个音量设置不是线性的,用硬件控制应该更好一点。
PS:标题就不用管它了,默认下Android根本不去找底层的kcontrol接口,而是使用自身的sw mixer。
更多相关文章
- Robolectric进行Android单元测试
- ubuntu10.04 android编译问题
- android led_misc驱动 + 测试应用程序(ndk-build)
- Android(安卓)Camera Architecture
- Android培训班(103)内核入口汇编3
- 【Android话题-2.5系统服务】ServiceManager启动和工作原理是怎
- Android(安卓)Q WiFi Enable
- Farsight(华清远见) s5pc100-a(A8) 开发板Android驱动开发环境搭建
- 非常好看的android音量旋钮