AudioHardwareInterface.h中定义了C语言接口来获取一个AudioHardwareInterface类型的指针
extern "C" AudioHardwareInterface* createAudioHardware(void);
class AudioHardwareBase : public AudioHardwareInterface
class AudioHardwareALSA : public AudioHardwareBase
在AudioHardwareInterface类中定义了一个static AudioHardwareInterface* create();
第一步:在AudioHardwareALSA.cpp中createAudioHardware方法的实现:
extern "C"
{
//
// Function for dlsym() to look up for creating a new AudioHardwareInterface.
//
android_audio_legacy::AudioHardwareInterface *createAudioHardware(void) {
return android_audio_legacy::AudioHardwareALSA::create();
}
#ifdef QCOM_ACDB_ENABLED
static int (*acdb_init)();
static void (*acdb_deallocate)();
#endif
#ifdef QCOM_CSDCLIENT_ENABLED
static int (*csd_client_init)();
static int (*csd_client_deinit)();
static int (*csd_start_playback)(uint32_t);
static int (*csd_stop_playback)(uint32_t);
static int (*csd_standby_voice)(uint32_t);
static int (*csd_resume_voice)(uint32_t);
#endif
} // extern "C"
第二步:在AudioHardwareALSA.cpp中实现AudioHardwareALSA类方法create()
AudioHardwareInterface *AudioHardwareALSA::create() {
AudioHardwareInterface * hardwareInterface = new AudioHardwareALSA();
if(hardwareInterface->initCheck() != OK) {
ALOGE("NULL - AHAL creation failed");
delete hardwareInterface;
hardwareInterface = NULL;
}
return hardwareInterface;
}
第三步:在AudioHardwareALSA.cpp中实现AudioHardwareALSA类的构造方法AudioHardwareALSA()的实现
AudioHardwareALSA::AudioHardwareALSA() :mALSADevice(0),mVoipStreamCount(0),mVoipMicMute(false),mVoipBitRate(0) ,mCallState(0),mAcdbHandle(NULL),mCsdHandle(NULL),mMicMute(0){ }
第四步:Audio_hw_hal.cpp 中方法static int qcom_adev_open(const hw_module_t* module, const char* name,hw_device_t** device)会执行qadev->hwif = createAudioHardware();方法,进而创建AudioHardwareALSA对象
---- create Matches (4 in 1 files) ----
AudioHardwareALSA.cpp (hardware\qcom\audio\alsa_sound): return android_audio_legacy::AudioHardwareALSA::create();
AudioHardwareALSA.cpp (hardware\qcom\audio\alsa_sound):AudioHardwareInterface *AudioHardwareALSA::create() {
---- createAudioHardware Matches (3 in 3 files) ----
AudioHardwareALSA.cpp (hardware\qcom\audio\alsa_sound): android_audio_legacy::AudioHardwareInterface *createAudioHardware(void) {
Audio_hw_hal.cpp (hardware\libhardware_legacy\audio): ladev->hwif = createAudioHardware();
Audio_hw_hal.cpp (hardware\qcom\audio\alsa_sound): qadev->hwif = createAudioHardware();