2010-06-19 3 views
2

필자는 빠른 연속으로 재생할 수 있도록 필요한 16 개의 짧은 사운드 클립 라이브러리를 보유하고 있습니다. 실시간으로 AVAudioPlayer 개체를 만들고 준비하는 것이 iPhone에 대해 너무 많이 묻는 것을 깨달았습니다.NSMutableArray에 AVAudioPlayer 참조를 저장하고 마음대로 재생할 수 있습니까?

그래서 내 앱을 초기화하는 동안 AVAudioPlayers 시리즈를 미리 만들어서 기본적으로 각 16 개의 사운드 중 하나가 사전로드되어 언제든지 재생할 수 있습니다.

이 문제를 깨끗하게 유지하려면 NSMutableArray에에 대한 참조를 저장하고 싶습니다. 따라서 배열 위치를 아는 것만으로 쉽게 얻을 수 있습니다. 나중에 그런

// (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]; 
} 

: 나는 현재 AVAudioPlayer 참조의 배열을 설정하고있어 어떻게

다음

은 다음과 같습니다 로그에 오류 메시지 승/그러나, 나는 그것을하고있어 방법은 시뮬레이터를 충돌한다 소리 # 8을로드하고 다시 재생하려고 시도합니다.

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

아이디어가 있으십니까? 또한 누구도 XCode와 함께 제공되는 매끄러운 디버깅 도구가 이러한 유형의 문제에 유용 할 수 있는지 알고 있습니까?

+0

그것은 주제와, 그러나 당신이 '에 캐스팅이 필요하지 않습니다 (ID) 페이지를 : 배열을 유지하고 Macatomy 이전에 언급 한 일을하도록 설정되어 내가 당신의 재산을 보장 할 '및'(NSUInteger) 16 '. 그리고 충돌 로그를 찾아 보시기 바랍니다.디버거 콘솔에 아무 것도 표시되지 않습니까? 그건 내게 일어난 일이 아니야. – Yuji

+0

감사! 매우 도움이됩니다. – todd412

답변

2

여기서 추측하고 있지만 배열의 용량에 문제가있을 수 있습니다.

시도 : soundPlayers = [[NSMutableArray alloc] init];.

이것은 크래시의 원인이 될 가능성이 없지만 -play을 호출하기 전에 NSLogging self.soundPlayer을 호출하여 nil이 아닌지 확인하십시오. 그리고 또 다른 사소한 일도 있습니다. 어레이에 추가 할 때 p을 타이프 캐스팅 할 필요가 없습니다. (id)없이 [soundPlayers addObject:p]으로 전화하십시오.

나는 코드를 살펴보고 올바르게 보이지 않는 것을 지적하면서 충돌의 정확한 원인을 알지 못합니다. 희망이 도움이!

+0

필요에 따라 NSMutableArray가 커지면 용량 문제가되지 않습니다. – progrmr

+0

오른쪽 - 용량이 문제라고 생각하지 않지만 위의 초기화 코드로 전환했습니다. 또한 typecasting 없애 버려, 고마워. – todd412

+0

이것은 그랬다! 배열을 초기화하려면 여기서 제안한 방법대로 초기화해야합니다. 다른 중요한 변경 사항은 배열에서 AVAudioPlayer 참조를 가져 오는 라인에있는 것으로 판명되었습니다. 추가 '자체'가 필요했습니다. 나는 그것이 합성 된 getter 메소드를 사용하도록 강요한다고 믿는다 : self.soundPlayer = [self.soundPlayers objectAtIndex : (NSUInteger) 8]; - 도와 주신 모든 분들께 감사드립니다! – todd412

0

어레이에 넣기 전에 prepareToPlay으로 전화하지 않아도 괜찮을 것 같습니다.

실제로 실제로 재생할 때이 방법을 사용하는 것이 좋습니다. 이 메서드에 대한 설명은 버퍼를 미리로드하고 재생을위한 오디오 하드웨어를 가져옵니다. 한 번에 16 번하는 것은 너무 많이 할 수 있습니다.

EDIT - 오류 검사를 추가해야합니다. 누락 된 결과가 나오면 initWithContentsOfURL : outError : 오류 메시지가 반환됩니다. 이를 활용하십시오 :

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

놀기 바로 전에 준비하는 것이 더 합리적이라고 생각합니다. 나는 또한 귀하의 오류를 제안 제안을 구현했습니다 - 감사합니다. 그러나 오류가 표시되지 않으므로 AVAudioPlayers가 성공적으로 만들어지고있는 것으로 보입니다. – todd412

1

soundPlayers mutable 배열이 유지되지 않을 가능성이 있습니다.

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

심지어 initWithCapacity:

+0

좋은 지적. arrray가 유지되고 있는지 확인하기 위해 헤더 파일에 다음 코드를 추가했지만 여전히 운이 없습니다. @property (비 원자력, 보유) NSMutableArray * soundPlayers; – todd412