Воспроизведение нескольких звуков одновременно? - PullRequest
3 голосов
/ 24 марта 2011

У меня 6 звуков на одном экране.

Тем не менее, я хочу, чтобы я мог играть более одного одновременно, чтобы вы нажали на звук 1 (звук 1 воспроизводился), а затем на звук 2. пока звучит звук 1.

Но в тот момент, когда я нажимаю звук 1 (воспроизводится звук 1), нажимаю звук 2 (воспроизводится звук 2, но звук 1 останавливается)

Вот код для аудио части.

- (IBAction)oneSound:(id)sender; {
    NSString *path = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"wav"];
    if (theAudio) [theAudio release];
    theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];   
    volumeTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(updateVolume) userInfo:nil repeats:YES];
}

- (IBAction)twoSound:(id)sender; {
    NSString *path = [[NSBundle mainBundle] pathForResource:@"2" ofType:@"wav"];
    if (theAudio) [theAudio release];
    theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];   
    volumeTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(updateVolume) userInfo:nil repeats:YES];
}

Ответы [ 3 ]

4 голосов
/ 24 марта 2011

Не хватает какого-то важного кода, но похоже, что theAudio - это глобал, который вы используете для управления воспроизведением ваших звуков.Поскольку вы уничтожаете его всякий раз, когда воспроизводится звук, все, что в данный момент воспроизводится, останавливается при подготовке к следующему звуку.

Существует несколько способов исправить это, один из которых заключается в том, что каждый звук получает свой уникальный экземпляр AVAudioPlayer.

2 голосов
/ 24 марта 2011

не выпускайте плеер только потому, что он существует.отпустите по окончании воспроизведения

Это необходимо реализовать в делегате приложения или свойстве делегата приложения, чтобы ссылка на делегат оставалась действительной, если вы открываете представление.

Вам не нужно делатьэто для каждого голоса.Каждый голос будет инициализировать игрока с другим именем файла или URL.Вы получите это, убедившись, что выпустите, когда закончите играть.Другая вещь, о которой нужно позаботиться, это освободить игроков, если игрок не закончил из-за перерыва.

#pragma mark -
#pragma mark Audio methods

-(void)playNote:(NSInteger)noteNumber {

    NSString *soundFilePath =
    [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%i", noteNumber ]
                                    ofType: @"caf"];

    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];

    AVAudioPlayer *playerToPrepare = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL
                                                                            error:nil];

    [fileURL release];

    [playerToPrepare prepareToPlay];
    [playerToPrepare setDelegate: self];

    [playerToPrepare play];

}

#pragma mark -
#pragma mark AVAudioPlayer delegate methods

- (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) playerThatFinished
                        successfully: (BOOL) completed {
    if (completed) {
        [playerThatFinished release];
    }
}
1 голос
/ 24 марта 2011

Вы можете объявить и использовать:

AVAudioPlayer *theAudio1;    // for file 1.wav
AVAudioPlayer *theAudio2;    // for file 2.wav
...
AVAudioPlayer *theAudio6;    // etc.

вместо выпуска и повторного использования только одного AVAudioPlayer.

...