package Ġrm . com . aud i ow ave Ċ Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġjava . util . concurrent . Executors Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġa lex Ċ Ġ*/ Ċ internal Ġval ĠMAIN _ THREAD Ġ= ĠHandler ( Looper . get Main Looper ()) Ċ internal Ġval ĠS AMP LER _ THREAD : ĠExecutor Service Ġ= ĠExec utors . new Single Thread Executor () Ċ Ċ object ĠSampler Ġ{ ĊĊĠ Ġfun Ġdown Sample Async ( data : ĠByteArray , Ġtarget Size : ĠInt , Ġanswer : Ġ( ByteArray ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ ĠS AMP LER _ THREAD . submit Ġ{ ĊĠĠĠĠĠ Ġval Ġscaled Ġ= Ġdown Sample ( data , Ġtarget Size ) ĊĊĠĠĠĠĠ ĠMAIN _ THREAD . post Ġ{ ĊĠĠĠĠĠĠĠ Ġanswer ( scaled ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġdown Sample ( data : ĠByteArray , Ġtarget Size : ĠInt ): ĠByteArray Ġ{ ĊĠĠĠ Ġval Ġtarget Sized Ġ= ĠByteArray ( target Size ) ĊĠĠĠ Ġval Ġchunk Size Ġ= Ġdata . size Ġ/ Ġtarget Size ĊĠĠĠ Ġval Ġchunk Step Ġ= ĠMath . max ( Math . floor (( chunk Size Ġ/ Ġ 1 0 . 0 )), Ġ 1 . 0 ). toInt () ĊĊĠĠĠ Ġvar Ġprev Data Index Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġsampled Per Chunk Ġ= Ġ 0 F ĊĠĠĠ Ġvar Ġsum Per Chunk Ġ= Ġ 0 F ĊĊĠĠĠ Ġif Ġ( target Size Ġ>= Ġdata . size ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtarget Sized . paste ( data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfor Ġ( index Ġin Ġ 0 .. data . size Ġstep Ġchunk Step ) Ġ{ ĊĠĠĠĠĠ Ġval Ġcurrent Data Index Ġ= Ġtarget Size Ġ* Ġindex Ġ/ Ġdata . size ĊĊĠĠĠĠĠ Ġif Ġ( prev Data Index Ġ== Ġcurrent Data Index ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsampled Per Chunk Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠ Ġsum Per Chunk Ġ+= Ġdata [ index ]. abs ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġtarget Sized [ prev Data Index ] Ġ= Ġ( sum Per Chunk Ġ/ Ġsampled Per Chunk ). to Byte () ĊĊĠĠĠĠĠĠĠ Ġsum Per Chunk Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠ Ġsampled Per Chunk Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠ Ġprev Data Index Ġ= Ġcurrent Data Index ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġtarget Sized ĊĠ Ġ} Ċ } Ċ Ċ internal Ġval ĠByte . abs : ĠByte ĊĠ Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ ĠByte . MIN _ VALUE Ġ-> ĠByte . MAX _ VALUE ĊĠĠĠ Ġin Ġ( Byte . MIN _ VALUE Ġ+ Ġ 1 .. 0 ) Ġ-> Ġ(- this ). to Byte () ĊĠĠĠ Ġelse Ġ-> Ġthis ĊĠ Ġ} Ċ Ċ internal Ġfun ĠByteArray . paste ( other : ĠByteArray ): ĠByteArray Ġ{ ĊĠ Ġif Ġ( size Ġ== Ġ 0 ) Ġreturn Ġbyte ArrayOf () ĊĊĠ Ġreturn Ġthis . apply Ġ{ ĊĠĠĠ ĠforEach Indexed Ġ{ Ġi , Ġbyte Ġ-> ĊĠĠĠĠĠ Ġthis [ i ] Ġ= Ġother . getOrElse ( i , Ġ{ Ġthis [ i ]. abs Ġ}) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }