package Ġme . s het j . recorder . sim Recorder ĊĊ Ċ import Ġandroid . media . Audio Record Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Handler Thread Ċ import Ġandroid . os . Looper Ċ import Ġandroid . os . Message Ċ import Ġme . s het j . recorder . core . FileUtils Ċ import Ġme . s het j . recorder . util . L ame Utils Ċ import Ġjava . io . File Ċ import Ġjava . io . FileNotFoundException Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . util .* Ċ /** Ċ Ġ* Ġ@ param Ġfile ĠĠĠĠĠĠ Ġfile Ċ Ġ* Ġ@ param ĠbufferSize ĠbufferSize Ċ Ġ* Ġ@ param Ġis Continue Ġæĺ¯åĲ¦ åĨĻ åľ¨ æĸĩä»¶ æľ« å°¾ Ċ Ġ* Ġ@ throws ĠFileNotFoundException Ġfile Ġnot Ġfound Ċ Ġ*/ Ċ class ĠData Encode Thread Ġ@ Throws ( FileNotFoundException :: class ) Ċ constructor ( file : ĠFile , ĠbufferSize : ĠInt , Ġis Continue : ĠBoolean ) Ġ: ĠHandler Thread (" Data Encode Thread "), ĊĠĠĠ ĠAudio Record . On Record Position Update Listener Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġm Handler : ĠStop Handler ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġm Mp 3 Buffer : ĠByteArray ĊĠĠĠ Ġprivate Ġvar Ġm File OutputStream : ĠFileOutputStream ? ĊĠĠĠ Ġprivate Ġvar Ġpath : ĠString ĊĠĠĠ Ġprivate Ġvar Ġneed Update Ġ= Ġfalse ĊĊĠĠĠ Ġval Ġhandler : ĠHandler ? ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm Handler ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Tasks Ġ= ĠCollections . synchronized List ( ArrayList < Read Task >()) ĊĠĠĠ Ġprivate Ġval Ġm Old Tasks Ġ= ĠCollections . synchronized List ( ArrayList < Read Task >()) ĊĊĠĠĠ Ġprivate Ġclass ĠStop Handler ( lo oper : ĠL ooper , Ġprivate Ġval Ġencode Thread : ĠData Encode Thread ) Ġ: ĊĠĠĠĠĠĠĠ ĠHandler ( lo oper ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Message ( msg : ĠMessage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( msg . what Ġ== ĠPROCESS _ STOP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¤ĦçĲĨ ç¼ĵ åĨ² åĮº ä¸ŃçļĦ æķ°æį® ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( encode Thread . process Data () Ġ> Ġ 0 ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCancel Ġany Ġevent Ġleft Ġin Ġthe Ġqueue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Callbacks And Messages ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencode Thread . flush And Release () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlo oper . quit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( msg . what Ġ== ĠPROCESS _ ERROR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¤ĦçĲĨ ç¼ĵ åĨ² åĮº ä¸ŃçļĦ æķ°æį® ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( encode Thread . process Data () Ġ> Ġ 0 ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCancel Ġany Ġevent Ġleft Ġin Ġthe Ġqueue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Callbacks And Messages ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencode Thread . flush And Release () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlo oper . quit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileUtils . delete File ( encode Thread . path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . m File OutputStream Ġ= ĠFileOutputStream ( file , Ġis Continue ) ĊĠĠĠĠĠĠĠ Ġpath Ġ= Ġfile . absolute Path ĊĠĠĠĠĠĠĠ Ġm Mp 3 Buffer Ġ= ĠByteArray (( 7 2 0 0 Ġ+ ĠbufferSize . toDouble () Ġ* Ġ 2 . 0 Ġ* Ġ 1 . 2 5 ). toInt ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . start () ĊĠĠĠĠĠĠĠ Ġm Handler Ġ= ĠStop Handler ( lo oper , Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck () Ġ{ ĊĠĠĠĠĠĠĠ ĠcheckNotNull ( m Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend Stop Message () Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck () ĊĠĠĠĠĠĠĠ Ġm Handler !!. send Empty Message ( PROCESS _ STOP ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend ErrorMessage () Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck () ĊĠĠĠĠĠĠĠ Ġm Handler !!. send Empty Message ( PROCESS _ ERROR ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate ( output FilePath : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . path Ġ= Ġoutput FilePath ĊĠĠĠĠĠĠĠ Ġneed Update Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĊĊĊĠĠĠ Ġoverride Ġfun Ġon Marker Reached ( recorder : ĠAudio Record ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġnothing ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Periodic Notification ( recorder : ĠAudio Record ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprocess Data () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġä»İ ç¼ĵ åĨ² åĮº ä¸Ń è¯»åıĸ å¹¶ å¤ĦçĲĨ æķ°æį® ï¼Į ä½¿çĶ¨ l ame ç¼ĸçłģ MP 3 ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġä»İ ç¼ĵ åĨ² åĮº ä¸Ń è¯»åıĸ çļĦæķ°æį® çļĦ éķ¿åº¦ ĊĠĠĠĠ Ġ* Ġ ç¼ĵ åĨ² åĮº ä¸Ń æ²¡æľī æķ°æį® æĹ¶ è¿ĶåĽŀ 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġprocess Data (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Tasks . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġm Tasks . remove At ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Old Data ( task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġtask . data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġread Size Ġ= Ġtask . read Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencoded Size Ġ= ĠL ame Utils . encode ( buffer , Ġbuffer , Ġread Size , Ġm Mp 3 Buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( encoded Size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm File OutputStream !!. write ( m Mp 3 Buffer , Ġ 0 , Ġencoded Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Cut () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġread Size ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFlush Ġall Ġdata Ġleft Ġin Ġl ame Ġbuffer Ġto Ġfile ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġflush And Release () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// å°Ĩ MP 3 ç»ĵ å°¾ ä¿¡æģ¯ åĨĻåħ¥ buffer ä¸Ń ĊĠĠĠĠĠĠĠ Ġval Ġflush Result Ġ= ĠL ame Utils . flush ( m Mp 3 Buffer ) ĊĠĠĠĠĠĠĠ Ġif Ġ( flush Result Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm File OutputStream !!. write ( m Mp 3 Buffer , Ġ 0 , Ġflush Result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m File OutputStream Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm File OutputStream !!. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL ame Utils . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġcheck Cut () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( need Update ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflush Result Ġ= ĠL ame Utils . flush ( m Mp 3 Buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flush Result Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm File OutputStream !!. write ( m Mp 3 Buffer , Ġ 0 , Ġflush Result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm File OutputStream ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm File OutputStream Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm File OutputStream Ġ= ĠFileOutputStream ( path , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( set Old Date ToFile () Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġneed Update Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Old Date ToFile () Ġ: ĠInt { ĊĠĠĠĠĠĠĠ Ġif Ġ( m Old Tasks . size Ġ> Ġ 0 Ġ&& Ġm File OutputStream Ġ!= null ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġm Old Tasks . remove At ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġtask . data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġread Size Ġ= Ġtask . read Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencoded Size Ġ= ĠL ame Utils . encode ( buffer , Ġbuffer , Ġread Size , Ġm Mp 3 Buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( encoded Size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm File OutputStream !!. write ( m Mp 3 Buffer , Ġ 0 , Ġencoded Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġread Size ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġadd Old Data ( task Ġ: ĠRead Task ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Old Tasks . size Ġ> Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// èĩªå·± è°ĥæķ´ æķ°éĩı å¤ļå°ĳ åĲĪ éĢĤ ï¼Į æĪĳ åĨĻ çļĦæĺ¯ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Old Tasks . remove At ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Old Tasks . add ( task ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Task ( raw Data : ĠShort Array , Ġread Size : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Tasks . add ( Read Task ( raw Data , Ġread Size )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPROCESS _ STOP Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPROCESS _ ERROR Ġ= Ġ 2 ĊĠĠĠ Ġ} ĊĊ Ċ } Ċ