2013-08-13 3 views
0

좋아요. 오디오 분석 응용 프로그램을 발표 할 예정 이니 코어 오디오를 사용하여 모노 터치 문제를 발견했습니다. 모노 터치는 실제로 코어 오디오/리모트 IO를위한 바인딩을 가지고 있으며 잘 작성된 Miguel이 작성한 샘플이 있습니다. 그건 큰 시간의 99 %를 작동합니다. 문제는 coreaudio의 렌더링 콜백 중에 "세계 정지"가비지 컬렉터가 발생한다고 생각하는 곳에서 발생합니다. 이 시점에서 우리는 관리되는 코드에 있으므로 렌더링 콜백은 gc가 끝날 때까지 돌아 가지 않을 것이라고 생각할 수 있습니다. 결과적으로 160 프레임 중 약 1 프레임이 삭제됩니다 (약 2 ~ 4 초마다).Coreaudio가 모노 터치로 콜백을 렌더링합니다.

그래서 시간 낭비인지 아는 지혜가없는 세 가지 옵션이 있습니다.

코드 오디오 C의 콜백 (다른 모든 코어 오디오 인터페이스 코드) 렌더링 작성합니다. 그런 다음 필자는 관리 코드가 분석 할 수있는 속도로 샘플을 빠르게 가져올 수있었습니다. 이렇게하면 20ms 동안 일시 중지 된 경우에도 프레임이 떨어지는 것을 방지 할 수 있습니다. 내 주요 질문은 모노럴 터치로 할 수 있는가? 완전히 관리되지 않는 경우 핵심 오디오 콜백 함수가 gc에 의해 중단됩니까? 그런 다음 필요에 따라 데이터를 읽는 비 관리 순환 큐를 가질 수 있습니다.

그냥 곡은 어떤 방법으로 GC는 덜 효율적이지만 세계의 적은 시간으로 일시 정지합니다. 항상 5ms 미만이면 아마 안전 할 것입니다. 나는 xamarin 스튜디오에서 이것을하는 방법을 모른다. 그것은 링커 옵션이나 그저 무리일까요?

다른 API를 사용하십시오. 입력 대기열 API를 시도했지만 대기 시간이 끔찍했습니다. 중간 정도입니까?

나는의 CoreAudio 끝내 모든 것을 알고 있지만, 내 필요를 위해 개발하는 약 100 배 빠르게이 분야에서이 응용 프로그램의 안드로이드 포트를 인정하고있다.

+1

나는 자 마린에 버그를 제출하고 그들이 그것을인지, 더 나는이 정확히 말하자면 당 버그라고 생각하지 않습니다 --- – Jason

+0

은 물론 나는 그것을 할 수있는 말을 볼 것이다 "설계대로 작동": 렌더링 콜백은 일정한 시간 보증을 요구하며 gc는이를 처리 할 수 ​​있습니다. 글리치가없이 모노크롬에서 저 레이턴시 오디오 레코딩을 원하는 많은 사람들이 있어야한다는 것을 고려할 때 여전히 나에게 전달하는 것이 좋을 것입니다. – user2680276

+0

Obj-C에서 수행 할 수 있다면 MT로 할 수 있어야하며 Xamarin도 동의 할 것입니다. GC가 간섭하는 경우 GC를 조정해야하거나 코드에서 다른 방법을 사용할 수 있습니다. 어쨌든, 나는 Xamarin 사람들이 당신의 코드를보고 충돌이있는 곳을보고 싶어한다고 생각합니다. – Jason

답변

4

애플 DTS는 심지어 짧은 기간 코어 오디오 콜백 만 결정적 직선 C (어쩌면 정적 파견 C++)에서 일반적인 목적 C 방법을 사용하지 않는 것이 좋습니다. 모든 동적 디스패치 또는 메모리 관리로 인해 오디오 언더 플로가 발생할 수 있습니다. 따라서 Monotouch 런타임 내부의 모든 GC 및 기타 메모리 관리 (확실하지 않음)를 실시간 콜백에 사용하기에는 적합하지 않을 수 있습니다.

저 지연 오디오의 비용, 특히 오래된 하드웨어의 비용입니다. 당신이 재현 가능한 테스트 케이스가있는 경우

+0

정보를 제공해 주셔서 감사합니다. 다행히도 내 응용 프로그램은 모든 백만에서 하나의 프레임을 삭제 처리 할 수 ​​있습니다. 매 160 분의 1에 불과하지 않습니다.minumum 응답 시간을 5ms에서 20ms로 늘리면 gc가 작업을 완료 할 수있는 여지가 충분 해집니다. 모노 토치 런타임이 여전히 핵심 오디오 콜백을 멈출 수 있다면, 또는 내가 거기에서 그것을 할 수 있다면 완전히 관리되지 않기 때문에, "네이티브 라이브러리에 모두 쓰십시오." – user2680276

+0

또한 iOS는 오디오 유닛이 시작된 후 버퍼 지속 시간을 앱이 요청한 시간에서 변경할 수 있습니다. 실시간 오디오 스레드에 블로킹 및 관리 코드가없는 경우 다른 런타임 코드가 해당 스레드에 많은 영향을 줄 수는 없습니다. – hotpaw2

+0

매우 사실이므로 하드웨어 버퍼 크기를 직접 설정하지 못할 수도 있습니다. 샘플을 보장하는 가장 좋은 방법은 기본 코드로 인터페이스와 콜백을 완전히 작성하고 잠금이없는 순환 대기열 또는 무언가를 사용하는 것입니다 (기본적으로 위의 옵션 1). 이것이 과잉 또는 고품질 공학인지 확실하지 않습니다. – user2680276

관련 문제