iOS AVAudioPlayer与Xcode 4.2和ARC的双重声音播放问题

时间:2012-01-01 16:32:39

标签: objective-c ios avaudioplayer

我一直在打击我的所有人,试图在我的程序中找出一个奇怪的声音问题。我将在下面发布代码。作为一个简短的描述我有一个函数,它传递一个变量,它需要并决定它应该播放哪种类型的声音,在该函数中我有多个触及类别的声音所以我使用arc4random语句然后通过switch语句运行它。一直发生的事情是,它会从case语句中播放两个声音而不是一个声音,大多数情况下,如果我用我的按钮按两次声音第二次它将从第一次播放声音和一个新声音,其他时候它在相同的顶部播放相同但相同的延迟。我在开关中放入一个断点,当它双重播放时,它只通过开关一次,这真的很混乱。有一点需要注意的是,在此之前我会播放另一个声音,但它使用单独的AVAudioplayer和路径变量,因此它不应该是一个问题,因为它永远不会像我正在播放的其他声音一样播放第二个声音。当我按下按钮时,我只调用该功能一次,所以我不确定为什么会这样做。我已经尝试将* path和* avaudioplayer变量放在函数中但它根本不会播放。在这里搜索似乎在它有机会播放它之前将它释放出来。我最终试图将它作为全局变量放在我的.m文件的顶部,然后设置实际路径并在开关内播放声音。声音将播放,但它播放两次..希望有人可以帮助我。我尝试将avaudioplayer定义作为属性,它也做同样的事情。这是我的代码片段。并提前感谢...

<。>文件中的

// 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 个答案:

答案 0 :(得分:7)

在播放音频声音之前设置此代码

这会将玩家重置为开头:

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

试试这个