SlideShare a Scribd company logo
1 of 6
안드로이드 아나토미 정리



Android Audio System
(PCM데이터 출력요청-
  서비스 클라이언트)




                            박철희

                       1
1.Audio data 전달                                                                                           안드로이드 아나토미 정리


  Audiotrack.java
  public int write(byte[] audioData,int offsetInBytes, int sizeInBytes)
  {
    //audioData:audioData the array that holds the data to play.
    //the offset expressed in bytes in audioData where the data to play starts.
    //the number of bytes to read in audioData after the offset.
    //the number of bytes that were written
    return native_write_byte(audioData, offsetInBytes, sizeInBytes, mAudioFormat);
  }




  Android_media_AudioTrack.cpp
  static jint android_media_AudioTrack_native_write()
  {
     if (javaAudioData) {
         cAudioData = (jbyte *)env->GetPrimitiveArrayCritical(javaAudioData, NULL); ----------------(1)
         if (cAudioData == NULL) {
             LOGE("Error retrieving source of audio data to play, can't play");
             return 0; // out of memory or no data to load
         }
     }

  jint written = writeToTrack(lpTrack, javaAudioFormat, cAudioData, offsetInBytes, sizeInBytes); ---------(2)

  }



                                                                                                                2
2.Audio data 전달(vm heap -> process heap -> 공유 메모리)                                                    안드로이드 아나토미 정리


 (1) cAudioData = (jbyte *)env->GetPrimitiveArrayCritical(javaAudioData, NULL);
 가상머신 heap(java영역)에 있는 audio data를 process heap(네이티브 공간)으로 copy한다.


                                      Music process
                   Java 계층                                        Native 계층
                                            Process heap
                   Dalvik VM
                                                VM heap
                  Music
                  application                      copy
                                             Audio buffer         audiotrack



 (2) jint written = writeToTrack(lpTrack, javaAudioFormat, cAudioData, offsetInBytes, sizeInBytes);
 music Process heap에 있는 audiodata를 adiotrack을 위한 공유 메모리에 write한다.
   (공유 메모리:audio track과 audio flinger가 data를 공유하기 위한 메모리


 AudioTrack++                                                        Audioflinger
                     audiob
                     uffer
                                    write          read
                                                                                                android
                                                                                                kernel
                        Track[3       32kbyte
                        1]
            AudioFlinger::Client
            (shared memory)                           1M

                         Track[0]

                                                                                                          3
3. 공유메모리에 audio data copy과정                                                                               안드로이드 아나토미 정리

 jint writeToTrack(AudioTrack* pTrack, jint audioFormat, jbyte* data, jint offsetInBytes, jint sizeInBytes)
 {
     written = pTrack->write(data + offsetInBytes, sizeInBytes);
 }

 AudioTrack.cpp
 ssize_t AudioTrack::write(const void* buffer, size_t userSize)
 {

     const int8_t *src = (const int8_t *)buffer;  process heap의 audio buffer를 가리킨다.
     Buffer audioBuffer;

     do {
       status_t err = obtainBuffer(&audioBuffer, -1);
        공유 메모리에서 유저 오프셋이 가리키는 곳의 메모리를 할당 받아 audiobuffer에 저장 한다.

         toWrite = audioBuffer.size;
         할당된 버퍼의 크기

         memcpy(audioBuffer.i8, src, toWrite);
         audio buffer의 data를 할당받은 공유메모리에 copy한다.

         releaseBuffer(&audioBuffer);
         오디오 트랙 컨트롤 블록의 유저 변수 값을 재계산 함.
     }

 }




                                                                                                              4
4.obtainbuffer                                                                        안드로이드 아나토미 정리

  status_t AudioTrack::obtainBuffer(Buffer* audioBuffer, int32_t waitCount)
  {

      uint32_t framesAvail = cblk->framesAvailable();
      공유 메모리에 할당 받을 메모리가 있는지 check한다.

       if (framesAvail == 0) {
           while (framesAvail == 0) {
             공유 메모리에 할당 받을 메모리가 없을 경우,
              audio driver에서 data를 출력해서 빈 메모리가 생길때까지 기다린다.
           }
      }

      남아 있는 메모리가 요구한 메모리보다 적게 남아 있으면 남아 있는 메모리를 넣는다.
      if (framesReq > framesAvail) {
           framesReq = framesAvail;
       }
       audioBuffer->size = framesReq * cblk->frameSize;
       audioBuffer->raw = (int8_t *)cblk->buffer(u);
        공유 메모리에 buffer를 할당 받고 그 위치를 return한다.               audiobuffer
                                                        User

  }

                                                                                               server



                                                               userBase                        serverBase


                                                                              오디오 컨트롤 블록



                                                                                           5
5.releaseBuffer                                                                   안드로이드 아나토미 정리

  void AudioTrack::releaseBuffer(Buffer* audioBuffer)
  {
    audio_track_cblk_t* cblk = mCblk;
    cblk->stepUser(audioBuffer->frameCount);
  }

  uint32_t audio_track_cblk_t::stepUser(uint32_t frameCount)
  {
     uint32_t u = this->user;
     u += frameCount;
      현재 user 변수에 할당 된 frameCount을 더한다.

      this->user = u;
      갱신된 user 값을 설정한다.

  }
                                                            User
                                                                    audiobuffer




                                                                                   server



                                                 userBase                          serverBase


                                                                   오디오 컨트롤 블록




                                                                                            6

More Related Content

What's hot

Android's Multimedia Framework
Android's Multimedia FrameworkAndroid's Multimedia Framework
Android's Multimedia FrameworkOpersys inc.
 
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
 
"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
 
Android internals By Rajesh Khetan
Android internals By Rajesh KhetanAndroid internals By Rajesh Khetan
Android internals By Rajesh KhetanRajesh Khetan
 
Overview of Android binder IPC implementation
Overview of Android binder IPC implementationOverview of Android binder IPC implementation
Overview of Android binder IPC implementationChethan Pchethan
 
Android Storage - Vold
Android Storage - VoldAndroid Storage - Vold
Android Storage - VoldWilliam Lee
 
Understanding the Android System Server
Understanding the Android System ServerUnderstanding the Android System Server
Understanding the Android System ServerOpersys inc.
 
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.
 
ABS 2012 - Android Device Porting Walkthrough
ABS 2012 - Android Device Porting WalkthroughABS 2012 - Android Device Porting Walkthrough
ABS 2012 - Android Device Porting WalkthroughBenjamin Zores
 
Learning AOSP - Android Linux Device Driver
Learning AOSP - Android Linux Device DriverLearning AOSP - Android Linux Device Driver
Learning AOSP - Android Linux Device DriverNanik Tolaram
 
mpeg2ts1_es_pes_ps_ts_psi
mpeg2ts1_es_pes_ps_ts_psimpeg2ts1_es_pes_ps_ts_psi
mpeg2ts1_es_pes_ps_ts_psihexiay
 

What's hot (20)

Embedded Android : System Development - Part IV
Embedded Android : System Development - Part IVEmbedded Android : System Development - Part IV
Embedded Android : System Development - Part IV
 
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
 
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 (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)
 
"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 internals By Rajesh Khetan
Android internals By Rajesh KhetanAndroid internals By Rajesh Khetan
Android internals By Rajesh Khetan
 
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
 
Overview of Android binder IPC implementation
Overview of Android binder IPC implementationOverview of Android binder IPC implementation
Overview of Android binder IPC implementation
 
Android Storage - Vold
Android Storage - VoldAndroid Storage - Vold
Android Storage - Vold
 
Understanding the Android System Server
Understanding the Android System ServerUnderstanding the Android System Server
Understanding the Android System Server
 
Android Internals
Android InternalsAndroid Internals
Android Internals
 
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...
 
ABS 2012 - Android Device Porting Walkthrough
ABS 2012 - Android Device Porting WalkthroughABS 2012 - Android Device Porting Walkthrough
ABS 2012 - Android Device Porting Walkthrough
 
Embedded Android : System Development - Part II (Linux device drivers)
Embedded Android : System Development - Part II (Linux device drivers)Embedded Android : System Development - Part II (Linux device drivers)
Embedded Android : System Development - Part II (Linux device drivers)
 
Learning AOSP - Android Linux Device Driver
Learning AOSP - Android Linux Device DriverLearning AOSP - Android Linux Device Driver
Learning AOSP - Android Linux Device Driver
 
Linux Audio Drivers. ALSA
Linux Audio Drivers. ALSALinux Audio Drivers. ALSA
Linux Audio Drivers. ALSA
 
mpeg2ts1_es_pes_ps_ts_psi
mpeg2ts1_es_pes_ps_ts_psimpeg2ts1_es_pes_ps_ts_psi
mpeg2ts1_es_pes_ps_ts_psi
 

Similar to Android audio system(pcm데이터출력요청-서비스클라이언트)

제2회 hello world 오픈세미나 Web Audio API-가능성엿보기
제2회 hello world 오픈세미나 Web Audio API-가능성엿보기제2회 hello world 오픈세미나 Web Audio API-가능성엿보기
제2회 hello world 오픈세미나 Web Audio API-가능성엿보기NAVER D2
 
Developing game audio with the Web Audio API
Developing game audio with the Web Audio APIDeveloping game audio with the Web Audio API
Developing game audio with the Web Audio APIJae Sung Park
 
[조진현]Kgc2012 c++amp
[조진현]Kgc2012 c++amp[조진현]Kgc2012 c++amp
[조진현]Kgc2012 c++amp진현 조
 
3D카툰메이커 완료세미나(복구됨)
3D카툰메이커 완료세미나(복구됨)3D카툰메이커 완료세미나(복구됨)
3D카툰메이커 완료세미나(복구됨)Daniel Shin
 
Android Screen Recorder
Android Screen RecorderAndroid Screen Recorder
Android Screen RecorderSooHwan Ok
 
[SWCON211] LectureCode_13_Matlab Practice.pptx
[SWCON211] LectureCode_13_Matlab Practice.pptx[SWCON211] LectureCode_13_Matlab Practice.pptx
[SWCON211] LectureCode_13_Matlab Practice.pptxoreo329
 
Windows Phone Mango 아키텍처-멀티태스킹(2)
Windows Phone Mango 아키텍처-멀티태스킹(2)Windows Phone Mango 아키텍처-멀티태스킹(2)
Windows Phone Mango 아키텍처-멀티태스킹(2)mosaicnet
 
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoLinux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoMario Cho
 
Android media codec 사용하기
Android media codec 사용하기Android media codec 사용하기
Android media codec 사용하기Taehwan kwon
 
Puppet과 자동화된 시스템 관리
Puppet과 자동화된 시스템 관리Puppet과 자동화된 시스템 관리
Puppet과 자동화된 시스템 관리Keon Ahn
 
안드로이드 플랫폼 설명
안드로이드 플랫폼 설명안드로이드 플랫폼 설명
안드로이드 플랫폼 설명Peter YoungSik Yun
 
[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)
[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)
[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)Ji-Woong Choi
 
리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초Yu Yongwoo
 
DB Monitoring 개념 및 활용 (박명규)
DB Monitoring 개념 및 활용 (박명규)DB Monitoring 개념 및 활용 (박명규)
DB Monitoring 개념 및 활용 (박명규)WhaTap Labs
 
Android audio system(audiopolicy_manager)
Android audio system(audiopolicy_manager)Android audio system(audiopolicy_manager)
Android audio system(audiopolicy_manager)fefe7270
 
Multithread pattern 소개
Multithread pattern 소개Multithread pattern 소개
Multithread pattern 소개Sunghyouk Bae
 
[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기진현 조
 
오픈스택: 구석구석 파헤쳐보기
오픈스택: 구석구석 파헤쳐보기오픈스택: 구석구석 파헤쳐보기
오픈스택: 구석구석 파헤쳐보기Jaehwa Park
 
이호민 - 우분투 환경에서의 임베디드 개발환경 구축 및 어플리케이션 개발 (2010Y06M24D)
이호민 - 우분투 환경에서의 임베디드 개발환경 구축 및 어플리케이션 개발 (2010Y06M24D)이호민 - 우분투 환경에서의 임베디드 개발환경 구축 및 어플리케이션 개발 (2010Y06M24D)
이호민 - 우분투 환경에서의 임베디드 개발환경 구축 및 어플리케이션 개발 (2010Y06M24D)Ubuntu Korea Community
 
망고100 보드로 놀아보자 13
망고100 보드로 놀아보자  13망고100 보드로 놀아보자  13
망고100 보드로 놀아보자 13종인 전
 

Similar to Android audio system(pcm데이터출력요청-서비스클라이언트) (20)

제2회 hello world 오픈세미나 Web Audio API-가능성엿보기
제2회 hello world 오픈세미나 Web Audio API-가능성엿보기제2회 hello world 오픈세미나 Web Audio API-가능성엿보기
제2회 hello world 오픈세미나 Web Audio API-가능성엿보기
 
Developing game audio with the Web Audio API
Developing game audio with the Web Audio APIDeveloping game audio with the Web Audio API
Developing game audio with the Web Audio API
 
[조진현]Kgc2012 c++amp
[조진현]Kgc2012 c++amp[조진현]Kgc2012 c++amp
[조진현]Kgc2012 c++amp
 
3D카툰메이커 완료세미나(복구됨)
3D카툰메이커 완료세미나(복구됨)3D카툰메이커 완료세미나(복구됨)
3D카툰메이커 완료세미나(복구됨)
 
Android Screen Recorder
Android Screen RecorderAndroid Screen Recorder
Android Screen Recorder
 
[SWCON211] LectureCode_13_Matlab Practice.pptx
[SWCON211] LectureCode_13_Matlab Practice.pptx[SWCON211] LectureCode_13_Matlab Practice.pptx
[SWCON211] LectureCode_13_Matlab Practice.pptx
 
Windows Phone Mango 아키텍처-멀티태스킹(2)
Windows Phone Mango 아키텍처-멀티태스킹(2)Windows Phone Mango 아키텍처-멀티태스킹(2)
Windows Phone Mango 아키텍처-멀티태스킹(2)
 
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoLinux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
 
Android media codec 사용하기
Android media codec 사용하기Android media codec 사용하기
Android media codec 사용하기
 
Puppet과 자동화된 시스템 관리
Puppet과 자동화된 시스템 관리Puppet과 자동화된 시스템 관리
Puppet과 자동화된 시스템 관리
 
안드로이드 플랫폼 설명
안드로이드 플랫폼 설명안드로이드 플랫폼 설명
안드로이드 플랫폼 설명
 
[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)
[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)
[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)
 
리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초
 
DB Monitoring 개념 및 활용 (박명규)
DB Monitoring 개념 및 활용 (박명규)DB Monitoring 개념 및 활용 (박명규)
DB Monitoring 개념 및 활용 (박명규)
 
Android audio system(audiopolicy_manager)
Android audio system(audiopolicy_manager)Android audio system(audiopolicy_manager)
Android audio system(audiopolicy_manager)
 
Multithread pattern 소개
Multithread pattern 소개Multithread pattern 소개
Multithread pattern 소개
 
[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기
 
오픈스택: 구석구석 파헤쳐보기
오픈스택: 구석구석 파헤쳐보기오픈스택: 구석구석 파헤쳐보기
오픈스택: 구석구석 파헤쳐보기
 
이호민 - 우분투 환경에서의 임베디드 개발환경 구축 및 어플리케이션 개발 (2010Y06M24D)
이호민 - 우분투 환경에서의 임베디드 개발환경 구축 및 어플리케이션 개발 (2010Y06M24D)이호민 - 우분투 환경에서의 임베디드 개발환경 구축 및 어플리케이션 개발 (2010Y06M24D)
이호민 - 우분투 환경에서의 임베디드 개발환경 구축 및 어플리케이션 개발 (2010Y06M24D)
 
망고100 보드로 놀아보자 13
망고100 보드로 놀아보자  13망고100 보드로 놀아보자  13
망고100 보드로 놀아보자 13
 

More from 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 part1fefe7270
 
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
 
Android audio system(오디오 출력-트랙활성화)
Android audio system(오디오 출력-트랙활성화)Android audio system(오디오 출력-트랙활성화)
Android audio system(오디오 출력-트랙활성화)fefe7270
 

More from fefe7270 (14)

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(오디오 출력-트랙활성화)
Android audio system(오디오 출력-트랙활성화)Android audio system(오디오 출력-트랙활성화)
Android audio system(오디오 출력-트랙활성화)
 

Android audio system(pcm데이터출력요청-서비스클라이언트)

  • 1. 안드로이드 아나토미 정리 Android Audio System (PCM데이터 출력요청- 서비스 클라이언트) 박철희 1
  • 2. 1.Audio data 전달 안드로이드 아나토미 정리 Audiotrack.java public int write(byte[] audioData,int offsetInBytes, int sizeInBytes) { //audioData:audioData the array that holds the data to play. //the offset expressed in bytes in audioData where the data to play starts. //the number of bytes to read in audioData after the offset. //the number of bytes that were written return native_write_byte(audioData, offsetInBytes, sizeInBytes, mAudioFormat); } Android_media_AudioTrack.cpp static jint android_media_AudioTrack_native_write() { if (javaAudioData) { cAudioData = (jbyte *)env->GetPrimitiveArrayCritical(javaAudioData, NULL); ----------------(1) if (cAudioData == NULL) { LOGE("Error retrieving source of audio data to play, can't play"); return 0; // out of memory or no data to load } } jint written = writeToTrack(lpTrack, javaAudioFormat, cAudioData, offsetInBytes, sizeInBytes); ---------(2) } 2
  • 3. 2.Audio data 전달(vm heap -> process heap -> 공유 메모리) 안드로이드 아나토미 정리 (1) cAudioData = (jbyte *)env->GetPrimitiveArrayCritical(javaAudioData, NULL); 가상머신 heap(java영역)에 있는 audio data를 process heap(네이티브 공간)으로 copy한다. Music process Java 계층 Native 계층 Process heap Dalvik VM VM heap Music application copy Audio buffer audiotrack (2) jint written = writeToTrack(lpTrack, javaAudioFormat, cAudioData, offsetInBytes, sizeInBytes); music Process heap에 있는 audiodata를 adiotrack을 위한 공유 메모리에 write한다. (공유 메모리:audio track과 audio flinger가 data를 공유하기 위한 메모리 AudioTrack++ Audioflinger audiob uffer write read android kernel Track[3 32kbyte 1] AudioFlinger::Client (shared memory) 1M Track[0] 3
  • 4. 3. 공유메모리에 audio data copy과정 안드로이드 아나토미 정리 jint writeToTrack(AudioTrack* pTrack, jint audioFormat, jbyte* data, jint offsetInBytes, jint sizeInBytes) { written = pTrack->write(data + offsetInBytes, sizeInBytes); } AudioTrack.cpp ssize_t AudioTrack::write(const void* buffer, size_t userSize) { const int8_t *src = (const int8_t *)buffer;  process heap의 audio buffer를 가리킨다. Buffer audioBuffer; do { status_t err = obtainBuffer(&audioBuffer, -1); 공유 메모리에서 유저 오프셋이 가리키는 곳의 메모리를 할당 받아 audiobuffer에 저장 한다. toWrite = audioBuffer.size; 할당된 버퍼의 크기 memcpy(audioBuffer.i8, src, toWrite); audio buffer의 data를 할당받은 공유메모리에 copy한다. releaseBuffer(&audioBuffer); 오디오 트랙 컨트롤 블록의 유저 변수 값을 재계산 함. } } 4
  • 5. 4.obtainbuffer 안드로이드 아나토미 정리 status_t AudioTrack::obtainBuffer(Buffer* audioBuffer, int32_t waitCount) { uint32_t framesAvail = cblk->framesAvailable(); 공유 메모리에 할당 받을 메모리가 있는지 check한다. if (framesAvail == 0) { while (framesAvail == 0) { 공유 메모리에 할당 받을 메모리가 없을 경우, audio driver에서 data를 출력해서 빈 메모리가 생길때까지 기다린다. } } 남아 있는 메모리가 요구한 메모리보다 적게 남아 있으면 남아 있는 메모리를 넣는다. if (framesReq > framesAvail) { framesReq = framesAvail; } audioBuffer->size = framesReq * cblk->frameSize; audioBuffer->raw = (int8_t *)cblk->buffer(u);  공유 메모리에 buffer를 할당 받고 그 위치를 return한다. audiobuffer User } server userBase serverBase 오디오 컨트롤 블록 5
  • 6. 5.releaseBuffer 안드로이드 아나토미 정리 void AudioTrack::releaseBuffer(Buffer* audioBuffer) { audio_track_cblk_t* cblk = mCblk; cblk->stepUser(audioBuffer->frameCount); } uint32_t audio_track_cblk_t::stepUser(uint32_t frameCount) { uint32_t u = this->user; u += frameCount;  현재 user 변수에 할당 된 frameCount을 더한다. this->user = u; 갱신된 user 값을 설정한다. } User audiobuffer server userBase serverBase 오디오 컨트롤 블록 6