package Ġcom . h hd . my and vide ot est . my play video Ċ Ċ import Ġandroid . media .* Ċ import Ġandroid . os . Build Ċ import Ġcom . h hd . my and vide ot est . util . Log Ex Ċ import Ġjava . io . File Ċ import Ġjava . lang . Exception Ċ Ċ class ĠMy Audio Player Ġ{ ĊĊĠĠĠ Ġvar Ġcur Pts : ĠLong Ġ= Ġ- 1 L ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġvar Ġduration Us : ĠLong Ġ= Ġ- 1 L ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAudio Format . ENCODING _ PCM _* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġp cm Encoding : ĠInt Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġvar Ġchannel Count : ĠInt Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġvar Ġsample Rate : ĠInt Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġvar ĠisOpen Ġ= Ġfalse ĊĠĠĠ Ġvar Ġis Play Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar Ġ_ extractor : ĠMedia Extractor ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġ_ dec order : ĠMedia Codec ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġ_ audio Track : ĠAudio Track ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġ_ pts List : ĠMutable List < Long >? Ġ= Ġnull ĊĊĊĠĠĠ Ġfun Ġprepare ( src File : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ extractor Ġ= ĠMedia Extractor () ĊĠĠĠĠĠĠĠ Ġ_ extractor !!. set DataSource ( src File . toString ()) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ_ extractor !!. track Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ extractor !!. un select Track ( i ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġfmt : ĠMedia Format ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġmime : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġidx Audio Track Ġ= Ġ- 1 ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ_ extractor !!. track Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfmt Ġ= Ġ_ extractor !!. get Track Format ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmime Ġ= Ġfmt . getString ( Media Format . KEY _ MIME ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mime !!. contains (" audio / ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidx Audio Track Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( idx Audio Track Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . isOpen Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠLog Ex . value (" fmt ", Ġfmt ) ĊĠĠĠĠĠĠĠ Ġ_ extractor !!. select Track ( idx Audio Track ) ĊĠĠĠĠĠĠĠ Ġthis . sample Rate Ġ= Ġfmt !!. getInteger ( Media Format . KEY _ SAMPLE _ RATE ) ĊĠĠĠĠĠĠĠ Ġthis . channel Count Ġ= Ġfmt . getInteger ( Media Format . KEY _ CHANNEL _ COUNT ) ĊĠĠĠĠĠĠĠ Ġthis . duration Us Ġ= Ġfmt . getLong ( Media Format . KEY _ DURATION ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . N ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . pcm Encoding Ġ= Ġfmt . getInteger ( Media Format . KEY _ PCM _ ENCODING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . pcm Encoding Ġ= Ġfmt . getInteger (" pcm - encoding ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( this . pcm Encoding Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbits _ per _ sample Ġ= Ġfmt . getInteger (" bits - per - sample ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . pcm Encoding Ġ= Ġwhen Ġ( bits _ per _ sample ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 8 Ġ-> ĠAudio Format . ENCODING _ PCM _ 8 BIT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 6 Ġ-> ĠAudio Format . ENCODING _ PCM _ 1 6 BIT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 2 Ġ-> ĠAudio Format . ENCODING _ PCM _ FLOAT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠAudio Format . ENCODING _ PCM _ 1 6 BIT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( this . pcm Encoding Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . pcm Encoding Ġ= ĠAudio Format . ENCODING _ PCM _ 1 6 BIT ĊĊĠĠĠĠĠĠĠ Ġ_ dec order Ġ= ĠMedia Codec . create Decoder ByType ( mime !! ) ĊĠĠĠĠĠĠĠ Ġ_ dec order !!. configure ( fmt , Ġnull , Ġnull , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ_ dec order !!. start () ĊĊĠĠĠĠĠĠĠ Ġ_ pts List Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ pts List !!. add (_ extractor !!. sample Time ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġ_ extractor !!. advance () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! res ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ_ extractor !!. seek To ( 0 , ĠMedia Extractor . SEEK _ TO _ CLOSE ST _ SYNC ) ĊĊĠĠĠĠĠĠĠ Ġval Ġch Cfg Ġ= Ġwhen Ġ( this . channel Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠAudio Format . CHANNEL _ OUT _ MON O ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> ĠAudio Format . CHANNEL _ OUT _ STER EO ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 Ġ-> ĠAudio Format . CHANNEL _ OUT _ QUAD ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠAudio Format . CHANNEL _ OUT _ MON O ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmin Buf Size Ġ= ĠAudio Track . getMin BufferSize ( sample Rate , Ġch Cfg , Ġthis . pcm Encoding ) ĊĊĠĠĠĠĠĠĠ Ġ_ audio Track Ġ= ĠAudio Track ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Attributes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ContentType ( Audio Attributes . CONTENT _ TYPE _ M US IC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Format ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Sample Rate ( this . sample Rate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Encoding ( this . pcm Encoding ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Buf Size , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Track . MODE _ STREAM , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . AUDIO _ SESSION _ ID _ GENER ATE ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ_ audio Track !!. play () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġseek ( pts : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast Pts Ġ= Ġ_ pts List !!. last () ĊĊĠĠĠĠĠĠĠ Ġvar Ġcal i Pts Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpts Ġ< Ġ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpts Ġ> Ġlast Pts Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Pts ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpts ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ_ extractor !!. seek To ( cal i Pts , ĠMedia Extractor . SEEK _ TO _ CLOSE ST _ SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdecode Render ( render : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ dec order Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ(_ extractor Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġis E os Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ extractor !!. sample Flags Ġand ĠMedia Codec . BUFFER _ FLAG _ END _ OF _ STREAM Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Codec . BUFFER _ FLAG _ END _ OF _ STREAM ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is E os ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Ex . d (" EOS Ġpts [ ${ _ extractor !!. sample Time }] ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . is Play Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġidx Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidx Ġ= Ġ_ dec order !!. de queue Input Buffer ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( idx Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= Ġ_ dec order !!. getInput Buffer ( idx ) ĊĠĠĠĠĠĠĠ Ġval Ġread Size Ġ= Ġ_ extractor !!. read Sample Data ( buf !! , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġflags Ġ= Ġ_ extractor !!. sample Flags ĊĠĠĠĠĠĠĠ Ġval Ġpts Ġ= Ġ_ extractor !!. sample Time ĊĠĠĠĠĠĠĠ Ġ_ dec order !!. queue Input Buffer ( idx , Ġ 0 , Ġread Size , Ġpts , Ġflags ) ĊĊĠĠĠĠĠĠĠ ĠLog Ex . d ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" IN BUF Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" idx [ ${ idx }] Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" pts [ ${ pts }] Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" read Size [ ${ read Size }] Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" flags [ ${ flags }] Ġ" ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= ĠMedia Codec . Buffer Info () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(_ x _ Ġin Ġ 0 .. 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidx Ġ= Ġ_ dec order !!. de queue Output Buffer ( info , Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( idx Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠLog Ex . d ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" OUT BUF Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" idx [ ${ idx }] Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" in Buf Pts [ ${ pts }] Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" out Buf Pts [ ${ info . presentation Time Us }] Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" size [ ${ info . size }] " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" flags [ ${ info . flags }] Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" render [ ${ render }] " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( render ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . cur Pts Ġ= Ġpts ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( idx Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Buf Ġ= Ġ_ dec order !!. getOutput Buffer ( idx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout ByteArray Ġ= ĠByteArray ( out Buf !!. remaining ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Buf . get ( out ByteArray ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ audio Track !!. write ( out ByteArray , Ġ 0 , Ġout ByteArray . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( idx Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ dec order !!. release Output Buffer ( idx , Ġrender ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . isOpen Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġthis . cur Pts Ġ= Ġ- 1 L ĊĠĠĠĠĠĠĠ Ġthis . duration Us Ġ= Ġ- 1 L ĊĠĠĠĠĠĠĠ Ġthis . is Play Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ(_ extractor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ extractor !!. release () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ extractor Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(_ dec order Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ dec order !!. stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ dec order !!. release () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ dec order Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ_ pts List Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadvance () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ extractor !!. advance () ĊĠĠĠ Ġ} Ċ }