AVAudioPlayer: звуки перекрываются - PullRequest
1 голос
/ 02 мая 2011

Я сделал простое приложение, в котором я могу записать себя, а затем сэмплировать то, что записал. Так как мне нравятся спам-кнопки, я попробовал это с моим собственным приложением. В результате было примерно 20 одинаковых звуков, когда я разговаривал, перекрывая друг друга и создавая ужасный беспорядок. Как я могу предотвратить такую ​​вещь в будущем?

Это мой код:

.h

-(IBAction)record {

        TempRecFile = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithString:@"VoiceFile"]]];

        recorder = [[AVAudioRecorder alloc] initWithURL:TempRecFile settings:nil error:nil];
        [recorder setDelegate:self];
        [recorder prepareToRecord];
        [recorder record];

}

-(IBAction)playback {

    [recorder stop];

    AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:TempRecFile error:nil];
    player.volume = 1;
    [player play];

}

Позже я хочу воспроизвести несколько звуков, прикрепленных к нескольким кнопкам, и если все они начнут перекрываться, уши пользователей, вероятно, начнут кровоточить очень скоро ...: (

Проблема с несколькими звуковыми кнопками была бы такой: мне нужно ограничить каждый звук перекрытием только с самим собой. Как я могу сделать такую ​​вещь?

1 Ответ

3 голосов
/ 02 мая 2011

В вашем методе воспроизведения, отключите кнопку первым делом. Когда вы инициализируете свой класс, установите его в качестве делегата для AVAudioPlayer и реализуйте протокол AVAudioPlayerDelegate , в частности, вы хотите перехватить audioPlayerDidFinishPlaying: успешно: событие. В этом случае снова включите кнопку.

Таким образом, это отключит кнопку, воспроизведет звук, а когда воспроизведение закончится, включите кнопку.

Теперь для нескольких кнопок просто сделайте одно и то же для каждой кнопки. Уловка в том, что вам нужно отслеживать AVAudioPlayer для каждой кнопки и знать, какой игрок идет с какой кнопкой. NSDictionary можно использовать для хранения списка игроков, а также значений ключей.

РЕДАКТИРОВАТЬ: чтобы остановить предыдущее воспроизведение и начать все сначала ...

Объявите AVPlayer на уровне класса, а не создавайте новый для каждого нажатия кнопки. Когда кнопка нажата, вы можете отправить ей сообщение seekToTime, чтобы начать сначала. Для нескольких кнопок есть несколько классов уровня AVPlayers.

Редактировать: если вы используете класс AVAudioPlayer, вы можете сделать то же самое, установив свойство currentTime.

...