Android的Audio系統
Android的Audio 系統
第一部分 Audio系統綜述
第二部分 Audio系統和上層介面
第三部分 Audio的硬體抽象層
第一部分 Audio系統綜述
Audio系統在Android中負責音訊方面的資料流傳輸和控制功能,也負責音訊裝置的管理。
Audio系統主要的分成幾個層次:
1. media中庫提供的Audio系統的上層介面
2. AudioFlinger作為Audio系統的中樞
3. Audio庫的硬體抽象層提供底層的支援
4. Audio介面通過JNI和Java框架提供給上層
Audio系統的上層介面主要提供了兩方面的功能:放音(Track)和錄音(Recorder)。
Media庫(libmedia.so)的Audio部分的目錄中:
frameworks/base/include/media/
frameworks/base/media/libmedia/
這部分的內容被編譯成庫libmedia.so,提供Audio部分的介面。
Audio Flinger (libaudioflinger.so):
frameworks/base/libs/audioflinger
這部分內容被編譯成庫libaudioflinger.so。
Audio的JNI部分:
frameworks/base/core/jni
Audio的JAVA部分:
frameworks/base/media/java/android/media
主要包含AudioManager和Audio系統的幾個類。
Audio硬體抽象層的介面:
hardware/libhardware_legacy/include/hardware/
第二部分 Audio系統和上層介面
2.1 Audio系統的各個層次
2.2 media庫中的Audio框架部分
2.3 AudioFlinger原生代碼
2.4 Audio系統的JNI程式碼
2.5 Audio系統的Java程式碼
2.1 Audio系統的各個層次
Audio系統的結構:
libmedia.so提供Audio介面,這些Audio介面既向上層開放,也向原生代碼開發。
libaudiofilnger.so
Audio硬體抽象層提供到硬體的介面,供AudioFlinger 呼叫。
Audio使用JNI和JAVA對上層提供介面。
2.2 media庫中的Audio框架部分
Android 的Audio的核心框架在media庫中提供,其中對上面主要實現AudioSystem、AudioTrack和AudioRecorder三個類。提供了IAudioFlinger類介面,在這個類中,可以獲得IAudioTrack和IAudioRecorder兩個介面,分別用於聲音的播放和錄製。AudioTrack和AudioRecorder分別通過呼叫IAudioTrack和IAudioRecorder來實現。
Audio系統的標頭檔案
(路徑為: frameworks/base/include/media/) :
AudioSystem.h
IAudioFlinger.h
AudioTrack.h
IAudioTrack.h
AudioRecorder.h
IAudioRecorder.h
Ixxx的介面通過AudioFlinger來實現,其他介面通過JNI向上層提供介面。
Audio系統的標頭檔案在frameworks/base/include/media/目錄中,主要的標頭檔案如下:
AudioSystem.h:media庫的Audio部分對上層的總管介面;
IAudioFlinger.h:需要下層實現的總管介面;
AudioTrack.h:放音部分對上介面;
IAudioTrack.h:放音部分需要下層實現的介面;
AudioRecorder.h:錄音部分對上介面;
IAudioRecorder.h:錄音部分需要下層實現的介面。
IAudioFlinger.h、IAudioTrack.h和IAudioRecorder.h這三個介面通過下層的繼承來實現(即AudioFlinger)。
AudioFlinger.h,AudioTrack.h和AudioRecorder.h是對上層提供的介面,它們既供本地程式呼叫(例如聲音的播放器、錄製器等),也可以通過JNI向Java層提供介面。
AudioTrack和AudioRecorder 都具有start,stop和pause等介面。前者具有write介面,用於聲音的播放,後者具有read介面,用於聲音的錄製。AudioSystem用於Audio系統的控制工作,主要包含一些set和get介面,是一個對上層的類。
AudioSystem.h:
class AudioSystem
{
public:
enum stream_type { // Audio 流的型別
SYSTEM = 1,
RING = 2,
MUSIC = 3,
ALARM = 4,
NOTIFICATION = 5,
BLUETOOTH_SCO = 6,
ENFORCED_AUDIBLE = 7,
NUM_STREAM_TYPES
};
enum audio_output_type { // Audio資料輸出型別
// …… 省略部分內容 };
enum audio_format { // Audio資料格式
FORMAT_DEFAULT = 0,
PCM_16_BIT,
PCM_8_BIT,
INVALID_FORMAT
};
enum audio_mode { // Audio模式
// …… 省略部分內容 };
enum audio_routes { // Audio 路徑型別
ROUTE_EARPIECE = (1 << 0),
ROUTE_SPEAKER = (1 << 1),
ROUTE_BLUETOOTH_SCO = (1 << 2),
ROUTE_HEADSET = (1 << 3),
ROUTE_BLUETOOTH_A2DP = (1 << 4),
ROUTE_ALL = -1UL,
};
static status_t setMasterVolume(float value);
static status_t setMasterMute(bool mute);
static status_t getMasterVolume(float* volume);
static status_t getMasterMute(bool* mute);
static status_t setStreamVolume(int stream, float value);
static status_t setStreamMute(int stream, bool mute);
static status_t getStreamVolume(int stream, float* volume);
static status_t getStreamMute(int stream, bool* mute);
static status_t setMode(int mode);
static status_t getMode(int* mode);
static status_t setRouting(int mode, uint32_t routes, uint32_t mask);
static status_t getRouting(int mode, uint32_t* routes);
// …… 省略部分內容
};
2.3 AudioFlinger原生代碼
Audio是AudioFlinger系統的中間層,其程式碼的路徑為:
frameworks/base/libs/audioflinger
AudioFlinger的核心檔案是AudioFlinger.h和AudioFlinger.cpp,提供了類AudioFlinger,這個類是一個IAudioFlinger的實現。
AudioFlinger的實現:
class AudioFlinger : public BnAudioFlinger, public IBinder::DeathRecipient
{
public: // …… 省略部分內容
virtual sp<IAudioTrack> createTrack( // 獲得音訊輸出介面( Track)
pid_t pid, int streamType,uint32_t sampleRate,
int format,int channelCount, int frameCount,
uint32_t flags, const sp<IMemory>& sharedBuffer,
status_t *status);
// …… 省略部分內容
virtual status_t setMasterVolume(float value);
virtual status_t setMasterMute(bool muted);
virtual status_t setStreamVolume(int stream, float value);
virtual status_t setStreamMute(int stream, bool muted);
virtual status_t setRouting(int mode, uint32_t routes, uint32_t mask);
virtual uint32_t getRouting(int mode) const;
virtual status_t setMode(int mode);
virtual int getMode() const;
virtual sp<IAudioRecord> openRecord( // 獲得音訊輸出介面(Record)
pid_t pid,int streamType, uint32_t sampleRate,
int format, int channelCount,int frameCount,
uint32_t flags,status_t *status);
2.4 Audio系統的JNI程式碼
Audio的JNI部分的程式碼的路徑為:
frameworks/base/core/jni
實現的幾個檔案為:
android_media_AudioSystem.cpp
android_media_AudioTrack.cpp
android_media_AudioRecord.cpp
主要提供三個類的支援:
android.media.AudioSystem
android.media.AudioTrack
android.media.AudioRecorder
2.5 Audio系統的JAVA程式碼
Audio的JAVA部分的程式碼的路徑為:
frameworks/base/media/java/android/media
實現了以下的幾個類:
android.media.AudioSystem
android.media.AudioTrack
android.media.AudioRecorder
android.media.AudioFormat
android.media.AudioManager
第三部分 Audio的硬體抽象層
Audio的硬體抽象層可以是AudioFlinger和Audio硬體的介面。可以基於Linux標準的Alsa或OSS實現,也可以基於私有的Audio驅動介面來實現。
Audio的硬體抽象層的程式碼路徑為:
hardware/libhardware_legacy/include/hardware/
其中主要的檔案為:
AudioHardwareBase.h
AudioHardwareInterface.h
在AudioHardwareInterface.h中定義了類:
AudioStreamOut
AudioStreamIn
AudioHardwareInterface
在AudioHardwareInterface.h中定義了類:
AudioHardwareBase,它繼承AudioHardwareInterface,
這是實現Audio硬體抽象層的主要介面。
Audio的硬體抽象層AudioStreamOut和AudioStreamIn 介面:
class AudioStreamOut {
public:
virtual ~AudioStreamOut() = 0;
virtual status_t setVolume(float volume) = 0;
virtual ssize_t write(const void* buffer, size_t bytes) = 0;
/*... ... */
};
class AudioStreamIn {
public:
virtual ~AudioStreamIn() = 0;
virtual status_t setGain(float gain) = 0;
virtual ssize_t read(void* buffer, ssize_t bytes) = 0;
/*... ... */
};
Audio的硬體抽象層AudioHardwareInterface 類:
class AudioHardwareInterface
{
public:
virtual status_t initCheck() = 0;
virtual status_t setVoiceVolume(float volume) = 0;
virtual status_t setMasterVolume(float volume) = 0;
virtual status_t setRouting(int mode, uint32_t routes) = 0;
virtual status_t getRouting(int mode, uint32_t* routes) = 0;
virtual status_t setMode(int mode) = 0;
virtual status_t getMode(int* mode) = 0;
/*... ... */
virtual AudioStreamOut* openOutputStream(
int format=0,
int channelCount=0,
uint32_t sampleRate=0,
status_t *status=0) = 0;
virtual AudioStreamIn* openInputStream(
int format,
int channelCount,
uint32_t sampleRate,
status_t *status,
AudioSystem::audio_in_acoustics acoustics) = 0;
static AudioHardwareInterface* create();
};
在AudioFlinger的實現中,以下幾個檔案提供了Audio系統的通用實現:
AudioHardwareGeneric.cpp
AudioHardwareStub.cpp
AudioDumpInterface.cpp
這些程式碼將編譯成靜態庫libaudiointerface.so,這作為Audio系統的通用實現來完成。
實際的Audio硬體抽象層,通常可以基於Linux中的OSS驅動程式和ALSA驅動程式來實現。
基於OSS的硬體抽象層的實現類似AudioGeneric的實現,但是增加了控制介面。
基於ALSA的硬體抽象層的實現需要構建於使用者空間的ALSA庫上,目前在Android已經有了成熟的應用。