iPhone: потоковая передача музыки в фоновом режиме - PullRequest
2 голосов
/ 12 мая 2011

У меня есть приложение для потоковой передачи музыки с использованием класса 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

Ответы [ 2 ]

1 голос
/ 03 июня 2012

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

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

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

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

1 голос
/ 15 мая 2012

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

- (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;
} }

Как-то так у меня работает.

...