iPhone上的AVAudioPlayer声音意外停止循环:如何调试?

时间:2009-05-30 17:48:07

标签: iphone cocoa-touch audio core-audio

我正在实现在用户拖动UISlider时播放的声音效果。

previous question中,我使用了 AudioServicesPlaySystemSound(),但无法暂停该类型的声音。当用户没有主动拖动滑块但尚未释放它时,我需要停止声音。

现在我正在使用 AVAudioPlayer 对象创建声音。我在我的View Controller中初始化它,如下所示:

@interface AudioLatencyViewController : UIViewController <AVAudioPlayerDelegate> {
AVAudioPlayer *player1;
}

@implementation AudioLatencyViewController
@property (nonatomic, retain) AVAudioPlayer *player1;
@synthesize player1;

-(void)viewDidLoad {

[super viewDidLoad];

// the sound file is 1 second long
NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"tone1" ofType:@"caf"];
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:soundFilePath];

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

[fileURL release];
self.player1 = newPlayer;;
[newPlayer release];

[self.player1 prepareToPlay];
[self.player1 setDelegate:self];
}

我有两种控制声音的方法。每当移动滑块时,第一个播放声音。它与Interface Builder中的UISlider的 Value Changed 事件相关联。

-(IBAction)sliderChanged:(id)sender;
{
    // only play if previous sound is done. helps with stuttering
    if (![self.player1 isPlaying]) {
        [self.player1 play];
    }
}

当用户释放滑块按钮时,第二种方法会停止声音。它连接到UISlider的 Touch Up Inside 事件。

-(IBAction)haltSound;
{
    [self.player1 stop];
}

当滑动按钮移动然后快速释放时,此功能有效,但如果您按住按钮的时间超过两三秒,声音会重复(好),然后会分解(坏)。从那时起,声音将不再播放(超级糟糕)。

我尝试使用声音设置声音循环:

[self.player1 setNumberOfLoops:30];

...但这会导致应用程序冻结(加上锁定模拟器)。

如何调试此问题?

1 个答案:

答案 0 :(得分:0)

当用户持有UISlider时,Value Changed会被多次调用(任何时候用户移动一点点)。我会改用Touch Down。

您可能仍希望尝试使用此路线的循环...

我喜欢在用户移动滑块时播放声音的想法。让我知道它是如何运作的。

deggstand@gmail.com