media/media
Java源代码位于:frameworks/base/media/java/android/media。
Jni目录framework/base/core/jni。
AudioManager封装Audio服务(IAudioService)和AudioSystem。
AudioService实现IAudioService 服务接口,服务名称为:“audio”。AudioService主要处理音量设置,设置操作在内部线程(AudioSystemThread)执行。通过AudioServiceBroadcastReceiver监听蓝牙、USB声音事件,更新声音设备状态。
- BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED
- BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED
- Intent.ACTION_USB_AUDIO_ACCESSORY_PLUG
- Intent.ACTION_USB_AUDIO_DEVICE_PLUG
java |
jni |
C++ |
AudioSystem |
AudioSystem | |
AudioRecord |
AudioRecord | |
AudioTrack |
AudioTrack |
该目录的java代码被打包到framework-base.jar中,但是运行进行可能在系统服务进程(system_server)和应用进程(app)。其中AudioService由系统服务进程加载,AudioManager通过ContextImpl的getSystemService获取。
system_server加载AudioService:
framework/base/services/java/com/android/server/SystemServer.java: ------------------------------------------------------------------------- public void initAndLoop() { // …… if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) { // …… if (!disableMedia && !"0".equals( SystemProperties.get("system_init.startaudioservice"))) { try { Slog.i(TAG, "Audio Service"); ServiceManager.addService( Context.AUDIO_SERVICE, new AudioService(context)); } catch (Throwable e) { reportWtf("starting Audio Service", e); } } // …… } // …… } |
app加载AudioManager:
framework/base/core/java/android/app/ContextImpl.java: ------------------------------------------------------------------------- static { // …… registerService(AUDIO_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new AudioManager(ctx); }}); // …… } |