2011-05-11 3 views
2

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

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

+0

Как ваше приложение играет в фоновом режиме? –

ответ

1

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

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

Нечто подобное работает для меня.

1

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

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

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

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

Смежные вопросы