2016-09-06 11 views
0

私はMIDIファイルから得られるタイミングデータがあるシナリオを持っています。 MIDIノートを再生する必要があるときは、UDP経由でコマンドを送信する必要があります。基本的には、「ノートAを再生し、125ms待って、ノートBを再生し、300ms待って、メモCを再生する」という指示があり、「ノートXを再生する」たびにUDPでデータを送信する必要があります。私はTimerTaskとシステム時間をチェックし、どれくらいの時間が経過したかを計算し、それに基づいてノートを再生するかどうかを決めるループを持つ単純なスレッドを使って試しましたが、どちらの方法もタイミングの問題を抱えているようです。 TimerTaskは指定された間隔(ドキュメントに記載されている)で正確に実行されないので、エラーメッセージが表示されます。スレッドはうまく動作しますが、それは他のスレッドが優先されているので、時々発生することがあります。Androidアプリで正確なタイミングでデータを送信するにはどうすればよいですか?

より正確なタイミングでこのデータを送信するより良い方法はありますか?オーディオを再生するために使用されるJavaのClipインターフェイスのようなものがありますか?

ご協力いただきありがとうございます。

答えて

0

これは失敗に終わる運命です。ここで問題を数えてみましょう:

1)AndroidはリアルタイムOSではありません。どちらもLinux(それが構築されている)ではない。 msレベルのタイミングが正確に起こることを期待することは決してうまくいかない。クロックが1msのレートで中断するのに十分正確であっても、Linuxが目覚めのためにスレッドをスケジュールするという保証はありません。

2)にTimerTasksであっても1

3)あなたはその後、UDP経由でどこかにそれを送っていることにより、限られた程度に正確であることを約束されていませんか?受信者が配信やタイミングの保証を受けていないプロトコルで、受信者が何らかの操作を行うと、受信者自身がタイミングの問題が発生する可能性があります。

この全体的なアプローチを捨てて、やり直してください。これのすべてのステップは悪い考えを示しています。

+0

したがって、オーディオを再生するアプリケーションは適切な時間を保ちますか? Androidアプリがファイルから曲を再生するとき、これらのタイプの問題はありません。私はあなたが上記のものではないと言っているわけではありません、私はあなたが言及した問題にもかかわらず、オーディオ再生がどのように達成されるか知りたいです – jteezy14

+0

タイミングデータではありません。ファイルデータをメモリに書き込みます。次に、データがどこにあるかをサウンドカードに伝え、サウンドカードはメモリを読み取り、それを出力します。これはもちろん簡素化です(完全な答えにはDMAやバッファリサイクルなどが含まれます)が、実際の音楽を再生するには別のハードウェアに渡します。 –

関連する問題