Я буду использовать класс AVAudioPlayer из фраемворка AVFoundation. Напишем приложение которое будет циклически проигрывать файл с возможностью перемотки. Я не использую Interface Builder поэтому не буду приводить скриншоты расположения элементов на экране. Итак, в в нашем вью присутствует кнопка старта/остановки проигрывания (playStopBtn), слайдер показывающий позицию в проигрываемом файле (tmSlider) и свичер разрешающий играть музыку при залоченом экране.
Первое, что необходимо сделать, так это создать наш плейер и настроить его. Например в методе init или loadView прописываем:
- NSURL *file = [[NSURL alloc] initFileURLWithPath:
- [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"a_hot.caf"]];
- NSError *err = nil;
- player = [[AVAudioPlayer alloc] initWithContentsOfURL:file error:&err];
- [file release];
- player.numberOfLoops = -1;
- player.delegate = self;
- [player prepareToPlay];
в результате плейер у нас создан, и в него загружен наш звуковой файл.
Описываем событие нажатия на кнопку playStopBtn:
- if (player.playing)
- {
- [player stop];
- [playStopBtn setTitle:NSLocalizedString(@"Play", @"") forState:UIControlStateNormal];
- [tmUpdaterTimer invalidate];
- [tmUpdaterTimer release];
- tmUpdaterTimer = nil;
- }
- else
- {
- [player play];
- [playStopBtn setTitle:NSLocalizedString(@"Stop", @"") forState:UIControlStateNormal];
- tmUpdaterTimer = [[NSTimer scheduledTimerWithTimeInterval:0.2
- target:self selector:@selector(timerAction:)
- userInfo:nil repeats:YES] retain];
- }
тут все просто, если сейчас играет музыка - останавливаем ее проигрывание, исли плейер на паузе - начинаем проигрывание. Так-же тут создается/уничтожается таймер, который изменяет позицию слайдера при проигрывали:
- - (void) timerAction:(NSTimer *) sender
- {
- [tmSlider setValue:player.currentTime animated:YES];
- }
У слайдера показывающего позицию в проигрываемом файле тоже есть два слушателя на изменение позиции и окончание изменения позиции:
- - (void) changeTime:(UISlider *) sender
- {
- if (!moving)
- {
- isPlaying = player.playing;
- if (player.playing)
- {
- [player stop];
- }
- moving = YES;
- }
- player.currentTime = sender.value;
- }
- - (void) endChangeTime:(UISlider *) sender
- {
- moving = NO;
- if (isPlaying)
- {
- [player play];
- }
- }
при начале перетаскивания ползунка проверяем, играет ли музыка, если да, то приостанавливаем проигрывание в конце востанавливаем состояние.
Все проигрывается, но при блокировке экрана музыка приостанавливается. Следующий код разрешает проигрывание музыки при выключенном экране устройства:
- AudioSessionInitialize(NULL, kCFRunLoopDefaultMode, NULL, self);
- UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
- AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
- AudioSessionSetActive(true);
Мой пример использующий все выше написанное можно скачать
Комментариев нет:
Отправить комментарий