2011-09-20 7 views
1

저는 Core Audio Audio Unit를 사용하는 iPad 응용 프로그램 (튜너)을 가지고 있습니다. 마이크에서 신호를 읽고 처리합니다. 소리를 스피커로 울리지 않습니다.마이크 및 스피커 피드백

불행히도, 다른 시간에 신호는 실제로 피드백을 받고 스피커에서 나옵니다. 마이크와 스피커를 연결하지 않았지만 마이크가 어떻게 든 켜져 있다는 착각을 불러 일으킨다. 그것은 직접적인 신호가 아닙니다. 그것은 잘게 잘려서 일어나기 전에 다소 큰 소리를 내야합니다.

저는 이것이 CPU 오버로드와 관련이 있다고 우려하고 있습니다. 나는 콜백이 뒤지고 있다고 생각하지 않는다. 디버그 문을 콜백에 넣으면 Audio Unit을 끄면 멈추는 것처럼 보입니다. 또 다른 이상한 점이 있습니다. 특정 시간에 Audio Unit이 정지 된 경우에도 마이크에서 스피커까지 피드백이 계속 발생하여 끊김없는 잡음이 멈추기 전에 앱을 종료하고 백그라운드 처리 대기열에서 제거해야합니다.

이상하게도 이것은 매번 그리고 모든 테스터에게 발생하지는 않지만 종종 저어를 생성하기에 충분합니다.

답변

3

RemoteIO 콜백이 너무 느리고 응용 프로그램이 충돌하여 오디오 콜백 처리를 중단하면 RemoteIO 오디오 버퍼가 재생되어 이전 재생 버퍼 중 일부 또는 레코드 버퍼가 종료 될 수 있습니다 언더 플로우 된 오디오 채널에서 반복되거나 반복됩니다. 이를 테스트하는 한 가지 방법은 콜백 내에서 모든 처리 코드 (및 너무 느릴 수있는 디버그 인쇄물)를 주석 처리하고 이것이 "피드백"문제를 수정하는지 확인하는 것입니다.

RemoteIO 레코드 및 재생 콜백 모두에서 간단한 버퍼 복사본 및/또는 기타 낮은 오버 헤드 빠른 처리 만 수행하십시오. 원격 콜백 내부에서 데이터를 처리하지 말고 나중에 콜백 외부에서 수행 할 작업을 핸드 셰이크, 일정 또는 대기열에 넣지 마십시오.

응용 프로그램이 어떻게 든 감지 할 수 없다면 RemoteIO 오디오 장치 (AudioOutputUnitStop)를 중지해야합니다.

각 레코드 콜백을 종료하기 전에 완료 한 후에 각 레코드 버퍼의 데이터를 0으로 설정하십시오. iPhoneOS의 아주 오래된 버전의 버그를 수정하는 데 도움이 될 수 있다는보고가있었습니다.

+0

네가 머리에 못을 박은 것 같아. 처리 과정을 줄이고 피드백이 사라졌습니다. "스스로"내가 뒤에 떨어지는 지 여부를 감지하려면 - inTimeStamp를보고 싶을 것입니다. 그리고 얼마나 많은 샘플이 들어 왔는지 알고 콜백 간의 시간이 아닌지 확인하기 위해 약간의 수학을 수행하십시오. 어떻게 든 성장하거나 일관되게 그 이상이어야합니다. 나는 버스 1 (마이크)에 연결되어 있고 오디오를 지역의 정적 버퍼로 렌더링하기 때문에 실제로 여기에 제로가 없는지 확실하지는 않습니다. 그러나 그 사실을 명심해야합니다. ioData 버퍼를 사용하기 시작합니다. –