Android 기술 Q&A 
Q&A 게시판에 질문을 남기신 글에 대한 답변/덧글/쪽글에 대한 Push 메일 서비스를 받고자 하시는 분들은
☞ Push 메일 서비스 공지를 필독하시기 바랍니다.
안드로이드 폰 오디오 신호 받기
작성자 RealTimeCh
작성일 2016-09-29 (목) 22:01
분 류 질문
ㆍ추천: 0  ㆍ조회: 2314      
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     분류     제목    글쓴이 작성일 조회
4998 질문 이미지뷰 확대 축소후에 선 그리기 홍윤호 2017-04-13 141
4997 질문 kernel 블루투스 SCO 질문드립니다 플래그 2017-03-29 193
4996 질문 블르투스 스피커 접속 & 해제 하는 방법 문의 드립니다.. 카르페디앰 2017-03-23 251
4995 질문 안드로이드 무전기앱 좋은 오픈소스가 있을까요?.. 녹트 2017-01-30 19690
4994 안드로이드 웹뷰 페이지 로딩문제 연신내막차 2017-01-23 24407
4993 통화녹음 관련하여 질문드립니다. 뽀죠 2017-01-16 29939
4992 질문 전화받기 기능 구현-Marshmallow 6.0.1 이상 와우92 2017-01-04 15944
4991 Adapter newView bindView 를 작업스레드에서 실행 할 순 없나.. 찌누 2016-12-12 10605
4990 질문 메소드 생성 관련 질문입니다. 노타이 2016-12-09 5708
4989 실행 디바이스 선택시 문제 노타이 2016-12-03 3991
4988 질문 Re.. 자답 찌누 2016-11-29 1867
4987 질문 한글 깨지는 문제 문의 찌누 2016-11-29 2091
4986 질문 안드로이드 OS별 저장 공간 관련. [2] 날펭 2016-11-22 2210
4985 질문 안드로이드 실무개발? 질문입니다. [1] 액션바 2016-11-03 1958
4984 질문 AOSP 초보 질문 [1]+1 찌누 2016-11-02 1886
4983 질문 안드로이드 6.0(마쉬멜로우)에서 Doze모드 파인드로이드 2016-10-29 2063
4982 오디오패스(스피커,이어잭)를 동시에 2개 사용 가능한가요?.. [2] J하늘리스 2016-10-17 2355
4981 JNI로 CPP 변수 변경하기 문의드립니다. jaebro 2016-10-11 1978
4980 질문 안드로이드 폰 오디오 신호 받기 RealTimeCh 2016-09-29 2314
4979 질문 Re..해결했습니다. 호루스 2016-08-31 2390
4978 질문 안드로이드 스튜디오에서 옵션메뉴가 나오질 않네요.. 호루스 2016-08-30 2987
4977 질문 블루투스 통신에서 고속의 데이터 수신 중 중간에 데이터 유실.. [3] 프로 2016-08-15 2810
4976 블루투스 에서 remote device가 강제로 연결을 끊었다는 것을 .. [1] bonjoy 2016-07-19 2755
4975 material 관련 라이선스 문의 bro 2016-06-27 2793
4974 질문 안드로이드 키보드 테마 작업 완봉 2016-05-25 3068
4973 질문 USB 이용한 오디오(통화) 관련 질문 드립니다. 주너 2016-05-24 3011
4972 질문 안드로이드 다른 어플 사이즈 조절 문제 kulman 2016-05-13 3065
4971 질문 변수 설정을 어떻게 해야할지 모르겠어요 [1] 배우러왔어요 2016-05-08 2908
4970 파일시스템 Read-Only에서 Read Write로 변경 어떻게하나요.. [1] windy21 2016-05-06 3180
4969 질문 아이피 바꾸어 가면서 특정 웹 사이트 접속하기.. 다클 2016-05-04 3163
4968 질문 RTSP 영상 스트리밍 플레이어 개발 관련 문의 후니후니훈2 2016-04-08 3352
4967 질문 Android MarshMallow에서 노말한 퍼미션은 어떻게 권한을 획득.. 툴체인 2016-04-07 3513
4966 질문 미디어컨트롤러 위에 이미지나 선으로 표시를 하고 싶은데..... kkk111 2016-03-25 3069
4965 질문 안드로이드 도트 매트릭스 질문입니다. 홍윤호 2016-02-19 3656
4964 질문 eth0 IP 변경 [2] 럽어페어 2015-12-16 5051
4963 카드게임과 자동 로그인 문의 [1] 찌누 2015-11-22 5995
4962 질문 고수님들.! 두가지 기능(블루투스, 영상처리) 를 어떻게 넣어.. parkch12 2015-11-06 4833
4961 질문 시스템 서비스 등록 크크크 2015-11-03 3988
4960 질문 slattach 기능을 안드로이드에서 이용할 수 있는 방법 문의드.. 엘카이저 2015-11-02 4262
4959 질문 루팅 관련 질문입니다. [2] 비둘기 2015-10-05 4647
4958 각각 이미지 확대 문제.. [1] fly 2015-10-03 4661
4957 질문 textview id 오류 질문합니다 [1] 어그래너 2015-10-02 4167
4956 질문 질문있습니다., [2] veronica 2015-10-02 4134
4955 게시판 자료가 다운로드 후 깨집니다. [5]+1 리로 2015-10-01 4563
4954 질문 안드로이드 개발 pc 추천 부탁드려요 [1] 레트 2015-09-18 4963
4953 external 에 추가하려고 하는 방법 질문드립니다... [1] 비둘기 2015-09-15 4321
4952 질문 초보 개발자 입니다. 초짜3 2015-09-04 4758
4951 질문 자바 람다식을 변수에 대입하는 방법 문의 [2]+2 찌누 2015-09-01 5017
4950 질문 init rc에서 mkdir시 소유자 ( user / group ) 설정 방법 문의.. 비둘기 2015-08-28 3925
4949 SMS 문자를 Xml 문서로 저장시 특수문자 기호에서 예외발생... [2]+2 찌누 2015-08-26 5017
12345678910,,,100