iOS AVAudioPlayer проблема с двойным воспроизведением звука в Xcode 4.2 и ARC - PullRequest
1 голос
/ 01 января 2012

Я бьюсь головой о всех, пытающихся выяснить странную проблему звука в моей программе.Я выложу код ниже.В качестве краткого описания у меня есть функция, которая передает переменную, и она принимает ее и решает, какую категорию звука она должна воспроизводить, в рамках этой функции у меня есть несколько звуков достижимой категории, поэтому я использую инструкцию arc4random, а затем запускаю ее через инструкцию switch.,Что продолжает происходить, так это то, что он будет воспроизводить два звука из оператора case вместо одного, чаще всего, если я вызываю его дважды, нажимая кнопку во второй раз, он будет воспроизводить звук с первого раза и новый звук, а иногда -играет одинаково поверх друг друга, но с небольшой задержкой.Я установил точку останова в коммутаторе, и когда он дважды проигрывает, он проходит через коммутатор только один раз, что очень запутанно.Стоит отметить, что перед этим я проигрываю другой звук, но он использует отдельный AVAudioplayer и переменную пути, так что это не должно быть проблемой, так как он никогда не воспроизводит второй звук, как другой звук, который я играю.Я вызываю функцию только один раз, когда нажимаю кнопку, поэтому не уверен, почему она это делает.Я попытался поместить переменные * path и * avaudioplayer в функцию, но она не будет воспроизводиться вообще.При поиске здесь кажется, что дуга освобождает его до того, как он получит шанс сыграть.В итоге я попытался поместить его в верхнюю часть моего файла .m как глобальную переменную, а затем просто установить фактический путь и воспроизвести звук в коммутаторе.Звук будет звучать, но он играет дважды. Надеюсь, кто-нибудь может мне помочь.Я попытался поместить определение avaudioplayer как свойство, и оно делает то же самое.Вот мой фрагмент кода.И заранее спасибо ...

в файле .m

// Just below my synthesize statements
NSString *path;
AVAudioPlayer *theSound

// My code that I call when the button is pressed
[self playVoice:@"buyVoice"];

// The playVoice function
- (void)playVoice:(NSString*)voiceNum;

    if ([voiceNum isEqualToString:@"buyVoice"])  // Bought an Item Time for a voice
    {
        // play coin sound 
        [self coinSound];

        // play random buy phrase and coin sound
        int phraseNumber = 0;
        phraseNumber = arc4random() %(3);

        switch (phraseNumber) 
       {
            case 0:
            {
                path = [[NSBundle mainBundle] pathForResource:@"sndBuy1" ofType:@"m4a"];
                    theSound =[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath: path] error:NULL];
                    [theSound setNumberOfLoops:0];
                    [theSound play]; 
                    break;
            }

            case 1:
            {
                path = [[NSBundle mainBundle] pathForResource:@"sndBuy2" ofType:@"m4a"];
                    theSound =[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath: path] error:NULL];
                    [theSound setNumberOfLoops:0];
                    [theSound play]; 
                    break;
            }

            case 2:
            {
                path = [[NSBundle mainBundle] pathForResource:@"sndBuy3" ofType:@"m4a"];
                    theSound =[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath: path] error:NULL];
                    [theSound setNumberOfLoops:0];
                    [theSound play]; 
                    break;
            }

            case 3:
            {
                path = [[NSBundle mainBundle] pathForResource:@"sndBuy4" ofType:@"m4a"];
                    theSound =[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath: path] error:NULL];
                    [theSound setNumberOfLoops:0];
                    [theSound play]; 
                    break;
            }
    }
}

1 Ответ

7 голосов
/ 03 января 2012

установите этот код перед воспроизведением аудио звука

Это вернет проигрыватель к началу:

[theSound setCurrentTime:0.0];
[theSound play];

попробуйте

...