iPhone: потоковая передача музыки, когда приложение находится в фоновом режиме

У меня есть приложение, которое транслирует музыку с помощью класса AudioStreamer Мэтта Галлахера. Это отлично работает в качестве фонового процесса, за исключением того, что я хочу иметь возможность перейти к следующей песне после завершения потока. К сожалению, эта часть не работает. Первоначально у меня был таймер, который отслеживал поток, но понял, что когда приложение работает в фоновом режиме, этот таймер больше не работает. Поэтому я попытался добавить обратный вызов делегата в функцию чтения пакетов:

void ASReadStreamCallBack(CFReadStreamRef aStream, CFStreamEventType eventType, void* inClientInfo)
{
   AudioStreamer* streamer = (AudioStreamer *)inClientInfo;
   double percent = [streamer progress]/[streamer duration];
   if(percent>=0.98 || (percent>=0.95 && [streamer isIdle])){
     if([streamer.delegate respondsToSelector:@selector(didFinishPlayingStream:)] ){
         [streamer.delegate didFinishPlayingStream:streamer];
         streamer.delegate = nil;
     }
   }


   [streamer handleReadFromStream:aStream eventType:eventType];
}

Это отлично работает, когда приложение находится на переднем плане, но больше не работает, когда приложение находится в фоновом режиме. Метод делегата в основном отправляет запрос на получение URL-адреса потока для следующей песни, а затем создает новый класс AudioStreamer.


person user491880    schedule 11.05.2011    source источник
comment
Как ваше приложение работает в фоновом режиме?   -  person Inder Kumar Rathore    schedule 18.04.2013


Ответы (2)


Пока приложение находится в фоновом режиме, вы можете реализовать делегат для обработки различных состояний удаленного управления.

- (void)remoteControlReceivedWithEvent:(UIEvent *)receivedEvent { 
switch (receivedEvent.subtype) {
    case UIEventSubtypeRemoteControlTogglePlayPause:
        if (player.isPlaying) {
            [player pause];
        } else {
            [player start];
        }
        break;

    case UIEventSubtypeRemoteControlPreviousTrack:
        break;

    case UIEventSubtypeRemoteControlNextTrack:
        [self skipSong:nil];
        break;

    default:
        break;
} }

Что-то вроде этого работает для меня.

person Pablo Formoso Estrada    schedule 15.05.2012

Я загрузил свой класс AudioPlayer/streamer, частично вдохновленный AudioStreamer Мэтта Галлахера, на https://code.google.com/p/audjustable.

Одной из крутых особенностей является поддержка непрерывного воспроизведения. Это означает, что AudioQueue никогда не закрывается между промежутками; чтобы iOS не приостанавливала работу вашего приложения.

Вы можете реализовать AudioPlayerDelegate:didFinishBufferingSourceWithQueueItemId и AudioPlayerDelegate:didFinishPlayingQueueItemId для постановки в очередь следующего трека, вызвав AudioPlayer:queueDataSource.

Дайте мне знать, если вам нужна помощь в его использовании.

person tumtumtum    schedule 03.06.2012