iPhone OS 4.0: NSFileHandleDataAvailableNotification не обеспечивает обратный вызов в конце файла - PullRequest
1 голос
/ 13 июля 2010

Я немного новичок в разработке для iPhone, так что будьте осторожны!Я поддерживаю приложение, которое загружает файл wav из потока файлов URL и воспроизводит его через AudioQueue.

Мы запускаем непрерывный цикл в другом потоке и останавливаем очередь, если обнаруживаем, что у нее нет используемых буферов, и входной файл FileStream достиг своего конца.В свою очередь, мы определяем, закончился ли FileStream в обратном вызове waitForDataInBackgroundAndNotify на NSFileHandleDataAvailableNotification для потока, проверяя, имеет ли availableData длину 0.

Это работает под iOS 3.0 - мы получаемуведомление о 0 доступных данных в конце файла - но на iOS 4.0 мы, кажется, не получаем обратный вызов в конце файла.Это происходит на устройстве с ОС 4.0, независимо от целевой версии ОС.

Изменился ли API между двумя версиями?Как я могу определить конец файла сейчас?

Надеемся, соответствующий код:

обратный вызов, доступный для данных:

- (void)readFileData:(NSNotification *)notification
{
  @try
  {
    NSData *data = [[notification object] availableData];

    if ([data length] == 0 && self.audioQueueState != AQS_END)
    {
      /***********************************************************************/
      /* We've hit the end of the data but it's possible that more may be    */
      /* appended to the file (if we're still downloading it) so we need to  */
      /* wait for the availability of more data.                             */
      /***********************************************************************/
      [self setFileStreamerState:FSS_END];
      [[notification object] waitForDataInBackgroundAndNotify];
    }
    else if (self.audioQueueState == AQS_END)
    {
      TRC_DBG(@"ignore read data as ending");
    }
    else
    {
      NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

      TRC_DBG(@"Read %d bytes", [data length]);

      [self setFileStreamerState:FSS_DATA];

      if (discontinuous)
      {
        TRC_DBG(@"AudioFileStreamParseBytes %d bytes, discontinuous", [data length]);
        err = AudioFileStreamParseBytes(audioFileStream, [data length], [data bytes], kAudioFileStreamParseFlag_Discontinuity);
        discontinuous = NO;
      }
      else
      {
        TRC_DBG(@"AudioFileStreamParseBytes %d bytes, continuous", [data length]);
        err = AudioFileStreamParseBytes(audioFileStream, [data length], [data bytes], 0);
      }

      /***********************************************************************/
      /* If error then get out, otherwise wait again for more data.          */
      /***********************************************************************/
      if (err != 0)
      {
        [self failWithErrorCode:AS_FILE_STREAM_PARSE_BYTES_FAILED];
      }
      else
      {
        [[notification object] waitForDataInBackgroundAndNotify];
      }

      [pool release];
    }
  }
  @catch (NSException *exception)
  {
    TRC_ERR(@"Exception: %@", exception);
    TRC_ERR(@"Exception reason: %@", [exception reason]);
    //[self failWithErrorCode:AS_FILE_AVAILABLE_DATA_FAILED];
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...