2017-05-11 33 views
0

나는 AUSampler & AURemoteIO 단위를 사용하여 사용자 정의 메모를 재생하는 음악 제작 응용 프로그램을 보유하고 있습니다. 일부 사용 후에 샘플러의 AudioUnitRender에 대한 호출이 결코 반환되지 않고 오디오 스레드가 매달리고 오디오 출력이 꺼지는 문제가 있습니다. 오디오 스레드가 지속적으로 장치 콘솔 (안 디버거 출력)에 오류 메시지를 뱉어 같이 CPU 사용량 또한,이 시점에서 쏘고 :이 메시지는 AUSampler 내부 _os_log_impl에 의해 기록되고AudioUnitRender가 AUSampler에 걸림

May 11 11:45:12 <device name> mediaserverd(CoreAudio)[2296] <Notice>: HALS_IOContext.cpp:1496:IOWorkLoop_HandleOverload: HALS_IOContext::IOWorkLoop_HandleOverload: Overload on context 96 current time: 11788974 deadline: 11788958

렌더링 (구체적으로 VoiceEnvelope::GetRunFrameCount).

왜 이런 일이 일어날 수 있으며 어떻게 피할 수 있습니까?

+0

remotei의 입력 콜백 내에서 audiounitrender를 호출 하시겠습니까? 그렇다면 코드 일부를 보여줄 수 있습니다. 또한 콜백을 사용하거나 audiounitrender를 수동으로 호출 할 필요가없는 경우 audiounit 연결을 만드는 것을 고려하십시오. – dave234

+0

remoteIO 오디오 장치의 렌더링 콜백에서 호출 중입니다. 실제로 콜백 설정 및 렌더링을 처리하는 라이브러리 인 [The Amazing Audio Engine 2] (https://git.io/v9yQx)를 사용하고 있지만 [AudioUnitRender]에 대한 호출은 [line 163]에 있습니다 (https://github.com/TheAmazingAudioEngine/TheAmazingAudioEngine2/blob/master/TheAmazingAudioEngine/Modules/AudioUnitModule.m#L163) – Jayson

답변

1

문제점을 발견했습니다. 버퍼의 크기보다 큰 오프셋을 MusicDeviceMIDIEvent에 전달 했으므로 문제가 발생할 수 있습니다. 이것은 렌더링 콜백에 제공되는 타임 스탬프 가끔 점프로 인해 발생했습니다. 현재 콜백의 프레임 수보다 큰 오프셋으로 이벤트를 확인하고 무시하여 문제를 해결할 수있었습니다.