Я работаю с приложением, которое должно воспроизводить звук «тап» с интервалом 60 мс (что составляет 1000 ударов в минуту). Когда я преодолеваю интервалы примерно в 120 мс (500 ударов в минуту), звуки становятся очень хаотичными и накапливаются друг с другом.
Используемый мной звуковой байт имеет длину 10 мс, и у меня есть таймер потока, который работает с интервалами в 20 мс. Я использую AVAudioPlayer для воспроизведения звука и пробовал форматы wav, caf и m4a. Я проверил с выходами NSLog, чтобы увидеть, когда запускается AVAudioPlayer, и когда цикл таймера опрашивает ... и все время кажется достаточно точным.
Я добавил обработку аудио-сеанса в метод viewDidLoad () следующим образом:
[[AVAudioSession sharedInstance]
setCategory: AVAudioSessionCategoryPlayback
error: &setCategoryError];
Вот мой цикл таймера, который работает в своем собственном потоке:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Give the sound thread high priority to keep the timing steady.
[NSThread setThreadPriority:1.0];
while (running) { // loop until stopped.
[self performSelectorOnMainThread:@selector(playOutput) withObject:nil waitUntilDone:NO];
// An autorelease pool to prevent the build-up of temporary objects.
NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];
NSDate *curtainTime = [[NSDate alloc] initWithTimeIntervalSinceNow:sleepValue];
NSDate *currentTime = [[NSDate alloc] init];
// Wake up periodically to see if we've been cancelled.
while (running && ([currentTime compare:curtainTime] == NSOrderedAscending)) {
[NSThread sleepForTimeInterval:0.015];
[currentTime release];
currentTime = [[NSDate alloc] init];
}
[curtainTime release];
[currentTime release];
[loopPool drain];
}
[pool drain];
Вот как я инициализирую мой AVAudioPlayer:
NSString *beatOne = @"3h";
NSString *beatOneSoundFile = [[NSBundle mainBundle]
pathForResource:beatOne ofType:@"caf"];
NSURL *beatOneURL = [[NSURL alloc] initFileURLWithPath:beatOneSoundFile];
beatPlayerOne = [[AVAudioPlayer alloc]initWithContentsOfURL:beatOneURL error:nil];
beatPlayerOne.delegate = self;
beatPlayerOne.currentTime = 0;
[beatPlayerOne prepareToPlay];
[beatOneURL release];
А вот где воспроизводится аудиоплеер:
[beatPlayerOne pause];
beatPlayerOne.currentTime = 0;
[beatPlayerOne play];
Заранее спасибо за любую помощь ...