Несколько AudioTracks, один поток или несколько? - PullRequest
4 голосов
/ 22 сентября 2011

В моем приложении я буду создавать несколько аудиодорожек, некоторые из которых нужно будет воспроизводить одновременно. Я собираюсь использовать MODE_STREAM и записывать данные при запуске приложения. Звуки будут генерироваться динамически, поэтому я использую Audio Track, а не все остальное. У меня есть 4 варианта, я считаю:

  1. AsyncTask
  2. Один поток пользовательского интерфейса и один поток, который управляет всем проигрыванием AudioTrack
  3. Один поток пользовательского интерфейса и один поток для каждого AudioTrack
  4. Один поток пользовательского интерфейса и Пул потоков

Какой из четырех методов будет лучшим способом управления несколькими AudioTrack?

Я думаю, что Thread Pool - это то, что нужно, но я не уверен, что на самом деле не использовал его.

Любой совет будет принята с благодарностью

Ответы [ 3 ]

1 голос
/ 26 сентября 2011

Для простоты я просто создавал новую тему каждый раз, когда играл в AudioTrack.

Но, независимо от того, это действительно не имеет значения.Я обнаружил, что при попытке воспроизвести более одного AudioTrack за раз, появляется треск / прерывистый звук.Я полагаю, что это просто проблема с системой Android, а не с моим приложением.

Начиная с уровня API 9 (пряник), я могу применить идентификатор сеанса к звуковой дорожке, которая, как мне кажется, позволит мне воспроизвести ее.с SoundPool, который должен сделать воспроизведение нескольких AudioTracks одновременно намного более плавным.

Прямо сейчас, из-за того, что многие пользователи все еще используют 2.2, и из-за того, что у меня нет пряничного устройства, я добавлюэтот проект в стороне до позже.

0 голосов
/ 14 декабря 2013

Создайте AsyncTask для каждого AudioTrack и выполните их с помощью Excecutor (на моем Android 4.4 будет выполняться только первая задача, если Excecutor не используется). Ниже приведен пример параллельной потоковой передачи сигнала микрофона на AudioTrack и потока аудиофайлов на другой AudioTrack.

/** Task for streaming file recording to speaker. */
private class PlayerTask extends AsyncTask<Null, Null, Null> {
    private short[] buffer;
    private int bufferSize;
    private final AudioTrack audioTrack;
    ...
    @Override
    protected Null doInBackground(final Null... params) {
        ...
        while (!isCancelled()) {
            audioTrack.write(buffer, 0, bufferSize);
        }
        ...
    }
}

/** Task for streaming microphone to speaker. */
private class MicTask extends AsyncTask<Null, Null, Null> {
    private short[] buffer;
    private int bufferSize;
    private final AudioTrack audioTrack;
    ...
    @Override
    protected Null doInBackground(final Null... params) {
        ...
        while (!isCancelled()) {
            audioTrack.write(buffer, 0, bufferSize);
        }
        ...
    }
}

/** On the UI-thread starting both tasks in parallel to hear
    both sources on the speaker. **/
PlayerTask playerTask = new PlayerTask();
playerTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new Null());

MicTask micTask = new MicTask();
micTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new Null());
0 голосов
/ 22 сентября 2011

Я думаю, что лучшим вариантом для этого будет AsyncTask.

...