SlideShare a Scribd company logo
안드로이드의 모든것 분석과 포팅 정리




Android Audio System
(AudioHardware class)




                                  박철희
                           1/10
1.AudioHardware class 위치 및 역활      안드로이드의 모든것 분석과 포팅 정리




Application                      역할:
Framework

                                 Device control
                                 (play,stop,routing)

Native
Framework




HAL




Kernel



                                                  2/10
2.AudioHardware class구조(msm7x30)                                                 안드로이드의 모든것 분석과 포팅 정리



                                                                               setParameters, getParameters
                                                                               openOutputStream,
                                               AudioHardwareInterface          openOutputSession,
      setVoiceVolume ,                                                         openInputStream
      setMode,
      setMasterVolume,
      openOutputStream,
      openOutputSession,
                                                 AudioHardwareBase             isModeInCall, isInCall
      openInputStream




   AudioStreamOut                                   AudioHardware                                  AudioStreamIn



                                    AudioStreamOutMSM72xx
                                                                 AudioStreamInMSM72xx

                                   AudioSessionOutMSM7xxx



                                                                                setParameters,
setParameters,                                                                  getParameters,
getParameters,                                                                  read // read audio buffer in from audio
Write // write audio buffer to driver.                                          driver
Returns number of bytes written
                                                                                                        3
3.AudioHardware class 초기화                                                         안드로이드의 모든것 분석과 포팅 정리



    1)AudioHardware class
   AudioFlinger.cpp
   AudioFlinger::AudioFlinger()
     : BnAudioFlinger(),
        mAudioHardware(0), mFmEnabled(false), mMasterVolume(1.0f), mMasterMute(false), mNextUniqueId(1)
   {

                 AudioHardwareInterface* mAudioHardware = AudioHardwareInterface::create();
             …
   }



AudioHardwareinterface.cpp                                                 AudioHardware.cpp(7x30)
AudioHardwareInterface* AudioHardwareInterface::create()                   AudioHardware::AudioHardware() :
{                                                                          {
    hw = createAudioHardware();                                             control =
}                                                                          msm_mixer_open("/dev/snd/controlC0", 0);


                                                                           //장착된 device들을 가져와서
                                                                           device_list 구조체에 넣는다.(소스 참조)
   AudioHardware.cpp(7x30)
   extern "C" AudioHardwareInterface* createAudioHardware(void)            //이 device_list 는 device id를 구할 때
   {                                                                       사용된다.
     return new AudioHardware();                                           }
   }


                                                                                                       4/10
3.AudioHardware class 초기화                                                          안드로이드의 모든것 분석과 포팅 정리



 2) AudioStreamOutMSM72xx
AudioPolicyManagerBase.cpp
AudioPolicyManagerBase::AudioPolicyManagerBase(AudioPolicyClientInterface *clientInterface)
{
  …
  mHardwareOutput = mpClientInterface->openOutput(…);
}

AudioFlinger.cpp
int AudioFlinger::openOutput
{
 AudioStreamOut *output = mAudioHardware->openOutputStream(*pDevices,…)

}
AudioHardware.cpp(7x30)
AudioStreamOut* AudioHardware::openOutputStream
{
  …
 AudioStreamOutMSM72xx* out = new AudioStreamOutMSM72xx();
 status_t lStatus = out->set(this, devices, format, channels, sampleRate);
}

AudioHardware.cpp(7x30)
status_t AudioHardware::AudioStreamOutMSM72xx::set
{
 if (pFormat) *pFormat = lFormat;
    if (pChannels) *pChannels = lChannels;
    if (pRate) *pRate = lRate;
    mDevices = devices;
                                                                                              5/10
3.AudioHardware class 초기화                                                          안드로이드의 모든것 분석과 포팅 정리



      3) AudioStreamInMSM72xx
AudioPolicyManagerBase.cpp
audio_io_handle_t AudioPolicyManagerBase::getInput(…){

     input = mpClientInterface->openInput(&inputDesc->mDevice,…);
}


AudioPolicyService.cpp
audio_io_handle_t AudioPolicyService::openInput(…)
{
  sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
  return af->openInput(pDevices, pSamplingRate, (uint32_t *)pFormat, pChannels, acoustics);
}

int AudioFlinger::openInput(…)                                          status_t AudioHardware::AudioStreamInMSM72xx::set
{                                                                       {
  …                                                                       //각 입력되는 format에 맞게
  AudioStreamIn *input = mAudioHardware->                                mDevices, mFormat, mChannels 등을 설정 함.
                     openInputStream(*pDevices,…);                       else if(*pFormat == AUDIO_HW_IN_FORMAT)
}                                                                       {
                                                                          ..
                                                                          mDevices = devices;
    AudioStreamIn* AudioHardware::openInputStream(…)                      mFormat = AUDIO_HW_IN_FORMAT;
    {                                                                     mChannels = *pChannels;
     AudioStreamInMSM72xx* in = new AudioStreamInMSM72xx();               …
      status_t lStatus = in->set(this, devices, format, channels,
                             sampleRate, acoustic_flags);
    }                                                                   }

                                                                                                       6/10
4. AudioHardware class method 분석                                        안드로이드의 모든것 분석과 포팅 정리


 1) setVoiceVolume
PhoneWindowManager.java
handleVolumeKey(AudioManager.STREAM_VOICE_CALL, keyCode);


 void handleVolumeKey(int stream, int keycode) {
audioService.adjustStreamVolume(stream,
      keycode == KeyEvent.KEYCODE_VOLUME_UP ? AudioManager.ADJUST_RAISE : AudioManager.ADJUST_LOWER,0);
}


AudioService.java
public void adjustStreamVolume{
sendMsg(mAudioHandler, MSG_SET_SYSTEM_VOLUME, STREAM_VOLUME_ALIAS[streamType], SENDMSG_NOOP, 0, 0,
                streamState, 0);
}

public void handleMessage(Message msg) {
 case MSG_SET_SYSTEM_VOLUME:
             setSystemVolume((VolumeStreamState) msg.obj);
             break;
}

private void setSystemVolume(VolumeStreamState streamState){
 setStreamVolumeIndex(streamState.mStreamType, streamState.mIndex);
}

private void setStreamVolumeIndex(int stream, int index) {
     AudioSystem.setStreamVolumeIndex(stream, (index + 5)/10);
}
                                                                                        7/10
4. AudioHardware class method 분석                                                      안드로이드의 모든것 분석과 포팅 정리

Android_media_AudioSystem.cpp
android_media_AudioSystem_setStreamVolumeIndex(JNIEnv *env, jobject thiz, jint stream, jint index)
{
  return check_AudioSystem_Command(
       AudioSystem::setStreamVolumeIndex(static_cast <AudioSystem::stream_type>(stream), index));
}

AudioSystem.cpp
status_t AudioSystem::setStreamVolumeIndex(stream_type stream, int index)
{
   const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
   if (aps == 0) return PERMISSION_DENIED;
   return aps->setStreamVolumeIndex(stream, index);
}

AudioPolicyService.cpp
status_t AudioPolicyService::setStreamVolumeIndex()
{
 return mpPolicyManager->setStreamVolumeIndex(stream, index);
}

AudioPolicyManagerBase.cpp
status_t AudioPolicyManagerBase::setStreamVolumeIndex(){
status_t volStatus = checkAndSetVolume(stream, index, mOutputs.keyAt(i), mOutputs.valueAt(i)->device());
}

status_t AudioPolicyManagerBase::checkAndSetVolume{
 if (stream == AudioSystem::VOICE_CALL ||
       stream == AudioSystem::BLUETOOTH_SCO) {
 mpClientInterface->setVoiceVolume(voiceVolume, delayMs);
}

                                                                                                           8/10
4. AudioHardware class method 분석                                         안드로이드의 모든것 분석과 포팅 정리

AudioPolicyService.cpp
status_t AudioPolicyService::setVoiceVolume(float volume, int delayMs)
{
   return mAudioCommandThread->voiceVolumeCommand(volume, delayMs);
}

status_t AudioPolicyService::AudioCommandThread::voiceVolumeCommand
{
 command->mCommand = SET_VOICE_VOLUME;
}

bool AudioPolicyService::AudioCommandThread::threadLoop()
{
 case SET_VOICE_VOLUME: {
 command->mStatus = AudioSystem::setVoiceVolume(data->mVolume);
}

AudioSystem.cpp
status_t AudioSystem::setVoiceVolume(float value)
{
   const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
   if (af == 0) return PERMISSION_DENIED;
   return af->setVoiceVolume(value);
}

AudioFlinger.cpp
status_t AudioFlinger::setVoiceVolume(float value)
{
 status_t ret = mAudioHardware->setVoiceVolume(value);
}


                                                                                   9/10
4. AudioHardware class method 분석                                      안드로이드의 모든것 분석과 포팅 정리

AudioHardware.cpp
status_t AudioHardware::setVoiceVolume(float v)
{
  if(msm_set_voice_rx_vol(vol)) {
      LOGE("msm_set_voice_rx_vol(%d) failed errno = %d",vol,errno);
      return -1;
    }
}

Hw.c(vendor/qcom…)
{
  int msm_set_voice_rx_vol(int volume)
  {
             struct snd_ctl_elem_value val;

             val.id.numid = NUMID_VOICE_VOL;
             val.value.integer.value[0] = DIR_RX;
             val.value.integer.value[1] = volume;

             return msm_mixer_elem_write(&val);
    }
}

static int msm_mixer_elem_write(struct snd_ctl_elem_value *val)
{
      rc = ioctl(control->fd, SNDRV_CTL_IOCTL_ELEM_WRITE, val);
}




                                                                               10/10
4. AudioHardware class method 분석                                                        안드로이드의 모든것 분석과 포팅 정리


 2) setVolume
QwertyKeyListener.java
public boolean onKeyDown{
return super.onKeyDown(view, content, keyCode, event);
}

phoneWindow.java
protected boolean onKeyDown{

audioManager.adjustSuggestedStreamVolume(
                keyCode == KeyEvent.KEYCODE_VOLUME_UP
                    ? AudioManager.ADJUST_RAISE
                    : AudioManager.ADJUST_LOWER,
                mVolumeControlStreamType,
               AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_VIBRATE);}




AudioManager.java
public void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags) {
     IAudioService service = getService();
     try {
        service.adjustSuggestedStreamVolume(direction, suggestedStreamType, flags);
     } catch (RemoteException e) {
        Log.e(TAG, "Dead object in adjustVolume", e);
     }
  }


                                                                                                 11/10
4. AudioHardware class method 분석                                                   안드로이드의 모든것 분석과 포팅 정리


AudioService.java
public void adjustSuggestedStreamVolume{
adjustStreamVolume(streamType, direction, flags);
}

public void adjustStreamVolume{

sendMsg(mAudioHandler, MSG_SET_SYSTEM_VOLUME,
                       STREAM_VOLUME_ALIAS[streamType], SENDMSG_NOOP, 0, 0,
                       streamState, 0);


 AudioService.java
 public void handleMessage(Message msg) {
    switch (baseMsgWhat) {
            case MSG_SET_SYSTEM_VOLUME:
              setSystemVolume((VolumeStreamState) msg.obj);
              break;
 }
                            AudioFlinger의 setStreamVolume을 호출해서 Volume setting함.


 status_t AudioFlinger::PlaybackThread::setStreamVolume(int stream, float value)
 {
  mStreamTypes[stream].volume = value;
 }

                  AudioFlinger::MixerThread::threadLoop()에서 prepareTracks_l
                  이 수행 됨.


                                                                                            12/10
4. AudioHardware class method 분석                                            안드로이드의 모든것 분석과 포팅 정리


uint32_t AudioFlinger::MixerThread::prepareTracks_l
{

    float typeVolume = mStreamTypes[track->type()].volume; setStreamVolume 에서 설정한 volume값을 가져와서

    //volume 값 설정
    float v = masterVolume * typeVolume;
    vl = (uint32_t)(v * cblk->volume[0]) << 12;
    vr = (uint32_t)(v * cblk->volume[1]) << 12;

    param = AudioMixer::VOLUME;

    //AudioMixer.cpp의 setparameter에서 처리 해줌.
    mAudioMixer->setParameter(param, AudioMixer::VOLUME0, (void *)left);
    mAudioMixer->setParameter(param, AudioMixer::VOLUME1, (void *)right);
    mAudioMixer->setParameter(param, AudioMixer::AUXLEVEL, (void *)aux);
    …
}




                                                                                         13/10

More Related Content

PPT
Android Audio System
PDF
Embedded Android : System Development - Part III (Audio / Video HAL)
PPTX
Android audio system(audioflinger)
PDF
Embedded Android : System Development - Part II (HAL)
PPTX
Android audio system(pcm데이터출력준비-서비스서버)
PPTX
Android audio system(audioplicy_service)
PPTX
Android audio system(audiopolicy_manager)
PPT
Linux Audio Drivers. ALSA
Android Audio System
Embedded Android : System Development - Part III (Audio / Video HAL)
Android audio system(audioflinger)
Embedded Android : System Development - Part II (HAL)
Android audio system(pcm데이터출력준비-서비스서버)
Android audio system(audioplicy_service)
Android audio system(audiopolicy_manager)
Linux Audio Drivers. ALSA

What's hot (20)

PDF
Embedded Android : System Development - Part IV
PPTX
Android audio system(오디오 출력-트랙생성)
PDF
Embedded Android : System Development - Part II (Linux device drivers)
PDF
Android's Multimedia Framework
PDF
Android Multimedia Framework
ODP
Q4.11: Porting Android to new Platforms
PDF
Embedded Android : System Development - Part I
PPT
"Learning AOSP" - Android Hardware Abstraction Layer (HAL)
PDF
Audio Drivers
PDF
Accessing Hardware on Android
PDF
Android presentation
PPTX
Android audio system(오디오 플링거 서비스 초기화)
ODP
Embedded Android : System Development - Part III
PDF
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...
PDF
Android Internals
PDF
Android Things : Building Embedded Devices
PDF
Android media framework overview
PDF
Android media
PDF
MediaPlayer Playing Flow
PDF
Embedded Android : System Development - Part IV
Android audio system(오디오 출력-트랙생성)
Embedded Android : System Development - Part II (Linux device drivers)
Android's Multimedia Framework
Android Multimedia Framework
Q4.11: Porting Android to new Platforms
Embedded Android : System Development - Part I
"Learning AOSP" - Android Hardware Abstraction Layer (HAL)
Audio Drivers
Accessing Hardware on Android
Android presentation
Android audio system(오디오 플링거 서비스 초기화)
Embedded Android : System Development - Part III
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...
Android Internals
Android Things : Building Embedded Devices
Android media framework overview
Android media
MediaPlayer Playing Flow
Ad

Viewers also liked (16)

PPT
Android Audio & OpenSL
PPTX
Surface flingerservice(서피스 출력 요청 jb)
PDF
08 android multimedia_framework_overview
PDF
Android Tools for Qualcomm Snapdragon Processors
KEY
USB Host APIで遊んでみた
PPTX
Bluetooth Controlled High Power Audio Amplifier- Final Presentaion
PDF
Android Gadgets, Bluetooth Low Energy, and the WunderBar
PPTX
Android Training (Media)
PPTX
Android audio system(오디오 출력-트랙활성화)
PPTX
Camera camcorder framework overview(ginger bread)
PPTX
Surface flingerservice(서피스플링거서비스초기화 ics)
PPTX
Surface flingerservice(서피스플링거서비스초기화)
PPTX
Surface flingerservice(그래픽 공유 버퍼 생성 및 등록)
PPTX
Surface flingerservice(서피스 플링거 연결 jb)
PPTX
Surface flingerservice(서피스 상태 변경 jb)
PDF
2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...
Android Audio & OpenSL
Surface flingerservice(서피스 출력 요청 jb)
08 android multimedia_framework_overview
Android Tools for Qualcomm Snapdragon Processors
USB Host APIで遊んでみた
Bluetooth Controlled High Power Audio Amplifier- Final Presentaion
Android Gadgets, Bluetooth Low Energy, and the WunderBar
Android Training (Media)
Android audio system(오디오 출력-트랙활성화)
Camera camcorder framework overview(ginger bread)
Surface flingerservice(서피스플링거서비스초기화 ics)
Surface flingerservice(서피스플링거서비스초기화)
Surface flingerservice(그래픽 공유 버퍼 생성 및 등록)
Surface flingerservice(서피스 플링거 연결 jb)
Surface flingerservice(서피스 상태 변경 jb)
2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...
Ad

Similar to Android audio system(audio_hardwareinterace) (7)

PDF
sounds in bada
PDF
MOPCON-2023_Wig.pdf
PPT
Stagefright recorder part1
PDF
HeadPhone.java All the outputs were same because the variabl.pdf
PDF
망고100 보드로 놀아보자 18
PDF
Voice That Matter 2010 - Core Audio
PDF
Embedded I/O Management
sounds in bada
MOPCON-2023_Wig.pdf
Stagefright recorder part1
HeadPhone.java All the outputs were same because the variabl.pdf
망고100 보드로 놀아보자 18
Voice That Matter 2010 - Core Audio
Embedded I/O Management

More from fefe7270 (6)

PPTX
Surface flingerservice(서피스플링거서비스초기화 jb)
PPTX
Surface flingerservice(서피스 플링거 연결 ics)
PPTX
Surface flingerservice(서피스 상태 변경 및 출력 요청)
PPTX
Surface flingerservice(서피스 플링거 연결)
PPTX
C++정리 스마트포인터
PPTX
Android audio system(pcm데이터출력요청-서비스클라이언트)
Surface flingerservice(서피스플링거서비스초기화 jb)
Surface flingerservice(서피스 플링거 연결 ics)
Surface flingerservice(서피스 상태 변경 및 출력 요청)
Surface flingerservice(서피스 플링거 연결)
C++정리 스마트포인터
Android audio system(pcm데이터출력요청-서비스클라이언트)

Recently uploaded (20)

PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
KodekX | Application Modernization Development
PPTX
Spectroscopy.pptx food analysis technology
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PPTX
Cloud computing and distributed systems.
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Machine learning based COVID-19 study performance prediction
PDF
Encapsulation theory and applications.pdf
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PPT
Teaching material agriculture food technology
PDF
Encapsulation_ Review paper, used for researhc scholars
PPTX
MYSQL Presentation for SQL database connectivity
Network Security Unit 5.pdf for BCA BBA.
Advanced methodologies resolving dimensionality complications for autism neur...
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
KodekX | Application Modernization Development
Spectroscopy.pptx food analysis technology
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Cloud computing and distributed systems.
Building Integrated photovoltaic BIPV_UPV.pdf
Reach Out and Touch Someone: Haptics and Empathic Computing
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
Spectral efficient network and resource selection model in 5G networks
Machine learning based COVID-19 study performance prediction
Encapsulation theory and applications.pdf
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
“AI and Expert System Decision Support & Business Intelligence Systems”
Mobile App Security Testing_ A Comprehensive Guide.pdf
Teaching material agriculture food technology
Encapsulation_ Review paper, used for researhc scholars
MYSQL Presentation for SQL database connectivity

Android audio system(audio_hardwareinterace)

  • 1. 안드로이드의 모든것 분석과 포팅 정리 Android Audio System (AudioHardware class) 박철희 1/10
  • 2. 1.AudioHardware class 위치 및 역활 안드로이드의 모든것 분석과 포팅 정리 Application 역할: Framework Device control (play,stop,routing) Native Framework HAL Kernel 2/10
  • 3. 2.AudioHardware class구조(msm7x30) 안드로이드의 모든것 분석과 포팅 정리 setParameters, getParameters openOutputStream, AudioHardwareInterface openOutputSession, setVoiceVolume , openInputStream setMode, setMasterVolume, openOutputStream, openOutputSession, AudioHardwareBase isModeInCall, isInCall openInputStream AudioStreamOut AudioHardware AudioStreamIn AudioStreamOutMSM72xx AudioStreamInMSM72xx AudioSessionOutMSM7xxx setParameters, setParameters, getParameters, getParameters, read // read audio buffer in from audio Write // write audio buffer to driver. driver Returns number of bytes written 3
  • 4. 3.AudioHardware class 초기화 안드로이드의 모든것 분석과 포팅 정리 1)AudioHardware class AudioFlinger.cpp AudioFlinger::AudioFlinger() : BnAudioFlinger(), mAudioHardware(0), mFmEnabled(false), mMasterVolume(1.0f), mMasterMute(false), mNextUniqueId(1) { AudioHardwareInterface* mAudioHardware = AudioHardwareInterface::create(); … } AudioHardwareinterface.cpp AudioHardware.cpp(7x30) AudioHardwareInterface* AudioHardwareInterface::create() AudioHardware::AudioHardware() : { { hw = createAudioHardware(); control = } msm_mixer_open("/dev/snd/controlC0", 0); //장착된 device들을 가져와서 device_list 구조체에 넣는다.(소스 참조) AudioHardware.cpp(7x30) extern "C" AudioHardwareInterface* createAudioHardware(void) //이 device_list 는 device id를 구할 때 { 사용된다. return new AudioHardware(); } } 4/10
  • 5. 3.AudioHardware class 초기화 안드로이드의 모든것 분석과 포팅 정리 2) AudioStreamOutMSM72xx AudioPolicyManagerBase.cpp AudioPolicyManagerBase::AudioPolicyManagerBase(AudioPolicyClientInterface *clientInterface) { … mHardwareOutput = mpClientInterface->openOutput(…); } AudioFlinger.cpp int AudioFlinger::openOutput { AudioStreamOut *output = mAudioHardware->openOutputStream(*pDevices,…) } AudioHardware.cpp(7x30) AudioStreamOut* AudioHardware::openOutputStream { … AudioStreamOutMSM72xx* out = new AudioStreamOutMSM72xx(); status_t lStatus = out->set(this, devices, format, channels, sampleRate); } AudioHardware.cpp(7x30) status_t AudioHardware::AudioStreamOutMSM72xx::set { if (pFormat) *pFormat = lFormat; if (pChannels) *pChannels = lChannels; if (pRate) *pRate = lRate; mDevices = devices; 5/10
  • 6. 3.AudioHardware class 초기화 안드로이드의 모든것 분석과 포팅 정리 3) AudioStreamInMSM72xx AudioPolicyManagerBase.cpp audio_io_handle_t AudioPolicyManagerBase::getInput(…){ input = mpClientInterface->openInput(&inputDesc->mDevice,…); } AudioPolicyService.cpp audio_io_handle_t AudioPolicyService::openInput(…) { sp<IAudioFlinger> af = AudioSystem::get_audio_flinger(); return af->openInput(pDevices, pSamplingRate, (uint32_t *)pFormat, pChannels, acoustics); } int AudioFlinger::openInput(…) status_t AudioHardware::AudioStreamInMSM72xx::set { { … //각 입력되는 format에 맞게 AudioStreamIn *input = mAudioHardware-> mDevices, mFormat, mChannels 등을 설정 함. openInputStream(*pDevices,…); else if(*pFormat == AUDIO_HW_IN_FORMAT) } { .. mDevices = devices; AudioStreamIn* AudioHardware::openInputStream(…) mFormat = AUDIO_HW_IN_FORMAT; { mChannels = *pChannels; AudioStreamInMSM72xx* in = new AudioStreamInMSM72xx(); … status_t lStatus = in->set(this, devices, format, channels, sampleRate, acoustic_flags); } } 6/10
  • 7. 4. AudioHardware class method 분석 안드로이드의 모든것 분석과 포팅 정리 1) setVoiceVolume PhoneWindowManager.java handleVolumeKey(AudioManager.STREAM_VOICE_CALL, keyCode); void handleVolumeKey(int stream, int keycode) { audioService.adjustStreamVolume(stream, keycode == KeyEvent.KEYCODE_VOLUME_UP ? AudioManager.ADJUST_RAISE : AudioManager.ADJUST_LOWER,0); } AudioService.java public void adjustStreamVolume{ sendMsg(mAudioHandler, MSG_SET_SYSTEM_VOLUME, STREAM_VOLUME_ALIAS[streamType], SENDMSG_NOOP, 0, 0, streamState, 0); } public void handleMessage(Message msg) { case MSG_SET_SYSTEM_VOLUME: setSystemVolume((VolumeStreamState) msg.obj); break; } private void setSystemVolume(VolumeStreamState streamState){ setStreamVolumeIndex(streamState.mStreamType, streamState.mIndex); } private void setStreamVolumeIndex(int stream, int index) { AudioSystem.setStreamVolumeIndex(stream, (index + 5)/10); } 7/10
  • 8. 4. AudioHardware class method 분석 안드로이드의 모든것 분석과 포팅 정리 Android_media_AudioSystem.cpp android_media_AudioSystem_setStreamVolumeIndex(JNIEnv *env, jobject thiz, jint stream, jint index) { return check_AudioSystem_Command( AudioSystem::setStreamVolumeIndex(static_cast <AudioSystem::stream_type>(stream), index)); } AudioSystem.cpp status_t AudioSystem::setStreamVolumeIndex(stream_type stream, int index) { const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); if (aps == 0) return PERMISSION_DENIED; return aps->setStreamVolumeIndex(stream, index); } AudioPolicyService.cpp status_t AudioPolicyService::setStreamVolumeIndex() { return mpPolicyManager->setStreamVolumeIndex(stream, index); } AudioPolicyManagerBase.cpp status_t AudioPolicyManagerBase::setStreamVolumeIndex(){ status_t volStatus = checkAndSetVolume(stream, index, mOutputs.keyAt(i), mOutputs.valueAt(i)->device()); } status_t AudioPolicyManagerBase::checkAndSetVolume{ if (stream == AudioSystem::VOICE_CALL || stream == AudioSystem::BLUETOOTH_SCO) { mpClientInterface->setVoiceVolume(voiceVolume, delayMs); } 8/10
  • 9. 4. AudioHardware class method 분석 안드로이드의 모든것 분석과 포팅 정리 AudioPolicyService.cpp status_t AudioPolicyService::setVoiceVolume(float volume, int delayMs) { return mAudioCommandThread->voiceVolumeCommand(volume, delayMs); } status_t AudioPolicyService::AudioCommandThread::voiceVolumeCommand { command->mCommand = SET_VOICE_VOLUME; } bool AudioPolicyService::AudioCommandThread::threadLoop() { case SET_VOICE_VOLUME: { command->mStatus = AudioSystem::setVoiceVolume(data->mVolume); } AudioSystem.cpp status_t AudioSystem::setVoiceVolume(float value) { const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); if (af == 0) return PERMISSION_DENIED; return af->setVoiceVolume(value); } AudioFlinger.cpp status_t AudioFlinger::setVoiceVolume(float value) { status_t ret = mAudioHardware->setVoiceVolume(value); } 9/10
  • 10. 4. AudioHardware class method 분석 안드로이드의 모든것 분석과 포팅 정리 AudioHardware.cpp status_t AudioHardware::setVoiceVolume(float v) { if(msm_set_voice_rx_vol(vol)) { LOGE("msm_set_voice_rx_vol(%d) failed errno = %d",vol,errno); return -1; } } Hw.c(vendor/qcom…) { int msm_set_voice_rx_vol(int volume) { struct snd_ctl_elem_value val; val.id.numid = NUMID_VOICE_VOL; val.value.integer.value[0] = DIR_RX; val.value.integer.value[1] = volume; return msm_mixer_elem_write(&val); } } static int msm_mixer_elem_write(struct snd_ctl_elem_value *val) { rc = ioctl(control->fd, SNDRV_CTL_IOCTL_ELEM_WRITE, val); } 10/10
  • 11. 4. AudioHardware class method 분석 안드로이드의 모든것 분석과 포팅 정리 2) setVolume QwertyKeyListener.java public boolean onKeyDown{ return super.onKeyDown(view, content, keyCode, event); } phoneWindow.java protected boolean onKeyDown{ audioManager.adjustSuggestedStreamVolume( keyCode == KeyEvent.KEYCODE_VOLUME_UP ? AudioManager.ADJUST_RAISE : AudioManager.ADJUST_LOWER, mVolumeControlStreamType, AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_VIBRATE);} AudioManager.java public void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags) { IAudioService service = getService(); try { service.adjustSuggestedStreamVolume(direction, suggestedStreamType, flags); } catch (RemoteException e) { Log.e(TAG, "Dead object in adjustVolume", e); } } 11/10
  • 12. 4. AudioHardware class method 분석 안드로이드의 모든것 분석과 포팅 정리 AudioService.java public void adjustSuggestedStreamVolume{ adjustStreamVolume(streamType, direction, flags); } public void adjustStreamVolume{ sendMsg(mAudioHandler, MSG_SET_SYSTEM_VOLUME, STREAM_VOLUME_ALIAS[streamType], SENDMSG_NOOP, 0, 0, streamState, 0); AudioService.java public void handleMessage(Message msg) { switch (baseMsgWhat) { case MSG_SET_SYSTEM_VOLUME: setSystemVolume((VolumeStreamState) msg.obj); break; } AudioFlinger의 setStreamVolume을 호출해서 Volume setting함. status_t AudioFlinger::PlaybackThread::setStreamVolume(int stream, float value) { mStreamTypes[stream].volume = value; } AudioFlinger::MixerThread::threadLoop()에서 prepareTracks_l 이 수행 됨. 12/10
  • 13. 4. AudioHardware class method 분석 안드로이드의 모든것 분석과 포팅 정리 uint32_t AudioFlinger::MixerThread::prepareTracks_l { float typeVolume = mStreamTypes[track->type()].volume; setStreamVolume 에서 설정한 volume값을 가져와서 //volume 값 설정 float v = masterVolume * typeVolume; vl = (uint32_t)(v * cblk->volume[0]) << 12; vr = (uint32_t)(v * cblk->volume[1]) << 12; param = AudioMixer::VOLUME; //AudioMixer.cpp의 setparameter에서 처리 해줌. mAudioMixer->setParameter(param, AudioMixer::VOLUME0, (void *)left); mAudioMixer->setParameter(param, AudioMixer::VOLUME1, (void *)right); mAudioMixer->setParameter(param, AudioMixer::AUXLEVEL, (void *)aux); … } 13/10