android工作,android

要详细阐述上面的an00b:s 答案和编辑的版本,我们需要深入探讨源代码。 IAudioflinger是AudioFlinger服务的接口和对virtual status_t setMicMute(bool state)

{

Parcel data, reply;

data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());

data.writeInt32(state);

remote()->transact(SET_MIC_MUTE, data, &reply);

return reply.readInt32();

}

实际上是用来静音麦克风的活页夹交易。 活页夹调用的接收方看起来像:status_t BnAudioFlinger::onTransact(

uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)

{

switch(code) {

...

case SET_MIC_MUTE: {

CHECK_INTERFACE(IAudioFlinger, data, reply);

int state = data.readInt32();

reply->writeInt32( setMicMute(state) );

return NO_ERROR;

} break;

...

}}

并调用setMicMute在 AudioFlinger of中实现的实际实现。 下一步是查看这里函数:status_t AudioFlinger::setMicMute(bool state)

{

//check calling permissions

if (!settingsAllowed()) {

return PERMISSION_DENIED;

}

AutoMutex lock(mHardwareLock);

mHardwareStatus = AUDIO_HW_SET_MIC_MUTE;

status_t ret = mAudioHardware->setMicMute(state);

mHardwareStatus = AUDIO_HW_IDLE;

return ret;

}

这里我们可以注意到两件事。 第一种是有权限检查,以便能够静音麦克风。 在settingsAllowed中检查的权限是 android.permission.MODIFY_AUDIO_SETTINGS,所以在第一个声音的声明上提到的是应用程序声明它需要这里权限。 接下来要注意的是,我们现在使用 mAudioHardware-> setMicMute(state) 来调用硬件特定版本的setMicMute 。

更深入地了解硬件插装方式研究文件 AudioHardwareInterface.cpp. 基本上结束在一个libhardware中,一个外部C 调用 createAudioHardware,它插入了正确的平台的AudioHardWare 。 还有一个用于使用基于的硬件的开关,一个用于 模拟器的通用硬件。 假设你正在处理实际的设备,那么实现是非常的硬件依赖于。 为了了解它,我们可以使用 Crespo ( Nexus ) 中的可用audiohardware作为示例。status_t AudioHardware::setMicMute(bool state)

{

LOGV("setMicMute(%d) mMicMute %d", state, mMicMute);

sp spIn;

{

AutoMutex lock(mLock);

if (mMicMute!= state) {

mMicMute = state;

//in call mute is handled by RIL

if (mMode!= AudioSystem::MODE_IN_CALL) {

spIn = getActiveInput_l();

}

}

}

if (spIn!= 0) {

spIn->standby();

}

return NO_ERROR;

}

基于这个例子,我们可以讨论在智能手机中音频路由的实现。 就像你在Crespo实现中看到的,只有当你不在呼叫中时,麦克风静音呼叫才会被尊重。 这个原因是音频通过模拟基带路由,处理电源调节,放大和它的他东西。 在调用中,语音音频通常由模拟基带和调制解调器CPU处理,并且不通过应用程序CPU路由。 在这种情况下,你可以能需要通过rtc通过调制解调器CPU来静音麦克风。 但是由于这种行为是硬件依赖的,所以没有通用的解决方案。

要向你的4个其他问题提供简短版本:

标志通过几层代码传递,直到它在硬件特定的静音麦克风中结束。

当硬件特定代码运行时,麦克风将断开,但在至少在某些设备上调用时。

当setMicrophoneMute不静音时,在调用时可以能使用一个电话 api: s,我建议学习电话应用程序。

基于当前实现静音似乎在不在呼叫时工作,但在我们没有研究的平台上可以能有硬件问题。

编辑:

进行了一些挖掘和向调制解调器CPU发送静静命令的方法是通过 com.android.internal.telephony 软件包的内部电话接口。 你可以看到这个函数只能被替换音频管理或者原来的电话应用程序使用,我猜想 AudioManager.setMicrophoneMute() 应该总是静音麦克风,而不考虑它的使用。 但是由于它的他应用程序可以能会使用这种方法,他们在硬件实现中添加了一个检查。 由于硬件实现细节和静音比最初考虑调用状态更复杂的事实,该函数可以能不正常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值