package Ġcom . lz b . record Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . media . Audio Format Ċ import Ġandroid . media . Audio Record Ċ import Ġandroid . media . Media Recorder Ċ import Ġandroid . text . TextUtils Ċ import Ġandroid . util . Log Ċ import Ġcom . lz b . record . event . Event Handle Data Ċ import Ġcom . lz b . record . play . Audio Tracker Ċ import Ġorg . green robot . event bus . EventBus Ċ import Ġorg . green robot . event bus . Subscribe Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġjava . util . concurrent . Executors ĊĊ Ċ /** Ċ Ġ* ĠCreated Ġby Ġl zb Ġon Ġ 2 0 1 8 / 1 1 / 2 1 . Ċ Ġ*/ Ċ class ĠAudio Recorder Ġprivate Ġconstructor () Ġ{ ĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġthis :: class . java . simple Name ĊĠĠĠ Ġ// å½ĵåīį çĬ¶æĢģ ĊĠĠĠ Ġprivate Ġvar Ġcurrent Status Ġ= ĠRecord Status . STATE _ RELEASE ĊĠĠĠ Ġ// é»ĺè®¤ åŃĺåĤ¨ çĽ®å½ķ ĊĠĠĠ Ġprivate Ġvar Ġrecord Cache Directory : ĠFile ? Ġ= Ġnull ĊĠĠĠ Ġ// éŁ³ é¢ĳ æĿ¥ æºĲ - éº ¦ åħĭ é£İ ĊĠĠĠ Ġprivate Ġvar Ġaudio Source Ġ= ĠMedia Recorder . Audio Source . MIC ĊĠĠĠ Ġ// Ġ éŁ³ é¢ĳ éĩĩ æł· çİĩ Ġ 4 4 1 0 0 ï¼Į å®ĺæĸ¹ æĸĩæ¡£ è¡¨ç¤º è¿Ļä¸ª éĩĩ æł· çİĩ åħ¼ å®¹ æĢ§ æľĢ å¥½ ĊĠĠĠ Ġprivate Ġval ĠA UDIO _ SAMPLE _ RE TE Ġ= Ġ 4 4 1 0 0 ĊĠĠĠ Ġ// å£° éģĵ Ġ Ġ åıĮ å£° éģĵ ĊĠĠĠ Ġprivate Ġval ĠA UDIO _ CHANNEL Ġ= ĠAudio Format . CHANNEL _ IN _ STER EO ĊĠĠĠ Ġ// éŁ³ é¢ĳ éĩĩ éĽĨ ç²¾ åº¦ ĊĠĠĠ Ġprivate Ġval ĠA UDIO _ ENCODING Ġ= ĠAudio Format . ENCODING _ PCM _ 1 6 BIT ĊĠĠĠ Ġ// ç¼ĵ åĨ² åĮº åŃĹèĬĤ å¤§å°ı ĊĠĠĠ Ġprivate Ġvar ĠbufferSize InBytes : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Audio Record : ĠAudio Record ĊĠĠĠ Ġ// æĸĩä»¶ åĲį ĊĠĠĠ Ġprivate Ġvar ĠfileName : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ// æł¼å¼ı åĮĸ æĸĩä»¶ åĲį çĶ¨ ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠdateFormat : ĠSimpleDateFormat ĊĊĠĠĠ Ġprivate Ġvar Ġm ExecutorService : ĠExecutor Service Ġ= ĠExec utors . new Cached ThreadPool () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġp cm To Wave Util : ĠP cm To Wave Util ĊĊĠĠĠ Ġprivate Ġvar Ġcallback Listener : ĠAudio Callback Listener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġis Paused Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar Ġf os Write PCM : ĠFileOutputStream ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġf os Write AAC : ĠFileOutputStream ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġf os Write W AV : ĠFileOutputStream ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent Save Type Ġ= ĠSAVE _ TYPE _ AAC ĊĊĠĠĠ Ġprivate Ġvar Ġm A ac Encoder : ĠA AC Encoder ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġis Need Play Real Time Ġ= Ġfalse ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠEvent Bus . getDefault (). register ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSAVE _ TYPE _ AAC Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSAVE _ TYPE _ W AV Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSAVE _ TYPE _ PCM Ġ= Ġ 3 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġm Instance : ĠAudio Recorder ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ@ Synchron ized ĊĠĠĠĠĠĠĠ Ġfun ĠgetInstance (): ĠAudio Recorder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Instance Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Instance Ġ= ĠAudio Recorder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm Instance !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinit ( context : ĠContext ?, Ġcallback Listener : ĠAudio Callback Listener ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( context Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNullPointerException (" context Ġis Ġnull Ġwhen Ġinit ĠAudio Recorder ") ĊĠĠĠĠĠĠĠ Ġthis . callback Listener Ġ= Ġcallback Listener ĊĠĠĠĠĠĠĠ Ġrecord Cache Directory Ġ= ĠRecord File Util . getDefault Record Directory ( context . application Context ) ĊĠĠĠĠĠĠĠ ĠdateFormat Ġ= ĠSimpleDateFormat (" yyyy MM dd - HH mm ss ", ĠLocale . CH INA ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åĩĨå¤ĩ å½ķ éŁ³ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġprepare Record ( fileName : ĠString ?, Ġis Need Play Real Time : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Status Ġ!= ĠRecord Status . STATE _ RELEASE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" å½ĵåīį çĬ¶æĢģ ä¸º $ current Status ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( record Cache Directory Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" call Ġthe Ġmethod Ġinit () Ġbefore Ġcreate Default Audio () ") ĊĠĠĠĠĠĠĠ Ġthis . is Need Play Real Time Ġ= Ġis Need Play Real Time ĊĠĠĠĠĠĠĠ Ġif Ġ( TextUtils . isEmpty ( fileName )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . fileName Ġ= ĠdateFormat . format ( System . currentTimeMillis ()) Ġ+ Ġ". pcm " ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . fileName Ġ= ĠfileName ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// èİ·å¾Ĺ ç¼ĵ åĨ² åĮº åŃĹèĬĤ å¤§å°ı ĊĠĠĠĠĠĠĠ ĠbufferSize InBytes Ġ= ĠAudio Record . getMin BufferSize ( AUDIO _ SAMPLE _ RE TE , ĠA UDIO _ CHANNEL , ĠA UDIO _ ENCODING ) ĊĠĠĠĠĠĠĠ Ġm Audio Record Ġ= ĠAudio Record ( audio Source , ĠA UDIO _ SAMPLE _ RE TE , ĠA UDIO _ CHANNEL , ĠA UDIO _ ENCODING , ĠbufferSize InBytes ) ĊĠĠĠĠĠĠĠ Ġupdate Status ( Record Status . STATE _ READY ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Need Play Real Time ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Tracker . getInstance (). prepare () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Status Ġ== ĠRecord Status . STATE _ RELEASE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" å½ķ éŁ³ å° ļ æľª åĪĿå§ĭåĮĸ ï¼Į è°ĥçĶ¨ create Default Audio () æĸ¹æ³ķ åĪĿå§ĭåĮĸ ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( current Status Ġ== ĠRecord Status . STATE _ RECORD ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" æŃ£åľ¨ å½ķ éŁ³ ...") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Audio Record . start Recording () ĊĠĠĠĠĠĠĠ Ġupdate Status ( Record Status . STATE _ RECORD ING ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Need Play Real Time ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Tracker . getInstance (). start () ĊĠĠĠĠĠĠĠ Ġ// ä¿ĿåŃĺ åĪ° æĸĩä»¶ ĊĠĠĠĠĠĠĠ Ġm ExecutorService . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Audio Recorder ", Ġ" start Ġrecord ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Save Config () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Audio Buffer () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpause () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Status Ġ== ĠRecord Status . STATE _ RECORD ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Audio Record . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Status ( Record Status . STATE _ PAUSE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Paused Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġresume Record () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Status Ġ!= ĠRecord Status . STATE _ PAUSE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" ä¸į åľ¨ æļĤ åģľ çĬ¶æĢģ ï¼Į ä¸įèĥ½ æģ ¢å¤į ") ĊĠĠĠĠĠĠĠ Ġm Audio Record . start Recording () ĊĠĠĠĠĠĠĠ Ġupdate Status ( Record Status . STATE _ RECORD ING ) ĊĠĠĠĠĠĠĠ Ġ// ä¿ĿåŃĺ åĪ° æĸĩä»¶ ĊĠĠĠĠĠĠĠ Ġm ExecutorService . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Audio Buffer () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Status Ġ== ĠRecord Status . STATE _ RECORD ING Ġ|| Ġcurrent Status Ġ== ĠRecord Status . STATE _ PAUSE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Audio Record . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Audio Recorder ", Ġ" stop Ġrecord ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Status ( Record Status . STATE _ STOP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Need Play Real Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Tracker . getInstance (). stop () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrelease () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Audio Record . release () ĊĠĠĠĠĠĠĠ Ġupdate Status ( Record Status . STATE _ RELEASE ) ĊĠĠĠĠĠĠĠ Ġ// ç»ĵæĿŁ å½ķ éŁ³ åĲİ åĨį æ¬¡ è°ĥçĶ¨ å¤ĦçĲĨ æĸ¹æ³ķ çĶ¨äºİ åħ³éĹŃ æµģ ãĢģ æ·»åĬł å¤´ çŃī æĵįä½ľ ĊĠĠĠĠĠĠĠ Ġhandle Audio Buffer () Ċ Ċ // ĠĠĠĠĠĠĠ Ġp cm To Wave Util Ġ= ĠP cm To Wave Util () Ċ // ĠĠĠĠĠĠĠ Ġm ExecutorService . execute Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaudio File Ġ= ĠFile ( record Cache Directory , ĠfileName ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdes FileName Ġ= ĠfileName ?. substring ( 0 , ĠfileName ?. indexOf (". pcm ") !! ) Ġ+ Ġ"- release . wav " Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdst File Ġ= ĠFile ( record Cache Directory , Ġdes FileName ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchange Result Ġ= Ġp cm To Wave Util . pcm 2 wav ( audio File . absolute Path , Ġdst File . absolute Path , Ġfalse ) Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Save Type ( save Type : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( save Type Ġ!= ĠSAVE _ TYPE _ AAC Ġ&& Ġsave Type Ġ!= ĠSAVE _ TYPE _ PCM Ġ&& Ġsave Type Ġ!= ĠSAVE _ TYPE _ W AV ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" save Ġtype Ġcan Ġonly Ġbe ĠAudio Recorder . SAVE _ TYPE _ AAC , Audio Recorder . SAVE _ TYPE _ AAC Ġand ĠAudio Recorder . SAVE _ TYPE _ AAC ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent Save Type Ġ= Ġsave Type ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// æĽ´æĸ° çĬ¶æĢģ ï¼Į åĽŀè°ĥ ĊĠĠĠ Ġprivate Ġfun Ġupdate Status ( status : ĠRecord Status ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Status Ġ== Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġcurrent Status Ġ= Ġstatus ĊĠĠĠĠĠĠĠ Ġval ĠfilePath Ġ= Ġrecord Cache Directory !!. absolute Path Ġ+ ĠFile . separator Ġ+ ĠfileName ĊĠĠĠĠĠĠĠ Ġif Ġ( callback Listener Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Listener !!. on Status Change ( current Status , ĠfilePath ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Audio Buffer () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// åĪĽå»ºä¸Ģä¸ª æİ¥åıĹ åįķåħĥ ĊĠĠĠĠĠĠĠ Ġval Ġread Buffer Ġ= ĠByteArray ( buffer Size InBytes ) ĊĠĠĠĠĠĠĠ Ġ// æ¯ıæ¬¡ è¯»åıĸ åĪ°çļĦ éķ¿åº¦ ĊĠĠĠĠĠĠĠ Ġvar Ġread Size Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( current Status Ġ== ĠRecord Status . STATE _ RECORD ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Size Ġ= Ġm Audio Record . read ( read Buffer , Ġ 0 , ĠbufferSize InBytes ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( callback Listener Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Listener !!. on Record Data ( read Buffer , Ġ 3 f ); ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¤ĦçĲĨ read Buffer ï¼Į ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Buffer 2 P cm ( read Size , Ġread Buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Buffer 2 W AV ( read Size , Ġread Buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Buffer 2 AAC ( read Size , Ġread Buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Need Play Real Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Tracker . getInstance (). play ( read Buffer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( current Status Ġ== ĠRecord Status . STATE _ RELEASE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Save Type Ġ== ĠSAVE _ TYPE _ W AV Ġ&& Ġf os Write W AV Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm ExecutorService . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsave FileName Ġ= ĠfileName ?. substring ( 0 , ĠfileName ?. lastIndexOf (".") !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwav FilePath Ġ= Ġrecord Cache Directory !!. absolute Path Ġ+ ĠFile . separator Ġ+ Ġ"$ save FileName . wav " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp cm To Wave Util Ġ= ĠP cm To Wave Util () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp cm To Wave Util . add Header 2 wav ( wav FilePath , Ġf os Write W AV !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf os Write W AV ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf os Write PCM ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf os Write AAC ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Save Config () Ġ{ ĊĠĠĠĠĠĠĠ Ġf os Write AAC Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġf os Write PCM Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġf os Write W AV Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġsave FileName Ġ= ĠfileName ?. substring ( 0 , ĠfileName ?. lastIndexOf (".") !! ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( current Save Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSAVE _ TYPE _ PCM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp cm FilePath Ġ= Ġrecord Cache Directory !!. absolute Path Ġ+ ĠFile . separator Ġ+ Ġ"$ save FileName . pcm " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf os Write PCM Ġ= ĠFileOutputStream ( pcm FilePath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSAVE _ TYPE _ W AV Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwav FilePath Ġ= Ġrecord Cache Directory !!. absolute Path Ġ+ ĠFile . separator Ġ+ Ġ"$ save FileName . wav " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf os Write W AV Ġ= ĠFileOutputStream ( wav FilePath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSAVE _ TYPE _ AAC Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa ac FilePath Ġ= Ġrecord Cache Directory !!. absolute Path Ġ+ ĠFile . separator Ġ+ Ġ"$ save FileName . aac " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf os Write AAC Ġ= ĠFileOutputStream ( aac FilePath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm A ac Encoder Ġ= ĠA AC Encoder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm A ac Encoder !!. prepare () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġå°Ĩ è¯»åıĸ åĪ°çļĦ éŁ³ é¢ĳ åŃĺåĤ¨ åĪ° pcm æĸĩä»¶ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsave Buffer 2 P cm ( read Size : ĠInt , Ġread Buffer : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// å°Ĩ è¯»åıĸ åĪ° çļĦæķ°æį® åĨĻ åĪ° . pcm æĸĩä»¶ ä¸Ń ĊĠĠĠĠĠĠĠ Ġif Ġ( read Size Ġ!= ĠAudio Record . ERROR _ INVALID _ OPERATION Ġ&& Ġf os Write PCM Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf os Write PCM ?. write ( read Buffer , Ġ 0 , Ġread Buffer . size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġå°Ĩ è¯»åıĸ åĪ°çļĦ éŁ³ é¢ĳ åŃĺåĤ¨ åĪ° aac æĸĩä»¶ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsave Buffer 2 AAC ( read Size : ĠInt , Ġread Buffer : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( mA ac Encoder Ġ!= Ġnull Ġ&& Ġf os Write AAC Ġ!= Ġnull Ġ&& Ġread Size Ġ!= ĠAudio Record . ERROR _ INVALID _ OPERATION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm A ac Encoder !!. encode ( read Size , Ġread Buffer , Ġf os Write AAC !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġå°Ĩ è¯»åıĸ åĪ°çļĦ éŁ³ é¢ĳ åŃĺåĤ¨ åĪ° wav æĸĩä»¶ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsave Buffer 2 W AV ( read Size : ĠInt , Ġread Buffer : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( read Size Ġ!= ĠAudio Record . ERROR _ INVALID _ OPERATION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf os Write W AV ?. write ( read Buffer , Ġ 0 , Ġread Buffer . size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Subscribe ĊĠĠĠ Ġfun Ġon Event ( handle Data : ĠEvent Handle Data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( handle Data . data Array . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Tracker . getInstance (). play ( handle Data . data Array ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }