есть аудио приложение, которое передает файлы по сети, все работает отлично, но одно. Для автоматического воспроизведения следующей дорожки в фоновом режиме CFReadStream инициализируется (я вижу это в журнале) после вызова AudioQueueStop, но обратный вызов никогда не вызывается (edit: фактически вызывается один раз), пока приложение не выходит на передний план. Кусок кода для инициализации потока:
//also tried main runloop just for test, no luck
CFReadStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
Дело в том, что приложение функционирует после остановки очереди, инициализируется поток, но обратный вызов вызывается только в том случае, если поток был инициализирован в режиме переднего плана. Вот фрагмент кода для обратного вызова:
CFReadStreamSetClient(stream,
kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered,
MyReadStreamCallBack,
&context);
С другой стороны, обратный вызов вызывается, когда приложение находится в фоновом режиме, и следующая дорожка запускается не автоматически, а с делегатом приложения (с той же функцией).
Я не совсем понимаю разницу между этими тремя случаями, пожалуйста, помогите.
Редактировать.
OSStatus status = AudioFileStreamOpen(self, MyAudioListener ...
Вызывается обратный вызов MyAudioListener, а MyReadStreamCallBack вызывается только один раз .
Редактировать 2
обратный вызов ReadStream чаще всего не вызывается ни разу, один раз - максимум того, что я смог увидеть.
С другой стороны, и это приводит меня к неправильному пониманию того, что происходит, после предыдущий AudioQueue останавливается , а следующий трек - локальный файл , затем другой AudioQueue открывается , он читает файл с помощью AudioFileReadPackets, и мне не нужно пробуждать приложение из фона, чтобы начать воспроизведение следующей дорожки, так как оно воспроизводит в фоновом режиме.