Android 기술 Q&A 
Q&A 게시판에 질문을 남기신 글에 대한 답변/덧글/쪽글에 대한 Push 메일 서비스를 받고자 하시는 분들은
☞ Push 메일 서비스 공지를 필독하시기 바랍니다.
안드로이드 폰 오디오 신호 받기
작성자
작성일 2016-09-29 (목) 22:01
분 류 질문
ㆍ추천: 0  ㆍ조회: 5395      
IP: 220.xxx.125
 안드로이드 미디어 플레어의 오디오 세션에서 디코딩된 오디오 신호를 받아서 아래와 같이
 별도 가공처리한 후 해당 오디오 세션이나 끝단의 OutputMix로 내보려고 하는데
 어떻게 버퍼에 접근해야 하는지 고수님들의 지도를 부탁드립니다.
 MediaPlayer                                       Global OutputMix
 Audio Session 설정됨      ---> 오디오처리 Engine --->   Output Mix
(디코딩 된 16bit PCM 데이터)   <버퍼로 받아서 처리후 내보냄>  (Audio Session 0)
   즉       오디오 세션 버퍼 ===>  처리 버퍼        ===> Output 버퍼                            
 
 현재 안드로이드는 자체 제공하는 이퀄라이저나 베이스부스터 등 오디오 효과처리 엔진을
 미디어 플레이어의 오디오 세션에 붙일 수 있게 되어 있는데,
 이 경우 오디오 신호가 이들 효과처리 엔진을 거쳐서 가도록(bypass) 되어 있습니다.
 
 아래 설명 내용에서 보시다시피 OpenSL ES 1.0.1 Spec 가운데 NULL UUID 또는 거의 사용되지 않는
 BASS_BOOST를 활용하여 독자적인 Bypass 경로를 설정하는 방법이 검토될 수 있을 듯 한데요.
 가르쳐 주시면 그 은혜 잊지 않겠습니다.
 
 <안드로이드 폰 Audio Path 설명>
 1. 안드로이드 미디어 플레이어
 package android.media; <== 동영상 및 오디오 파일 재생 (오디오파일만의 재생은 AudioTrack 클라스를 쓸 수도 있음)
 public class MediaPlayer extends PlayerBase
 
  MediaPlayer                                  Global OutputMix
 Audio Session 설정됨         -------------->    Output Mix
(예 Audio Session 7, 33 등, 디코딩)               (Audio Session 0)
 2. 안드로이드 오디오 효과 (오디오 신호에 부가하는 Auxiliary형과 오디오신호를 완전히 바꿔넣는 Insert형으로 분류됨)
 package android.media.audiofx;
 public class AudioEffect
                 <== 오디오신호를 완전히 바꿔넣는 Insert형으로 Equalizer, Bass Boost, Virtualizer 제공
AudioEffect is the base class for controlling audio effects provided by the android audio framework.
Applications should not use the AudioEffect class directly but one of its derived classes to control specific effects:
***직접 AudioEffect class 사용하는 것 금지, Equalizer 등 개별 파생 class 사용토록 규정. 일례로 이퀄라이저를 보면
public class Equalizer extends AudioEffect
The methods, parameter types and units exposed by the Equalizer implementation are
directly mapping those defined by the OpenSL ES 1.0.1 Specification (http://www.khronos.org/opensles/)
*** 이퀄라이저 등 오디오 이펙트 클라스들은 OpenSL ES 1.0.1 스펙과 직접 매핑됨.
 3. 오디오 패스 : 오디오 효과 엔진을 MediaPlayer에 붙임.(우선순위 값 및 미디어플레이어 오디오세션으로 생성)
      mEqualizer = new Equalizer(0x7FFF_FFFF_FFFF_FFFF, mMediaPlayer.getAudioSessionId());
 MediaPlayer                                    Global OutputMix
 Audio Session 설정됨      ---> Equalizer --->    Output Mix
(디코딩 된 16bit PCM 데이터)    (좌측 오디오세션에 붙임)   (Audio Session 0)
                                         Equalizer를 global audio output mix인 session 0 에 붙이는 것은 금지됨
An application creates an Equalizer object to instantiate and control an Equalizer engine in the audio framework.
To attach the Equalizer to a particular AudioTrack or MediaPlayer, specify the audio session ID of this AudioTrack or MediaPlayer when constructing the Equalizer.
NOTE: attaching an Equalizer to the global audio output mix by use of session 0 is deprecated.
      global audio output mix인 session 0 에 붙이는 것은 금지됨.
 4. 오디오 효과 엔진 붙였을 때의 효과 : creat만 하면 바로 오디오 신호가 들어왔다가 감.
 ***이퀄라이저를 creat만 하고 Enable 안한 상태라면 이퀄라이저 기능이 적용되지 않지만(오디오 효과 없이 원단대로 출력)
     Disable한 이 상태에서도 오디오 신호는 이퀄라이저 엔진을 거쳐 간다고 규정하고 있음.
     Creating an audio effect does not automatically apply this effect on the audio source. It
     * creates the resources necessary to process this effect but the audio signal is still bypassed
     * through the effect engine. Calling this method will make that the effect is actually applied
     * or not to the audio content being played in the corresponding audio session.
      
 5. 요청 사항 : 오디오세션에서 오디오신호를 별도 버퍼로 내주고 OutputMix다 다시 받아가는 루틴 형성.*****
 MediaPlayer                                      Global OutputMix
 Audio Session 설정됨    ---> 오디오처리 Engine --->   Output Mix
(디코딩 된 16bit PCM 데이터)                          (Audio Session 0)
 6. 오디오 효과 엔진의 UUID :
 OpenSL ES 1.0.1 Spec과 안드로이드 AudioEffect 클라스가 모두 이퀄라이저,
베이스부스트 등과, NULL용 UUID 제공.
   이퀄라이저, Null 등의 UUID 는 양쪽에서 당연히 일치함.
***또한 OpenSL ES 1.0.1 Spec인 OpenSLES_IID.c은 아래와 같이 OUTPUTMIX 버퍼의 UUID를
{ 0x97750f60, 0xddd7, 0x11db, 0x92b1, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } };로 규정.
--------------------------------------------------------------------------------------------
AudioEffect.java  <안드로이드 제공>
public static final UUID EFFECT_TYPE_NULL = UUID
            .fromString("ec7178ec-e5e1-4432-a3f4-4657e6795210");
public static final UUID EFFECT_TYPE_EQUALIZER = UUID
            .fromString("0bed4300-ddd6-11db-8f34-0002a5d5c51b");
public static final UUID EFFECT_TYPE_BASS_BOOST = UUID
            .fromString("0634f220-ddd4-11db-a0fc-0002a5d5c51b");
---------------------------------------------------------------------------------------------
OpenSLES_IID.c  <Khronos Group Inc. 제공>
static const struct SLInterfaceID_ SL_IID_NULL_ = { 0xec7178ec, 0xe5e1, 0x4432, 0xa3f4, { 0x46, 0x57, 0xe6, 0x79, 0x52, 0x10 } };
const SLInterfaceID SL_IID_NULL = &SL_IID_NULL_;
static const struct SLInterfaceID_ SL_IID_EQUALIZER_ = { 0x0bed4300, 0xddd6, 0x11db, 0x8f34, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } };
const SLInterfaceID SL_IID_EQUALIZER = &SL_IID_EQUALIZER_;
static const struct SLInterfaceID_ SL_IID_OUTPUTMIX_ = { 0x97750f60, 0xddd7, 0x11db, 0x92b1, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } };
const SLInterfaceID SL_IID_OUTPUTMIX = &SL_IID_OUTPUTMIX_;
***NULL UUID 또는 거의 사용되지 않는 BASS_BOOST를 활용하여 독자적인 Bypass 경로를 설정하는 방법 검토.
7. 관련자료 목록 (7개) :
안드로이드 ; MediaPlayer.java
          AudioEffect.java
   Equalizer.java
오픈SL_ES ; OpenSL ES Specification Version 1.0.1
           OpenSLES.h
    OpenSLES_IID.c
           OpenSLES_Platform
  최원용드림 010-5757-6367  
덧글 쓰기 0
3500
※ 회원등급 레벨 0 이상 읽기가 가능한 게시판입니다.
    N     분류     제목    글쓴이 작성일 조회
5003 안드로이드 에뮬레이터 속도 [2] 2008-03-04 16759
5002 개념설명 : "@+" syntax in layout xml 2008-03-04 11766
5001 Touch Screen Event [1] 2008-03-04 12596
5000 Webkit 관련 2008-03-04 11080
4999 P2P 관련 2008-03-04 12365
4998 에뮬레이터간 XMPP 메시징환경 설정 2008-03-04 10776
4997 SD Card 환경설정 [1]+1 2008-03-04 11526
4996 안드로이드 디버깅 로그 출력 2008-03-04 13428
4995 안드로이드(Android) Webkit 사양관련 2008-03-04 14497
4994 레이아웃 : TextView와 Scrollbar 2008-03-04 12155
4993 안드로이드 포팅 [8] 2008-03-04 46645
4992 [파노라마] WebKit에 대한 궁금한 점이.. [1] 2008-03-07 8934
4991 WebKit-GTK에 대하여. [1] 2008-03-07 10917
4990 프로그램을 만들다 난관에 부딧혀 질문올립니다... [2] 2008-03-07 9481
4989 웹 관련해서 질문이 있습니다. [3] 2008-03-11 8416
4988 Android와 OpenBinder에 대한 질문입니다. [3] 2008-03-13 11014
4987 ProgressBarDialog 컨트롤에 대해서.... [3] 2008-03-14 10862
4986 안드로이드 os안에 있는 이미지 파일을 출력하고자 합니다... 2008-03-15 9481
4985 webkit 구조 및 기능에 대한 질문입니다. 2008-03-18 11950
4984 [답변]webkit 구조 및 기능에 대한 질문입니다 [4] 2008-03-18 13753
4983 [답변] 안드로이드 os안에 있는 이미지 파일을 출력하고자 합.. [2] 2008-03-19 12629
4982 안드로이드와 피카사 관련 질문 2008-03-19 8836
4981 rotatedrawable을 어떻게 사용해야되는데요 [1] 2008-03-20 11544
4980 TI OMAP 보드 포팅 [4] 2008-03-21 10787
4979 xmpp를 이용하여 p2p 어플리케이션 제작하신분 계신가요??.. [4] 2008-03-24 9295
4978 포팅관련 질문을 올립니다 [2] 2008-03-24 9751
4977 JVM 관련해서 물어볼 곳이 여기밖에 없네요. [4] 2008-03-25 9961
4976 안녕하십니까 m5에 관한 질문좀 드릴께요 [2] 2008-03-25 8904
4975 다시한번 질문드립니다. [1] 2008-03-26 8361
4974 안드로이드 안에 있는 app데모중에.. [1] 2008-03-26 9480
4973 armadillo-500(arm1136jf-s) - USB Gadget 동작 [3] 2008-03-27 10245
4972 TI OMAP 보드 보팅 중 uboot관련 [5] 2008-03-27 9770
4971 맵 갱신을 하려고하는데요. 에러가 나네요. [2] 2008-03-27 11968
4970 다이얼 로그 질문 이에요.. [2] 2008-03-28 8908
4969 scroll bar 사용시에 터치패드로 움직이는 것을 막고 싶습니다.. 2008-03-28 9026
4968 안드로이드와 UMA/GAN의 조화 2008-03-31 8913
4967 안드로이드 플랫폼 개발과 관련하여 질문 [2] 2008-04-01 8748
4966 이거 만우절 장난인가요? 진짠가...?ㅜㅜ [2] 2008-04-01 9146
4965 안드로이드 포팅 관련 질문입니다[맨땅에 헤딩중입니다].. [2] 2008-04-03 10513
4964 안드로이드 플랫폼에 있는 [1] 2008-04-03 9280
4963 다이얼로그에 관련된 좋은 샘플을 구합니다. [2] 2008-04-04 9094
4962 Conversion to Dalvik format failed with error 1 [3] 2008-04-07 10996
4961 시스템 해킹 관련 [1] 2008-04-07 8616
4960 안드로이드 챌린지 제출방법에 대해서 궁금한점이 있습니다... [4] 2008-04-08 8563
4959 포커스에 관한것좀 여쭙겟습니다. [4] 2008-04-09 15403
4958 파일 관리에 대해 질문있습니다. [1] 2008-04-11 8363
4957 mp3플레이어 MusicDroid에 대해서.. [2] 2008-04-14 9851
4956 안드로이드의 CE제품 적용 [1] 2008-04-21 8526
4955 xml 디자인 관련 [3] 2008-04-21 9641
4954 파일 입출력 관련.. [2] 2008-04-24 9430
12345678910,,,101