2013-06-30 90 views
0

我的iOS應用程序有4個filePlayer單元連接到AUGraph中的混音器單元。我希望用戶能夠將四個filePlayer單元的「混合」作爲一個.caf文件發送給電子郵件。播放AUGraph時顯示UIActivityIndi​​catorView

我通過將回調附加到remoteIO並在回調中將混音器的輸出通過ExtAudioFileWriteAsync寫入文件來捕獲混音器的輸出。

我開始了這個過程 - 也就是說我打電話AUGraphStart - 當用戶點擊我的「導出混合和電子郵件」按鈕。由於AUGraphStart發生在另一個線程上,我的應用程序接下來在圖形運行時調用MFMailComposeViewController代碼。此代碼顯示電子郵件表單並將混合的.caf文件附加到電子郵件中。這裏顯而易見的問題是,該文件在創建時並未完全寫入,因爲圖形仍在運行。

要解決此問題,拉開AUGraph開始之後我這樣做:

while ([myMixerObject graphIsRunning]) { 
//  NSLog(@"...waiting for graph to stop..."); 
    } 

graphIsRunning簡單地調用AUGraphIsRunning,並返回一個布爾值。

雖然看起來有些呆滯,但它仍然有效,但我一直在繼續。

當AUGraph捕獲混合器的輸出時,當我試圖顯示UIActivityIndicatorView時,事情變得更加重要。總之,當我這樣做...

[activityIndicator startAnimating]; 
    while ([myMixerObject graphIsRunning]) { 
//  NSLog(@"...waiting for graph to stop..."); 
    } 
    [activityIndicator stopAnimating]; 

...該指標永遠不會出現。

只是爲了踢我把[activityIndicator startAnimating]內while循環,但它仍然不會出現。

我已經檢查過activityIndi​​cator對象正在被正確實例化(例如,當圖表沒有運行時,我可以讓它出現),所以它讓我相信在AUGraph運行時調用它有一些特別的東西。

我還是iOS和Core Audio的新手,但我知道某些Core Audio調用發生在實時線程上,所以我的第一個懷疑是有一些併發問題正在進行。但我不知道從哪裏開始。我的while()循環是從哪裏開始的?我應該以不同的方式接近嗎?

在此先感謝。

回答

1

您的while循環阻塞了主線程,這就是您遇到UI問題的原因。我建議不要輪詢混音器對象,而是要定期(每秒5-10次)註冊一個回叫(使用NSTimer或GCD定時器)。此回調應檢查混合器圖形是否正在運行。圖形停止後,您的計時器回調可以處理必要的UI更改和清理。

相關問題