Я немного новичок в разработке для 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];
}
}