多个AudioTracks,单线程还是多个?

时间:2011-09-22 03:26:22

标签: android multithreading audio threadpool

在我的应用程序中,我将创建多个音频轨道,其中一些需要同时播放。我将使用MODE_STREAM并在应用程序运行时写入数据。声音将动态生成,这就是我使用Audio Track而不是其他任何东西的原因。 我相信有4种选择:

  1. 的AsyncTask
  2. 一个UI线程和一个管理所有AudioTrack播放的线程
  3. 每个AudioTrack的一个UI线程和一个线程
  4. 一个UI主题和一个Thread Pool
  5. 这四种方法中哪一种是管理多个AudioTracks的最佳方式?

    我认为线程池是可行的方法,但我没有肯定,因为我实际上并没有使用它。

    非常感谢任何建议

3 个答案:

答案 0 :(得分:1)

为简单起见,我每次播放AudioTrack时都只创建一个新线程。

但是,不管它真的没关系。我发现当尝试一次播放多个AudioTrack时,会发出噼里啪啦声。我认为这只是Android系统的一个问题,而不是我的应用程序。

从API级别9(姜饼)开始,我可以将会话ID应用到音频轨道,我相信我可以使用SoundPool播放它,这样可以让多个AudioTracks的播放更加顺畅。

目前,由于有多少用户仍在使用2.2以及我没有使用姜饼设备这一事实,我将把这个项目放到一边,直到稍后。

答案 1 :(得分:0)

我认为你最好的选择是AsyncTask。

答案 2 :(得分:0)

为每个AudioTrack创建一个AsyncTask,并使用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());