SlideShare une entreprise Scribd logo
1  sur  11
안드로이드 아나토미 정리




  Android Audio System
(오디오 플링거 서비스 초기화)




                            박철희

                       1
1.오디오 시스템의 역활    안드로이드 아나토미 정리




사운드 데이터           사운드 데이터
PCM 데이터          PCM 데이터
(decode된 data)    (encoding될
                  data)




                     2
2.PCM(Pulse code modulation) DATA   안드로이드 아나토미 정리




                                        3
3.오디오 시스템 아키텍쳐   안드로이드 아나토미 정리




 Application


Native proxy




 Native system
4.오디오 플링거 서비스 초기화                                                            안드로이드 아나토미 정리



 1)오디오 HAL 결정
  AudioFlinger.cpp
  AudioFlinger::AudioFlinger(){
  mAudioHardware = AudioHardwareInterface::create();
  }



  AudioHardwareInterface.cpp
  AudioHardwareInterface* AudioHardwareInterface::create()
  {

  #ifdef GENERIC_AUDIO
     hw = new AudioHardwareGeneric();
  #else
  hw = createAudioHardware();
     }
  #endif
     if (hw->initCheck() != NO_ERROR) {
         LOGW("Using stubbed audio hardware. No sound will be produced.");
         delete hw;
         hw = new AudioHardwareStub();
     }
  }
4.오디오 플링거 서비스 초기화                                                                                안드로이드 아나토미 정리



 2)출력 스트림 생성
   AudioFlinger.cpp
   AudioPolicyService::AudioPolicyService() {
   mpPolicyManager = createAudioPolicyManager(this);
   }



   AudioPolicyManager.cpp
   extern "C" AudioPolicyInterface* createAudioPolicyManager(AudioPolicyClientInterface
   *clientInterface)
   {
      return new AudioPolicyManager(clientInterface);
   }
                                  AudioPolicyManager의 부모 class인 AudioPolicyManagerBase에서 openOutput호출


  AudioPolicyManagerBase.cpp
  AudioPolicyManagerBase::AudioPolicyManagerBase(AudioPolicyClientInterface *clientInterface){

  mHardwareOutput = mpClientInterface->openOutput(&outputDesc->mDevice,
                     &outputDesc->mSamplingRate,
                     &outputDesc->mFormat,
                     &outputDesc->mChannels,
                     &outputDesc->mLatency,
                     outputDesc->mFlags);
  }
4.오디오 플링거 서비스 초기화                                                            안드로이드 아나토미 정리



   AudioPolicyService.cpp
   audio_io_handle_t AudioPolicyService::openOutput(){
   return af->openOutput(pDevices,
                   pSamplingRate,
                   (uint32_t *)pFormat,
                   pChannels,
                   pLatencyMs,
                   flags);
   }

     AudioFlinger.cpp
     AudioFlinger::openOutput(){
     AudioStreamOut *output = mAudioHardware->openOutputStream(*pDevices,
                                               (int *)&format,
                                               &channels,
                                               &samplingRate,
                                               &status);
 AudioHardware.cpp
 AudioStreamOut* AudioHardware::openOutputStream{
  AudioStreamOutMSM72xx* out = new AudioStreamOutMSM72xx();
 status_t lStatus = out->set(this, devices, format, channels, sampleRate);
 }



    status_t AudioHardware::AudioStreamOutMSM72xx::set{
     if (pFormat) *pFormat = lFormat;
     if (pChannels) *pChannels = lChannels;
     if (pRate) *pRate = lRate;
    }
4.오디오 플링거 서비스 초기화                                                                                          안드로이드 아나토미 정리



 3)Playback thread(Mixer thread) 생성
   AudioFlinger.cpp                                            DirectOutputThread
   AudioFlinger::openOutput(){                                    -Linear PCM이 아닌 PCM Data를 출력하고 자 할 경우 사용
                                                                   (Linear PCM: PCM 포맷이 8 ,16,24로 고정된 PCM)
   if ((flags & AudioSystem::OUTPUT_FLAG_DIRECT) ||
    {
             thread = new DirectOutputThread(this, output, id, *pDevices);

    }
   else
   {
          thread = new MixerThread(this, output, id, *pDevices);
   }

                 Refbase                                       Pthread_create
                                                     3                                 4
                      1
             Thread
                                             Run()                                _threadLoop()


                 Threadbase                     2
                                                                     5       1회호출                      6    반복호출

                 playbackthread          onFirstRef()              ReadyToRun()



                 MixerThread                                                                      ThreadLoop()
4.오디오 플링거 서비스 초기화                                                                                           안드로이드 아나토미 정리



RefBase.cpp                                                               int Thread::_threadLoop(void* user)
void RefBase::incStrong(const void* id) const{                            {
                                                                            do {
const_cast<RefBase*>(this)->onFirstRef();                                       bool result;
}                                                                               if (first) {
           1                                                                        first = false;
                                                                                    self->mStatus = self->readyToRun();   5
AudioFlinger..cpp                                                                }
void AudioFlinger::PlaybackThread::onFirstRef(){                                 else{
                                                          4                        result = self->threadLoop();           6
run(buffer, ANDROID_PRIORITY_URGENT_AUDIO);                                       }
}                                                                              }
                                                                          }
        2
                                                                               status_t AudioFlinger::PlaybackThread::readyToRun()
Threads.cpp                                                                    {
status_t Thread::run(const char* name, int32_t priority, size_t stack){           if (mSampleRate == 0) {
                                                                                            return NO_INIT;
res = androidCreateRawThreadEtc                                                   }
             (_threadLoop,this, name, priority, stack, &mThread);              return NO_ERROR;
}                                                                              }
            3
                                                                                bool AudioFlinger::MixerThread::threadLoop()
 int androidCreateRawThreadEtc(){                                               {
                                                                                  while (!exitPending())
 int result = pthread_create(&thread, &attr,                                      {
                (android_pthread_entry)entryFunction, userData);                         …
                                                                                   }
 }                                                                              }
4.오디오 플링거 서비스 초기화                                                                     안드로이드 아나토미 정리



AudioFlinger::MixerThread::MixerThread
  : PlaybackThread(audioFlinger, output, id, device),
    mAudioMixer(0)
{
  mAudioMixer = new AudioMixer(mFrameCount, mSampleRate);
}
                                                                      track   track             track
AudioFlinger::PlaybackThread::PlaybackThread{                                           …
                                                                                        .
 readOutputParameters();
}

 void AudioFlinger::PlaybackThread::readOutputParameters()
 {
   mFrameSize = (uint16_t)mOutput->frameSize();
   mFrameCount = mOutput->bufferSize() / mFrameSize;               Mixer
   mMixBuffer = new int16_t[mFrameCount * 2];                      buffer
   memset(mMixBuffer, 0, mFrameCount * 2 * sizeof(int16_t));
 }


                                                                                        frame

    1)frame: pcm data를 읽고 쓰는 단위                          Framecount:
    2)framesize: pcm format x 채널 수                       Buffersize/frame
              ex) 16 bit x 2 (strero)= 4 bytes           size
                                                                                        Audio HAL
4.오디오 플링거 서비스 초기화                                                                         안드로이드 아나토미 정리



AudioFlinger::MixerThread::MixerThread
  : PlaybackThread(audioFlinger, output, id, device),
    mAudioMixer(0)
{
  mAudioMixer = new AudioMixer(mFrameCount, mSampleRate);
}


AudioMixer::AudioMixer(size_t frameCount, uint32_t sampleRate)
{
  mState.enabledTracks= 0;
  track_t* t = mState.tracks;
 for (int i=0 ; i<32 ; i++) {
  t->bufferProvider = 0;                   Track[0]          track               track       Track[31]
  t->mainBuffer = NULL;                                                     …
}                                                                           .
}




                                                                    AudioMixer
                              State_t                                 [0]          [31]
                              mState      tracks         Buffer                                          Mixer
                                                         provider                                        buffer
                                        Enable tracks    MainBuffer
                                          hook             hook

Contenu connexe

Tendances

Android audio system(audio_hardwareinterace)
Android audio system(audio_hardwareinterace)Android audio system(audio_hardwareinterace)
Android audio system(audio_hardwareinterace)
fefe7270
 

Tendances (20)

Embedded Android : System Development - Part III (Audio / Video HAL)
Embedded Android : System Development - Part III (Audio / Video HAL)Embedded Android : System Development - Part III (Audio / Video HAL)
Embedded Android : System Development - Part III (Audio / Video HAL)
 
Android audio system(audio_hardwareinterace)
Android audio system(audio_hardwareinterace)Android audio system(audio_hardwareinterace)
Android audio system(audio_hardwareinterace)
 
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
 
Android Multimedia Framework
Android Multimedia FrameworkAndroid Multimedia Framework
Android Multimedia Framework
 
Embedded Android : System Development - Part I
Embedded Android : System Development - Part IEmbedded Android : System Development - Part I
Embedded Android : System Development - Part I
 
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 Things : Building Embedded Devices
Android Things : Building Embedded DevicesAndroid Things : Building Embedded Devices
Android Things : Building Embedded Devices
 
Android's Multimedia Framework
Android's Multimedia FrameworkAndroid's Multimedia Framework
Android's Multimedia Framework
 
Linux Audio Drivers. ALSA
Linux Audio Drivers. ALSALinux Audio Drivers. ALSA
Linux Audio Drivers. ALSA
 
Embedded Android : System Development - Part IV (Android System Services)
Embedded Android : System Development - Part IV (Android System Services)Embedded Android : System Development - Part IV (Android System Services)
Embedded Android : System Development - Part IV (Android System Services)
 
08 android multimedia_framework_overview
08 android multimedia_framework_overview08 android multimedia_framework_overview
08 android multimedia_framework_overview
 
Embedded Android Workshop
Embedded Android WorkshopEmbedded Android Workshop
Embedded Android Workshop
 
Building aosp
Building aospBuilding aosp
Building aosp
 
Explore Android Internals
Explore Android InternalsExplore Android Internals
Explore Android Internals
 
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
 
"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)
 
Embedded Android : System Development - Part III
Embedded Android : System Development - Part IIIEmbedded Android : System Development - Part III
Embedded Android : System Development - Part III
 
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
 
Camera2 API, SHIM, and HAL 3.2 in Android 5.1
Camera2 API, SHIM, and HAL 3.2 in Android 5.1Camera2 API, SHIM, and HAL 3.2 in Android 5.1
Camera2 API, SHIM, and HAL 3.2 in Android 5.1
 

Similaire à Android audio system(오디오 플링거 서비스 초기화)

Android audio system(오디오 출력-트랙활성화)
Android audio system(오디오 출력-트랙활성화)Android audio system(오디오 출력-트랙활성화)
Android audio system(오디오 출력-트랙활성화)
fefe7270
 
Gpg gems1 1.3
Gpg gems1 1.3Gpg gems1 1.3
Gpg gems1 1.3
david nc
 
Google Protocol buffer
Google Protocol bufferGoogle Protocol buffer
Google Protocol buffer
knight1128
 
[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11
흥배 최
 
Android+init+process
Android+init+processAndroid+init+process
Android+init+process
Hong Jae Kwon
 
빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)
SeongHyun Ahn
 
이산수학 C1 프로젝트 7
이산수학 C1 프로젝트 7이산수학 C1 프로젝트 7
이산수학 C1 프로젝트 7
pkok15
 

Similaire à Android audio system(오디오 플링거 서비스 초기화) (20)

Java mentoring of samsung scsc 2
Java mentoring of samsung scsc   2Java mentoring of samsung scsc   2
Java mentoring of samsung scsc 2
 
Android audio system(오디오 출력-트랙활성화)
Android audio system(오디오 출력-트랙활성화)Android audio system(오디오 출력-트랙활성화)
Android audio system(오디오 출력-트랙활성화)
 
Gpg gems1 1.3
Gpg gems1 1.3Gpg gems1 1.3
Gpg gems1 1.3
 
Google Protocol buffer
Google Protocol bufferGoogle Protocol buffer
Google Protocol buffer
 
Java Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJava Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte Code
 
20201121 코드 삼분지계
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계
 
[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11
 
Android+init+process
Android+init+processAndroid+init+process
Android+init+process
 
병렬 프로그래밍
병렬 프로그래밍병렬 프로그래밍
병렬 프로그래밍
 
[2014 CodeEngn Conference 11] 이경식 - 동적 추적 프레임워크를 이용한 OS X 바이너리 분석
[2014 CodeEngn Conference 11] 이경식 - 동적 추적 프레임워크를 이용한 OS X 바이너리 분석[2014 CodeEngn Conference 11] 이경식 - 동적 추적 프레임워크를 이용한 OS X 바이너리 분석
[2014 CodeEngn Conference 11] 이경식 - 동적 추적 프레임워크를 이용한 OS X 바이너리 분석
 
빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)
 
6 function
6 function6 function
6 function
 
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
 
Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017
 
한컴MDS_무기체계 SW 개발을 위한 TRACE32 활용방안
한컴MDS_무기체계 SW 개발을 위한 TRACE32 활용방안한컴MDS_무기체계 SW 개발을 위한 TRACE32 활용방안
한컴MDS_무기체계 SW 개발을 위한 TRACE32 활용방안
 
이산수학 C1 프로젝트 7
이산수학 C1 프로젝트 7이산수학 C1 프로젝트 7
이산수학 C1 프로젝트 7
 
IPython
IPythonIPython
IPython
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
 
Java stream v0.1
Java stream v0.1Java stream v0.1
Java stream v0.1
 
Java stream v0.1
Java stream v0.1Java stream v0.1
Java stream v0.1
 

Plus de 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
 
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
 
Surface flingerservice(서피스 플링거 연결 ics)
Surface flingerservice(서피스 플링거 연결 ics)Surface flingerservice(서피스 플링거 연결 ics)
Surface flingerservice(서피스 플링거 연결 ics)
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(서피스 플링거 연결)
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 part1
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
 
C++정리 스마트포인터
C++정리 스마트포인터C++정리 스마트포인터
C++정리 스마트포인터
fefe7270
 

Plus de fefe7270 (13)

Surface flingerservice(서피스 출력 요청 jb)
Surface flingerservice(서피스 출력 요청 jb)Surface flingerservice(서피스 출력 요청 jb)
Surface flingerservice(서피스 출력 요청 jb)
 
Surface flingerservice(서피스 상태 변경 jb)
Surface flingerservice(서피스 상태 변경 jb)Surface flingerservice(서피스 상태 변경 jb)
Surface flingerservice(서피스 상태 변경 jb)
 
Surface flingerservice(서피스 플링거 연결 jb)
Surface flingerservice(서피스 플링거 연결 jb)Surface flingerservice(서피스 플링거 연결 jb)
Surface flingerservice(서피스 플링거 연결 jb)
 
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(서피스플링거서비스초기화 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(서피스 플링거 연결)
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
 
Camera camcorder framework overview(ginger bread)
Camera camcorder framework overview(ginger bread)Camera camcorder framework overview(ginger bread)
Camera camcorder framework overview(ginger bread)
 
C++정리 스마트포인터
C++정리 스마트포인터C++정리 스마트포인터
C++정리 스마트포인터
 

Android audio system(오디오 플링거 서비스 초기화)

  • 1. 안드로이드 아나토미 정리 Android Audio System (오디오 플링거 서비스 초기화) 박철희 1
  • 2. 1.오디오 시스템의 역활 안드로이드 아나토미 정리 사운드 데이터 사운드 데이터 PCM 데이터 PCM 데이터 (decode된 data) (encoding될 data) 2
  • 3. 2.PCM(Pulse code modulation) DATA 안드로이드 아나토미 정리 3
  • 4. 3.오디오 시스템 아키텍쳐 안드로이드 아나토미 정리 Application Native proxy Native system
  • 5. 4.오디오 플링거 서비스 초기화 안드로이드 아나토미 정리 1)오디오 HAL 결정 AudioFlinger.cpp AudioFlinger::AudioFlinger(){ mAudioHardware = AudioHardwareInterface::create(); } AudioHardwareInterface.cpp AudioHardwareInterface* AudioHardwareInterface::create() { #ifdef GENERIC_AUDIO hw = new AudioHardwareGeneric(); #else hw = createAudioHardware(); } #endif if (hw->initCheck() != NO_ERROR) { LOGW("Using stubbed audio hardware. No sound will be produced."); delete hw; hw = new AudioHardwareStub(); } }
  • 6. 4.오디오 플링거 서비스 초기화 안드로이드 아나토미 정리 2)출력 스트림 생성 AudioFlinger.cpp AudioPolicyService::AudioPolicyService() { mpPolicyManager = createAudioPolicyManager(this); } AudioPolicyManager.cpp extern "C" AudioPolicyInterface* createAudioPolicyManager(AudioPolicyClientInterface *clientInterface) { return new AudioPolicyManager(clientInterface); } AudioPolicyManager의 부모 class인 AudioPolicyManagerBase에서 openOutput호출 AudioPolicyManagerBase.cpp AudioPolicyManagerBase::AudioPolicyManagerBase(AudioPolicyClientInterface *clientInterface){ mHardwareOutput = mpClientInterface->openOutput(&outputDesc->mDevice, &outputDesc->mSamplingRate, &outputDesc->mFormat, &outputDesc->mChannels, &outputDesc->mLatency, outputDesc->mFlags); }
  • 7. 4.오디오 플링거 서비스 초기화 안드로이드 아나토미 정리 AudioPolicyService.cpp audio_io_handle_t AudioPolicyService::openOutput(){ return af->openOutput(pDevices, pSamplingRate, (uint32_t *)pFormat, pChannels, pLatencyMs, flags); } AudioFlinger.cpp AudioFlinger::openOutput(){ AudioStreamOut *output = mAudioHardware->openOutputStream(*pDevices, (int *)&format, &channels, &samplingRate, &status); AudioHardware.cpp AudioStreamOut* AudioHardware::openOutputStream{ AudioStreamOutMSM72xx* out = new AudioStreamOutMSM72xx(); status_t lStatus = out->set(this, devices, format, channels, sampleRate); } status_t AudioHardware::AudioStreamOutMSM72xx::set{ if (pFormat) *pFormat = lFormat; if (pChannels) *pChannels = lChannels; if (pRate) *pRate = lRate; }
  • 8. 4.오디오 플링거 서비스 초기화 안드로이드 아나토미 정리 3)Playback thread(Mixer thread) 생성 AudioFlinger.cpp DirectOutputThread AudioFlinger::openOutput(){ -Linear PCM이 아닌 PCM Data를 출력하고 자 할 경우 사용 (Linear PCM: PCM 포맷이 8 ,16,24로 고정된 PCM) if ((flags & AudioSystem::OUTPUT_FLAG_DIRECT) || { thread = new DirectOutputThread(this, output, id, *pDevices); } else { thread = new MixerThread(this, output, id, *pDevices); } Refbase Pthread_create 3 4 1 Thread Run() _threadLoop() Threadbase 2 5 1회호출 6 반복호출 playbackthread onFirstRef() ReadyToRun() MixerThread ThreadLoop()
  • 9. 4.오디오 플링거 서비스 초기화 안드로이드 아나토미 정리 RefBase.cpp int Thread::_threadLoop(void* user) void RefBase::incStrong(const void* id) const{ { do { const_cast<RefBase*>(this)->onFirstRef(); bool result; } if (first) { 1 first = false; self->mStatus = self->readyToRun(); 5 AudioFlinger..cpp } void AudioFlinger::PlaybackThread::onFirstRef(){ else{ 4 result = self->threadLoop(); 6 run(buffer, ANDROID_PRIORITY_URGENT_AUDIO); } } } } 2 status_t AudioFlinger::PlaybackThread::readyToRun() Threads.cpp { status_t Thread::run(const char* name, int32_t priority, size_t stack){ if (mSampleRate == 0) { return NO_INIT; res = androidCreateRawThreadEtc } (_threadLoop,this, name, priority, stack, &mThread); return NO_ERROR; } } 3 bool AudioFlinger::MixerThread::threadLoop() int androidCreateRawThreadEtc(){ { while (!exitPending()) int result = pthread_create(&thread, &attr, { (android_pthread_entry)entryFunction, userData); … } } }
  • 10. 4.오디오 플링거 서비스 초기화 안드로이드 아나토미 정리 AudioFlinger::MixerThread::MixerThread : PlaybackThread(audioFlinger, output, id, device), mAudioMixer(0) { mAudioMixer = new AudioMixer(mFrameCount, mSampleRate); } track track track AudioFlinger::PlaybackThread::PlaybackThread{ … . readOutputParameters(); } void AudioFlinger::PlaybackThread::readOutputParameters() { mFrameSize = (uint16_t)mOutput->frameSize(); mFrameCount = mOutput->bufferSize() / mFrameSize; Mixer mMixBuffer = new int16_t[mFrameCount * 2]; buffer memset(mMixBuffer, 0, mFrameCount * 2 * sizeof(int16_t)); } frame 1)frame: pcm data를 읽고 쓰는 단위 Framecount: 2)framesize: pcm format x 채널 수 Buffersize/frame ex) 16 bit x 2 (strero)= 4 bytes size Audio HAL
  • 11. 4.오디오 플링거 서비스 초기화 안드로이드 아나토미 정리 AudioFlinger::MixerThread::MixerThread : PlaybackThread(audioFlinger, output, id, device), mAudioMixer(0) { mAudioMixer = new AudioMixer(mFrameCount, mSampleRate); } AudioMixer::AudioMixer(size_t frameCount, uint32_t sampleRate) { mState.enabledTracks= 0; track_t* t = mState.tracks; for (int i=0 ; i<32 ; i++) { t->bufferProvider = 0; Track[0] track track Track[31] t->mainBuffer = NULL; … } . } AudioMixer State_t [0] [31] mState tracks Buffer Mixer provider buffer Enable tracks MainBuffer hook hook