2010-06-19 63 views
2

我有一個需要快速連續播放的16個短聲片段庫。我意識到,實時創建和準備對象實在太難以問及iPhone。我可以將AVAudioPlayer引用存儲在NSMutableArray中並隨意播放它們嗎?

所以相反,在我的應用程序的初始化過程中,我預先創建了一系列AVAudioPlayers,這樣每個基本上都預先加載了我的16個聲音中的一個,因此它們隨時可以播放。

問題是,爲了保持這個清潔,我想將這些16 AVAudioPlayers的參考文件存儲在NSMutableArray中,所以我只需知道它們的陣列位置就可以輕鬆獲得它們。但是,我做的方式崩潰模擬器W /日誌中沒有錯誤消息:

這裏是我當前如何建立的AVAudioPlayer引用數組:

// (soundPlayers is an NSMutableArray instance var) 
soundPlayers = [NSMutableArray arrayWithCapacity:(NSUInteger)16];          

for (int i = 0; i < 16; i++) { 
    NSString *soundName = [NSString stringWithFormat:@"sound-%d", i]; 
    NSString *soundPath = [[NSBundle mainBundle] pathForResource:soundName ofType:@"mp3"]; 
    NSURL *soundFile = [[NSURL alloc] initFileURLWithPath:soundPath]; 
    AVAudioPlayer *p = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFile error:nil]; 
    [soundFile release]; 
    [p prepareToPlay]; 
    [soundPlayers addObject:(id)p]; 
    [p release]; 
} 

再後來我嘗試加載聲音#8並播放:

// (soundPlayer is an AVAudioPlayer instance var) 
self.soundPlayer = [soundPlayers objectAtIndex:(NSUInteger)8]; 
[soundPlayer play]; 

任何想法?也有人知道,如果任何與XCode一起提供的漂亮的調試工具對這類問題有用嗎?

+0

這是題外話,但你並不需要在'投(ID)p '和'(NSUInteger)16'。請確保查看崩潰日誌。調試器控制檯中沒有顯示任何內容嗎?這從來沒有發生在我身上。 – Yuji 2010-06-19 03:11:14

+0

謝謝!很有幫助。 – todd412 2010-06-19 18:48:12

回答

2

我只是猜測在這裏,但數組的容量可能有問題。

嘗試:soundPlayers = [[NSMutableArray alloc] init];改爲。

這不太可能是導致崩潰的原因,但請在調用-play之前嘗試NSLogging self.soundPlayer以確保其不是nil。還有一件小事:在將數組添加到數組時,不需要輸入p。只需撥打[soundPlayers addObject:p]而不需要(id)

我不確定你的崩潰的確切原因,只是通過代碼並指出什麼看起來不正確。希望這可以幫助!

+0

NSMutableArray根據需要增長,容量不是問題。 – progrmr 2010-06-19 03:36:08

+0

右鍵 - 我不認爲容量是問題,但我切換到上述初始化代碼以防萬一。也擺脫了類型轉換,謝謝。 – todd412 2010-06-19 19:01:58

+0

這樣做了!事實證明,我確實需要按照您在這裏建議的方式初始化陣列以使其工作。另一個關鍵的變化竟然出現在我從數組中拉入AVAudioPlayer引用的行中 - 它需要一個額外的「自我」。我相信迫使它使用合成的'getter'方法,如下所示:self.soundPlayer = [self.soundPlayers objectAtIndex:(NSUInteger)8]; - 感謝大家的幫助! – todd412 2010-06-20 03:29:14

0

對我來說看起來還不錯,除非在放入數組之前不應該調用prepareToPlay

當你真的打算玩它時,最好這樣做。該方法的描述表明它預加載緩衝區並獲取用於播放的音頻硬件。一次做16次可能太多了。

編輯 - 您還應該添加錯誤檢查,您的缺失結果可能會告訴你什麼是錯誤的,initWithContentsOfURL:outError:返回錯誤消息。利用這一點:

NSError* error = nil; 
AVAudioPlayer *p = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFile error:&error]; 
if (error) { 
    NSLog(@"ERROR: %@, URL=%@", error.localizedDescription, soundFile); 
} 
+0

我認爲在播放之前準備它們確實更有意義,我改變了這一點。 我也實現了你的錯誤檢查建議 - 謝謝你。但是,它沒有顯示任何錯誤,所以看起來AVAudioPlayers正在成功創建。 – todd412 2010-06-19 19:00:24

1

這是最有可能的情況下,你的soundPlayers可變陣列正在釋放某些點,因爲你不保留它。我將確保您的財產爲陣列設置爲保留和做什麼Macatomy如前所述:

self.soundPlayers = [[NSMutableArray alloc] init]; 

甚至initWithCapacity:

+0

好點。我將下面的代碼添加到頭文件中,以確保arrray得到保留,但仍然沒有運氣。 @property(nonatomic,retain)NSMutableArray * soundPlayers; – todd412 2010-06-19 19:20:15

相關問題