Я реализую звуковой эффект, который воспроизводится, когда пользователь перетаскивает UISlider.
В предыдущем вопросе я использовал AudioServicesPlaySystemSound () , но этот тип звука не может быть остановлен. Мне нужно, чтобы звук остановился, когда пользователь не активно перетаскивает ползунок, но не выпустил его.
Теперь я создаю звук, используя объект AVAudioPlayer . Я инициализирую его в своем контроллере вида следующим образом:
@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];
}
У меня есть два способа управления звуком. Первый воспроизводит звук всякий раз, когда движется слайдер. Он связан с событием Значение UISlider в Интерфейсном Разработчике.
-(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];
... но это приводит к зависанию приложения (плюс блокировка симулятора).
Что я могу сделать для устранения этой проблемы?