2015-04-13 2 views
0

Чтение официальной документации аудиодорожки, я заметил, что я могу записать массив поплавка затем прочитать его в потоковом или буферном режиме:не может найти AudioTrack.write (поплавок [], Int, Int, Int) в Android

общественного ИНТ записи (поплавок [] аудиоданный, внутр offsetInFloats, внутр sizeInFloats, внутр WriteMode) Добавлены в уровне API 21

Записывает аудио данных в аудио раковины для воспроизведения (потоковый режим), или копии аудио данные для последующего воспроизведения (режим статического буфера). В режиме статический буфер копирует данные в буфер, начиная со смещения 0, и режим записи игнорируется. В потоковом режиме поведение блокировки будет зависеть от режима записи.

Я попытался использовать его в своем коде, как это:

 .... 

     float[]raw2=bytesToFloats(read(f2)); 
     int convhandle= FFTProcessor.createFastConvolutionContext(raw1.length, raw1, im1); 
     long t1=System.currentTimeMillis(); 
     FFTProcessor.performFastConvolution(convhandle, raw2, im2); 
     long t2=System.currentTimeMillis()-t1; 
     int minSize=audio.getMinBufferSize(22050, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_8BIT); 
     audio = new AudioTrack(AudioManager.STREAM_MUSIC,22050, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_8BIT, minSize ,AudioTrack.MODE_STREAM); 
     audio.write(raw2, 0, raw2.length, WRITE_NON_BLOCKING); 
     audio.play(); 
     ...... 

Но я получаю эту ошибку в методе записи():

The method write(byte[], int, int) in the type AudioTrack is not applicable for the arguments (float[], int, int, int) 

Я обновил свой SDK, и проверил файл манифеста, android:targetSdkVersion="21" /> , но все еще не знаете, что случилось.

+0

В чем Ваш 'minSdkVersion'? – StenSoft

+0

@StenSoft hanaa

+0

Вы не можете использовать функции, недоступные в вашем 'minSdkVersion', если вы не украсите класс/метод' @TargetApi '. Обратите внимание, что использование этого вызова в более низком API приведет к краху вашего приложения. – StenSoft

ответ

0

замените это;

float[]raw2=bytesToFloats(read(f2)); 

с этим;

byte[]raw2=read(f2); 

и заменить это;

FFTProcessor.performFastConvolution(convhandle, raw2, im2); 

с этим;

FFTProcessor.performFastConvolution(convhandle, bytesToFloats(raw2), im2); 
+0

, который не выполняет свертку. – hanaa

+0

ok , но я думаю, что ваше сообщение предполагает, что вы пытаетесь передать float [] в метод вместо байта [] – matty357

Смежные вопросы