2828import java .util .List ;
2929import java .util .Locale ;
3030
31- import fftlib .FFT ;
3231import fftlib .FftFactory ;
3332
3433/**
@@ -121,10 +120,12 @@ public void stop() {
121120 if (state == RecordState .PAUSE ) {
122121 makeFile ();
123122 state = RecordState .IDLE ;
123+ notifyState ();
124+ stopMp3Encoded ();
124125 } else {
125126 state = RecordState .STOP ;
127+ notifyState ();
126128 }
127- notifyState ();
128129 }
129130
130131 void pause () {
@@ -196,20 +197,7 @@ public void run() {
196197
197198 private FftFactory fftFactory = new FftFactory (FftFactory .Level .Original );
198199
199-
200- private long time ;
201-
202-
203- int i = 0 ;
204-
205200 private void notifyData (final byte [] data ) {
206- // Logger.w(TAG, "time: %s", System.currentTimeMillis() - time);
207-
208- time = System .currentTimeMillis ();
209-
210- if (++i % 4 == 0 ) {
211- return ;
212- }
213201 if (recordDataListener == null && recordSoundSizeListener == null && recordFftDataListener == null ) {
214202 return ;
215203 }
@@ -235,76 +223,7 @@ public void run() {
235223 });
236224 }
237225
238- /**
239- * 优化处理FFT数据
240- *
241- * @param data pcm byte[]数据
242- * @return fft
243- */
244- private byte [] makeFftData (byte [] data ) {//data.length = 1280
245- if (data .length < 1024 ) {
246- return null ;
247- }
248- try {
249- double [] ds = toHardDouble (ByteUtils .toShorts (data ));
250- double [] fft = FFT .fft (ds , 62 );
251- //start
252- double [] newFft = new double [128 ];
253- for (int i = 16 ; i < 16 + newFft .length ; i ++) {
254- if (i < 24 ) {
255- newFft [i - 16 ] = fft [i ] * 0.2 ;
256- } else if (i < 36 ) {
257- newFft [i - 16 ] = fft [i ] * 0.4 ;
258- } else if (i < 48 ) {
259- newFft [i - 16 ] = fft [i ] * 0.6 ;
260- } else {
261- newFft [i - 16 ] = fft [i ];
262- }
263- if (newFft [i - 16 ] < 10 * 128 ) {
264- newFft [i - 16 ] = newFft [i - 16 ] * 0.6 ;
265- }
266- }
267- fft = newFft ;
268- //end
269- int step = fft .length / 128 ;
270- byte [] fftBytes = new byte [128 ];
271-
272-
273- int scale = 128 ;//压缩128基准
274- double max = getMax (fft );
275- if (max > 128 * 128 ) {//高音优化
276- scale = (int ) (max / 128 ) + 2 ;
277- }
278-
279- for (int i = 0 ; i < fftBytes .length ; i ++) {
280- double tmp = fft [i * step ] / scale ;
281- if (tmp > 127 ) {
282- fftBytes [i ] = 127 ;
283- } else if (tmp < -128 ) {
284- fftBytes [i ] = -127 ;
285-
286- } else {
287- fftBytes [i ] = (byte ) tmp ;
288- }
289- }
290- return fftBytes ;
291- } catch (Exception e ) {
292- Logger .w (TAG , e .getMessage ());
293- }
294- return null ;
295- }
296-
297- private double getMax (double [] data ) {
298- double max = 0 ;
299- for (int i = 0 ; i < data .length ; i ++) {
300- if (data [i ] > max ) {
301- max = data [i ];
302- }
303- }
304- return max ;
305- }
306-
307- public int getDb (byte [] data ) {
226+ private int getDb (byte [] data ) {
308227 double sum = 0 ;
309228 double ave ;
310229 int length = data .length > 128 ? 128 : data .length ;
@@ -317,15 +236,6 @@ public int getDb(byte[] data) {
317236 return i < 0 ? 27 : i ;
318237 }
319238
320- private double [] toHardDouble (short [] shorts ) {
321- int length = 512 ;
322- double [] ds = new double [length ];
323- for (int i = 0 ; i < length ; i ++) {
324- ds [i ] = shorts [i ];
325- }
326- return ds ;
327- }
328-
329239 private void initMp3EncoderThread (int bufferSize ) {
330240 try {
331241 mp3EncodeThread = new Mp3EncodeThread (resultFile , bufferSize );
@@ -348,6 +258,8 @@ private class AudioRecordThread extends Thread {
348258 if (currentConfig .getFormat () == RecordConfig .RecordFormat .MP3 ) {
349259 if (mp3EncodeThread == null ) {
350260 initMp3EncoderThread (bufferSize );
261+ } else {
262+ Logger .e (TAG , "mp3EncodeThread != null, 请检查代码" );
351263 }
352264 }
353265 }
@@ -431,23 +343,27 @@ private void startMp3Recorder() {
431343 if (state != RecordState .PAUSE ) {
432344 state = RecordState .IDLE ;
433345 notifyState ();
434- if (mp3EncodeThread != null ) {
435- mp3EncodeThread .stopSafe (new Mp3EncodeThread .EncordFinishListener () {
436- @ Override
437- public void onFinish () {
438- notifyFinish ();
439- mp3EncodeThread = null ;
440- }
441- });
442- } else {
443- notifyFinish ();
444- }
346+ stopMp3Encoded ();
445347 } else {
446348 Logger .d (TAG , "暂停" );
447349 }
448350 }
449351 }
450352
353+ private void stopMp3Encoded () {
354+ if (mp3EncodeThread != null ) {
355+ mp3EncodeThread .stopSafe (new Mp3EncodeThread .EncordFinishListener () {
356+ @ Override
357+ public void onFinish () {
358+ notifyFinish ();
359+ mp3EncodeThread = null ;
360+ }
361+ });
362+ } else {
363+ Logger .e (TAG , "mp3EncodeThread is null, 代码业务流程有误,请检查!! " );
364+ }
365+ }
366+
451367 private void makeFile () {
452368 switch (currentConfig .getFormat ()) {
453369 case MP3 :
0 commit comments