2016-09-06 2 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 및 버퍼 재활용과 같은 것이 포함됨). 그러나 실제 음악을 재생하려면 하드웨어의 별도 부분으로 전달해야합니다. –

관련 문제