静的モードで0.5 秒間繰り返し再生したいのですAudioTrack
が、音が途切れるという問題に直面しています。TransitionDrawable
しかし、並走中の音は完全にクリアであることに気付きました。
私のコードの簡略化されたスケルトンは次のとおりです。
thread = new Thread(new Runnable() {
public void run() {
createTransition();
try {
createAudioTrack();
while (true) {
if (audio) {
playSoundClip();
}
if (display) {
playScreenTransition();
}
Thread.sleep(getDelayBetweenBeats());
}
} catch (InterruptedException e) {
} finally {
resetScreenTransition();
stopSoundClip();
}
}
private void createAudioTrack() {
short[] samples = generateSamples();
track = new AudioTrack(AudioManager.STREAM_MUSIC, SAMPLERATE, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, samples.length * 2, AudioTrack.MODE_STATIC);
if (track.getState() != AudioTrack.STATE_UNINITIALIZED) {
track.write(samples, 0, samples.length);
}
}
private void playSoundClip() {
if (track != null && track.getState() != AudioTrack.STATE_UNINITIALIZED) {
track.stop();
track.reloadStaticData();
track.play();
}
}
private void playScreenTransition() {
view.post(new Runnable() {
public void run() {
view.setBackgroundDrawable(transition);
transition.startTransition(DURATION);
}
});
}
});
thread.start();
ご覧のとおりthread
、UI スレッドでは実行されないため、track
マルチスレッドの問題に直面していると思います。オーディオが並行して再生されているため、トランジションを再生する UI スレッドが CPU 全体を消費するとは思いません。アクティビティが何らかの形で CPU を消費し、他に何も実行されていないように見えます。
も使用しようとしview.post(new Runnable() {...});
ましplaySoundClip()
たが、役に立ちませんでした。
すべてを に変更することを考えましたAsyncTask
が、バックグラウンド タスクのままであるため、何も変更されません。UI 要素をサウンドで更新する必要がなく、トランジションを並行して再生する必要があるため、それも試しませんでした。
解決策は、おそらく常にいくつかのトランジションを並行して実行することです (実際のトランジションまたはダミーのトランジション)。
track
常にプレイを明確にする別の方法を知っている人はいますか?
編集:
この問題でさらに作業し、プログラムを拡張した後、ロジックが完了するまでに時間がかかり、UI ですべてを実行できないため、上で示したようなスレッド化されたアプローチを使用する必要があることに気付きました-もうスレッド。現在、オーディオの再生中にダミーのトランジションを再生していますが、それでもまだ悪いように聞こえます。したがって、このトピックに関する洞察を提供できる場合は、ここに投稿/回答してください。