SlideShare une entreprise Scribd logo
1  sur  13
안드로이드의 모든것 분석과 포팅 정리




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

Contenu connexe

Tendances

Android audio system(audiopolicy_manager)
Android audio system(audiopolicy_manager)Android audio system(audiopolicy_manager)
Android audio system(audiopolicy_manager)fefe7270
 
Android audio system(pcm데이터출력준비-서비스서버)
Android audio system(pcm데이터출력준비-서비스서버)Android audio system(pcm데이터출력준비-서비스서버)
Android audio system(pcm데이터출력준비-서비스서버)fefe7270
 
MediaPlayer Playing Flow
MediaPlayer Playing FlowMediaPlayer Playing Flow
MediaPlayer Playing FlowJavid Hsu
 
Android audio system(오디오 출력-트랙생성)
Android audio system(오디오 출력-트랙생성)Android audio system(오디오 출력-트랙생성)
Android audio system(오디오 출력-트랙생성)fefe7270
 
Android Booting Sequence
Android Booting SequenceAndroid Booting Sequence
Android Booting SequenceJayanta Ghoshal
 
Android booting sequece and setup and debugging
Android booting sequece and setup and debuggingAndroid booting sequece and setup and debugging
Android booting sequece and setup and debuggingUtkarsh Mankad
 
Understanding the Android System Server
Understanding the Android System ServerUnderstanding the Android System Server
Understanding the Android System ServerOpersys inc.
 
Learning AOSP - Android Booting Process
Learning AOSP - Android Booting ProcessLearning AOSP - Android Booting Process
Learning AOSP - Android Booting ProcessNanik Tolaram
 
Using and Customizing the Android Framework / part 4 of Embedded Android Work...
Using and Customizing the Android Framework / part 4 of Embedded Android Work...Using and Customizing the Android Framework / part 4 of Embedded Android Work...
Using and Customizing the Android Framework / part 4 of Embedded Android Work...Opersys inc.
 
Q4.11: Porting Android to new Platforms
Q4.11: Porting Android to new PlatformsQ4.11: Porting Android to new Platforms
Q4.11: Porting Android to new PlatformsLinaro
 
"Learning AOSP" - Android Hardware Abstraction Layer (HAL)
"Learning AOSP" - Android Hardware Abstraction Layer (HAL)"Learning AOSP" - Android Hardware Abstraction Layer (HAL)
"Learning AOSP" - Android Hardware Abstraction Layer (HAL)Nanik Tolaram
 

Tendances (20)

Android audio system(audiopolicy_manager)
Android audio system(audiopolicy_manager)Android audio system(audiopolicy_manager)
Android audio system(audiopolicy_manager)
 
Android audio system(pcm데이터출력준비-서비스서버)
Android audio system(pcm데이터출력준비-서비스서버)Android audio system(pcm데이터출력준비-서비스서버)
Android audio system(pcm데이터출력준비-서비스서버)
 
Embedded Android : System Development - Part IV
Embedded Android : System Development - Part IVEmbedded Android : System Development - Part IV
Embedded Android : System Development - Part IV
 
MediaPlayer Playing Flow
MediaPlayer Playing FlowMediaPlayer Playing Flow
MediaPlayer Playing Flow
 
Audio Drivers
Audio DriversAudio Drivers
Audio Drivers
 
Android Internals
Android InternalsAndroid Internals
Android Internals
 
Android audio system(오디오 출력-트랙생성)
Android audio system(오디오 출력-트랙생성)Android audio system(오디오 출력-트랙생성)
Android audio system(오디오 출력-트랙생성)
 
Android Booting Sequence
Android Booting SequenceAndroid Booting Sequence
Android Booting Sequence
 
Android 10
Android 10Android 10
Android 10
 
Linux Audio Drivers. ALSA
Linux Audio Drivers. ALSALinux Audio Drivers. ALSA
Linux Audio Drivers. ALSA
 
Embedded Android : System Development - Part II (HAL)
Embedded Android : System Development - Part II (HAL)Embedded Android : System Development - Part II (HAL)
Embedded Android : System Development - Part II (HAL)
 
Android booting sequece and setup and debugging
Android booting sequece and setup and debuggingAndroid booting sequece and setup and debugging
Android booting sequece and setup and debugging
 
Low Level View of Android System Architecture
Low Level View of Android System ArchitectureLow Level View of Android System Architecture
Low Level View of Android System Architecture
 
Understanding the Android System Server
Understanding the Android System ServerUnderstanding the Android System Server
Understanding the Android System Server
 
Embedded Android : System Development - Part I
Embedded Android : System Development - Part IEmbedded Android : System Development - Part I
Embedded Android : System Development - Part I
 
Learning AOSP - Android Booting Process
Learning AOSP - Android Booting ProcessLearning AOSP - Android Booting Process
Learning AOSP - Android Booting Process
 
Using and Customizing the Android Framework / part 4 of Embedded Android Work...
Using and Customizing the Android Framework / part 4 of Embedded Android Work...Using and Customizing the Android Framework / part 4 of Embedded Android Work...
Using and Customizing the Android Framework / part 4 of Embedded Android Work...
 
Q4.11: Porting Android to new Platforms
Q4.11: Porting Android to new PlatformsQ4.11: Porting Android to new Platforms
Q4.11: Porting Android to new Platforms
 
"Learning AOSP" - Android Hardware Abstraction Layer (HAL)
"Learning AOSP" - Android Hardware Abstraction Layer (HAL)"Learning AOSP" - Android Hardware Abstraction Layer (HAL)
"Learning AOSP" - Android Hardware Abstraction Layer (HAL)
 
Android Internals
Android InternalsAndroid Internals
Android Internals
 

En vedette

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

En vedette (16)

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

Similaire à Android audio system(audio_hardwareinterace)

The unconventional devices for the Android video streaming
The unconventional devices for the Android video streamingThe unconventional devices for the Android video streaming
The unconventional devices for the Android video streamingMatteo Bonifazi
 
망고100 보드로 놀아보자 18
망고100 보드로 놀아보자 18망고100 보드로 놀아보자 18
망고100 보드로 놀아보자 18종인 전
 
Developing natural user interface applications with real sense devices
Developing natural user interface applications with real sense devicesDeveloping natural user interface applications with real sense devices
Developing natural user interface applications with real sense devicespeteohanlon
 
System Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbs
System Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbsSystem Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbs
System Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbsashukiller7
 
The unconventional devices for the video streaming in Android
The unconventional devices for the video streaming in AndroidThe unconventional devices for the video streaming in Android
The unconventional devices for the video streaming in AndroidAlessandro Martellucci
 
XebiCon'17 : Faites chauffer les neurones de votre Smartphone avec du Deep Le...
XebiCon'17 : Faites chauffer les neurones de votre Smartphone avec du Deep Le...XebiCon'17 : Faites chauffer les neurones de votre Smartphone avec du Deep Le...
XebiCon'17 : Faites chauffer les neurones de votre Smartphone avec du Deep Le...Publicis Sapient Engineering
 
CMU monitoring tool - proto
CMU monitoring tool - protoCMU monitoring tool - proto
CMU monitoring tool - protoGoutam Adwant
 
9 password security
9   password security9   password security
9 password securitydrewz lin
 
服务框架: Thrift & PasteScript
服务框架: Thrift & PasteScript服务框架: Thrift & PasteScript
服务框架: Thrift & PasteScriptQiangning Hong
 
Automating Analysis and Exploitation of Embedded Device Firmware
Automating Analysis and Exploitation of Embedded Device FirmwareAutomating Analysis and Exploitation of Embedded Device Firmware
Automating Analysis and Exploitation of Embedded Device FirmwareMalachi Jones
 
망고100 보드로 놀아보자 15
망고100 보드로 놀아보자 15망고100 보드로 놀아보자 15
망고100 보드로 놀아보자 15종인 전
 
Lo Mejor Del Pdc2008 El Futrode C#
Lo Mejor Del Pdc2008 El Futrode C#Lo Mejor Del Pdc2008 El Futrode C#
Lo Mejor Del Pdc2008 El Futrode C#Juan Pablo
 
Kinect v2 Introduction and Tutorial
Kinect v2 Introduction and TutorialKinect v2 Introduction and Tutorial
Kinect v2 Introduction and TutorialTsukasa Sugiura
 

Similaire à Android audio system(audio_hardwareinterace) (20)

Integrando sua app Android com Chromecast
Integrando sua app Android com ChromecastIntegrando sua app Android com Chromecast
Integrando sua app Android com Chromecast
 
The unconventional devices for the Android video streaming
The unconventional devices for the Android video streamingThe unconventional devices for the Android video streaming
The unconventional devices for the Android video streaming
 
망고100 보드로 놀아보자 18
망고100 보드로 놀아보자 18망고100 보드로 놀아보자 18
망고100 보드로 놀아보자 18
 
Developing natural user interface applications with real sense devices
Developing natural user interface applications with real sense devicesDeveloping natural user interface applications with real sense devices
Developing natural user interface applications with real sense devices
 
System Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbs
System Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbsSystem Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbs
System Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbs
 
The unconventional devices for the video streaming in Android
The unconventional devices for the video streaming in AndroidThe unconventional devices for the video streaming in Android
The unconventional devices for the video streaming in Android
 
Android For All The Things
Android For All The ThingsAndroid For All The Things
Android For All The Things
 
XebiCon'17 : Faites chauffer les neurones de votre Smartphone avec du Deep Le...
XebiCon'17 : Faites chauffer les neurones de votre Smartphone avec du Deep Le...XebiCon'17 : Faites chauffer les neurones de votre Smartphone avec du Deep Le...
XebiCon'17 : Faites chauffer les neurones de votre Smartphone avec du Deep Le...
 
srgoc
srgocsrgoc
srgoc
 
CMU monitoring tool - proto
CMU monitoring tool - protoCMU monitoring tool - proto
CMU monitoring tool - proto
 
9 password security
9   password security9   password security
9 password security
 
服务框架: Thrift & PasteScript
服务框架: Thrift & PasteScript服务框架: Thrift & PasteScript
服务框架: Thrift & PasteScript
 
MPI
MPIMPI
MPI
 
Scmad Chapter13
Scmad Chapter13Scmad Chapter13
Scmad Chapter13
 
Os lab final
Os lab finalOs lab final
Os lab final
 
Automating Analysis and Exploitation of Embedded Device Firmware
Automating Analysis and Exploitation of Embedded Device FirmwareAutomating Analysis and Exploitation of Embedded Device Firmware
Automating Analysis and Exploitation of Embedded Device Firmware
 
망고100 보드로 놀아보자 15
망고100 보드로 놀아보자 15망고100 보드로 놀아보자 15
망고100 보드로 놀아보자 15
 
Lo Mejor Del Pdc2008 El Futrode C#
Lo Mejor Del Pdc2008 El Futrode C#Lo Mejor Del Pdc2008 El Futrode C#
Lo Mejor Del Pdc2008 El Futrode C#
 
IOMX in Android
IOMX in AndroidIOMX in Android
IOMX in Android
 
Kinect v2 Introduction and Tutorial
Kinect v2 Introduction and TutorialKinect v2 Introduction and Tutorial
Kinect v2 Introduction and Tutorial
 

Plus de fefe7270

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

Plus de fefe7270 (7)

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

Dernier

Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...gurkirankumar98700
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 

Dernier (20)

Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 

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