2014-11-13 2 views
0

Я создаю приложение для Android, которое импульсирует значок - простой импульс, 2x размер при громкой громкости и 1 раз без звука - на основе звука. Стоит отметить, что мой min api равен 15.Android пульсирует значок при изменении объема .wav

Пользователь выбирает режим (файл) для воспроизведения, и я использую AudioTrack для воспроизведения его в бесконечном цикле. Каждый выбор wav варьируется от < секунд до 2 или 3 секунд. Audiotrack позволяет мне устанавливать громкость и высоту тона в реальном времени на основе пользовательского ввода (SoundPool неправильно менял шаг в Kitkat). Поскольку громкость изменяется в пределах каждого аудиотрека, я пытаюсь сжать и развить значок. До сих пор я пробовал визуализатор, чтобы получить данные осциллограммы и fft по мере воспроизведения трека, но я не уверен, что это правильно.

Есть ли способ получить (ближайшее возможное) изменение в реальном времени db из аудиотрека? Кажется, что функция формы волны всегда находится между 108 и 112, поэтому я не думаю, что правильно ее использую. Самый простой пример pulse.wav является here

Мой AudioTrack инициализации с использованием байт [] из данных ИКМ-

AudioTrack mAudioTrack = new AudioTrack(AudioAudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, getMinBuffer(sound), AudioTrack.MODE_STATIC); 
mAudioTrack.write(mSound, 0, mSound.length); 
mAudioTrack.setLoopPoints(0, (int)(mSound.length/4), -1); 

My Visualizer

Visualizer mVisualizer = new Visualizer(mAudioTrack.getAudioSessionId()); 
mVisualizer.setEnabled(false); 
mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]); 
mVisualizer.setDataCaptureListener(new Visualizer.OnDataCaptureListener { 
    @Override 
    public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) { 
     double sum = 0; 

     for (int i = 0; i < bytes.length; i++) { 
      sum += Math.abs(bytes[i]) * Math.abs(bytes[i]); 
     } 

     double volume = (double) Math.sqrt(1.0d * sum/bytes.length); 
     //THIS IS THE RESIZE FUNCTION// 
     //resizeHeart((double) volume); 
     System.out.println("Volume: " + volume); //always prints out between 108 and 112. 
    } 
    @Override 
    public void onFftDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) { 
     //not sure what to do here. 
    } 
}, Visualizer.getMaxCaptureRate()/2, true, true); 
mVisualizer.setEnabled(true); 

ответ

0

Проблема заключается в том, что вы обрабатывать байты как если вы указали 16-разрядный размер выборки. Попробуйте что-нибудь подобное (обратите внимание, что абс не нужен, так как вы все равно возвышаетесь):

for (int i = 0; i < bytes.length/2; i+=2) { 
     int sample = bytes[i] << 8 || bytes[i+1]; 
     sum += sample * sample; 
    } 
+0

Это приводит к предупреждению оператора '||' не может применяться к 'int', 'byte'. Какие-либо предложения? –

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