2016-09-06 2 views
0

У меня есть сценарий, где у меня есть некоторые данные синхронизации, которые я получаю из файла MIDI. Когда нужно прослушивать MIDI-ноту, мне нужно отправить команду поверх UDP. В принципе, у меня есть инструкции, которые говорят «сыграйте в заметку A, подождите 125 мс, играйте в заметку B, подождите 300 мс, играйте в ноту C ...», и каждый раз, когда я «играю в ноту X», мне нужно отправлять данные по UDP. Я пробовал использовать как TimerTask, так и простой поток с циклом, который проверяет системное время и вычисляет, сколько времени прошло, и решить, следует ли играть ноту на основе этого, но оба метода, похоже, имеют проблемы с синхронизацией. TimerTask не работает точно на указанном интервале (что указано в документации), поэтому я получаю неустойчивые сообщения. Нить работает лучше, но по-прежнему она иногда икает, потому что другие потоки получают приоритет над ней.Как отправить данные с точным временем в приложении Android?

Есть ли лучший способ отправить эти данные с более точным временем? Есть ли что-то, что я могу использовать, например, интерфейс Clip на Java, который используется для воспроизведения звука?

Любая помощь очень ценится.

ответ

0

Это подход, обреченный на провал. Позвольте мне посчитать здесь вопросы:

1) Android не является оперативной ОС. Также не Linux (который построен на нем). Ожидание того, что тайм-ауты уровня мс будет происходить точно правильно, никогда не будет работать. Даже если часы достаточно точны, чтобы прерывать скорость 1 мс, нет никакой уверенности в том, что Linux заплатит ваш поток для пробуждения.

2) TimerTasks не обещал быть точным, даже до такой степени ограничена 1.

3) Вы затем отправить его куда-нибудь через UDP? Протокол, который не имеет гарантий относительно доставки или времени, получателю, который затем что-то сделает с ним, и у этого получателя могут быть дополнительные проблемы времени.

Выбросьте весь этот подход и начните сначала, я буду советом. На каждом шагу это говорит плохая идея.

+0

Так как приложение, которое воспроизводит аудио, сохраняет правильное время? Когда приложение Android воспроизводит песню из файла, у нее нет таких проблем. Я не говорю, что вы не правы выше, я просто хочу знать, как выполняется воспроизведение звука, несмотря на проблемы, о которых вы говорили. – jteezy14

+0

Не по времени. Он записывает данные файла в память. Затем он сообщает звуковой карте, где находятся данные, а звуковая карта считывает память и обрабатывает ее. Это, конечно, упрощение (полный ответ включает такие вещи, как DMA и переработка буфера), но для воспроизведения реальной музыки он передает ее отдельному аппарату. –