Play&使用相同的按钮停止声音 - AVAudioPlayer

时间:2014-02-06 16:39:45

标签: objective-c audio avaudioplayer

如何通过触摸一次UICollectionViewCell来播放声音,并通过使用AVAudioPlayer再次触摸相同的UICollectionViewCell来停止相同的声音?

我的代码正确播放声音,但是当我按下单元格时它不会停止它,它只是从头开始循环。我目前的代码如下:

// Sound
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {


// Loop
int loopOrNot;
BOOL playing = 0;

if ([loopArray containsObject:saveFavorite]) // YES
{
    loopOrNot = -1;


} else {

    loopOrNot = 0;

}
// Play soundeffects

if (playing==NO) {
    // Init audio with playback capability


    // Play sound even in silent mode
    [[AVAudioSession sharedInstance]
     setCategory: AVAudioSessionCategoryPlayback
     error: nil];

    NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/%@.wav", [[NSBundle mainBundle] resourcePath], [mainArray objectAtIndex:indexPath.row]]];

    NSError *error;
    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
    audioPlayer.numberOfLoops = loopOrNot;

    if (audioPlayer == nil) {
        //  NSLog([error description]);
    }
    else {
        [audioPlayer play];
    }

    playing=YES;
}
else if(playing==YES){

[audioPlayer stop];


    playing=NO;
}
}

3 个答案:

答案 0 :(得分:1)

那是因为你的playing变量是该函数的本地变量,并且它的值不会在调用中保留。每次调用函数时,它都会被初始化为NO。 将该变量移动到您的类声明中。

答案 1 :(得分:1)

在您设置方法的开头:

BOOL playing = 0;

和你的第一个if语句:

if (playing==NO) {
总是如此。

在您的方法的开头添加:

BOOL playing = 0;

这样:

if(playing==YES){
   [audioPlayer stop];
    playing=NO;
    return
}

然后添加设置播放器的代码。 在这种情况下,如果玩家正在播放,则停止并从该功能返回,如果它没有播放,则创建播放器并开始播放。

同样替换此行:

BOOL playing = 0;

playing = 0;

并将此声明为ivar

@implementation YourClassName
{
    BOOL playing;
}

答案 2 :(得分:1)

这是一种快速的方法(使用Swift 2.0 FYI)。将计数器定义为全局变量并将其设置为0.再次按下该按钮时,停止音频并重置其开始时间。希望这会有所帮助。

func setupAudioPlayerWithFile(file:NSString, type:NSString) -> AVAudioPlayer  {
    let path = NSBundle.mainBundle().pathForResource(file as String, ofType: type as String)
    let url = NSURL.fileURLWithPath(path!)
    var audioPlayer:AVAudioPlayer?

    do {
        try audioPlayer = AVAudioPlayer(contentsOfURL: url)
    } catch {
        print("NO AUDIO PLAYER")
    }

    return audioPlayer!
}


@IBAction func buttonTap(sender: AnyObject) {
    if (counter%2==0)
    {
    backMusic = setupAudioPlayerWithFile("Etudes", type: "mp3")
    backMusic.play()
    }
    else
    {
        backMusic.stop()
        backMusic.currentTime = 0.0
    }
    counter++