SoundPool にいくつかのトラックをロードし、いくつかの条件に基づいてそれらを切り替えようとしています。
最初のトラックでさえ再生が開始されず、次のエラーが表示されます。
10-23 22:11:07.240: E/AudioTrack(16803): AudioFlinger could not create track, status: -12
10-23 22:11:07.240: E/SoundPool(16803): Error creating AudioTrack
私はGoogleでいくつかの調査を行い、MP3ファイルをOGG形式で保存し、その期間を可能な限り短縮することに至りました. 各ファイルの長さは約 3 秒で、同じ SoundPool オブジェクトを使用して無限ループに入れました。Audacity を使用して OGG 形式でエクスポートしましたが、Audacity は ConstantBitRate をサポートしていません。これは、SoundPool について見つけたいくつかの記事/質問に従って使用することになっています。
これで 2 つのサウンド ファイルをロードできましたが、3 つ目のファイルを開始しようとすると、このエラーが再び発生します。
10-23 22:11:07.240: E/AudioTrack(16803): AudioFlinger could not create track, status: -12
10-23 22:11:07.240: E/SoundPool(16803): Error creating AudioTrack
3 つのファイルすべてを同時に再生するにはどうすればよいですか?
編集:アクティビティのコードは次のとおりです。
private SoundPool soundPool;
private AudioManager audioManager;
private float actVolume;
private float maxVolume;
private float volume;
private boolean mainPlaying;
private Integer clean = -1;
private Integer filter1 = -1;
private Integer filter2 = -1;
private Integer[] mainAudios = new Integer[] { clean, filter1, filter2 };
private int remaining;
// ...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// /////////////////////////////// AUDIO
audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
actVolume = (float) audioManager
.getStreamVolume(AudioManager.STREAM_MUSIC);
maxVolume = (float) audioManager
.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
volume = actVolume / maxVolume;
setVolumeControlStream(AudioManager.STREAM_MUSIC);
soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId,
int status) {
remaining--;
if (remaining == 0) {
mainAudios = new Integer[] { clean, filter1, filter2 };
for (int id : mainAudios)
soundPool.play(id, 0, 0, 1, -1, 1f);
mainPlaying = true;
}
}
});
remaining = mainAudios.length;
clean = soundPool.load(this, R.raw.angle_normal, 1);
filter1 = soundPool.load(this, R.raw.filter2, 1);
filter2 = soundPool.load(this, R.raw.filter5, 1);
// //////////////////////////////////////////////////
// ...
}