Глупо, что я могу публиковать ответы, но не комментарии, если у меня недостаточно очков.Я просто хотел добавить к следующему ответу:
"Может случиться так, что после того, как ваша цепочка буферов опустошится, вам нужно перезапустить воспроизведение. Я никогда не опустошал буфер AudioQueue, но я помню из программирования Win32, чтоэто было так, поэтому, пожалуйста, не стесняйтесь исправлять меня, если я ошибаюсь. "
Я на самом деле проверил этот сценарий в моем аудиоплеере, который я недавно сделал.Я сделал FLAC-декодер с нуля, и он поддерживает только 16-битные песни на данный момент.Если я натыкаюсь на песню, которая составляет 24 бита, я продолжаю терять синхронизацию с песней, которую я играю - она не будет играть вообще - и это может занять любое количество времени, например, 30 секунд, чтобы создать пример, чтобы восстановиться.Это очень сильно истощает аудио-очереди, и когда я, наконец, снова начинаю посылать буферы в аудио-очереди, потребуется 30 секунд, чтобы перехватить тишину следующей песни, чтобы она снова заиграла.
Это просто мойнаблюдение, и я еще не особо задумывался над тем, почему я наблюдаю это поведение.Может быть, он выбрасывает сэмплы в соответствии с количеством сэмплов. AudioQueue считает, что он должен воспроизводиться в данный момент - что он потерял во время голодания?Мой аудиоплеер, кажется, быстро воспроизводит песню, пока не достигнет точки, которую он хочет воспроизвести снова.
РЕДАКТИРОВАТЬ: Пока вы публикуете новый буфер для каждого обратного вызова, вам никогда не потребуется перезапускать воспроизведение или что-либо еще,В моем проигрывателе, если я не закончил обработку буфера, когда следующий буфер «вызывается обратно», поток для этого буфера будет заблокирован до тех пор, пока первый буфер не будет заполнен.Это сделано с NSLock.Это главная причина, по которой AudioQueues сильно страдает от голода, когда я теряю синхронизацию, когда мой проигрыватель еще не понимает 24-битные FLAC.NSLock также предотвращает любые условия гонки, когда AudioQueue дает вам больше буферов для заполнения.Я использую 3 буфера с низкой задержкой.Слишком низкая задержка дает полное молчание, поэтому вам нужно найти «хороший размер» для вашей системы.