package Ġcom . params en . noise . sample . view Ċ Ċ import Ġandroid . Manifest . permission . RECORD _ AUDIO Ċ import Ġandroid . content . pm . PackageManager . PERMISSION _ GRAN TED Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . animation . Accel erate De cel erate Interpolator Ċ import Ġandroid . view . animation . Animation Ċ import Ġandroid . view . animation . Animation Utils Ċ import Ġandroid . widget . Action Menu View Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . appcompat . view . menu . Action MenuItem View Ċ import Ġcom . params en . noise . Noise Ċ import Ġcom . params en . noise . sample . R Ċ import Ġcom . params en . noise . sample . source . Audio Source Ċ import Ġio . reactivex . Flow able Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . functions . Function Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġval ĠTAG Ġ= Ġjava Class . simple Name !! ĊĊĠĠĠ Ġval Ġdis posable : ĠComposite Disposable Ġ= ĠComposite Disposable () ĊĊĠĠĠ Ġval Ġp 0 Ġ= ĠProfiler (" p 0 ") ĊĠĠĠ Ġval Ġp 1 Ġ= ĠProfiler (" p 1 ") ĊĠĠĠ Ġval Ġp 2 Ġ= ĠProfiler (" p 2 ") ĊĠĠĠ Ġval Ġp 3 Ġ= ĠProfiler (" p 3 ") ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĠĠĠĠĠĠĠ Ġschedule About () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( request Audio () Ġ&& Ġdis posable . size () Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSubscribe Ġto Ġmicro phone ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= ĠAudio Source (). stream () ĊĠĠĠĠĠĠĠ Ġval Ġnoise Ġ= ĠNo ise . real ( 4 0 9 6 ) ĊĊĠĠĠĠĠĠĠ Ġ// Audio View ĊĠĠĠĠĠĠĠ Ġdis posable . add ( src . observe On ( Schedulers . new Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġp 0 . next () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( audio View :: on Window , Ġ{ Ġe Ġ-> ĠLog . e ( TAG , Ġe . message ) Ġ})) ĊĠĠĠĠĠĠĠ Ġ// FFT View ĊĠĠĠĠĠĠĠ Ġdis posable . add ( src . observe On ( Schedulers . new Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġp 1 . next () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġit . indices ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ i ] Ġ*= Ġ 2 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġnoise . fft ( it , ĠFloat Array ( 4 0 9 6 Ġ+ Ġ 2 )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġp 3 . next () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġfft Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfft Heat MapView . on FFT ( fft ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfft Band View . on FFT ( fft ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġe Ġ-> ĠLog . e ( TAG , Ġe . message ) Ġ})) ĊĊĠĠĠĠĠĠĠ Ġtip . schedule () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDispose Ġmicro phone Ġsubscriptions ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġdis posable . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOutput Ġwindows Ġof Ġ 4 0 9 6 Ġlen , Ġ~ 1 0 / sec Ġfor Ġ 4 4 . 1 kh z , Ġacc umul ates Ġfor ĠFFT ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġaccum ulate ( o : ĠFlow able < Float Array >): ĠFlow able < Float Array > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġ 4 0 9 6 ĊĊĠĠĠĠĠĠĠ Ġreturn Ġo . map ( object Ġ: ĠFunction < Float Array , ĠFloat Array > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= ĠFloat Array ( size Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġempty Ġ= ĠFloat Array ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġc Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( window : ĠFloat Array ): ĠFloat Array Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( window , Ġ 0 , Ġbuf , Ġc , Ġwindow . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ+= Ġwindow . size ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ>= Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠFloat Array ( size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( buf , Ġ 0 , Ġout , Ġ 0 , Ġsize ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ> Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( buf , Ġc Ġ% Ġsize , Ġbuf , Ġ 0 , Ġc Ġ% Ġsize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġout ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}). filter Ġ{ Ġfft Ġ-> Ġfft . size Ġ== Ġsize Ġ} Ġ// filter Ġonly Ġthe Ġemission s Ġof Ġcomplete Ġ 4 0 9 6 Ġwindows ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġaccum ulate 1 ( o : ĠFlow able < Float Array >): ĠFlow able < Float Array > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġo . window ( 6 ). flatMap Single Ġ{ Ġit . collect ({ ĠArrayList < Float Array >() Ġ}, Ġ{ Ġa , Ġb Ġ-> Ġa . add ( b ) Ġ}) Ġ}. map Ġ{ Ġwindow Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠFloat Array ( 4 0 9 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġc Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( each Ġin Ġwindow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ+ Ġeach . size Ġ>= Ġ 4 0 9 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( each , Ġ 0 , Ġout , Ġc , Ġeach . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ+= Ġeach . size Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequest Audio (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M Ġ&& Ġcheck Self Permission ( RECORD _ AUDIO ) Ġ!= ĠPER MISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions ( array Of ( RECORD _ AUDIO ), Ġ 1 3 3 7 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġpermissions : ĠArray < out ĠString >, Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( grant Results [ 0 ] Ġ== ĠPER MISSION _ GRAN TED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . menu , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġinfo . on Show () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġschedule About () Ġ{ ĊĠĠĠĠĠĠĠ Ġcontainer . post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! info . show ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanim Ġ= ĠAnimation Utils . load Animation ( this , ĠR . anim . n udge ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat Count Ġ= Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat Mode Ġ= ĠAnimation . RE VERSE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 2 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinterpol ator Ġ= ĠAccel erate De cel erate Interpolator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Terminate Ġ{ Ġschedule About () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ((( (( container . parent . parent Ġas ĠViewGroup ). getChild At ( 1 ) Ġas ĠViewGroup ) Ġ// container ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getChild At ( 0 ) Ġas ĠViewGroup ) Ġ// action bar ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getChild At ( 1 ) Ġas ĠAction Menu View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getChild At ( 0 ) Ġas ĠAction MenuItem View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start Animation ( anim ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Could Ġnot Ġanimate Ġn udge Ġ/ Ġ${ Log . get StackTrace String ( e )} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ 3 0 0 0 ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ