2011-05-08 4 views
0

사운드가 끝나면 다른 사운드를 재생할 수 있지만이 코드에서는 사운드가 혼합되어 있습니다 ... 어떻게 해결할 수 있습니까? audioplayerdidfinishplaying problem! iphone sdk

-(IBAction) ... { 
    for (...) { 
    if (compare(Output, N1)) { 
     songPath = [[NSBundle mainBundle] pathForResource:@"a" ofType:@"wav"]; 
    } 
    if (compare(Output, N2)) { 
     songPath = [[NSBundle mainBundle] pathForResource:@"b" ofType:@"wav"]; 
    } 
    audioPlayer=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath: songPath] error:NULL]; 
       [audioPlayer setDelegate:self]; 
       [audioPlayer play]; 
    } 
} 


-(void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL) flag { 
    NSLog(@"Song FINISHED!!!!!!"); 
    [player release]; 
} 
+0

'for'루프에'[audioPlayer play]'를 넣었습니다. 분명히 루프에 여러 번의 오디오 플레이어가 함께있을 때보 다 1 회 이상의 반복이있는 경우입니다. –

답변

0

코드는 정말 이해할 수없는,하지만 난 당신의 목표는 무엇을 얻을 생각합니다.

구현하려면 NSArray *itemsToPlay이 있어야합니다. 처음부터 (즉, 사용자가 버튼을 탭하면) 모든 소리가 가득 찼습니다.

사용자가 버튼을 누르면, IBAction이 호출됩니다. 여기서 첫 번째 사운드를 itemsToPlay에서 선택하고 (이 컨테이너에서 제거한 후) audioPlayer에게 재생하도록 알려줍니다.

재생이 끝나면 audioPlayerDidFinishPlaying:successfully:이 호출됩니다. 여기서 다시 한 번 itemsToPlay에서 첫 번째 항목을 선택하고 audioPlayer을 다시 초기화하십시오. 다시 말하지만, 재생하려면 audioPlayer라고 말하십시오.

itemsToPlay이 비어 있으면이주기가 종료됩니다.

1

사용자가 오디오 플레이어를 재생하면 오디오 플레이어가 재생되지만 오디오가 끝나지 않은 상태에서 다시 누르면 오디오 플레이어의 다른 개체가 오디오 파일에 대한 다른 참조와 함께 만들어지는 것처럼 보입니다. 이렇게하면 두 개 이상의 오디오가 동시에 재생됩니다. 솔루션은 간단합니다. 플레이어가 이미 재생 중이면 버튼을 누를 때마다 확인하여 플레이어를 중지하고 새 URL URL 참조로 새 인스턴스를 만듭니다. 이렇게하려면 audioPlayer를 합성하여

으로 사용해야합니다
-(IBAction) ... { 
    for (...) { 
    if (compare(Output, N1)) { 
    songPath = [[NSBundle mainBundle] pathForResource:@"a" ofType:@"wav"]; 
    } 
    if (compare(Output, N2)) { 
    songPath = [[NSBundle mainBundle] pathForResource:@"b" ofType:@"wav"]; 
    } 
    if(self.audioPlayer){ 
    self.audioPlayer.delegate=nil; 
    self.audioPlayer=nil; 
    } 
    self.audioPlayer=[[AVAudioPlayer alloc] initWithContentsOfURL: 
          [NSURL fileURLWithPath: songPath] error:NULL]; 
    [self.audioPlayer setDelegate:self]; 
    [self.audioPlayer play]; 
    } 
} 


-(void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL) flag { 
    NSLog(@"Song FINISHED!!!!!!"); 
    [self.audioPlayer setDelegate:nil]; 
    self.audioPlayer=nil; 
    } 
+0

문제가 발생합니다. self.audioPlayer = nil 그런 다음 [self.audioPlayer setDelegate : nil]; ? –

+0

예, 위 코드가 잘못되었습니다. delegate가 nil로 설정되면 audioPlayer를 nil로 설정해야합니다. 델리게이트는 오디오 플레이어 자체의 약한 속성이기 때문에 오디오 플레이어가 보존하지 못하고 충돌을 일으키지 않을 수도 있지만 올바른 방법은 아닙니다. – Sandeep