package Ġcom . fr anny . android medi ap lay ground . media Ċ Ċ import Ġandroid . media . Audio Track Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . FileNotFoundException Ċ import Ġjava . io . IOException Ċ import Ġjava . io . Random Access File Ċ import Ġjava . math . BigInteger Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . channels . File Channel Ċ import Ġjava . nio . charset . Charset Ċ Ċ /** Ċ Ġ* ĠReference : Ġhttps :// docs . file format . com / audio / wav / Ċ Ġ* Ġhttp :// www - mm sp . ece . mc g ill . ca / Documents / Audio Formats / W AVE / Samples . html Ċ Ġ*/ Ċ class ĠW AV Decoder Ġ{ ĊĠĠĠ Ġdata Ġclass ĠHeader ( ĊĠĠĠĠĠĠĠ Ġval Ġr iff : ĠString , Ġ// Ġ 1 - 4 ĊĠĠĠĠĠĠĠ Ġval ĠfileSize : ĠInt , Ġ// Ġ 5 - 8 , Ġsize Ġin Ġbyte ĊĠĠĠĠĠĠĠ Ġval ĠfileType : ĠString , Ġ// Ġ 9 - 1 2 ĊĠĠĠĠĠĠĠ Ġval Ġformat : ĠString , Ġ// Ġ 1 3 - 1 6 ĊĠĠĠĠĠĠĠ Ġval Ġformat Data Length : ĠInt , Ġ// Ġ 1 7 - 2 0 ĊĠĠĠĠĠĠĠ Ġval Ġformat Type : ĠInt , Ġ// Ġ 2 1 - 2 2 , Ġ 1 Ġis ĠP CM ĊĠĠĠĠĠĠĠ Ġval Ġchannel Number : ĠInt , Ġ// Ġ 2 3 - 2 4 ĊĠĠĠĠĠĠĠ Ġval Ġsample Rate : ĠInt , Ġ// Ġ 2 5 - 2 8 ĊĠĠĠĠĠĠĠ Ġval Ġbyte Rate : ĠInt , Ġ// Ġ 2 9 - 3 2 , Ġ( Sample ĠRate Ġ* ĠBits Per Sample Ġ* ĠChannels ) Ġ/ Ġ 8 . ĊĠĠĠĠĠĠĠ Ġval Ġchannel Bits Per Sample : ĠInt , Ġ// Ġ 3 3 - 3 4 , Ġ( Bits Per Sample Ġ* ĠChannels ) Ġ/ Ġ 8 . Ġ 1 : 8 Ġbit Ġmono , Ġ 2 : 8 Ġbit Ġst ereo / 1 6 Ġbit Ġmono ; Ġ 4 : 1 6 Ġbit Ġst ereo ĊĠĠĠĠĠĠĠ Ġval Ġbits Per Sample : ĠInt , Ġ// Ġ 3 5 - 3 6 ĊĠĠĠĠĠĠĠ Ġval Ġdata Tag : ĠString , Ġ// Ġ 3 7 - 4 0 ĊĠĠĠĠĠĠĠ Ġval Ġdata Size : ĠInt , Ġ// Ġ 4 1 - 4 4 ĊĠĠĠĠĠĠĠ Ġval Ġduration InSeconds : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġbit Rate Kb S : ĠInt , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" r iff : Ġ$ r iff " Ġ+ Ġ"\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" file Size Ġ: Ġ$ file Size " Ġ+ Ġ"\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" fileType Ġ: Ġ$ fileType " Ġ+ Ġ"\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" format Ġ: Ġ$ format " Ġ+ Ġ"\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" format Data Length Ġ: Ġ$ format Data Length " Ġ+ Ġ"\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" format Type Ġ: Ġ$ format Type " Ġ+ Ġ"\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" channel Number Ġ: Ġ$ channel Number " Ġ+ Ġ"\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" sample Rate Ġ: Ġ$ sample Rate " Ġ+ Ġ"\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" byte Rate Ġ: Ġ$ byte Rate " Ġ+ Ġ"\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" channel Bits Per Sample Ġ: Ġ$ channel Bits Per Sample " Ġ+ Ġ"\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" bits Per Sample Ġ: Ġ$ bits Per Sample " Ġ+ Ġ"\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" data Tag Ġ: Ġ$ data Tag " Ġ+ Ġ"\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" data Size Ġ: Ġ$ data Size " Ġ+ Ġ"\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" duration InSeconds : Ġ$ duration InSeconds " Ġ+ Ġ"\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" bit Rate Kb S : Ġ$ bit Rate Kb S " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdecode Header ( filePath : ĠString ): ĠHeader ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġheader : ĠHeader ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġrandom Access File : ĠRandom Access File ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġfile Channel : ĠFile Channel ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrandom Access File Ġ= ĠRandom Access File ( filePath , Ġ" r ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Channel Ġ= Ġrandom Access File . channel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteBuffer . allocate ( HEADER _ BYTE _ LENGTH ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Channel . read ( buffer ) Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader Ġ= Ġanalyze Header ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . w ( e . stack Trace ToString ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . w ( e . stack Trace ToString ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . w ( e . stack Trace ToString ()) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Channel ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrandom Access File ?. close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġheader ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdecode ( filePath : ĠString , Ġaudio Track : ĠAudio Track ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġrandom Access File : ĠRandom Access File ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġfile Channel : ĠFile Channel ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrandom Access File Ġ= ĠRandom Access File ( filePath , Ġ" r ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Channel Ġ= Ġrandom Access File . channel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Track . play () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbuffer Ġ= ĠByteBuffer . allocate ( 1 0 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Channel . position ( HEADER _ BYTE _ LENGTH . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( audio Track . play State Ġ== ĠAudio Track . PLAY STATE _ PLAY ING Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Channel . read ( buffer ) Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Track . write ( buffer . array (), Ġ 0 , Ġbuffer . array (). size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Ġ= ĠByteBuffer . allocate ( 1 0 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . w ( e . stack Trace ToString ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . w ( e . stack Trace ToString ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . w ( e . stack Trace ToString ()) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Channel ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrandom Access File ?. close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReference : Ġhttps :// en . wikipedia . org / wiki / Resource _ Inter change _ File _ Format ĊĠĠĠĠ Ġ* ĠMulti - byte Ġintegers Ġare Ġin Ġlittle - endian Ġformat . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġanalyze Header ( buffer : ĠByteBuffer ): ĠHeader Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcharset Ġ= ĠCharset . default Charset () ĊĠĠĠĠĠĠĠ Ġval Ġr iff Bytes Ġ= ĠByteArray ( 4 ) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer [ index ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġr iff Ġ= ĠString ( r iff Bytes , Ġcharset ) ĊĊĠĠĠĠĠĠĠ Ġval ĠfileSize Bytes Ġ= Ġbyte ArrayOf ( buffer [ 7 ], Ġbuffer [ 6 ], Ġbuffer [ 5 ], Ġbuffer [ 4 ]) ĊĠĠĠĠĠĠĠ Ġval ĠfileSize Ġ= ĠBigInteger ( file Size Bytes ). toInt () ĊĊĠĠĠĠĠĠĠ Ġval ĠfileType Bytes Ġ= Ġbyte ArrayOf ( buffer [ 8 ], Ġbuffer [ 9 ], Ġbuffer [ 1 0 ], Ġbuffer [ 1 1 ]) ĊĠĠĠĠĠĠĠ Ġval ĠfileType Ġ= ĠString ( fileType Bytes , Ġcharset ) ĊĊĠĠĠĠĠĠĠ Ġval Ġformat Bytes Ġ= Ġbyte ArrayOf ( buffer [ 1 2 ], Ġbuffer [ 1 3 ], Ġbuffer [ 1 4 ], Ġbuffer [ 1 5 ]) ĊĠĠĠĠĠĠĠ Ġval Ġformat Ġ= ĠString ( format Bytes , Ġcharset ) ĊĊĠĠĠĠĠĠĠ Ġval Ġformat Data Length Bytes Ġ= Ġbyte ArrayOf ( buffer [ 1 9 ], Ġbuffer [ 1 8 ], Ġbuffer [ 1 7 ], Ġbuffer [ 1 6 ]) ĊĠĠĠĠĠĠĠ Ġval Ġformat Data Length Ġ= ĠBigInteger ( format Data Length Bytes ). toInt () ĊĊĠĠĠĠĠĠĠ Ġval Ġformat Type Bytes Ġ= Ġbyte ArrayOf ( buffer [ 2 1 ], Ġbuffer [ 2 0 ]) ĊĠĠĠĠĠĠĠ Ġval Ġformat Type Ġ= ĠBigInteger ( format Type Bytes ). toInt () ĊĊĠĠĠĠĠĠĠ Ġval Ġchannel Number Bytes Ġ= Ġbyte ArrayOf ( buffer [ 2 3 ], Ġbuffer [ 2 2 ]) ĊĠĠĠĠĠĠĠ Ġval Ġchannel Number Ġ= ĠBigInteger ( channel Number Bytes ). toInt () ĊĊĠĠĠĠĠĠĠ Ġval Ġsample Rate Bytes Ġ= Ġbyte ArrayOf ( buffer [ 2 7 ], Ġbuffer [ 2 6 ], Ġbuffer [ 2 5 ], Ġbuffer [ 2 4 ]) ĊĠĠĠĠĠĠĠ Ġval Ġsample Rate Ġ= ĠBigInteger ( sample Rate Bytes ). toInt () ĊĊĠĠĠĠĠĠĠ Ġval Ġbyte Rate Bytes Ġ= Ġbyte ArrayOf ( buffer [ 3 1 ], Ġbuffer [ 3 0 ], Ġbuffer [ 2 9 ], Ġbuffer [ 2 8 ]) ĊĠĠĠĠĠĠĠ Ġval Ġbyte Rate Ġ= ĠBigInteger ( byte Rate Bytes ). toInt () ĊĊĠĠĠĠĠĠĠ Ġval Ġchannel Bits Per Sample Bytes Ġ= Ġbyte ArrayOf ( buffer [ 3 3 ], Ġbuffer [ 3 2 ]) ĊĠĠĠĠĠĠĠ Ġval Ġchannel Bits Per Sample Ġ= ĠBigInteger ( channel Bits Per Sample Bytes ). toInt () ĊĊĠĠĠĠĠĠĠ Ġval Ġbits Per Sample Bytes Ġ= Ġbyte ArrayOf ( buffer [ 3 5 ], Ġbuffer [ 3 4 ]) ĊĠĠĠĠĠĠĠ Ġval Ġbits Per Sample Ġ= ĠBigInteger ( bits Per Sample Bytes ). toInt () ĊĊĠĠĠĠĠĠĠ Ġval Ġdata Tag Bytes Ġ= Ġbyte ArrayOf ( buffer [ 3 6 ], Ġbuffer [ 3 7 ], Ġbuffer [ 3 8 ], Ġbuffer [ 3 9 ]) ĊĠĠĠĠĠĠĠ Ġval Ġdata Tag Ġ= ĠString ( data Tag Bytes , Ġcharset ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdata Size Bytes Ġ= Ġbyte ArrayOf ( buffer [ 4 3 ], Ġbuffer [ 4 2 ], Ġbuffer [ 4 1 ], Ġbuffer [ 4 0 ]) ĊĠĠĠĠĠĠĠ Ġval Ġdata Size Ġ= ĠBigInteger ( data Size Bytes ). toInt () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠHeader ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr iff , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfileSize , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfileType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġformat , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġformat Data Length , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġformat Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Number , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsample Rate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Rate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Bits Per Sample , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbits Per Sample , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Tag , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Size , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Size Ġ/ Ġbyte Rate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Rate Ġ* Ġ 8 Ġ/ Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠ Ġ. also Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ("$ it ") Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠHEADER _ BYTE _ LENGTH Ġ= Ġ 4 4 ĊĠĠĠ Ġ} Ċ }