16 июля 2010 г.

Проигрывание музыки с помощью iPhone SDK

Присутствие звуковых эффектов и музыки сильно улучшает ваше приложение. Сегодня я расскажу как с помощью iPhone SDK управлять проигрыванием звукового файла. Речь пойдет о проигрывали больших звуковых файлов с возможностью приостановки и изменении позиции проигрывания.
Я буду использовать класс AVAudioPlayer из фраемворка AVFoundation. Напишем приложение которое будет циклически проигрывать файл с возможностью перемотки. Я не использую Interface Builder поэтому не буду приводить скриншоты расположения элементов на экране. Итак, в в нашем вью присутствует кнопка старта/остановки проигрывания (playStopBtn), слайдер показывающий позицию в проигрываемом файле (tmSlider) и свичер разрешающий играть музыку при залоченом экране.
Первое, что необходимо сделать, так это создать наш плейер и настроить его. Например в методе init или loadView прописываем:

  1. NSURL *file = [[NSURL alloc] initFileURLWithPath:
  2.     [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"a_hot.caf"]];
  3. NSError *err = nil;
  4. player = [[AVAudioPlayer alloc] initWithContentsOfURL:file error:&err];
  5. [file release];
  6. player.numberOfLoops = -1;
  7. player.delegate = self;
  8. [player prepareToPlay];

в результате плейер у нас создан, и в него загружен наш звуковой файл.
Описываем событие нажатия на кнопку playStopBtn:

  1. if (player.playing)
  2. {
  3.  [player stop];
  4.  [playStopBtn setTitle:NSLocalizedString(@"Play", @"") forState:UIControlStateNormal];
  5.  [tmUpdaterTimer invalidate];
  6.  [tmUpdaterTimer release];
  7.  tmUpdaterTimer = nil;
  8. }
  9. else
  10. {
  11.  [player play];
  12.  [playStopBtn setTitle:NSLocalizedString(@"Stop", @"") forState:UIControlStateNormal];
  13.  tmUpdaterTimer = [[NSTimer scheduledTimerWithTimeInterval:0.2
  14.  target:self selector:@selector(timerAction:)
  15.  userInfo:nil repeats:YES] retain];
  16. }

тут все просто, если сейчас играет музыка - останавливаем ее проигрывание, исли плейер на паузе - начинаем проигрывание. Так-же тут создается/уничтожается таймер, который изменяет позицию слайдера при проигрывали:

  1. - (void) timerAction:(NSTimer *) sender
  2. {
  3.   [tmSlider setValue:player.currentTime animated:YES];
  4. } 

У слайдера показывающего позицию в проигрываемом файле тоже есть два слушателя на изменение позиции и окончание изменения позиции:

  1. - (void) changeTime:(UISlider *) sender
  2. {
  3.   if (!moving)
  4.   {
  5.     isPlaying = player.playing;
  6.     if (player.playing)
  7.     {
  8.       [player stop];
  9.     }
  10.     moving = YES;
  11.   }
  12.   player.currentTime = sender.value;
  13. }
  14.  
  15. - (void) endChangeTime:(UISlider *) sender
  16. {
  17.   moving = NO;
  18.   if (isPlaying)
  19.   {
  20.     [player play];
  21.   }
  22. }

при начале перетаскивания ползунка проверяем, играет ли музыка, если да, то приостанавливаем проигрывание в конце востанавливаем состояние.

Все проигрывается, но при блокировке экрана музыка приостанавливается. Следующий код разрешает проигрывание музыки при выключенном экране устройства:

  1. AudioSessionInitialize(NULL, kCFRunLoopDefaultMode, NULL, self);
  2. UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
  3. AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
  4. AudioSessionSetActive(true);

Мой пример использующий все выше написанное можно скачать

Комментариев нет:

Отправить комментарий