Android 기술 Q&A 
Q&A 게시판에 질문을 남기신 글에 대한 답변/덧글/쪽글에 대한 Push 메일 서비스를 받고자 하시는 분들은
☞ Push 메일 서비스 공지를 필독하시기 바랍니다.
안드로이드 폰 오디오 신호 받기
작성자 RealTimeCh
작성일 2016-09-29 (목) 22:01
분 류 질문
ㆍ추천: 0  ㆍ조회: 2894      
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     분류     제목    글쓴이 작성일 조회
5001 IT분야로 진로고민이나,취업,이직고민으로 궁금한점들이 많으.. [1] 멘토쌤 2017-07-19 22
5000 질문 공유기 사용시 로컬 공인 IP 주소 얻는 방법 [1]+1 찌누 2017-07-07 125
4999 질문 후행섹션에서는 컨텐츠가 허용되지 않습니다라는 오류.. leo.choi 2017-07-04 137
4998 질문 절판 된 안드로이드 개발서(안드로이드 미디어 프레임워크, 아.. 시쿠시쿠 2017-06-10 295
4997 질문 이미지뷰 확대 축소후에 선 그리기 홍윤호 2017-04-13 714
4996 질문 kernel 블루투스 SCO 질문드립니다 플래그 2017-03-29 725
4995 질문 블르투스 스피커 접속 & 해제 하는 방법 문의 드립니다.. 카르페디앰 2017-03-23 762
4994 질문 안드로이드 무전기앱 좋은 오픈소스가 있을까요?.. 녹트 2017-01-30 20284
4993 안드로이드 웹뷰 페이지 로딩문제 연신내막차 2017-01-23 25110
4992 통화녹음 관련하여 질문드립니다. 뽀죠 2017-01-16 30624
4991 질문 전화받기 기능 구현-Marshmallow 6.0.1 이상 와우92 2017-01-04 16517
4990 Adapter newView bindView 를 작업스레드에서 실행 할 순 없나.. 찌누 2016-12-12 11247
4989 질문 메소드 생성 관련 질문입니다. 노타이 2016-12-09 6254
4988 실행 디바이스 선택시 문제 노타이 2016-12-03 4675
4987 질문 Re.. 자답 찌누 2016-11-29 2405
4986 질문 한글 깨지는 문제 문의 찌누 2016-11-29 2640
4985 질문 안드로이드 OS별 저장 공간 관련. [2] 날펭 2016-11-22 2799
4984 질문 안드로이드 실무개발? 질문입니다. [1] 액션바 2016-11-03 2467
4983 질문 AOSP 초보 질문 [1]+1 찌누 2016-11-02 2395
4982 질문 안드로이드 6.0(마쉬멜로우)에서 Doze모드 파인드로이드 2016-10-29 2607
4981 오디오패스(스피커,이어잭)를 동시에 2개 사용 가능한가요?.. [2] J하늘리스 2016-10-17 2951
4980 JNI로 CPP 변수 변경하기 문의드립니다. jaebro 2016-10-11 2507
4979 질문 안드로이드 폰 오디오 신호 받기 RealTimeCh 2016-09-29 2894
4978 질문 Re..해결했습니다. 호루스 2016-08-31 2877
4977 질문 안드로이드 스튜디오에서 옵션메뉴가 나오질 않네요.. 호루스 2016-08-30 3576
4976 질문 블루투스 통신에서 고속의 데이터 수신 중 중간에 데이터 유실.. [3] 프로 2016-08-15 3481
4975 블루투스 에서 remote device가 강제로 연결을 끊었다는 것을 .. [1] bonjoy 2016-07-19 3327
4974 material 관련 라이선스 문의 bro 2016-06-27 3345
4973 질문 안드로이드 키보드 테마 작업 완봉 2016-05-25 3702
4972 질문 USB 이용한 오디오(통화) 관련 질문 드립니다. 주너 2016-05-24 3595
4971 질문 안드로이드 다른 어플 사이즈 조절 문제 kulman 2016-05-13 3702
4970 질문 변수 설정을 어떻게 해야할지 모르겠어요 [1] 배우러왔어요 2016-05-08 3462
4969 파일시스템 Read-Only에서 Read Write로 변경 어떻게하나요.. [1] windy21 2016-05-06 3791
4968 질문 아이피 바꾸어 가면서 특정 웹 사이트 접속하기.. 다클 2016-05-04 3834
4967 질문 RTSP 영상 스트리밍 플레이어 개발 관련 문의 후니후니훈2 2016-04-08 3962
4966 질문 Android MarshMallow에서 노말한 퍼미션은 어떻게 권한을 획득.. 툴체인 2016-04-07 4254
4965 질문 미디어컨트롤러 위에 이미지나 선으로 표시를 하고 싶은데..... kkk111 2016-03-25 3671
4964 질문 eth0 IP 변경 [2] 럽어페어 2015-12-16 5767
4963 카드게임과 자동 로그인 문의 [1] 찌누 2015-11-22 6670
4962 질문 고수님들.! 두가지 기능(블루투스, 영상처리) 를 어떻게 넣어.. parkch12 2015-11-06 5652
4961 질문 시스템 서비스 등록 크크크 2015-11-03 4618
4960 질문 slattach 기능을 안드로이드에서 이용할 수 있는 방법 문의드.. 엘카이저 2015-11-02 4830
4959 질문 루팅 관련 질문입니다. [2] 비둘기 2015-10-05 5317
4958 각각 이미지 확대 문제.. [1] fly 2015-10-03 5330
4957 질문 textview id 오류 질문합니다 [1] 어그래너 2015-10-02 4767
4956 질문 질문있습니다., [2] veronica 2015-10-02 4765
4955 게시판 자료가 다운로드 후 깨집니다. [5]+1 리로 2015-10-01 5153
4954 질문 안드로이드 개발 pc 추천 부탁드려요 [1] 레트 2015-09-18 5713
4953 external 에 추가하려고 하는 방법 질문드립니다... [1] 비둘기 2015-09-15 4922
4952 질문 초보 개발자 입니다. 초짜3 2015-09-04 5160
12345678910,,,101