2010-06-22 2 views
2

나는 오디오를 녹음하고 나서 네트워크를 통해 방송하는 iPhone 앱을 가지고 있습니다. 원단으로부터의 "정지"에 대한 응답으로 녹음을 중지하라는 통지를 대기 행렬에 저장합니다. 아아, AudioQueueStop 호출에 도달하면 응용 프로그램이 멈 춥니 다 (즉, 중지하지 마십시오). 알림 덕분에 모든 AudioQueue 조작이 같은 스레드에서 일어나고 있습니다.iPhone CoreAudio가 멈 추면 멈춤

아무도 아이디어가 있습니까?

편집 : 레코더를 처리하는 UI 스레드에서 수신기를 설정했습니다.

내 네트워크 스레드에서 "postNotificationName"메시지를 UI 스레드에 게시했는데 모든 스레드에서 해당 메시지가 게시되었다는 것을 알았습니다. 이것은 사실로 보이지 않습니다. postNotificationName에 의해 호출되는 함수를 중단 시키면 네트워크 스레드에서 호출이 수행되고 UI 스레드에서는 호출되지 않는 것처럼 보입니다.

나는 이것이 내 실수라고 생각합니다. 누구든지 UIThread에 처리하도록 알리는 방법으로 작동시키는 법을 알고 있습니까?

편집 2 : performSelectorOnMainThread를 사용하도록 다시 작성했습니다. 그리고 그것은 여전히 ​​충돌합니다. 난 그냥 내가 호출 스택을 볼 수 있습니다 엑스 코드에서 더 많은 정보를 얻을하는 방법을 배웠 더하기 측면에서

간다 :

semaphore_timedwait_signal_trap
semaphore_timedwait_signal

pthread_cond_timedwait_relative_np
CAGuard을 _pthread_cond_wait :: 보면 WaitFor를
ClientAudioQueue :: ServicePendingCallbacks
AudioQueueStop
[기타]

누군가가 왜 정지하는지 아이디어가 있습니까?

답변

1

AudioQueueStop으로 전화하는 방법은 무엇입니까? 이 함수는 동기 및 비동기의 두 가지 모드를 지원합니다.

나머지 버퍼가 재생/기록되는 동안 함수가 즉시 반환하므로 비동기 중지를 사용하는 것이 가장 좋습니다.

당신이 동기가되고 싶으면 어쩌면 죽은 자물쇠 나 경쟁 조건이 어딘가에있을 수 있습니다. 디버거에서 응용 프로그램을 일시 중지하고 스레드의 스택 프레임을 확인하여 문제가있는 곳을 확인 했습니까?

+0

나는 그것을 즉시 끝내고 싶기 때문에 동 기적으로하고있다. 내 편집을 확인하십시오 :) – Goz

+0

"performSelectorOnMainThread"대신 NSThread의 "detachNewThreadSelector : toTarget : withObject :"메서드를 사용해 보셨습니까? 새 스레드에서 중지가 호출된다는 사실은 아마도 중단을 해결할 것입니다. –

+0

사실 면밀히 조사해 보면 바로 거기에 있습니다. 내 스레드 간 통신은 네트워크를 통해 오디오가 전송되는 것을 막는 잠금 장치를 보유하고 있으며 버퍼 채워진 콜백에서 나가기 때문에 종료 할 수 없다고 추측합니다. 나는 이것을 빨리 지금 검사 할 것이다 :) – Goz