SlideShare uma empresa Scribd logo
1 de 10
안드로이드의 모든것 분석과 포팅 정리




Android Audio System
(AudioPolicyManager)




                                 박철희

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




Application                     역할:
Framework

                                1.입출력 디바이스 관리

                                2.오디오 볼륨 제어 및 관리
Native
Framework                       3.오디오 정책 관리




HAL




Kernel



                                            2/10
2.입출력 디바이스 관리                                                                       안드로이드의 모든것 분석과 포팅 정리



    AudioPolicyManagerbase의 생성자에서 초기 입출력 device 지정
AudioPolicyManagerBase::AudioPolicyManagerBase(AudioPolicyClientInterface *clientInterface)
{
                                                                           Audiosysystem.h
    //출력이 가능한 device                                                       enum audio_devices {
    mAvailableOutputDevices = AudioSystem::DEVICE_OUT_EARPIECE;            // output devices
    mAvailableOutputDevices |= AudioSystem::DEVICE_OUT_SPEAKER;            DEVICE_OUT_EARPIECE = 0x1,
                                                                           DEVICE_OUT_SPEAKER = 0x2,
    //입력이 가능한 device                                                       DEVICE_OUT_WIRED_HEADSET = 0x4,
    mAvailableInputDevices = AudioSystem::DEVICE_IN_BUILTIN_MIC;           DEVICE_OUT_WIRED_HEADPHONE = 0x8,
                                                                            …
                                                                            // input devices
    outputDesc->mDevice = AudioSystem::DEVICE_OUT_SPEAKER;                 DEVICE_IN_COMMUNICATION = 0x10000,
    mHardwareOutput = mpClientInterface->openOutput                        DEVICE_IN_AMBIENT = 0x20000,
                     (&outputDesc->mDevice,                                DEVICE_IN_BUILTIN_MIC = 0x40000,
                     &outputDesc->mSamplingRate,                           DEVICE_IN_BLUETOOTH_SCO_HEADSET =
                     &outputDesc->mFormat,                                 0x80000,
                     &outputDesc->mChannels,                                …
                     &outputDesc->mLatency,
                     outputDesc->mFlags);
     mHardwareOutput 는 playbackthread의 id

    //playbackthread가 DEVICE_OUT_SPEAKER 로 설정됨을 gOutput에 저장.
    setOutputDevice(mHardwareOutput, , defaultDevice, true);
                                                                         아래와 같은 함수들에서 현재 output stream의
}
                                                                         정보를 구할 때 gOutputs 가 사용된다.
                                                                         getOutputSamplingRate
               AudioSystem의 gOutput의 정보를 갱신 함.
                                                                         getOutputFrameCount
                                                                         getOutputLatency

                                                                                               3/10
2.입출력 디바이스 관리                                                                   안드로이드의 모든것 분석과 포팅 정리



setDeviceConnectionState 에 의해 입출력 device 변경
status_t AudioPolicyManagerBase::setDeviceConnectionState
{
   // handle output devices
   if (AudioSystem::isOutputDevice(device)){

            case AudioSystem::DEVICE_STATE_AVAILABLE:
             mAvailableOutputDevices |= device;

            case AudioSystem::DEVICE_STATE_UNAVAILABLE:
            mAvailableOutputDevices &= ~device;

         // request routing change if necessary
        uint32_t newDevice = getNewDevice(mHardwareOutput, false);
              setOutputDevice(mHardwareOutput, newDevice);
  }

 // handle input devices
  if (AudioSystem::isInputDevice(device)) {

      …
             mAvailableInputDevices |= device;

             mpClientInterface->setParameters(activeInput, param.toString());
  }




                                                                                          4/10
2.입출력 디바이스 관리                                                                     안드로이드의 모든것 분석과 포팅 정리



    setForceUse();정해진 device만을 사용
    startOutput(),stopOutput();play시에 Strategy에 맞는 device 선택 및 해제
    startInput(),stopInput(); record시에 Strategy에 맞는 device 선택 및 해제

void AudioPolicyManagerBase::setForceUse(AudioSystem::force_use usage, AudioSystem::forced_config config)
{
  ..                                              AudioSystem::FOR_MEDI                     FORCE_SPEAK
 case AudioSystem::FOR_MEDIA:                     A                                         ER
 mForceUse[usage] = config;
}

status_t AudioPolicyManagerBase::startOutput
{

     //getNewDevice로 설정할 device를 가져와서 set함.
     setOutputDevice(output, getNewDevice(output));

}


status_t AudioPolicyManagerBase::stopOutput
{
  //현재 play시킨 device와 playbackthred의 output이 일치 하지 않을 경우
  //playbackthread의 device로 다시 set해줌.
  if (output != mHardwareOutput) {
         setOutputDevice(mHardwareOutput, getNewDevice(mHardwareOutput), true);
  }
}

                                                                                                5/10
3. 오디오 볼륨 제어 및 관리                                                    안드로이드의 모든것 분석과 포팅 정리



각 stream별 volume setting(MIN,MAX)
 AudioService.java
 private int[] MAX_STREAM_VOLUME = new int[] {
       6, // STREAM_VOICE_CALL
       7, // STREAM_SYSTEM
      7, // STREAM_RING
      15, // STREAM_MUSIC
      7, // STREAM_ALARM
      7, // STREAM_NOTIFICATION
      15, // STREAM_BLUETOOTH_SCO
      15, // STREAM_FM
      15, // STREAM_DTMF
      15, // STREAM_TTS
      7, // STREAM_SYSTEM_ENFORCED
   };

                 VolumeStreamState의 생성자에서 각 stream에 대한 volume level 설정

public class VolumeStreamState {
 private VolumeStreamState(String settingName, int streamType) {
 mIndexMax = MAX_STREAM_VOLUME[streamType];
AudioSystem.initStreamVolume(streamType, 0, mIndexMax);
}
                 각 stream에 대한 min,max value 설정

void AudioPolicyManagerBase::initStreamVolume{
 mStreams[stream].mIndexMin = indexMin;
  mStreams[stream].mIndexMax = indexMax;
}
                                                                               6/10
3. 오디오 볼륨 제어 및 관리                                                                       안드로이드의 모든것 분석과 포팅 정리



    Volume 조절
    AudioService.java
    public void handleMessage(Message msg) {
       switch (baseMsgWhat) {
               case MSG_SET_SYSTEM_VOLUME:
                 setSystemVolume((VolumeStreamState) msg.obj);
                 break;
    }
private void setSystemVolume(VolumeStreamState streamState) {

        // Adjust volume
        setStreamVolumeIndex(streamState.mStreamType, streamState.mIndex);

        //setting에 sound value 값을 반영 하기 위해 MSG_PERSIST_VOLUME 날려 줌.
        sendMsg(mAudioHandler, MSG_PERSIST_VOLUME, streamState.mStreamType,
                 SENDMSG_REPLACE, 1, 1, streamState, PERSIST_DELAY);
}


private void setStreamVolumeIndex(int stream, int index) {
     AudioSystem.setStreamVolumeIndex(stream, (index + 5)/10);
   }


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

    }
                                                                                                           7/10
3. 오디오 볼륨 제어 및 관리                                                                 안드로이드의 모든것 분석과 포팅 정리


status_t AudioPolicyManagerBase::checkAndSetVolume((int stream, int index..)
{

    //정수로 들어온 volume value를 float형으로 바꿔준다.
    float volume = computeVolume(stream, index, output, device);

    mpClientInterface->setStreamVolume((AudioSystem::stream_type)stream, volume, output, delayMs);
}

                 AudioFlinger의 mStreamTypes 변수에 volume set해줌.



status_t AudioFlinger::PlaybackThread::setStreamVolume(int stream, float value)
{
 mStreamTypes[stream].volume = value;
}
Play시에 이 구조체에 있는 volume값으로 play됨.




                                                                                                     8/10
4.오디오 정책 관리                                                                       안드로이드의 모든것 분석과 포팅 정리



audio_io_handle_t AudioPolicyManagerBase::getOutput                            enum stream_type {
{                                                                                   DEFAULT        =-1,
                                                                                    VOICE_CALL       = 0,
  routing_strategy strategy = getStrategy((AudioSystem::stream_type)stream);        SYSTEM         = 1,
  uint32_t device = getDeviceForStrategy(strategy);                                 RING        = 2,
…                                                                                   MUSIC        = 3,
}                                                                                   ALARM         = 4,
                                       enum routing_strategy {                      NOTIFICATION = 5,
                                               STRATEGY_MEDIA,                      BLUETOOTH_SCO = 6,
                                               STRATEGY_PHONE,                      FM        = 7,
                                               STRATEGY_SONIFICATION,               DTMF        = 8,
                                               STRATEGY_DTMF,                       TTS        = 9,
                                               NUM_STRATEGIES                       ENFORCED_AUDIBLE = 10
                                            };                                      NUM_STREAM_TYPES
                                                                                 };

enum audio_devices {
    // output devices                                          // input devices
    DEVICE_OUT_EARPIECE = 0x1,                                       DEVICE_IN_COMMUNICATION = 0x10000,
    DEVICE_OUT_SPEAKER = 0x2,                                        DEVICE_IN_AMBIENT = 0x20000,
    DEVICE_OUT_WIRED_HEADSET = 0x4,                                  DEVICE_IN_BUILTIN_MIC = 0x40000,
    DEVICE_OUT_WIRED_HEADPHONE = 0x8,                                DEVICE_IN_BLUETOOTH_SCO_HEADSET = 0x80000,
    DEVICE_OUT_BLUETOOTH_SCO = 0x10,                                 DEVICE_IN_WIRED_HEADSET = 0x100000,
    DEVICE_OUT_BLUETOOTH_SCO_HEADSET = 0x20,                         DEVICE_IN_AUX_DIGITAL = 0x200000,
    DEVICE_OUT_BLUETOOTH_SCO_CARKIT = 0x40,                          DEVICE_IN_VOICE_CALL = 0x400000,
    DEVICE_OUT_BLUETOOTH_A2DP = 0x80,                                DEVICE_IN_BACK_MIC = 0x800000,
    DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES =                           DEVICE_IN_FM_RX = 0x1000000,
0x100,                                                               DEVICE_IN_FM_RX_A2DP = 0x2000000,
    DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 0x200,                       DEVICE_IN_ANC_HEADSET = 0x400000,
    DEVICE_OUT_AUX_DIGITAL = 0x400,                                  …
     …                                                                                             9/10
4.오디오 정책 관리                                                    안드로이드의 모든것 분석과 포팅 정리



오디오 정책 관리를 위해 사용되는 변수들
mOutputs, mInputs, mAvailableOutputDevices, mAvailableInputDevices


1.KeyedVector<audio_io_handle_t, AudioOutputDescriptor *> mOutputs;
  H/W output device에 연결된 Playbackthread의 정보

2.KeyedVector<audio_io_handle_t, AudioInputDescriptor *> mInputs
 H/W input device에 연결된 recordthread의 정보
                                                    audio_io_handle_t mHardwareOutput
3.uint32_t mAvailableOutputDevices;                 audio_io_handle_t mA2dpOutput;
 현재 사용가능한 output device들                           audio_io_handle_t mDuplicatedOutput;


4.uint32_t mAvailableInputDevices;
 현재 사용가능한 input device들




                                                                                10/10

Mais conteúdo relacionado

Mais procurados

Android audio system(pcm데이터출력요청-서비스클라이언트)
Android audio system(pcm데이터출력요청-서비스클라이언트)Android audio system(pcm데이터출력요청-서비스클라이언트)
Android audio system(pcm데이터출력요청-서비스클라이언트)fefe7270
 
Android Boot Time Optimization
Android Boot Time OptimizationAndroid Boot Time Optimization
Android Boot Time OptimizationKan-Ru Chen
 
MediaPlayer Playing Flow
MediaPlayer Playing FlowMediaPlayer Playing Flow
MediaPlayer Playing FlowJavid Hsu
 
Android Multimedia Framework
Android Multimedia FrameworkAndroid Multimedia Framework
Android Multimedia FrameworkPicker Weng
 
Understanding the Android System Server
Understanding the Android System ServerUnderstanding the Android System Server
Understanding the Android System ServerOpersys inc.
 
Android media framework overview
Android media framework overviewAndroid media framework overview
Android media framework overviewJerrin George
 
Android internals By Rajesh Khetan
Android internals By Rajesh KhetanAndroid internals By Rajesh Khetan
Android internals By Rajesh KhetanRajesh Khetan
 
Android Camera Architecture
Android Camera ArchitectureAndroid Camera Architecture
Android Camera ArchitecturePicker Weng
 
Overview of Android binder IPC implementation
Overview of Android binder IPC implementationOverview of Android binder IPC implementation
Overview of Android binder IPC implementationChethan Pchethan
 
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.
 
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
 

Mais procurados (20)

Android audio system(pcm데이터출력요청-서비스클라이언트)
Android audio system(pcm데이터출력요청-서비스클라이언트)Android audio system(pcm데이터출력요청-서비스클라이언트)
Android audio system(pcm데이터출력요청-서비스클라이언트)
 
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)
 
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 Boot Time Optimization
Android Boot Time OptimizationAndroid Boot Time Optimization
Android Boot Time Optimization
 
Android Binder: Deep Dive
Android Binder: Deep DiveAndroid Binder: Deep Dive
Android Binder: Deep Dive
 
Audio Drivers
Audio DriversAudio Drivers
Audio Drivers
 
Embedded Android : System Development - Part III
Embedded Android : System Development - Part IIIEmbedded Android : System Development - Part III
Embedded Android : System Development - Part III
 
MediaPlayer Playing Flow
MediaPlayer Playing FlowMediaPlayer Playing Flow
MediaPlayer Playing Flow
 
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)
 
Android Multimedia Framework
Android Multimedia FrameworkAndroid Multimedia Framework
Android Multimedia Framework
 
Understanding the Android System Server
Understanding the Android System ServerUnderstanding the Android System Server
Understanding the Android System Server
 
Android media framework overview
Android media framework overviewAndroid media framework overview
Android media framework overview
 
Embedded Android : System Development - Part I
Embedded Android : System Development - Part IEmbedded Android : System Development - Part I
Embedded Android : System Development - Part I
 
Android internals By Rajesh Khetan
Android internals By Rajesh KhetanAndroid internals By Rajesh Khetan
Android internals By Rajesh Khetan
 
Android Internals
Android InternalsAndroid Internals
Android Internals
 
Android Camera Architecture
Android Camera ArchitectureAndroid Camera Architecture
Android Camera Architecture
 
Overview of Android binder IPC implementation
Overview of Android binder IPC implementationOverview of Android binder IPC implementation
Overview of Android binder IPC implementation
 
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...
 
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
 

Destaque

Surface flingerservice(서피스 플링거 연결 jb)
Surface flingerservice(서피스 플링거 연결 jb)Surface flingerservice(서피스 플링거 연결 jb)
Surface flingerservice(서피스 플링거 연결 jb)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
 
Surface flingerservice(서피스 플링거 연결 ics)
Surface flingerservice(서피스 플링거 연결 ics)Surface flingerservice(서피스 플링거 연결 ics)
Surface flingerservice(서피스 플링거 연결 ics)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(서피스 상태 변경 및 출력 요청)
Surface flingerservice(서피스 상태 변경 및 출력 요청)Surface flingerservice(서피스 상태 변경 및 출력 요청)
Surface flingerservice(서피스 상태 변경 및 출력 요청)fefe7270
 
Surface flingerservice(서피스 플링거 연결)
Surface flingerservice(서피스 플링거 연결)Surface flingerservice(서피스 플링거 연결)
Surface flingerservice(서피스 플링거 연결)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(서피스플링거서비스초기화 jb)
Surface flingerservice(서피스플링거서비스초기화 jb)Surface flingerservice(서피스플링거서비스초기화 jb)
Surface flingerservice(서피스플링거서비스초기화 jb)fefe7270
 
Android Audio & OpenSL
Android Audio & OpenSLAndroid Audio & OpenSL
Android Audio & OpenSLYoss Cohen
 
Web app 개발 방법론
Web app 개발 방법론Web app 개발 방법론
Web app 개발 방법론Sang Seok Lim
 

Destaque (13)

Surface flingerservice(서피스 플링거 연결 jb)
Surface flingerservice(서피스 플링거 연결 jb)Surface flingerservice(서피스 플링거 연결 jb)
Surface flingerservice(서피스 플링거 연결 jb)
 
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)
 
Surface flingerservice(서피스 플링거 연결 ics)
Surface flingerservice(서피스 플링거 연결 ics)Surface flingerservice(서피스 플링거 연결 ics)
Surface flingerservice(서피스 플링거 연결 ics)
 
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(서피스 상태 변경 및 출력 요청)
Surface flingerservice(서피스 상태 변경 및 출력 요청)Surface flingerservice(서피스 상태 변경 및 출력 요청)
Surface flingerservice(서피스 상태 변경 및 출력 요청)
 
Surface flingerservice(서피스 플링거 연결)
Surface flingerservice(서피스 플링거 연결)Surface flingerservice(서피스 플링거 연결)
Surface flingerservice(서피스 플링거 연결)
 
Surface flingerservice(서피스플링거서비스초기화 ics)
Surface flingerservice(서피스플링거서비스초기화 ics)Surface flingerservice(서피스플링거서비스초기화 ics)
Surface flingerservice(서피스플링거서비스초기화 ics)
 
Surface flingerservice(서피스플링거서비스초기화)
Surface flingerservice(서피스플링거서비스초기화)Surface flingerservice(서피스플링거서비스초기화)
Surface flingerservice(서피스플링거서비스초기화)
 
Surface flingerservice(서피스플링거서비스초기화 jb)
Surface flingerservice(서피스플링거서비스초기화 jb)Surface flingerservice(서피스플링거서비스초기화 jb)
Surface flingerservice(서피스플링거서비스초기화 jb)
 
Android Audio & OpenSL
Android Audio & OpenSLAndroid Audio & OpenSL
Android Audio & OpenSL
 
Web app 개발 방법론
Web app 개발 방법론Web app 개발 방법론
Web app 개발 방법론
 

Semelhante a Android audio system(audiopolicy_manager)

Android+init+process
Android+init+processAndroid+init+process
Android+init+processHong Jae Kwon
 
13. Application - Tensorflow Autoencoder
13. Application - Tensorflow Autoencoder 13. Application - Tensorflow Autoencoder
13. Application - Tensorflow Autoencoder merry7
 
Ryu with OpenFlow 1.3, Traffic Monitor
Ryu with OpenFlow 1.3, Traffic MonitorRyu with OpenFlow 1.3, Traffic Monitor
Ryu with OpenFlow 1.3, Traffic Monitorjieun kim
 
컵드론 멀티콥터 펌웨어 분석 2015. 3.28.
컵드론 멀티콥터 펌웨어 분석 2015. 3.28.컵드론 멀티콥터 펌웨어 분석 2015. 3.28.
컵드론 멀티콥터 펌웨어 분석 2015. 3.28.chcbaram
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Sangon Lee
 
Windows Phone Mango 아키텍처-멀티태스킹(2)
Windows Phone Mango 아키텍처-멀티태스킹(2)Windows Phone Mango 아키텍처-멀티태스킹(2)
Windows Phone Mango 아키텍처-멀티태스킹(2)mosaicnet
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSCirculus
 
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613KTH, 케이티하이텔
 
NodeJs로 디바이스 통신하기
NodeJs로 디바이스 통신하기NodeJs로 디바이스 통신하기
NodeJs로 디바이스 통신하기TaeYoung Kim
 
라즈베리파이 Circulus API 가이드
라즈베리파이 Circulus API 가이드라즈베리파이 Circulus API 가이드
라즈베리파이 Circulus API 가이드Circulus
 
웹 사이트 시각화 및 성능 관리
웹 사이트 시각화 및 성능 관리웹 사이트 시각화 및 성능 관리
웹 사이트 시각화 및 성능 관리mosaicnet
 
코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011Esun Kim
 
[Osx dev] server essential lesson 10. configuring os x server to provide de...
[Osx dev] server essential   lesson 10. configuring os x server to provide de...[Osx dev] server essential   lesson 10. configuring os x server to provide de...
[Osx dev] server essential lesson 10. configuring os x server to provide de...EungShik (Henry) Kim
 
안드로이드 플랫폼 설명
안드로이드 플랫폼 설명안드로이드 플랫폼 설명
안드로이드 플랫폼 설명Peter YoungSik Yun
 
Android audio system(오디오 출력-트랙활성화)
Android audio system(오디오 출력-트랙활성화)Android audio system(오디오 출력-트랙활성화)
Android audio system(오디오 출력-트랙활성화)fefe7270
 
Aperture : 3&4. 조도센서를 이용한 led 밝기 제어하기
Aperture : 3&4. 조도센서를 이용한 led 밝기 제어하기Aperture : 3&4. 조도센서를 이용한 led 밝기 제어하기
Aperture : 3&4. 조도센서를 이용한 led 밝기 제어하기Hyemin Song
 
Java mentoring of samsung scsc 2
Java mentoring of samsung scsc   2Java mentoring of samsung scsc   2
Java mentoring of samsung scsc 2도현 김
 

Semelhante a Android audio system(audiopolicy_manager) (20)

Android+init+process
Android+init+processAndroid+init+process
Android+init+process
 
Spring boot actuator
Spring boot   actuatorSpring boot   actuator
Spring boot actuator
 
13. Application - Tensorflow Autoencoder
13. Application - Tensorflow Autoencoder 13. Application - Tensorflow Autoencoder
13. Application - Tensorflow Autoencoder
 
Ryu with OpenFlow 1.3, Traffic Monitor
Ryu with OpenFlow 1.3, Traffic MonitorRyu with OpenFlow 1.3, Traffic Monitor
Ryu with OpenFlow 1.3, Traffic Monitor
 
컵드론 멀티콥터 펌웨어 분석 2015. 3.28.
컵드론 멀티콥터 펌웨어 분석 2015. 3.28.컵드론 멀티콥터 펌웨어 분석 2015. 3.28.
컵드론 멀티콥터 펌웨어 분석 2015. 3.28.
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조
 
Windows Phone Mango 아키텍처-멀티태스킹(2)
Windows Phone Mango 아키텍처-멀티태스킹(2)Windows Phone Mango 아키텍처-멀티태스킹(2)
Windows Phone Mango 아키텍처-멀티태스킹(2)
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
 
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
 
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
 
NodeJs로 디바이스 통신하기
NodeJs로 디바이스 통신하기NodeJs로 디바이스 통신하기
NodeJs로 디바이스 통신하기
 
라즈베리파이 Circulus API 가이드
라즈베리파이 Circulus API 가이드라즈베리파이 Circulus API 가이드
라즈베리파이 Circulus API 가이드
 
웹 사이트 시각화 및 성능 관리
웹 사이트 시각화 및 성능 관리웹 사이트 시각화 및 성능 관리
웹 사이트 시각화 및 성능 관리
 
코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011
 
[Osx dev] server essential lesson 10. configuring os x server to provide de...
[Osx dev] server essential   lesson 10. configuring os x server to provide de...[Osx dev] server essential   lesson 10. configuring os x server to provide de...
[Osx dev] server essential lesson 10. configuring os x server to provide de...
 
안드로이드 플랫폼 설명
안드로이드 플랫폼 설명안드로이드 플랫폼 설명
안드로이드 플랫폼 설명
 
Android audio system(오디오 출력-트랙활성화)
Android audio system(오디오 출력-트랙활성화)Android audio system(오디오 출력-트랙활성화)
Android audio system(오디오 출력-트랙활성화)
 
Aperture : 3&4. 조도센서를 이용한 led 밝기 제어하기
Aperture : 3&4. 조도센서를 이용한 led 밝기 제어하기Aperture : 3&4. 조도센서를 이용한 led 밝기 제어하기
Aperture : 3&4. 조도센서를 이용한 led 밝기 제어하기
 
Java mentoring of samsung scsc 2
Java mentoring of samsung scsc   2Java mentoring of samsung scsc   2
Java mentoring of samsung scsc 2
 

Último

Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Wonjun Hwang
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Wonjun Hwang
 

Último (6)

Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 

Android audio system(audiopolicy_manager)

  • 1. 안드로이드의 모든것 분석과 포팅 정리 Android Audio System (AudioPolicyManager) 박철희 1/10
  • 2. 1.AudiopolicyManager 위치 및 역활 안드로이드의 모든것 분석과 포팅 정리 Application 역할: Framework 1.입출력 디바이스 관리 2.오디오 볼륨 제어 및 관리 Native Framework 3.오디오 정책 관리 HAL Kernel 2/10
  • 3. 2.입출력 디바이스 관리 안드로이드의 모든것 분석과 포팅 정리 AudioPolicyManagerbase의 생성자에서 초기 입출력 device 지정 AudioPolicyManagerBase::AudioPolicyManagerBase(AudioPolicyClientInterface *clientInterface) { Audiosysystem.h //출력이 가능한 device enum audio_devices { mAvailableOutputDevices = AudioSystem::DEVICE_OUT_EARPIECE; // output devices mAvailableOutputDevices |= AudioSystem::DEVICE_OUT_SPEAKER; DEVICE_OUT_EARPIECE = 0x1, DEVICE_OUT_SPEAKER = 0x2, //입력이 가능한 device DEVICE_OUT_WIRED_HEADSET = 0x4, mAvailableInputDevices = AudioSystem::DEVICE_IN_BUILTIN_MIC; DEVICE_OUT_WIRED_HEADPHONE = 0x8, … // input devices outputDesc->mDevice = AudioSystem::DEVICE_OUT_SPEAKER; DEVICE_IN_COMMUNICATION = 0x10000, mHardwareOutput = mpClientInterface->openOutput DEVICE_IN_AMBIENT = 0x20000, (&outputDesc->mDevice, DEVICE_IN_BUILTIN_MIC = 0x40000, &outputDesc->mSamplingRate, DEVICE_IN_BLUETOOTH_SCO_HEADSET = &outputDesc->mFormat, 0x80000, &outputDesc->mChannels, … &outputDesc->mLatency, outputDesc->mFlags);  mHardwareOutput 는 playbackthread의 id //playbackthread가 DEVICE_OUT_SPEAKER 로 설정됨을 gOutput에 저장. setOutputDevice(mHardwareOutput, , defaultDevice, true); 아래와 같은 함수들에서 현재 output stream의 } 정보를 구할 때 gOutputs 가 사용된다. getOutputSamplingRate AudioSystem의 gOutput의 정보를 갱신 함. getOutputFrameCount getOutputLatency 3/10
  • 4. 2.입출력 디바이스 관리 안드로이드의 모든것 분석과 포팅 정리 setDeviceConnectionState 에 의해 입출력 device 변경 status_t AudioPolicyManagerBase::setDeviceConnectionState { // handle output devices if (AudioSystem::isOutputDevice(device)){ case AudioSystem::DEVICE_STATE_AVAILABLE: mAvailableOutputDevices |= device; case AudioSystem::DEVICE_STATE_UNAVAILABLE: mAvailableOutputDevices &= ~device; // request routing change if necessary uint32_t newDevice = getNewDevice(mHardwareOutput, false); setOutputDevice(mHardwareOutput, newDevice); } // handle input devices if (AudioSystem::isInputDevice(device)) { … mAvailableInputDevices |= device; mpClientInterface->setParameters(activeInput, param.toString()); } 4/10
  • 5. 2.입출력 디바이스 관리 안드로이드의 모든것 분석과 포팅 정리 setForceUse();정해진 device만을 사용 startOutput(),stopOutput();play시에 Strategy에 맞는 device 선택 및 해제 startInput(),stopInput(); record시에 Strategy에 맞는 device 선택 및 해제 void AudioPolicyManagerBase::setForceUse(AudioSystem::force_use usage, AudioSystem::forced_config config) { .. AudioSystem::FOR_MEDI FORCE_SPEAK case AudioSystem::FOR_MEDIA: A ER mForceUse[usage] = config; } status_t AudioPolicyManagerBase::startOutput { //getNewDevice로 설정할 device를 가져와서 set함. setOutputDevice(output, getNewDevice(output)); } status_t AudioPolicyManagerBase::stopOutput { //현재 play시킨 device와 playbackthred의 output이 일치 하지 않을 경우 //playbackthread의 device로 다시 set해줌. if (output != mHardwareOutput) { setOutputDevice(mHardwareOutput, getNewDevice(mHardwareOutput), true); } } 5/10
  • 6. 3. 오디오 볼륨 제어 및 관리 안드로이드의 모든것 분석과 포팅 정리 각 stream별 volume setting(MIN,MAX) AudioService.java private int[] MAX_STREAM_VOLUME = new int[] { 6, // STREAM_VOICE_CALL 7, // STREAM_SYSTEM 7, // STREAM_RING 15, // STREAM_MUSIC 7, // STREAM_ALARM 7, // STREAM_NOTIFICATION 15, // STREAM_BLUETOOTH_SCO 15, // STREAM_FM 15, // STREAM_DTMF 15, // STREAM_TTS 7, // STREAM_SYSTEM_ENFORCED }; VolumeStreamState의 생성자에서 각 stream에 대한 volume level 설정 public class VolumeStreamState { private VolumeStreamState(String settingName, int streamType) { mIndexMax = MAX_STREAM_VOLUME[streamType]; AudioSystem.initStreamVolume(streamType, 0, mIndexMax); } 각 stream에 대한 min,max value 설정 void AudioPolicyManagerBase::initStreamVolume{ mStreams[stream].mIndexMin = indexMin; mStreams[stream].mIndexMax = indexMax; } 6/10
  • 7. 3. 오디오 볼륨 제어 및 관리 안드로이드의 모든것 분석과 포팅 정리 Volume 조절 AudioService.java public void handleMessage(Message msg) { switch (baseMsgWhat) { case MSG_SET_SYSTEM_VOLUME: setSystemVolume((VolumeStreamState) msg.obj); break; } private void setSystemVolume(VolumeStreamState streamState) { // Adjust volume setStreamVolumeIndex(streamState.mStreamType, streamState.mIndex); //setting에 sound value 값을 반영 하기 위해 MSG_PERSIST_VOLUME 날려 줌. sendMsg(mAudioHandler, MSG_PERSIST_VOLUME, streamState.mStreamType, SENDMSG_REPLACE, 1, 1, streamState, PERSIST_DELAY); } private void setStreamVolumeIndex(int stream, int index) { AudioSystem.setStreamVolumeIndex(stream, (index + 5)/10); } status_t AudioPolicyManagerBase::setStreamVolumeIndex(AudioSystem::stream_type stream, int index) { status_t volStatus = checkAndSetVolume(stream, index, mOutputs.keyAt(i), mOutputs.valueAt(i)->device()); } 7/10
  • 8. 3. 오디오 볼륨 제어 및 관리 안드로이드의 모든것 분석과 포팅 정리 status_t AudioPolicyManagerBase::checkAndSetVolume((int stream, int index..) { //정수로 들어온 volume value를 float형으로 바꿔준다. float volume = computeVolume(stream, index, output, device); mpClientInterface->setStreamVolume((AudioSystem::stream_type)stream, volume, output, delayMs); } AudioFlinger의 mStreamTypes 변수에 volume set해줌. status_t AudioFlinger::PlaybackThread::setStreamVolume(int stream, float value) { mStreamTypes[stream].volume = value; } Play시에 이 구조체에 있는 volume값으로 play됨. 8/10
  • 9. 4.오디오 정책 관리 안드로이드의 모든것 분석과 포팅 정리 audio_io_handle_t AudioPolicyManagerBase::getOutput enum stream_type { { DEFAULT =-1, VOICE_CALL = 0, routing_strategy strategy = getStrategy((AudioSystem::stream_type)stream); SYSTEM = 1, uint32_t device = getDeviceForStrategy(strategy); RING = 2, … MUSIC = 3, } ALARM = 4, enum routing_strategy { NOTIFICATION = 5, STRATEGY_MEDIA, BLUETOOTH_SCO = 6, STRATEGY_PHONE, FM = 7, STRATEGY_SONIFICATION, DTMF = 8, STRATEGY_DTMF, TTS = 9, NUM_STRATEGIES ENFORCED_AUDIBLE = 10 }; NUM_STREAM_TYPES }; enum audio_devices { // output devices // input devices DEVICE_OUT_EARPIECE = 0x1, DEVICE_IN_COMMUNICATION = 0x10000, DEVICE_OUT_SPEAKER = 0x2, DEVICE_IN_AMBIENT = 0x20000, DEVICE_OUT_WIRED_HEADSET = 0x4, DEVICE_IN_BUILTIN_MIC = 0x40000, DEVICE_OUT_WIRED_HEADPHONE = 0x8, DEVICE_IN_BLUETOOTH_SCO_HEADSET = 0x80000, DEVICE_OUT_BLUETOOTH_SCO = 0x10, DEVICE_IN_WIRED_HEADSET = 0x100000, DEVICE_OUT_BLUETOOTH_SCO_HEADSET = 0x20, DEVICE_IN_AUX_DIGITAL = 0x200000, DEVICE_OUT_BLUETOOTH_SCO_CARKIT = 0x40, DEVICE_IN_VOICE_CALL = 0x400000, DEVICE_OUT_BLUETOOTH_A2DP = 0x80, DEVICE_IN_BACK_MIC = 0x800000, DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = DEVICE_IN_FM_RX = 0x1000000, 0x100, DEVICE_IN_FM_RX_A2DP = 0x2000000, DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 0x200, DEVICE_IN_ANC_HEADSET = 0x400000, DEVICE_OUT_AUX_DIGITAL = 0x400, … … 9/10
  • 10. 4.오디오 정책 관리 안드로이드의 모든것 분석과 포팅 정리 오디오 정책 관리를 위해 사용되는 변수들 mOutputs, mInputs, mAvailableOutputDevices, mAvailableInputDevices 1.KeyedVector<audio_io_handle_t, AudioOutputDescriptor *> mOutputs;  H/W output device에 연결된 Playbackthread의 정보 2.KeyedVector<audio_io_handle_t, AudioInputDescriptor *> mInputs H/W input device에 연결된 recordthread의 정보 audio_io_handle_t mHardwareOutput 3.uint32_t mAvailableOutputDevices; audio_io_handle_t mA2dpOutput; 현재 사용가능한 output device들 audio_io_handle_t mDuplicatedOutput; 4.uint32_t mAvailableInputDevices; 현재 사용가능한 input device들 10/10