Android: Смешивание нескольких экземпляров AudioTrack?

Мне нужно одновременно запускать два экземпляра AudioTrack. Они должны запускаться отдельно, потому что я играю их по разным, переменным частотам выборки. Я обнаружил, что если я запускаю их в одном потоке, они «по очереди». Я запускаю их каждый в своем потоке, но звук заикается.

Любые идеи по созданию двух экземпляров играют хорошо? Если нет, советы по смешиванию двух коротких буферов в один, даже если я хочу играть их с разной частотой дискретизации.

У меня есть 4 аудио трека, играющих одновременно, и они, кажется, играют хорошо. Тестирование на HTC Desire 1.1ghz OC. Иногда я получаю сбои с резьбой. Иногда, если все четыре играют, один не останавливается, когда я пытаюсь присоединиться к потоку. Необходимо провести больше испытаний. Вот мой класс для воспроизведения wav-файла, записанного по заданному пути

package com.ron.audio.functions; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import android.media.AudioFormat; import android.media.AudioManager; import android.media.AudioTrack; public class AudioPlayManager implements Runnable { private File fileName; private volatile boolean playing; public AudioPlayManager() { super(); setPlaying(false); } public void run(){ // Get the length of the audio stored in the file (16 bit so 2 bytes per short) // and create a short array to store the recorded audio. int musicLength = (int)(fileName.length()/2); short[] music = new short[musicLength]; try { // Create a DataInputStream to read the audio data back from the saved file. InputStream is = new FileInputStream(fileName); BufferedInputStream bis = new BufferedInputStream(is); DataInputStream dis = new DataInputStream(bis); // Read the file into the music array. int i = 0; while (dis.available() > 0) { music[i] = dis.readShort(); i++; } // Close the input streams. dis.close(); // Create a new AudioTrack object using the same parameters as the AudioRecord // object used to create the file. AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, musicLength, AudioTrack.MODE_STREAM); // Start playback audioTrack.play(); // Write the music buffer to the AudioTrack object while(playing){ audioTrack.write(music, 0, musicLength); } } catch(Exception e){ e.printStackTrace(); } } public void setFileName(File fileName) { this.fileName = fileName; } public File getFileName() { return fileName; } public void setPlaying(boolean playing) { this.playing = playing; } public boolean isPlaying() { return playing; } 

}

Intereting Posts
Google oauth как использовать токен обновления Невозможно фильтровать активы для нескольких плотностей с использованием инструментов сборки SDK 21 или более поздней версии Почему эмулятор Android настолько медленный? Как мы можем ускорить разработку эмулятора Android? Поддержка нескольких apk для Android TV и телефона «ИМЯ НЕИСПРАВНОСТИ ФАЙЛА: ДОЛЖНО СОДЕРЖАТЬ ТОЛЬКО » Для звуковых файлов в Android Studio Андроид TextView.setText не работает с простым виджетами Icu4j слишком большая, любая альтернатива? ActivityNotFoundException при отправке электронной почты из приложения Представления StackedWidget, не показывающие Как Google оценивает мое местоположение без GPS? Сохранение данных приложений Android при выходе приложения Как добавить изображение в расширяемый список в parent в android? Как настроить линию в диалоговом окне в стиле Android ICS RecyclerView в DialogFragment -> перетаскивание мышью (swap) Получить положительную кнопку в DialogPreference