1、demo
AudioManager audioManager = (AudioManager)getSystemService("audio"); audioManager.setMode(AudioManager.STREAM_MUSIC);//设置声音模式 audioManager.setMicrophoneMute(true); //打开麦克风
权限:<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
2、java层
<1>frameworks/base/media/java/android/media/AudioManager.java
public void setMicrophoneMute(boolean on){
IAudioService service = getService(); service.setMicrophoneMute(on, mContext.getOpPackageName()); }
<2>frameworks/base/media/java/android/media/AudioSystem.java
public static native int muteMicrophone(boolean on);
3、Native层
<1>frameworks/base/core/jni/android_media_AudioSystem.cpp
(1)static JNINativeMethodgMethods[] ={
{"muteMicrophone", "(Z)I", (void *)android_media_AudioSystem_muteMicrophone},};
(2)static jint android_media_AudioSystem_muteMicrophone(JNIEnv *env, jobject thiz, jboolean on) { return (jint) check_AudioSystem_Command(AudioSystem::muteMicrophone(on));
}
<2>frameworks/av/media/libmedia/AudioSystem.cpp
status_t AudioSystem::muteMicrophone(bool state) { const sp<IAudioFlinger>&af = AudioSystem::get_audio_flinger(); return af->setMicMute(state); }
<3>Binder的Client端Bp层,真正实现的部分在服务端的Bn层
frameworks/av/media/libmedia/IaudioFlinger.cpp
class BpAudioFlinger : public BpInterface<IAudioFlinger>{
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(); }
};
IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
status_t BnAudioFlinger::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags){ case SET_MIC_MUTE: { CHECK_INTERFACE(IAudioFlinger, data, reply); reply->writeInt32( setMicMute(state) ); //发送给Bn服务端 return NO_ERROR;} break;
}
<4>Binder服务端的Bn层,真正实现的部分
frameworks/av/services/audioflinger/AudioFlinger.cpp
AudioFlinger::AudioFlinger() :BnAudioFlinger(){//构造函数
} status_t AudioFlinger::setMicMute(bool state){ status_t result = dev->set_mic_mute(dev, state);//调用HAL层 }
4、HAL层
hardware/rockchip/audio/tinyalsa_hal/audio_hw.c
<1>static int adev_open(const hw_module_t* module, const char* name, hw_device_t** device) { struct audio_device *adev; adev->hw_device.set_mic_mute = adev_set_mic_mute; } static int adev_set_mic_mute(struct audio_hw_device *dev, bool state) { struct audio_device *adev = (struct audio_device *)dev; adev->mic_mute = state; return 0; }
<2>打开audio设备节点操作
external/tinyalsa/pcm.c
struct pcm *pcm_open(unsigned int card, unsigned int device, unsigned int flags, struct pcm_config *config)
{ snprintf(fn, sizeof(fn), "/dev/snd/pcmC%uD%u%c", card, device, flags & PCM_IN ? 'c' : 'p');
pcm->fd =open(fn, O_RDWR); }
5、Kernel层
kernel/sound/soc/rockchip/rk30_fpga192k.c
static int rk30_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { snd_soc_dai_set_sysclk(cpu_dai, 0, pll_out, 1); snd_soc_dai_set_clkdiv(cpu_dai, ROCKCHIP_DIV_BCLK,div_bclk); snd_soc_dai_set_clkdiv(cpu_dai, ROCKCHIP_DIV_MCLK, div_mclk); }