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




Android Audio System
(AudioPolicyService)




                                박철희

                          1
1.Audiopolicyservice 위치 및 역활         안드로이드의 모든것 분석과 포팅 정리




Application                     역할:
Framework

                                1.현재 입출력 디바이스의
                                  연결 상태 파악 및
                                  routing을 위한 조건 check
Native
Framework                       2.중간 다리 역활




HAL




Kernel



                                                2
2.AudiopolicyService class 구조                                   안드로이드의 모든것 분석과 포팅 정리



           IInterface



       IaudioPolicyService




      BnAudioPolicyService         AudioPolicyClientInterface      IBinder::DeathRecipient




                                AudiopolicyService

                                                                      AudioPolicyInterface




                                                                    AudioPolicyManagerBase




                                                                      AudiopolicyManager

                                                                                 3
3.AudioPolicyService의 초기화                                                   안드로이드의 모든것 분석과 포팅 정리


   Main_mediaserver.cpp
   int main(int argc, char** argv)
   {
      AudioFlinger::instantiate();
      MediaPlayerService::instantiate();
      CameraService::instantiate();
      AudioPolicyService::instantiate();
      ProcessState::self()->startThreadPool();
      IPCThreadState::self()->joinThreadPool();
   }
                                                                       bool AudioPolicyService::
                                                                       AudioCommandThread::threadLoop()
   AudioPolicyService.cpp                                              {
   void AudioPolicyService::instantiate() {                                case START_TONE,
     defaultServiceManager()->addService(                                  case STOP_TONE:
          String16("media.audio_policy"), new AudioPolicyService());         mTonePlaybackThread 처리
   }                                                                        case SET_VOLUME:
                                                                            case SET_PARAMETERS:
                                                                            case SET_VOICE_VOLUME:
AudioPolicyService::AudioPolicyService()                                    case SET_FM_VOLUME:
   : BnAudioPolicyService() , mpPolicyManager(NULL)                          mAudioCommandThread 처리
{
  // start tone playback thread(START_TONE,STOP_TONE)                  }
   mTonePlaybackThread = new AudioCommandThread(String8(""));

// start audio commands thread(SET_VOLUME, SET_PARAMETERS, SET_VOICE_VOLUME, SET_FM_VOLUME)
mAudioCommandThread = new AudioCommandThread(String8("ApmCommandThread"));

mpPolicyManager = createAudioPolicyManager(this);


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



    Hardware/msm7k/libaudio-msm7x30/audiopolicymanager.cpp
    extern "C" AudioPolicyInterface* createAudioPolicyManager(AudioPolicyClientInterface *clientInterface)
    {
      return new AudioPolicyManager(clientInterface);
    }


                          Android.mk(AudioFlinger)                         Hardware/msm7k/libaudio-msm7x30/Android.mk

                                                                           LOCAL_SRC_FILES := AudioPolicyManager.cpp
                     libAudio                 libaudioPolicy               LOCAL_SHARED_LIBRARIES := libcutils
                                                                           LOCAL_SHARED_LIBRARIES += libutils
                                                                           LOCAL_SHARED_LIBRARIES += libmedia
                                                                           LOCAL_MODULE := libaudiopolicy




class AudioPolicyManager: public AudioPolicyManagerBase
{                                                                                                   AudioPolicyInterface
public:
    AudioPolicyManager(AudioPolicyClientInterface *clientInterface)
   : AudioPolicyManagerBase(clientInterface) {
     mLPADecodeOutput = -1;                                                                      AudioPolicyManagerBase
     mLPAMuted = false;                               AudioPolicyService
     mLPAStreamType = AudioSystem::DEFAULT;
     }
                                                                                                    AudiopolicyManager
…

                                                                                                              5
3.AudioPolicyService의 초기화                                                               안드로이드의 모든것 분석과 포팅 정리



Ex)Audiopolicyservice의 getoutput method를 호출할 경우

audiopolicymanager.cpp에는 이 함수가 없다. 대신 상속받은 AudioPolicyManagerBase.cpp에 존재 함.

  AudioPolicyService.cpp
  audio_io_handle_t AudioPolicyService::getOutput
  {
    return mpPolicyManager->getOutput(stream, samplingRate, format, channels, flags);
  }

  AudioPolicyManagerBase.cpp
  audio_io_handle_t AudioPolicyManagerBase::getOutput(…)
  {
    …
   mpClientInterface->openOutput(&outputDesc->mDevice,
                           &outputDesc->mSamplingRate,
                           &outputDesc->mFormat,
                           &outputDesc->mChannels,
      AudioPolicyService
                           &outputDesc->mLatency,
                           outputDesc->mFlags);
  }


  audio_io_handle_t AudioPolicyService::openOutput
  {

      af->openOutput(pDevices ,…);
  }
          Audioflinger

                                                                                                  6
3.AudioPolicyService의 초기화                                                                안드로이드의 모든것 분석과 포팅 정리


int AudioFlinger::openOutput
{
 AudioStreamOut *output = mAudioHardware->openOutputStream(*pDevices,
                                   (int *)&format,
                                   &channels,
                                   &samplingRate,
                                   &status);

 // notify client processes of the new output creation
  thread->audioConfigChanged_l(AudioSystem::OUTPUT_OPENED);
}

void AudioFlinger::PlaybackThread::audioConfigChanged_l
{
 mAudioFlinger->audioConfigChanged_l(event, param, NULL);
}


 void AudioFlinger::audioConfigChanged_l
 {
  mNotificationClients.valueAt(i)->client()->ioConfigChanged(event, ioHandle, param2);
 }
         AudioSystem::AudioFlingerClient

                                                                        아래와 같은 함수들에서 현재 output stream의
                                                                        정보를 구할 때 gOutputs 가 사용된다.
 void AudioSystem::AudioFlingerClient::ioConfigChanged
                                                                        getOutputSamplingRate
 {
                                                                        getOutputFrameCount
  gOutputs.add(ioHandle, outputDesc);
                                                                        getOutputLatency
 }

                                                                                                   7
4.AudioPolicyManager의 초기화                                                           안드로이드의 모든것 분석과 포팅 정리


class AudioPolicyManager: public AudioPolicyManagerBase
{

public:
    AudioPolicyManager(AudioPolicyClientInterface *clientInterface)
   : AudioPolicyManagerBase(clientInterface) {
     mLPADecodeOutput = -1;
     mLPAMuted = false;
     mLPAStreamType = AudioSystem::DEFAULT;
     }
                                                                          AudioPolicyService

AudioPolicyManagerBase::AudioPolicyManagerBase(AudioPolicyClientInterface *clientInterface)
{
 //audiopolicyservice를 변수에 저장한다.
 mpClientInterface = clientInterface;

uint32_t defaultDevice = (uint32_t) AudioSystem::DEVICE_OUT_SPEAKER;

mHardwareOutput = mpClientInterface->openOutput(&outputDesc->mDevice,
                   &outputDesc->mSamplingRate,
                   &outputDesc->mFormat,
                   &outputDesc->mChannels,
                   &outputDesc->mLatency,
                   outputDesc->mFlags);
mHardwareOutput 는 playbackthread의 id

setOutputDevice(mHardwareOutput, defaultDevice, true);
}



                                                                                                8
4.AudioPolicyManager의 초기화                                                         안드로이드의 모든것 분석과 포팅 정리



void AudioPolicyManagerBase::setOutputDevice
{
  …

 // do the routing
 //mHardwareOutput:playbackthread의 id
//device: AudioSystem::DEVICE_OUT_SPEAKER
 AudioParameter param = AudioParameter();
 param.addInt(String8(AudioParameter::keyRouting), (int)device);
  mpClientInterface->setParameters(mHardwareOutput, param.toString(), delayMs);
}


void AudioPolicyService::setParameters
{
 mAudioCommandThread->parametersCommand((int)ioHandle, keyValuePairs, delayMs);
 // mAudioCommandThread 는 AudioPolicyService 생성자에서 생성된 thread


}


    status_t AudioPolicyService::AudioCommandThread::parametersCommand
    {
     insertCommand_l(command, delayMs);
      SET_PARAMETERS command를 mAudioCommands에 insert한다.
    }

                    Threadloop으로 돌고 있는 AudioCommandThread 에서 처리한다.


                                                                                            9
4.AudioPolicyManager의 초기화                                                      안드로이드의 모든것 분석과 포팅 정리


bool AudioPolicyService::AudioCommandThread::threadLoop()
{
  …
 case SET_PARAMETERS:
             command->mStatus = AudioSystem::setParameters(data->mIO, data->mKeyValuePairs);
}

AudioSystem.cpp
status_t AudioSystem::setParameters
{
 return af->setParameters(ioHandle, keyValuePairs);
}


 AudioFlinger.cpp
 status_t AudioFlinger::setParameters
 {
   //현재 설정된 palybackthread의 parent class인 threadbase의 setParameters를 호출함.
   result = thread->setParameters(keyValuePairs);
 }


status_t AudioFlinger::ThreadBase::setParameters
{
  mNewParameters.add(keyValuePairs);
}

 bool AudioFlinger::MixerThread::threadLoop()
 {
   checkForNewParameters_l()
 }
                                                                                               10
4.AudioPolicyManager의 초기화                                                                안드로이드의 모든것 분석과 포팅 정리


 bool AudioFlinger::MixerThread::checkForNewParameters_l()
 {
   sendConfigEvent_l(AudioSystem::OUTPUT_CONFIG_CHANGED);
 }

void AudioFlinger::ThreadBase::sendConfigEvent_l(int event, int param)
{
 mConfigEvents.add(configEvent);
}


 bool AudioFlinger::MixerThread::threadLoop()
 {
  processConfigEvents();
 }

 void AudioFlinger::ThreadBase::processConfigEvents()
 {
  audioConfigChanged_l(configEvent->mEvent, configEvent->mParam);
 }

 void AudioFlinger::audioConfigChanged_l
 {
  mNotificationClients.valueAt(i)->client()->ioConfigChanged(event, ioHandle, param2);
 }

 void AudioSystem::AudioFlingerClient::ioConfigChanged
 {
  case OUTPUT_CONFIG_CHANGED:
  gOutputs.replaceValueFor(ioHandle, outputDesc);
 }
                                                                                                   11

More Related Content

What's hot

Android media framework overview
Android media framework overviewAndroid media framework overview
Android media framework overviewJerrin George
 
ExoPlayer for Application developers
ExoPlayer for Application developersExoPlayer for Application developers
ExoPlayer for Application developersHassan Abid
 
Android Multimedia Framework
Android Multimedia FrameworkAndroid Multimedia Framework
Android Multimedia FrameworkPicker Weng
 
Android Camera Architecture
Android Camera ArchitectureAndroid Camera Architecture
Android Camera ArchitecturePicker Weng
 
"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
 
Accessing Hardware on Android
Accessing Hardware on AndroidAccessing Hardware on Android
Accessing Hardware on AndroidGary Bisson
 
Booting Android: bootloaders, fastboot and boot images
Booting Android: bootloaders, fastboot and boot imagesBooting Android: bootloaders, fastboot and boot images
Booting Android: bootloaders, fastboot and boot imagesChris Simmonds
 
Android for Embedded Linux Developers
Android for Embedded Linux DevelopersAndroid for Embedded Linux Developers
Android for Embedded Linux DevelopersOpersys inc.
 
Android crash debugging
Android crash debuggingAndroid crash debugging
Android crash debuggingAshish Agrawal
 
LAS16-406: Android Widevine on OP-TEE
LAS16-406: Android Widevine on OP-TEELAS16-406: Android Widevine on OP-TEE
LAS16-406: Android Widevine on OP-TEELinaro
 
Android's HIDL: Treble in the HAL
Android's HIDL: Treble in the HALAndroid's HIDL: Treble in the HAL
Android's HIDL: Treble in the HALOpersys inc.
 
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...Opersys inc.
 

What's hot (20)

Android media framework overview
Android media framework overviewAndroid media framework overview
Android media framework overview
 
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)
 
ExoPlayer for Application developers
ExoPlayer for Application developersExoPlayer for Application developers
ExoPlayer for Application developers
 
Android Multimedia Framework
Android Multimedia FrameworkAndroid Multimedia Framework
Android Multimedia Framework
 
Embedded Android : System Development - Part IV
Embedded Android : System Development - Part IVEmbedded Android : System Development - Part IV
Embedded Android : System Development - Part IV
 
Android Camera Architecture
Android Camera ArchitectureAndroid Camera Architecture
Android Camera Architecture
 
Audio Drivers
Audio DriversAudio Drivers
Audio Drivers
 
"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)
 
Accessing Hardware on Android
Accessing Hardware on AndroidAccessing Hardware on Android
Accessing Hardware on Android
 
Android Things : Building Embedded Devices
Android Things : Building Embedded DevicesAndroid Things : Building Embedded Devices
Android Things : Building Embedded Devices
 
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
 
Booting Android: bootloaders, fastboot and boot images
Booting Android: bootloaders, fastboot and boot imagesBooting Android: bootloaders, fastboot and boot images
Booting Android: bootloaders, fastboot and boot images
 
Android for Embedded Linux Developers
Android for Embedded Linux DevelopersAndroid for Embedded Linux Developers
Android for Embedded Linux Developers
 
Embedded Android : System Development - Part I
Embedded Android : System Development - Part IEmbedded Android : System Development - Part I
Embedded Android : System Development - Part I
 
Android crash debugging
Android crash debuggingAndroid crash debugging
Android crash debugging
 
LAS16-406: Android Widevine on OP-TEE
LAS16-406: Android Widevine on OP-TEELAS16-406: Android Widevine on OP-TEE
LAS16-406: Android Widevine on OP-TEE
 
Android presentation
Android presentationAndroid presentation
Android presentation
 
Android's HIDL: Treble in the HAL
Android's HIDL: Treble in the HALAndroid's HIDL: Treble in the HAL
Android's HIDL: Treble in the HAL
 
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...
 
Embedded Android : System Development - Part III
Embedded Android : System Development - Part IIIEmbedded Android : System Development - Part III
Embedded Android : System Development - Part III
 

Viewers also liked

Android's Multimedia Framework
Android's Multimedia FrameworkAndroid's Multimedia Framework
Android's Multimedia FrameworkOpersys inc.
 
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
 
Android audio system(오디오 출력-트랙활성화)
Android audio system(오디오 출력-트랙활성화)Android audio system(오디오 출력-트랙활성화)
Android audio system(오디오 출력-트랙활성화)fefe7270
 
Android Training (Media)
Android Training (Media)Android Training (Media)
Android Training (Media)Khaled Anaqwa
 
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
 
Android Media Player Development
Android Media Player DevelopmentAndroid Media Player Development
Android Media Player DevelopmentTalentica Software
 
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...Омские ИТ-субботники
 
Superpowered Media Server for Android
Superpowered Media Server for AndroidSuperpowered Media Server for Android
Superpowered Media Server for AndroidPatrick Vlaskovits
 
안드로이드 MediaPlayer & VideoView
안드로이드 MediaPlayer & VideoView안드로이드 MediaPlayer & VideoView
안드로이드 MediaPlayer & VideoViewEunjoo Im
 
Android media codec 사용하기
Android media codec 사용하기Android media codec 사용하기
Android media codec 사용하기Taehwan kwon
 
A slightly deeper dive into Stagefright
A slightly deeper dive into StagefrightA slightly deeper dive into Stagefright
A slightly deeper dive into StagefrightAlexy Joseph
 
Introducing Android Media Player
Introducing Android Media PlayerIntroducing Android Media Player
Introducing Android Media PlayerArif Huda
 

Viewers also liked (20)

Android's Multimedia Framework
Android's Multimedia FrameworkAndroid's Multimedia Framework
Android's Multimedia Framework
 
Android Audio & OpenSL
Android Audio & OpenSLAndroid Audio & OpenSL
Android Audio & OpenSL
 
Surface flingerservice(서피스 출력 요청 jb)
Surface flingerservice(서피스 출력 요청 jb)Surface flingerservice(서피스 출력 요청 jb)
Surface flingerservice(서피스 출력 요청 jb)
 
Android audio system(오디오 출력-트랙활성화)
Android audio system(오디오 출력-트랙활성화)Android audio system(오디오 출력-트랙활성화)
Android audio system(오디오 출력-트랙활성화)
 
Android Training (Media)
Android Training (Media)Android Training (Media)
Android Training (Media)
 
Android cameraoverview
Android cameraoverviewAndroid cameraoverview
Android cameraoverview
 
FBK NO - Bondgård
FBK NO - BondgårdFBK NO - Bondgård
FBK NO - Bondgård
 
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(서피스플링거서비스초기화)
 
Android Media Player Development
Android Media Player DevelopmentAndroid Media Player Development
Android Media Player Development
 
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...
 
Superpowered Media Server for Android
Superpowered Media Server for AndroidSuperpowered Media Server for Android
Superpowered Media Server for Android
 
안드로이드 MediaPlayer & VideoView
안드로이드 MediaPlayer & VideoView안드로이드 MediaPlayer & VideoView
안드로이드 MediaPlayer & VideoView
 
Android media codec 사용하기
Android media codec 사용하기Android media codec 사용하기
Android media codec 사용하기
 
A slightly deeper dive into Stagefright
A slightly deeper dive into StagefrightA slightly deeper dive into Stagefright
A slightly deeper dive into Stagefright
 
Introducing Android Media Player
Introducing Android Media PlayerIntroducing Android Media Player
Introducing Android Media Player
 

Similar to Android audio system(audioplicy_service)

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
 
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
 
Appium Automation with Kotlin
Appium Automation with KotlinAppium Automation with Kotlin
Appium Automation with KotlinRapidValue
 
jBPM5 Community Training Module 4: jBPM5 APIs Overview + Hands On
jBPM5 Community Training Module 4: jBPM5 APIs Overview + Hands OnjBPM5 Community Training Module 4: jBPM5 APIs Overview + Hands On
jBPM5 Community Training Module 4: jBPM5 APIs Overview + Hands OnMauricio (Salaboy) Salatino
 
Kinect v2 Introduction and Tutorial
Kinect v2 Introduction and TutorialKinect v2 Introduction and Tutorial
Kinect v2 Introduction and TutorialTsukasa Sugiura
 
Setting Up Sumo Logic - Apr 2017
Setting Up Sumo Logic - Apr 2017Setting Up Sumo Logic - Apr 2017
Setting Up Sumo Logic - Apr 2017Sumo Logic
 
yagdao-0.3.1 hibernate guide
yagdao-0.3.1 hibernate guideyagdao-0.3.1 hibernate guide
yagdao-0.3.1 hibernate guideMert Can Akkan
 
The Ring programming language version 1.7 book - Part 84 of 196
The Ring programming language version 1.7 book - Part 84 of 196The Ring programming language version 1.7 book - Part 84 of 196
The Ring programming language version 1.7 book - Part 84 of 196Mahmoud Samir Fayed
 
The Ring programming language version 1.5.2 book - Part 75 of 181
The Ring programming language version 1.5.2 book - Part 75 of 181The Ring programming language version 1.5.2 book - Part 75 of 181
The Ring programming language version 1.5.2 book - Part 75 of 181Mahmoud Samir Fayed
 
The Ring programming language version 1.5.4 book - Part 78 of 185
The Ring programming language version 1.5.4 book - Part 78 of 185The Ring programming language version 1.5.4 book - Part 78 of 185
The Ring programming language version 1.5.4 book - Part 78 of 185Mahmoud Samir Fayed
 
Gstreamer Basics
Gstreamer BasicsGstreamer Basics
Gstreamer Basicsidrajeev
 
The Ring programming language version 1.8 book - Part 87 of 202
The Ring programming language version 1.8 book - Part 87 of 202The Ring programming language version 1.8 book - Part 87 of 202
The Ring programming language version 1.8 book - Part 87 of 202Mahmoud Samir Fayed
 
망고100 보드로 놀아보자 18
망고100 보드로 놀아보자 18망고100 보드로 놀아보자 18
망고100 보드로 놀아보자 18종인 전
 
Generic Synchronization Policies in C++
Generic Synchronization Policies in C++Generic Synchronization Policies in C++
Generic Synchronization Policies in C++Ciaran McHale
 
The Ring programming language version 1.7 book - Part 12 of 196
The Ring programming language version 1.7 book - Part 12 of 196The Ring programming language version 1.7 book - Part 12 of 196
The Ring programming language version 1.7 book - Part 12 of 196Mahmoud Samir Fayed
 

Similar to Android audio system(audioplicy_service) (20)

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
 
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
 
Appium Automation with Kotlin
Appium Automation with KotlinAppium Automation with Kotlin
Appium Automation with Kotlin
 
jBPM5 Community Training Module 4: jBPM5 APIs Overview + Hands On
jBPM5 Community Training Module 4: jBPM5 APIs Overview + Hands OnjBPM5 Community Training Module 4: jBPM5 APIs Overview + Hands On
jBPM5 Community Training Module 4: jBPM5 APIs Overview + Hands On
 
Integrando sua app Android com Chromecast
Integrando sua app Android com ChromecastIntegrando sua app Android com Chromecast
Integrando sua app Android com Chromecast
 
Kinect v2 Introduction and Tutorial
Kinect v2 Introduction and TutorialKinect v2 Introduction and Tutorial
Kinect v2 Introduction and Tutorial
 
Android workshop
Android workshopAndroid workshop
Android workshop
 
Setting Up Sumo Logic - Apr 2017
Setting Up Sumo Logic - Apr 2017Setting Up Sumo Logic - Apr 2017
Setting Up Sumo Logic - Apr 2017
 
Scmad Chapter13
Scmad Chapter13Scmad Chapter13
Scmad Chapter13
 
yagdao-0.3.1 hibernate guide
yagdao-0.3.1 hibernate guideyagdao-0.3.1 hibernate guide
yagdao-0.3.1 hibernate guide
 
The Ring programming language version 1.7 book - Part 84 of 196
The Ring programming language version 1.7 book - Part 84 of 196The Ring programming language version 1.7 book - Part 84 of 196
The Ring programming language version 1.7 book - Part 84 of 196
 
The Ring programming language version 1.5.2 book - Part 75 of 181
The Ring programming language version 1.5.2 book - Part 75 of 181The Ring programming language version 1.5.2 book - Part 75 of 181
The Ring programming language version 1.5.2 book - Part 75 of 181
 
Level 4
Level 4Level 4
Level 4
 
The Ring programming language version 1.5.4 book - Part 78 of 185
The Ring programming language version 1.5.4 book - Part 78 of 185The Ring programming language version 1.5.4 book - Part 78 of 185
The Ring programming language version 1.5.4 book - Part 78 of 185
 
Gstreamer Basics
Gstreamer BasicsGstreamer Basics
Gstreamer Basics
 
Annotation processing
Annotation processingAnnotation processing
Annotation processing
 
The Ring programming language version 1.8 book - Part 87 of 202
The Ring programming language version 1.8 book - Part 87 of 202The Ring programming language version 1.8 book - Part 87 of 202
The Ring programming language version 1.8 book - Part 87 of 202
 
망고100 보드로 놀아보자 18
망고100 보드로 놀아보자 18망고100 보드로 놀아보자 18
망고100 보드로 놀아보자 18
 
Generic Synchronization Policies in C++
Generic Synchronization Policies in C++Generic Synchronization Policies in C++
Generic Synchronization Policies in C++
 
The Ring programming language version 1.7 book - Part 12 of 196
The Ring programming language version 1.7 book - Part 12 of 196The Ring programming language version 1.7 book - Part 12 of 196
The Ring programming language version 1.7 book - Part 12 of 196
 

More from 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
 

More from 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데이터출력요청-서비스클라이언트)
 

Android audio system(audioplicy_service)

  • 1. 안드로이드의 모든것 분석과 포팅 정리 Android Audio System (AudioPolicyService) 박철희 1
  • 2. 1.Audiopolicyservice 위치 및 역활 안드로이드의 모든것 분석과 포팅 정리 Application 역할: Framework 1.현재 입출력 디바이스의 연결 상태 파악 및 routing을 위한 조건 check Native Framework 2.중간 다리 역활 HAL Kernel 2
  • 3. 2.AudiopolicyService class 구조 안드로이드의 모든것 분석과 포팅 정리 IInterface IaudioPolicyService BnAudioPolicyService AudioPolicyClientInterface IBinder::DeathRecipient AudiopolicyService AudioPolicyInterface AudioPolicyManagerBase AudiopolicyManager 3
  • 4. 3.AudioPolicyService의 초기화 안드로이드의 모든것 분석과 포팅 정리 Main_mediaserver.cpp int main(int argc, char** argv) { AudioFlinger::instantiate(); MediaPlayerService::instantiate(); CameraService::instantiate(); AudioPolicyService::instantiate(); ProcessState::self()->startThreadPool(); IPCThreadState::self()->joinThreadPool(); } bool AudioPolicyService:: AudioCommandThread::threadLoop() AudioPolicyService.cpp { void AudioPolicyService::instantiate() { case START_TONE, defaultServiceManager()->addService( case STOP_TONE: String16("media.audio_policy"), new AudioPolicyService());  mTonePlaybackThread 처리 } case SET_VOLUME: case SET_PARAMETERS: case SET_VOICE_VOLUME: AudioPolicyService::AudioPolicyService() case SET_FM_VOLUME: : BnAudioPolicyService() , mpPolicyManager(NULL)  mAudioCommandThread 처리 { // start tone playback thread(START_TONE,STOP_TONE) } mTonePlaybackThread = new AudioCommandThread(String8("")); // start audio commands thread(SET_VOLUME, SET_PARAMETERS, SET_VOICE_VOLUME, SET_FM_VOLUME) mAudioCommandThread = new AudioCommandThread(String8("ApmCommandThread")); mpPolicyManager = createAudioPolicyManager(this); 4
  • 5. 3.AudioPolicyService의 초기화 안드로이드의 모든것 분석과 포팅 정리 Hardware/msm7k/libaudio-msm7x30/audiopolicymanager.cpp extern "C" AudioPolicyInterface* createAudioPolicyManager(AudioPolicyClientInterface *clientInterface) { return new AudioPolicyManager(clientInterface); } Android.mk(AudioFlinger) Hardware/msm7k/libaudio-msm7x30/Android.mk LOCAL_SRC_FILES := AudioPolicyManager.cpp libAudio libaudioPolicy LOCAL_SHARED_LIBRARIES := libcutils LOCAL_SHARED_LIBRARIES += libutils LOCAL_SHARED_LIBRARIES += libmedia LOCAL_MODULE := libaudiopolicy class AudioPolicyManager: public AudioPolicyManagerBase { AudioPolicyInterface public: AudioPolicyManager(AudioPolicyClientInterface *clientInterface) : AudioPolicyManagerBase(clientInterface) { mLPADecodeOutput = -1; AudioPolicyManagerBase mLPAMuted = false; AudioPolicyService mLPAStreamType = AudioSystem::DEFAULT; } AudiopolicyManager … 5
  • 6. 3.AudioPolicyService의 초기화 안드로이드의 모든것 분석과 포팅 정리 Ex)Audiopolicyservice의 getoutput method를 호출할 경우 audiopolicymanager.cpp에는 이 함수가 없다. 대신 상속받은 AudioPolicyManagerBase.cpp에 존재 함. AudioPolicyService.cpp audio_io_handle_t AudioPolicyService::getOutput { return mpPolicyManager->getOutput(stream, samplingRate, format, channels, flags); } AudioPolicyManagerBase.cpp audio_io_handle_t AudioPolicyManagerBase::getOutput(…) { … mpClientInterface->openOutput(&outputDesc->mDevice, &outputDesc->mSamplingRate, &outputDesc->mFormat, &outputDesc->mChannels, AudioPolicyService &outputDesc->mLatency, outputDesc->mFlags); } audio_io_handle_t AudioPolicyService::openOutput { af->openOutput(pDevices ,…); } Audioflinger 6
  • 7. 3.AudioPolicyService의 초기화 안드로이드의 모든것 분석과 포팅 정리 int AudioFlinger::openOutput { AudioStreamOut *output = mAudioHardware->openOutputStream(*pDevices, (int *)&format, &channels, &samplingRate, &status); // notify client processes of the new output creation thread->audioConfigChanged_l(AudioSystem::OUTPUT_OPENED); } void AudioFlinger::PlaybackThread::audioConfigChanged_l { mAudioFlinger->audioConfigChanged_l(event, param, NULL); } void AudioFlinger::audioConfigChanged_l { mNotificationClients.valueAt(i)->client()->ioConfigChanged(event, ioHandle, param2); } AudioSystem::AudioFlingerClient 아래와 같은 함수들에서 현재 output stream의 정보를 구할 때 gOutputs 가 사용된다. void AudioSystem::AudioFlingerClient::ioConfigChanged getOutputSamplingRate { getOutputFrameCount gOutputs.add(ioHandle, outputDesc); getOutputLatency } 7
  • 8. 4.AudioPolicyManager의 초기화 안드로이드의 모든것 분석과 포팅 정리 class AudioPolicyManager: public AudioPolicyManagerBase { public: AudioPolicyManager(AudioPolicyClientInterface *clientInterface) : AudioPolicyManagerBase(clientInterface) { mLPADecodeOutput = -1; mLPAMuted = false; mLPAStreamType = AudioSystem::DEFAULT; } AudioPolicyService AudioPolicyManagerBase::AudioPolicyManagerBase(AudioPolicyClientInterface *clientInterface) { //audiopolicyservice를 변수에 저장한다. mpClientInterface = clientInterface; uint32_t defaultDevice = (uint32_t) AudioSystem::DEVICE_OUT_SPEAKER; mHardwareOutput = mpClientInterface->openOutput(&outputDesc->mDevice, &outputDesc->mSamplingRate, &outputDesc->mFormat, &outputDesc->mChannels, &outputDesc->mLatency, outputDesc->mFlags); mHardwareOutput 는 playbackthread의 id setOutputDevice(mHardwareOutput, defaultDevice, true); } 8
  • 9. 4.AudioPolicyManager의 초기화 안드로이드의 모든것 분석과 포팅 정리 void AudioPolicyManagerBase::setOutputDevice { … // do the routing //mHardwareOutput:playbackthread의 id //device: AudioSystem::DEVICE_OUT_SPEAKER AudioParameter param = AudioParameter(); param.addInt(String8(AudioParameter::keyRouting), (int)device); mpClientInterface->setParameters(mHardwareOutput, param.toString(), delayMs); } void AudioPolicyService::setParameters { mAudioCommandThread->parametersCommand((int)ioHandle, keyValuePairs, delayMs); // mAudioCommandThread 는 AudioPolicyService 생성자에서 생성된 thread } status_t AudioPolicyService::AudioCommandThread::parametersCommand { insertCommand_l(command, delayMs);  SET_PARAMETERS command를 mAudioCommands에 insert한다. } Threadloop으로 돌고 있는 AudioCommandThread 에서 처리한다. 9
  • 10. 4.AudioPolicyManager의 초기화 안드로이드의 모든것 분석과 포팅 정리 bool AudioPolicyService::AudioCommandThread::threadLoop() { … case SET_PARAMETERS: command->mStatus = AudioSystem::setParameters(data->mIO, data->mKeyValuePairs); } AudioSystem.cpp status_t AudioSystem::setParameters { return af->setParameters(ioHandle, keyValuePairs); } AudioFlinger.cpp status_t AudioFlinger::setParameters { //현재 설정된 palybackthread의 parent class인 threadbase의 setParameters를 호출함. result = thread->setParameters(keyValuePairs); } status_t AudioFlinger::ThreadBase::setParameters { mNewParameters.add(keyValuePairs); } bool AudioFlinger::MixerThread::threadLoop() { checkForNewParameters_l() } 10
  • 11. 4.AudioPolicyManager의 초기화 안드로이드의 모든것 분석과 포팅 정리 bool AudioFlinger::MixerThread::checkForNewParameters_l() { sendConfigEvent_l(AudioSystem::OUTPUT_CONFIG_CHANGED); } void AudioFlinger::ThreadBase::sendConfigEvent_l(int event, int param) { mConfigEvents.add(configEvent); } bool AudioFlinger::MixerThread::threadLoop() { processConfigEvents(); } void AudioFlinger::ThreadBase::processConfigEvents() { audioConfigChanged_l(configEvent->mEvent, configEvent->mParam); } void AudioFlinger::audioConfigChanged_l { mNotificationClients.valueAt(i)->client()->ioConfigChanged(event, ioHandle, param2); } void AudioSystem::AudioFlingerClient::ioConfigChanged { case OUTPUT_CONFIG_CHANGED: gOutputs.replaceValueFor(ioHandle, outputDesc); } 11