@ file : Suppress (" DE PREC ATION ") Ċ Ċ package Ġme . s het j . recorder . mix Recorder Ċ Ċ import Ġandroid . media . Audio Format Ċ import Ġandroid . media . Audio Manager Ċ import Ġandroid . media . Audio Track Ċ import Ġandroid . media . Media Format Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . os . Message Ċ import Ġandroid . util . Log Ċ import Ġme . s het j . player . Player Listener Ċ import Ġjava . util . concurrent . Linked Blocking Deque Ċ import Ġandroid . media . Audio Attributes Ċ import Ġandroid . media . Audio Format . CHANNEL _ OUT _ MON O ĊĊ Ċ /** Ċ Ġ* Ġæ Ĵ Ń æĶ¾ éŁ³ ä¹Ĳ ï¼Į çĶ¨æĿ¥ æĴŃæĶ¾ PCM Ċ Ġ* Ċ Ġ* Ġ 1 . æĶ¯æĮģ æļĤ åģľ Ġpause (), resume () Ġ< br > Ċ Ġ* Ġ 2 . æĶ¯æĮģ å¾ªçİ¯ æĴŃæĶ¾ set Loop ( boolean Ġis Loop )< br > Ċ Ġ* Ġ 3 . ĠæĶ¯æĮģ åĪĩæį¢ èĥĮæĻ¯ éŁ³ ä¹Ĳ Ġset Back Ground Url ( String Ġpath )< br > Ċ Ġ* Ġupdate Ġ 2 0 1 9 å¹´ 1 0 æľĪ 1 1 æĹ¥ Ċ Ġ* Ġæ·»åĬł æĹ¶éĹ´ è¿Ľ åº¦ è®°å½ķ ( æ³¨æĦı è¿ĶåĽŀ ä¸įæĺ¯ åľ¨ ä¸» çº¿ç¨ĭ éľĢè¦ģ èĩªå·± è®¾ç½® åľ¨ ä¸» çº¿ç¨ĭ ) Ċ Ġ* Ċ Ġ* ĠTODO Ġseek To Ġ ç¼º å¤± åĬŁèĥ½ Ċ Ġ* Ċ Ġ*/ Ċ class ĠPlay Back Music ( private Ġvar Ġdefault Channel : ĠInt Ġ= ĠCHAN NEL _ OUT _ MON O ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġm Audio Decoder : ĠAudio Decoder ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġback Ground Bytes Ġ= ĊĠĠĠĠĠĠĠ ĠLinked Blocking Deque < ByteArray >() // new ĠArray Deque <>(); // ĠArray Deque ä¸įæĺ¯ çº¿ç¨ĭ å®īåħ¨ çļĦ ĊĠĠĠ Ġvar Ġis Playing Music Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġprivate Ġvar Ġm Is Recording Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġm Is Loop Ġ= Ġfalse ĊĠĠĠ Ġvar Ġis Is Pause Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġprivate Ġval Ġplay Handler : ĠPlay Handler ĊĠĠĠ Ġprivate Ġvar Ġaudio Track : ĠAudio Track ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġvolume Ġ Ġ= Ġ 0 . 3 f ĊĠĠĠ Ġprivate Ġvar Ġplayer Listener : ĠPlayer Listener ?= null ĊĊĠĠĠ Ġinternal Ġval Ġis PCM Data E os : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġif Ġ( m Audio Decoder Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} else Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Audio Decoder !!. is PCM Extractor EOS ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠbufferSize : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġif Ġ( m Audio Decoder Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Decoder . BUFFER _ SIZE ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Audio Decoder !!. buffer Size ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠPlay Handler ( private Ġval Ġplay Back Music : ĠPlay Back Music ) Ġ: ĊĠĠĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Message ( msg : ĠMessage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( msg . what ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPROCESS _ STOP , ĠPROCESS _ ERROR Ġ-> Ġplay Back Music . release () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPROCESS _ RE PLAY Ġ-> Ġplay Back Music . restart Music () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġplay Handler Ġ= ĠPlay Handler ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġè®¾ç½® æĪĸèĢħ åĪĩæį¢ èĥĮæĻ¯ éŁ³ ä¹Ĳ ĊĠĠĠĠ Ġ* Ġ@ param Ġpath ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Back Ground Url ( path : ĠString ): ĠPlay Back Music Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Is Pause ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Decoder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Decoder ( path ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Is Pause Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Decoder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Decoder ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Is Pause Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Back Ground Play Listener ( player Listener : ĠPlayer Listener ){ ĊĠĠĠĠĠĠĠ Ġthis . player Listener Ġ= Ġplayer Listener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Decoder ( path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Audio Decoder Ġ= ĠAudio Decoder () ĊĠĠĠĠĠĠĠ Ġm Audio Decoder ?. set Mp 3 FilePath ( path ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrelease Decoder () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Audio Decoder Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Audio Decoder ?. release () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Audio Decoder Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġm Is Recording Ġ æłĩè¯Ĩ å¤ĸéĥ¨ æĺ¯åĲ¦ æŃ£åľ¨ å½ķ éŁ³ ï¼Į åıªæľī å¼Ģå§ĭ å½ķ éŁ³ ĊĠĠĠĠ Ġ* Ġ@ param Ġenable ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Need Re code Data Enable ( enable : ĠBoolean ): ĠPlay Back Music Ġ{ ĊĠĠĠĠĠĠĠ Ġm Is Recording Ġ= Ġenable ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæĺ¯åĲ¦ å¾ªçİ¯ æĴŃæĶ¾ ĊĠĠĠĠ Ġ* Ġ@ param Ġis Loop Ġæĺ¯åĲ¦ å¾ªçİ¯ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Loop ( is Loop : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Is Loop Ġ= Ġis Loop ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¼Ģå§ĭ æĴŃæĶ¾ ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstart Play Back Music (): ĠPlay Back Music Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Audio Decoder Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNullPointerException (" Audio Decoder Ġno Ġnull , Ġplease Ġset Ġset Back Ground Url ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// å¼Ģå§ĭ åĬłè½½ éŁ³ ä¹Ĳ æķ°æį® ĊĠĠĠĠĠĠĠ Ġinit PCM Data () ĊĠĠĠĠĠĠĠ Ġis Playing Music Ġ= Ġtrue ĊĠĠĠĠĠĠĠ ĠPlay Need Mix Audio Task ( object Ġ: ĠBack Ground Frame Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Frame Ar rive ( bytes : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Back Ground Bytes ( bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}). start () ĊĠĠĠĠĠĠĠ Ġplayer Listener ?. onStart ("", 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġget Back Ground Bytes (): ĠByteArray ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( back Ground Bytes . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġback Ground Bytes . poll () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Frame Bytes (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ! back Ground Bytes . isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġframe Bytes Size (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġback Ground Bytes . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ ļ Ĥ åģľ æĴŃæĶ¾ ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Playing Music Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġplayer Listener ?. on Stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġresume () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Playing Music ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Is Pause Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Listener ?. on Resume () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpause () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Playing Music ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Is Pause Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Listener ?. on Pause () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġrelease (): ĠPlay Back Music Ġ{ ĊĠĠĠĠĠĠĠ Ġis Playing Music Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġis Is Pause Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġm Audio Decoder ?. release () ĊĠĠĠĠĠĠĠ Ġback Ground Bytes . clear () ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è¿Ļæł· çļĦæĸ¹å¼ı æİ§åĪ¶ åĲĮæŃ¥ ĠéľĢè¦ģ æ·»åĬł åĪ° éĺŁåĪĹ æĹ¶ åĪ¤æĸŃ åĲĮæĹ¶ åľ¨ æĴŃæĶ¾ åĴĮ å½ķ åĪ¶ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Back Ground Bytes ( bytes : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Playing Music Ġ&& Ġm Is Recording ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback Ground Bytes . add ( bytes ) Ġ// Ġwhat Ġif Ġout Ġof Ġmemory ? ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éĩįæĸ° å¼Ģå§ĭ æĴŃæĶ¾ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrestart Music () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// çŃīäºİ Ġm Audio Decoder . is PCM Extractor EOS () Ġ Ġ= Ġtrue Ġè¡¨ç¤º å·²ç»ı ç»ĵæĿŁ äºĨ ĊĠĠĠĠĠĠĠ Ġ// å¦Ĥæŀľ æĺ¯ å¾ªçİ¯ æ¨¡å¼ı è¦ģ éĩįæĸ° å¼Ģå§ĭ è§£ çłģ ĊĠĠĠĠĠĠĠ Ġif Ġ( is PCM Data E os Ġ&& Ġm Is Loop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// éĩįæĸ° å¼Ģå§ĭ æĴŃæĶ¾ mp 3 Ġ-> Ġp cm ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit PCM Data () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLog . i (" Play Back Music "," restart Music ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è§£æŀĲ Ġmp 3 Ġ--> Ġp cm ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinit PCM Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Audio Decoder !!. start P cm Extractor () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ èĻ½çĦ¶ åı¯ä»¥ æĸ°å»º å¤ļä¸ª ĠAsync Task çļĦ åŃĲ ç±»çļĦ å®ŀä¾ĭ ï¼Į ä½Ĩæĺ¯ AsyncTask çļĦ åĨħéĥ¨ Handler åĴĮ ThreadPoolExecutor éĥ½æĺ¯ static çļĦ ï¼Į ĊĠĠĠĠ Ġ* Ġ è¿Ļ ä¹Ī å®ļä¹ī çļĦ åıĺ Ġ éĩı å±ŀ äºİ ç±»çļĦ ï¼Į æĺ¯ è¿Ľç¨ĭ èĮĥåĽ´ åĨħ åħ±äº« çļĦ ï¼Į æīĢä»¥ AsyncTask æİ§åĪ¶ çĿĢ è¿Ľç¨ĭ èĮĥåĽ´ åĨħ æīĢæľīçļĦ åŃĲ ç±» å®ŀä¾ĭ ï¼Į ĊĠĠĠĠ Ġ* Ġ èĢĮä¸Ķ è¯¥ ç±»çļĦ æīĢæľī å®ŀä¾ĭ éĥ½ åħ± çĶ¨ ä¸Ģä¸ª çº¿ç¨ĭ æ±ł åĴĮ Handler ĊĠĠĠĠ Ġ* Ġ è¿ĻéĩĮ æĸ° å¼Ģ ä¸Ģä¸ª çº¿ç¨ĭ ĊĠĠĠĠ Ġ* Ġ èĩªå·± è§£æŀĲ åĩºæĿ¥ Ġp cm Ġdata ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġinner Ġclass ĠPlay Need Mix Audio Task Ġinternal Ġconstructor ( private Ġval Ġlistener : ĠBack Ground Frame Listener ?) Ġ: ĊĠĠĠĠĠĠĠ ĠThread () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( audio Track Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Track Ġ= Ġinit Audio Track () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Volume ( volume ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ å¼Ģå§ĭ æĴŃæĶ¾ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Track !!. play () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// éŁ³ ä¹Ĳ å®ŀéĻħ å¼Ģå§ĭ ä¼ļ æħ¢ ä¸Ģ çĤ¹ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Frame Ar rive ( ByteArray ( 2 0 4 8 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( is Playing Music ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Is Pause ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp cm Ġ= Ġm Audio Decoder !!. pcm Data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Ġ= Ġp cm ?. buffer Bytes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pcm Ġ== Ġnull Ġ|| Ġtemp Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Is Loop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Handler . send Empty Message ( PROCESS _ RE PLAY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsleep ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Track !!. write ( temp , Ġ 0 , Ġtemp . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Audio Decoder != Ġnull Ġ&& Ġm Audio Decoder !!. media Format Ġ!= null ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Listener ?. on Progress ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( pcm . time Ġ/ Ġ 1 0 0 0 ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( m Audio Decoder !!. media Format !!. getLong ( Media Format . KEY _ DURATION ) Ġ/ Ġ 1 0 0 0 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Frame Ar rive ( temp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¦Ĥæŀľ æĺ¯ æļĤ åģľ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// éĺ² æŃ¢ æŃ» å¾ªçİ¯ AN R ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsleep ( 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Listener ?. on Stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Track !!. stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Track !!. flush () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Track !!. release () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Track Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" mp 3 Recorder ", Ġ" error :" Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Listener ?. onError ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Playing Music Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Is Pause Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Listener ?. on Completion () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Audio Track (): ĠAudio Track Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠbufferSize Ġ= ĠAudio Track . getMin BufferSize ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Sample Rate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Channel , Ġm Audio Encoding ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAudio Track . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Audio Attributes ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Attributes . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Usage ( Audio Attributes . USAGE _ MEDIA ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ContentType ( Audio Attributes . CONTENT _ TYPE _ M US IC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Legacy Stream Type ( Audio Manager . STREAM _ M US IC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Audio Format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Format . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Encoding ( m Audio Encoding ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Sample Rate ( m Sample Rate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Channel Mask ( default Channel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Transfer Mode ( Audio Track . MODE _ STREAM ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set BufferSize InBytes ( buffer Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ ĠAudio Track ( Audio Manager . STREAM _ M US IC , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Sample Rate , Ġdefault Channel , Ġm Audio Encoding , ĠbufferSize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Track . MODE _ STREAM ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġset Volume ( volume : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . volume Ġ= Ġvolume ĊĠĠĠĠĠĠĠ Ġif Ġ( audio Track Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . LO L LI POP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Track !!. set Volume ( volume ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Track !!. set Ster eo Volume ( volume , volume ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġinterface ĠBack Ground Frame Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Frame Ar rive ( bytes : ĠByteArray ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPROCESS _ STOP Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPROCESS _ ERROR Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPROCESS _ RE PLAY Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġm Sample Rate Ġ= Ġ 4 4 1 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġm Audio Encoding Ġ= ĠAudio Format . ENCODING _ PCM _ 1 6 BIT // ä¸Ģä¸ª éĩĩ æł· çĤ¹ 1 6 æ¯Ķ çī¹ - 2 ä¸ª åŃĹèĬĤ ĊĠĠĠ Ġ} Ċ } Ċ