package Ġme . s het j . recorder . mix Recorder Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . media . Media Codec Ċ import Ġandroid . media . Media Extractor Ċ import Ġandroid . media . Media Format Ċ import Ġandroid . net . Uri Ċ import Ġandroid . util . Log Ċ import Ġjava . util .* Ċ Ċ class ĠAudio Decoder Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġchunk PCM Data Container Ġ= ĠArrayList < PCM >() // PCM æķ°æį® åĿĹ å®¹åĻ¨ ĊĠĠĠ Ġprivate Ġvar Ġmedia Extractor : ĠMedia Extractor ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġmedia Decode : ĠMedia Codec ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġdecode Buffer Info : ĠMedia Codec . Buffer Info ? Ġ= Ġnull ĊĊĠĠĠ Ġinternal Ġvar Ġis PCM Extractor EOS Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġprivate Ġvar Ġmp 3 FilePath : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġcontext : ĠContext ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġmp 3 UR i : ĠUri ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġheaders : ĠMutable Map < String , ĠString >? Ġ= Ġnull ĊĊĠĠĠ Ġinternal Ġvar Ġmedia Format : ĠMedia Format ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ// è®° å¾Ĺ åĬł éĶģ ĊĠĠĠ Ġ// æ¯ıæ¬¡ åıĸ åĩº index Ġ 0 ĠçļĦ æķ°æį® ĊĠĠĠ Ġ// åıĸ åĩº åĲİ å°Ĩ æŃ¤ æķ°æį® remove æİī Ġ æĹ¢ èĥ½ ä¿Ŀè¯ģ PCM æķ°æį® åĿĹ çļĦ åıĸ åĩº é¡ºåºı Ġ åıĪ èĥ½ åıĬ æĹ¶ éĩĬæĶ¾ åĨħåŃĺ ĊĠĠĠ Ġval Ġp cm Data : ĠP CM ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsynchronized ( lock PCM ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( chunk PCM Data Container . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp cm Chunk Ġ= Ġchunk PCM Data Container [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk PCM Data Container . remove At ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġp cm Chunk ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæµ ĭ è¯ķ æĹ¶ åıĳçİ° Ġæ Ĵ Ń æĶ¾ éŁ³ é¢ĳ çļĦ ĠMedia Codec . Buffer Info . size Ġæĺ¯ åıĺ æį¢ çļĦ ĊĠĠĠĠ Ġ* Ġä¼ļ åĩºçİ° ä¸į ä¸Ģæł· çļĦæķ°æį® ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal ĊĠĠĠ Ġval ĠbufferSize : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsynchronized ( lock PCM ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( chunk PCM Data Container . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBUFFER _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġchunk PCM Data Container [ 0 ]. buffer Size ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Mp 3 FilePath ( path : ĠString ): ĠAudio Decoder Ġ{ ĊĠĠĠĠĠĠĠ Ġmp 3 FilePath Ġ= Ġpath ĊĠĠĠĠĠĠĠ Ġif Ġ( path . startsWith (" http ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" mix Recorder ", Ġ" the Ġurl Ġ Ġmay Ġbe ĠHTTP Ġ, APP Ġcould ĠAN R Ġby ĠMedia Extractor ," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" you Ġshould Ġdownload Ġit Ġto Ġuse Ġbetter Ġthan Ġdirect Ġto Ġuse || Ġå¦Ĥæŀľ ä½¿çĶ¨ HTTP çļĦ url , ĠAPP åı¯èĥ½ AN R ," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ä½ł åºĶè¯¥ ä¸ĭè½½ å®ĥ åĲİ åĨį çĶ¨ ï¼Į ä¼ļ æ¯Ķ åıª çĽ´æİ¥ çĶ¨ url å¥½ å¾Īå¤ļ " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmp 3 UR i Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcontext Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Mp 3 FilePath ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġuri : ĠUri , ĊĠĠĠĠĠĠĠ Ġheaders : ĠMutable Map < String , ĠString >? ĊĠĠĠ Ġ): ĠAudio Decoder Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . context Ġ= Ġcontext . application Context ĊĠĠĠĠĠĠĠ Ġmp 3 UR i Ġ= Ġuri ĊĠĠĠĠĠĠĠ Ġmp 3 FilePath Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġthis . headers Ġ= Ġheaders ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġstart P cm Extractor (): ĠAudio Decoder Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Media Decode () ĊĠĠĠĠĠĠĠ Ġif Ġ( is PCM Extractor EOS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis PCM Extractor EOS Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread Ġ{ Ġsrc Audio Format To PCM () Ġ}. start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrelease (): ĠAudio Decoder Ġ{ ĊĠĠĠĠĠĠĠ Ġis PCM Extractor EOS Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġrelease Decode () ĊĠĠĠĠĠĠĠ Ġsynchronized ( lock PCM ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk PCM Data Container . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ æĺ¯ ç½ĳç»ľ çļĦ éĵ¾æİ¥ åı¯èĥ½ä¼ļ åĩºçİ° ï¼Į AN R ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinit Media Decode () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Extractor Ġ= ĠMedia Extractor () // æŃ¤ ç±» åı¯ åĪĨ ç¦» è§Ĩé¢ĳ æĸĩä»¶çļĦ éŁ³ è½ ¨ åĴĮ è§Ĩé¢ĳ è½ ¨ éģĵ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mp 3 FilePath Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" mix Recorder ", Ġ" mp 3 FilePath Ġ= Ġ" Ġ+ Ġmp 3 FilePath !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Extractor !!. set DataSource ( mp 3 FilePath !! )// åªĴ ä½ĵ æĸĩä»¶çļĦ ä½įç½® ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( context Ġ!= Ġnull Ġ&& Ġmp 3 UR i Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Extractor !!. set DataSource ( context !! , Ġmp 3 UR i !! , Ġheaders )// åªĴ ä½ĵ æĸĩä»¶çļĦ ä½įç½® ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Format Ġ= Ġmedia Extractor !!. get Track Format ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmime Ġ= Ġmedia Format !!. getString ( Media Format . KEY _ MIME ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġæ£Ģ æŁ¥ æĺ¯åĲ¦ ä¸º éŁ³ é¢ĳ æĸĩä»¶ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! mime !!. startsWith (" audio / ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror ("$ mp 3 FilePath Ġis Ġnot Ġaudio Ġfile ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// éĢīæĭ© æŃ¤ éŁ³ é¢ĳ è½ ¨ éģĵ ï¼Į åĽłä¸º æĺ¯ éŁ³ é¢ĳ åıªæľī ä¸ĢæĿ¡ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Extractor !!. select Track ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// åĪĽå»º Decode è§£ çłģ åĻ¨ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Decode Ġ= ĠMedia Codec . create Decoder ByType ( mime ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Decode !!. configure ( media Format , Ġnull , Ġnull , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( media Decode Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" mix Recorder ", Ġ" create Ġmedia Decode Ġfailed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmedia Decode !!. start () // åĲ¯åĬ¨ Media Codec Ġï¼Į çŃīå¾ħ ä¼łåħ¥ æķ°æį® ĊĠĠĠĠĠĠĠ Ġdecode Buffer Info Ġ= ĠMedia Codec . Buffer Info () // çĶ¨äºİ æııè¿° è§£ çłģ å¾ĹåĪ° çļĦ byte [] æķ°æį®çļĦ çĽ¸åħ³ ä¿¡æģ¯ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġput PCM Data ( pcm Chunk : ĠByteArray , ĠbufferSize : ĠInt , Ġtime : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( lock PCM ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// è®° å¾Ĺ åĬł éĶģ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk PCM Data Container . add ( PCM ( pcm Chunk , ĠbufferSize , Ġtime )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è§£ çłģ éŁ³ é¢ĳ æĸĩä»¶ Ġ å¾ĹåĪ° PCM æķ°æį® åĿĹ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsrc Audio Format To PCM () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġis PCM Extractor EOS Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġsaw Input EOS Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! is PCM Extractor EOS Ġ&& Ġmedia Extractor Ġ!= Ġnull Ġ&& Ġmedia Decode Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// åĬłåħ¥ éĻĲåĪ¶ ï¼Į éĺ² æŃ¢ åŀ ĥ åľ ¾ æīĭæľº åį¡ é¡ ¿ ï¼Į - Ġ- Ġ éĺ² æŃ¢ æŃĮ æĽ² å¤ª å¤§ åĨħåŃĺ ä¸į å¤Ł çĶ¨ äºĨ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( chunk PCM Data Container . size Ġ> Ġ 6 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// éĺ² æŃ¢ æŃ» å¾ªçİ¯ AN R ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! s aw Input EOS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// èİ·åıĸ åı¯ çĶ¨çļĦ input Buffer Ġ- 1 ä»£è¡¨ ä¸ĢçĽ´ çŃīå¾ħ ï¼Į 0 è¡¨ç¤º ä¸į çŃīå¾ħ Ġ å»ºè®® - 1 , éģ¿åħį ä¸ ¢ å¸ § ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Index Ġ= Ġmedia Decode !!. de queue Input Buffer (- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input Index Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Buffer Ġ= Ġmedia Decode !!. getInput Buffer ( input Index ) Ġ// æĭ¿ åĪ° input Buffer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Buffer !!. clear () // æ¸ħ ç©º ä¹ĭåīį ä¼łåħ¥ input Buffer åĨħ çļĦæķ°æį® ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è¿ĻéĩĮ æľī è®°å½ķ è¯»åıĸ å¤±è´¥ ï¼Į å¯¼èĩ´ çĽ´æİ¥ ç»ĵæĿŁ è·³ åĩº å¾ªçİ¯ äºĨ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsample Size Ġ= Ġmedia Extractor !!. read Sample Data ( input Buffer , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sample Size Ġ< Ġ 0 ) Ġ{// å°ı äºİ 0 Ġ ä»£è¡¨ æīĢæľī æķ°æį® å·² è¯»åıĸ å®ĮæĪĲ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsaw Input EOS Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Decode !!. queue Input Buffer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Index , Ġ 0 , Ġ 0 , Ġ 0 L , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Codec . BUFFER _ FLAG _ END _ OF _ STREAM ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpresentation Time Us Ġ= Ġmedia Extractor !!. sample Time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Decode !!. queue Input Buffer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Index , Ġ 0 , Ġsample Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresentation Time Us , Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// éĢļçŁ¥ Media Decode è§£ çłģ åĪļ åĪļ ä¼łåħ¥ çļĦæķ°æį® ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Extractor !!. advance () // Media Extractor ç§»åĬ¨ åĪ° ä¸ĭ ä¸Ģ åıĸ æł· å¤Ħ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" mix Recorder ", Ġ" message Ġ= Ġ${ e . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis PCM Extractor EOS Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Decode () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// èİ·åıĸ è§£ çłģ å¾ĹåĪ° çļĦ byte [] æķ°æį® ĠåıĤæķ° Buffer Info ä¸ĬéĿ¢ å·² ä»ĭç»į Ġ 1 0 0 0 0 åĲĮ æł· ä¸º çŃīå¾ħ æĹ¶éĹ´ Ġ åĲĮ ä¸Ĭ - 1 ä»£è¡¨ ä¸ĢçĽ´ çŃīå¾ħ ï¼Į 0 ä»£è¡¨ ä¸į çŃīå¾ħ ãĢĤ æŃ¤ å¤Ħ åįķä½į ä¸º å¾® ç§Ĵ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// æŃ¤ å¤Ħ å»ºè®® ä¸įè¦ģ å¡« - 1 Ġæľī äºĽ æĹ¶åĢĻ å¹¶ æ²¡æľī æķ°æį® è¾ĵåĩº ï¼Į éĤ£ä¹Ī ä»ĸ å°±ä¼ļ ä¸ĢçĽ´ åį¡ åľ¨ è¿Ļ Ġ çŃīå¾ħ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Index Ġ= Ġmedia Decode !!. de queue Output Buffer ( decode Buffer Info !! , Ġ 1 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( output Index Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSimply Ġignore Ġcodec Ġconfig Ġbuffers . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( decode Buffer Info !!. flags Ġand ĠMedia Codec . BUFFER _ FLAG _ CODEC _ CONFIG Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è¿Ļæĺ¯ åĪĿå§ĭåĮĸ çļĦæķ°æį® ï¼Į æĹł éľĢ å¤ĦçĲĨ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Decode !!. release Output Buffer ( output Index , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( decode Buffer Info !!. size Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Buf Ġ= Ġmedia Decode !!. getOutput Buffer ( output Index ) Ġ// æĭ¿ åĪ° çĶ¨äºİ åŃĺ æĶ¾ PCM æķ°æį®çļĦ Buffer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsuccess Buffer Get Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠByteArray ( decode Buffer Info !!. size )// Buffer Info åĨħ å®ļä¹ī äºĨ æŃ¤ æķ°æį® åĿĹ çļĦ å¤§å°ı ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Buf !!. position ( decode Buffer Info !!. offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Buf . limit ( decode Buffer Info !!. offset Ġ+ Ġdecode Buffer Info !!. size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// æŁĲ äºĽ æľºåĻ¨ ä¸Ĭ buf åı¯èĥ½ Ġis Accessible Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Buf . get ( data )// å°Ĩ Buffer åĨħ çļĦæķ°æį® åıĸ åĩº åĪ° åŃĹèĬĤ æķ°ç»Ħ ä¸Ń ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Buf . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Buffer Get Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( success Buffer Get ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// èĩªå·± å®ļä¹ī çļĦæĸ¹æ³ķ ï¼Į ä¾Ľ ç¼ĸçłģ åĻ¨ æīĢåľ¨ çļĦ çº¿ç¨ĭ èİ·åıĸ æķ°æį® , ä¸ĭéĿ¢ ä¼ļ è´ ´ åĩº ä»£çłģ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput PCM Data ( data , Ġdecode Buffer Info !!. size , Ġmedia Extractor !!. sample Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Decode !!. release Output Buffer ( output Index , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// æŃ¤ æĵįä½ľ ä¸Ģå®ļ è¦ģ åģļ ï¼Į ä¸į çĦ¶ Media Codec çĶ¨ å®Į æīĢæľīçļĦ Buffer åĲİ Ġå°Ĩ ä¸įèĥ½ åĲĳ å¤ĸ è¾ĵåĩº æķ°æį® ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( decode Buffer Info !!. flags Ġand ĠMedia Codec . BUFFER _ FLAG _ END _ OF _ STREAM Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis PCM Extractor EOS Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" mix Recorder ", Ġ" pcm Ġfinished ..." Ġ+ Ġmp 3 FilePath !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// åıªæľī è¯»åıĸ å®ĮæĪĲ æīį ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Decode () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrelease Decode () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( media Decode Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Decode !!. stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Decode !!. release () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Decode Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( media Extractor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Extractor !!. release () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Extractor Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġclass ĠP CM Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġbuffer Bytes : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġinternal Ġvar ĠbufferSize : ĠInt , ĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġtime : ĠLong // å½ĵåīį æĹ¶éĹ´ ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠåĪĿå§ĭåĮĸ è§£ çłģ åĻ¨ ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlock PCM Ġ= ĠAny () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBUFFER _ SIZE Ġ= Ġ 2 0 4 8 ĊĠĠĠ Ġ} Ċ } Ċ