天天看點

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層

Android的Audio系統詳解

2017年05月06日 10:20:50 zzqhost 閱讀數:3318更多

個人分類: Android代碼研究

目錄

Audio系統詳解

1       Audio的Framework層功能及用法大全

    1.1        多媒體的framework接口預覽

    1.2        Audio相關的檔案預覽

    1.3        Audio核心

        1.3.1         AudioTrack

        1.3.2         AudioRecord

        1.3.3         AudioFormat

        1.3.4         AudioSystem

    1.4        Audio輔助

        1.4.1         AudioManager和AudioService

        1.4.2         RingToneManager和RingTone

        1.4.3         ToneGenerator

        1.4.4         SoundPool

    1.5        Audio路由

        1.5.1         MediaRounter

    1.6        Audio Framework層總結

2       Audio系統的整體結構

3       Audio系統的Native層

    3.1        Audio架構libmedia

    3.2        AudioFlinger

    3.3        AudioPolicy

        3.3.1         代碼位置

        3.3.2         AudioPolicy的結構圖

        3.3.3         AudioPolicyManagerBase

        3.3.4         AudioPolicyManagerBase的職責

        3.3.5         AudioPolicyManagerBase中的主要方法

4       Audio系統的Hal層

    4.1        代碼位置

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
1       Audio的Framework層功能及用法大全

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
1.1     多媒體的framework接口預覽

類型 檔案名 描述
多媒體核心 MediaPlayer.java
MediaRecorder.java
應用層控制Extractor,解碼 DecoderCapabilities.java  用來獲得Android平台支援的解碼器。
EncoderCapabilities.java 用來獲得Android平台支援的編碼器。
MediaCodecInfo.java Android4.1
MediaCodec.java Android4.1
MediaCodecList.java Android4.1
MediaFormat.java Android4.1
MediaExtractor.java Android4.1
Utils MediaCrypto.java 為MediaCodec提供支援 Android4.1
MediaCryptoException.java Android4.1
MediaSyncEvent.java Android4.1
Audio核心 AudioRecord.java
AudioTrack.java
AudioSystem.java
AudioFormat.java
聲音路由相關 AudioRoutesInfo.java 用來設定聲音路由,現在使用者可以自由設定AudioPolicy中的功能了。 Android4.1
MediaRouter.java Android4.1
Audio輔助及控制 AsyncPlayer.java 聲音異步加載
AudioManager.java  管理音量、鈴聲
AudioService.java 聲音管理服務, AudioManager中調用的是此中的實作
RingtoneManager.java
Ringtone.java
ToneGenerator.java
SoundPool.java
MediaActionSound.java Android4.1
Camera CamcorderProfile.java
CameraProfile.java
掃描和Provider MediaFile.java
MediaScannerClient.java
MediaScannerConnection.java
MediaScanner.java
MediaInserter.java
Metadata.java
TimedText.java
MediaMetadataRetriever.java
MiniThumbFile.java
ThumbnailUtils.java
其它 ExifInterface.java 用來獲得Jpeg圖像的Exif資訊
FaceDetector.java 人臉識别,有沒有實作就不知道了,需要再研究。
JetPlayer.java
RemoteControlClient.java
AmrInputStream.java
ResampleInputStream.java

說明:在frameworks/base/media/java/android/media/ 路徑下總共有57個檔案:

檔案夾:   2個

aidl檔案: 10個

html檔案: 1個

以上有說明的檔案:44個, 相對Android4.0.3增加了11個。

下面是兩個檔案夾下的具體内容:

VideoEditor     |-- AudioTrack.java
    |-- EffectColor.java
    |-- Effect.java
    |-- EffectKenBurns.java
    |-- ExtractAudioWaveformProgressListener.java
    |-- MediaArtistNativeHelper.java
    |-- MediaImageItem.java
    |-- MediaItem.java
    |-- MediaProperties.java
    |-- MediaVideoItem.java
    |-- OverlayFrame.java
    |-- Overlay.java
    |-- TransitionAlpha.java
    |-- TransitionCrossfade.java
    |-- TransitionFadeBlack.java
    |-- Transition.java
    |-- TransitionSliding.java
    |-- VideoEditorFactory.java
    |-- VideoEditorImpl.java
    |-- VideoEditor.java
    |-- VideoEditorProfile.java
    `-- WaveformData.java
AudioFx     |-- AcousticEchoCanceler.java
    |-- AudioEffect.java
    |-- AutomaticGainControl.java
    |-- BassBoost.java
    |-- EnvironmentalReverb.java
    |-- Equalizer.java
    |-- NoiseSuppressor.java
    |-- package.html
    |-- PresetReverb.java
    |-- Virtualizer.java
    `-- Visualizer.java

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
1.2     Audio相關的檔案預覽

在整個Framework的Media部分與Audio相關的部分如下:

類型 檔案名 描述
Audio核心 AudioRecord.java
AudioTrack.java
AudioSystem.java
AudioFormat.java
聲音路由相關 AudioRoutesInfo.java 用來設定聲音路由,現在使用者可以自由設定AudioPolicy中的功能了。 Android4.1
MediaRouter.java Android4.1
Audio輔助及控制 AsyncPlayer.java 聲音異步加載
AudioManager.java  管理音量、鈴聲
AudioService.java 聲音管理服務, AudioManager中調用的是此中的實作
RingtoneManager.java
Ringtone.java
ToneGenerator.java
SoundPool.java
MediaActionSound.java Android4.1

由上圖可知:Framework層主要分為兩個部分,Audio的核心層和Audio的輔助類。Audio核心層的類包括AudioTrack, AudioRecord, AudioSystem。Audio的輔助類主要有AudioManager,RingToneManager,ToneGenerator和SoundPool。

下面的章節節将分别介紹這些部分。

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
1.3     Audio核心

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
1.3.1  AudioTrack

AudioTrack是播放的API接口,具體用法是先new一個執行個體出來,然後再調用它裡邊的一個play, write, read等函數, 最後stop, release.

         下圖是一個建立及銷毀的全過程:

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
1.3.2  AudioRecord

AudioRecord是錄音的API,提供接口給使用者調用,并且含有大量的native函數,需要JNI調用Native的相關功能。

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
1.3.3  AudioFormat

AudioFormat中定義了一些變量,這些變量在AudioTrack和AudioRecord中用到。主要有以下内容:

1.3.3.1 Audio data format

    public static final int ENCODING_INVALID = 0;

    public static final int ENCODING_DEFAULT = 1;

    // These two values must be kept in sync with JNI code for AudioTrack, AudioRecord

    public static final int ENCODING_PCM_16BIT = 2;

    public static final int ENCODING_PCM_8BIT = 3;

1.3.3.2 Chanel mask

包括chanel in 和 chanel out的很多掩碼定義

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
1.3.4  AudioSystem

此類包含了一些常量定義,裝置定義,native的方法調用接口等。

以下是代碼中的說明:

1.3.4.1 Audio stream相關

public static final int STREAM_VOICE_CALL = 0;

    public static final int STREAM_SYSTEM = 1;

    public static final int STREAM_RING = 2;

    public static final int STREAM_MUSIC = 3;

    public static final int STREAM_ALARM = 4;

    public static final int STREAM_NOTIFICATION = 5;

    public static final int STREAM_BLUETOOTH_SCO = 6;

    public static final int STREAM_SYSTEM_ENFORCED = 7;

    public static final int STREAM_DTMF = 8;

    public static final int STREAM_TTS = 9;

目前一共10種Type, 從0-9, 并且用以下的函數取得StreameType的Count.

// Expose only the getter method publicly so we can change it in the future

    private static final int NUM_STREAM_TYPES = 10;

    public static final int getNumStreamTypes() { return NUM_STREAM_TYPES; }

Audio Stream是一個重要的類型,在其它的很多函數中都需要用到它, 如下所示:

public static native boolean isStreamActive(int stream, int inPastMs);

public static native int initStreamVolume(int stream, int indexMin, int indexMax);

public static native int setStreamVolumeIndex(int stream, int index, int device);

public static native int getStreamVolumeIndex(int stream, int device);

public static native int getDevicesForStream(int stream);

1.3.4.2 Microphone是否靜音

public static native int muteMicrophone(boolean on);

public static native boolean isMicrophoneMuted();

傳回值是 AUDIO_STATUS_OK 或 AUDIO_STATUS_ERROR

1.3.4.3 setPhoneState()

public static native int setPhoneState(int state);

// phone state, match audio_mode???

    public static final int PHONE_STATE_OFFCALL = 0;

    public static final int PHONE_STATE_RINGING = 1;

    public static final int PHONE_STATE_INCALL = 2;

上邊的被淘汰了,用下邊的定義:

    public static final int MODE_INVALID            = -2;

    public static final int MODE_CURRENT            = -1;

    public static final int MODE_NORMAL             = 0;

    public static final int MODE_RINGTONE           = 1;

    public static final int MODE_IN_CALL            = 2;

    public static final int MODE_IN_COMMUNICATION   = 3;

    public static final int NUM_MODES               = 4;

1.3.4.4 setParameters() 和 getParameters

    public static native int setParameters(String keyValuePairs);

public static native String getParameters(String keys);

1.3.4.5 DeviceConnectionState

public static native int setDeviceConnectionState(int device, int state, String device_address);

public static native int getDeviceConnectionState(int device, String device_address);

1.3.4.6 ForceUse

    public static native int setForceUse(int usage, int config);

public static native int getForceUse(int usage);

// device categories config for setForceUse, must match AudioSystem::forced_config

    public static final int FORCE_NONE = 0;

    public static final int FORCE_SPEAKER = 1;

    public static final int FORCE_HEADPHONES = 2;

    public static final int FORCE_BT_SCO = 3;

    public static final int FORCE_BT_A2DP = 4;

    public static final int FORCE_WIRED_ACCESSORY = 5;

    public static final int FORCE_BT_CAR_DOCK = 6;

    public static final int FORCE_BT_DESK_DOCK = 7;

    public static final int FORCE_ANALOG_DOCK = 8;

    public static final int FORCE_DIGITAL_DOCK = 9;

    public static final int FORCE_NO_BT_A2DP = 10;

    public static final int FORCE_SYSTEM_ENFORCED = 11;

    private static final int NUM_FORCE_CONFIG = 12;

    public static final int FORCE_DEFAULT = FORCE_NONE;

// usage for setForceUse, must match AudioSystem::force_use

    public static final int FOR_COMMUNICATION = 0;

    public static final int FOR_MEDIA = 1;

    public static final int FOR_RECORD = 2;

    public static final int FOR_DOCK = 3;

    public static final int FOR_SYSTEM = 4;

    private static final int NUM_FORCE_USE = 5;

1.3.4.7 StreamVolume

    public static native int initStreamVolume(int stream, int indexMin, int indexMax);

    public static native int setStreamVolumeIndex(int stream, int index, int device);

    public static native int getStreamVolumeIndex(int stream, int device);

1.3.4.8 MasterVolume 和 MasterMute

    public static native int setMasterVolume(float value);

    public static native float getMasterVolume();

    public static native int setMasterMute(boolean mute);

public static native boolean getMasterMute();

1.3.4.9 getDevicesForStream()

    public static native int getDevicesForStream(int stream);

1.3.4.10         PrimaryOutput

    public static native int getPrimaryOutputSamplingRate();

    public static native int getPrimaryOutputFrameCount();

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
1.4     Audio輔助

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
1.4.1  AudioManager和AudioService

Android中AudioManager主管的是音量及一些鈴音等。在代碼中的典型用法如下:

        // Request the audio focus so that other apps can pause playback.

final AudioManager audioManager = AudioManager)getSystemService(Context.AUDIO_SERVICE);

audioManager.requestAudioFocus(null, AudioManager.STREAM_MUSIC,

                AudioManager.AUDIOFOCUS_GAIN);

得到的AUDIO_SERVICE是AudioManager類型,然後具體的工作再傳給AudioService去做。

AudioManager提供的具體方法如下:

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
1.4.2  RingToneManager和RingTone

RingToneManager類管理所有的RingTone, 其實際是從資料庫中查找出都有哪些Ringtone給調用者,然後調用者可以指定建立哪個RongTone, RongToneManager就會new 相應的RingTone類執行個體。

RingTone分為三種類型:Ringtone, notifaction, alam.

從其存儲的位置還可以分為三種: internel ringtone, media ringtone, drmringtone.

RingTone類其實是一個含有StreamType的簡單點傳播放器,調用系統的MediaPlayer.

首先嘗試用LocalPlayer(類型為MediaPlayer)進行播放設定進來的URI,如果沒有LocalPlayer 則用RemotePlayer來進行播放。RemotePlayer是從AudioManager中得來的,即是一個服務中的。

RingTone與Tone音的差別,參見ToneGenerator

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
1.4.3  ToneGenerator

ToneGenerator的職責是控制簡單聲音的Tone聲發音。 例如電話撥号按鍵時發出的聲音。

ToneGenerator的API也很簡單,隻是一個構造,然後是StartTone, StopTone.

有一個ToneType的概念。 有很多種Tone類型。

這個ToneGenerator與RingTone不一樣, RingTone隻是一種概念,其實就是普通的聲音檔案,比如Mp3, 把它們存到特定的位置,即成為RingTone.這個在掃描的代碼中有具體的代碼,應該是有三個檔案夾的位置。

         ToneGenerator有native層的實作,具體的實作均位于Native層。

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
1.4.4  SoundPool

SoundPool是為了加快那些短小并且需要頻繁播放的聲音準備的,例如遊戲中的一些發音“哈哈哈,嘿嘿嘿”。

         從它的表面意思就能看出來,聲音池,哈哈!!

什麼? 不懂? 那你知道線程池不? 也不知道, 那你就别混了……

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
1.5     Audio路由

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
1.5.1  MediaRounter

待研究…

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
1.6     Audio Framework層總結

待研究…

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
2       Audio系統的整體結構

Audio從整個結構上來說分為Framework層,JNI 層,Native層,Hal及Driver層。

由上節可知,Framework層主要分為兩個部分,Audio的核心層和Audio的輔助類。Audio核心層的類包括AudioTrack, AudioRecord, AudioSystem。Audio的輔助類主要有AudioManager,RingToneManager,ToneGenerator和SoundPool。

其中它們之中具有JNI的有:AudioRecorder, AudioTrack, AudioSystem, ToneGenerator, SoundPool。

再之下就是Native層的AudioPolicy和AudioFlinger了。這些内容将會在Native層的部分進行介紹。

下圖是整個系統的架構圖:

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層

從Native層開始,它們的對外接口是libmedia中的AudioTrack, AudioRecorder, AudioSyste, 其中AudioSystem依賴于AudioFlinger和AudioPolicy這兩個服務中提供的具體功能。如下圖所示:

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
3       Audio系統的Native層

如果按照Android的四層體系架構,Native層(包括)往下是一個完整的體系,Framework層(包括)往上是一個層次,它們分别有它們的對外接口。Framework層的對外接口,請參考第一章,Native層及以下的對外接口就是AudioRecorder, AudioTrack, AudioSyste這三個類。它們之間通過JNI進行聯通。

對外接口的三個類:

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
3.1     Audio架構libmedia

Audio的架構主要是幾個對外接口類,及抽象接口定義,比如AudioTrack, AudioSyste, IAudioFlinger,以及AudioPolicyService類的定義。

         未完待續…

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
3.2     AudioFlinger

AudioFlinger是Android中音頻的核心,主要負責音頻的混音,并把完成的PCM資料送到Hal層的硬體去播放。

         未完待續…

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
3.3     AudioPolicy

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
3.3.1  代碼位置

1.       AudioPolicyService位置:

Frameworks/av/services/audioflinger/AudioService.h

Frameworks/av/services/audioflinger/AudioService.cpp

2.       AudioPolicy的頭檔案定義:

hardware/libhardware/include/hardware/audio_policy.h

3.       實作位置

hardware/libhardware_legacy/audio/audio_policy_hal.cpp

hardware/ libhardware_legacy/audio/AudioPolicyManagerBase.cpp

4.       不同的廠商具有不同的實作從以上Android的實作繼承下來。

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
3.3.2  AudioPolicy的結構圖

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
3.3.3  AudioPolicyManagerBase

可以說AudioPolicyManagerBase是AudioPolicy實作的核心,這是Android的一個預設實作,對于每一個平台來說,産生可以從它繼承一個子類,進行自己的定制化修改,但是AudioPolicyManagerBase已經完成了完整的邏輯,一般來說廠商的子類不會重載基類AudioPolicyManagerBase中的實作或者隻重載一小部分的内容。

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
3.3.4  AudioPolicyManagerBase的職責

設定電話的狀态

設定Stream的音量,并計算音量,設定到AudioFlinger中。

StartOutput

Forceuse

根據電話狀和Stream Type和ForceUse選擇device

計算音量時,如果是插着耳機的話,為了保護聽力,會降低音量。

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
3.3.5  AudioPolicyManagerBase中的主要方法

    virtual status_t setDeviceConnectionState(audio_devices_t device,

                                          AudioSystem::device_connection_state state,

                                          const char *device_address) = 0;

    // retrieve a device connection status

    virtual AudioSystem::device_connection_state getDeviceConnectionState(audio_devices_t device,

                                                                          const char *device_address) = 0;

    // indicate a change in phone state. Valid phones states are defined by AudioSystem::audio_mode

    virtual void setPhoneState(int state) = 0;

    // force using a specific device category for the specified usage

    virtual void setForceUse(AudioSystem::force_use usage, AudioSystem::forced_config config) = 0;

    // retrieve current device category forced for a given usage

    virtual AudioSystem::forced_config getForceUse(AudioSystem::force_use usage) = 0;

    // set a system property (e.g. camera sound always audible)

    virtual void setSystemProperty(const char* property, const char* value) = 0;

    // check proper initialization

    virtual status_t initCheck() = 0;

    //

    // Audio routing query functions

    //

    // request an output appropriate for playback of the supplied stream type and parameters

    virtual audio_io_handle_t getOutput(AudioSystem::stream_type stream,

                                        uint32_t samplingRate = 0,

                                        uint32_t format = AudioSystem::FORMAT_DEFAULT,

                                        uint32_t channels = 0,

                                        AudioSystem::output_flags flags = AudioSystem::OUTPUT_FLAG_INDIRECT) = 0;

    // indicates to the audio policy manager that the output starts being used by corresponding stream.

    virtual status_t startOutput(audio_io_handle_t output,

                                 AudioSystem::stream_type stream,

                                 int session = 0) = 0;

    // indicates to the audio policy manager that the output stops being used by corresponding stream.

    virtual status_t stopOutput(audio_io_handle_t output,

                                AudioSystem::stream_type stream,

                                int session = 0) = 0;

    // releases the output.

    virtual void releaseOutput(audio_io_handle_t output) = 0;

    // request an input appropriate for record from the supplied device with supplied parameters.

    virtual audio_io_handle_t getInput(int inputSource,

                                    uint32_t samplingRate = 0,

                                    uint32_t Format = AudioSystem::FORMAT_DEFAULT,

                                    uint32_t channels = 0,

                                    AudioSystem::audio_in_acoustics acoustics = (AudioSystem::audio_in_acoustics)0) = 0;

    // indicates to the audio policy manager that the input starts being used.

    virtual status_t startInput(audio_io_handle_t input) = 0;

    // indicates to the audio policy manager that the input stops being used.

    virtual status_t stopInput(audio_io_handle_t input) = 0;

    // releases the input.

    virtual void releaseInput(audio_io_handle_t input) = 0;

    //

    // volume control functions

    //

    // initialises stream volume conversion parameters by specifying volume index range.

    virtual void initStreamVolume(AudioSystem::stream_type stream,

                                      int indexMin,

                                      int indexMax) = 0;

    // sets the new stream volume at a level corresponding to the supplied index for the

    // supplied device. By convention, specifying AUDIO_DEVICE_OUT_DEFAULT means

    // setting volume for all devices

    virtual status_t setStreamVolumeIndex(AudioSystem::stream_type stream,

                                          int index,

                                          audio_devices_t device) = 0;

    // retrieve current volume index for the specified stream and the

    // specified device. By convention, specifying AUDIO_DEVICE_OUT_DEFAULT means

    // querying the volume of the active device.

    virtual status_t getStreamVolumeIndex(AudioSystem::stream_type stream,

                                          int *index,

                                          audio_devices_t device) = 0;

    // return the strategy corresponding to a given stream type

    virtual uint32_t getStrategyForStream(AudioSystem::stream_type stream) = 0;

    // return the enabled output devices for the given stream type

    virtual audio_devices_t getDevicesForStream(AudioSystem::stream_type stream) = 0;

    // Audio effect management

    virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc) = 0;

    virtual status_t registerEffect(const effect_descriptor_t *desc,

                                    audio_io_handle_t io,

                                    uint32_t strategy,

                                    int session,

                                    int id) = 0;

    virtual status_t unregisterEffect(int id) = 0;

    virtual status_t setEffectEnabled(int id, bool enabled) = 0;

    virtual bool isStreamActive(int stream, uint32_t inPastMs = 0) const = 0;

    virtual bool isStreamActiveRemotely(int stream, uint32_t inPastMs = 0) const = 0;

    virtual bool isSourceActive(audio_source_t source) const = 0;

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
4       Audio系統的Hal層

Android的Audio系統詳解Android的Audio系統詳解1       Audio的Framework層功能及用法大全2       Audio系統的整體結構3       Audio系統的Native層4       Audio系統的Hal層
4.1     代碼位置

不同的廠商代碼位置不同,但都位于hardware下,以下是intel平台CLV+的代碼位置:

hardware/alsa_sound/audio_hw_configurable

其中AudioStreamOutALSA.cpp類是音頻輸出的實作,如果要dump資料,直接在此類中把資料寫到檔案中即可, 采用的參數一般來說是, 44100, 16 bit, 雙聲道。

繼續閱讀