Я использую AudioQueue для потоковой передачи аудио из произвольного источника (классу просто нужен делегат, который предоставляет ему пакеты), я создал класс, который оборачивает все функции, которые можно вызывать, AudioQueueClass, я использую этот классчтобы воспроизвести много песен, между каждой песней, которую я выпускаю своим классом, и создаю новый экземпляр AudioQueueClass для воспроизведения следующей песни, я вижу две проблемы, которые мне не удалось найти, может быть, некоторые из вас сталкивались с этими проблемамии может пролить свет на это
1- Каждый раз, когда AudioQueue воспроизводит несколько секунд предыдущей песни, а затем возвращается к текущей песне, не уверенный, почему это может происходить, когда я создаю новыйочереди для каждой песни, и я считаю, что я распоряжаюсь своими очередями надлежащим образом - какой-то код должен следовать
2 - этот код еще хуже, иногда, когда я вхожу в 3-ю или 4-ю песню, аудио-очередь останавливаетсяиграю ... Я считаю, что проблема в том, что AudioQueueInputCallback inCallbackProc перестает вызываться,Я думаю, это потому, что очередь перестала воспроизводить и обрабатывать пакеты, но не может понять, почему ... Еще одна вещь, на которую следует обратить внимание, это то, что это происходит только тогда, когда я передаю потоковую передачу на устройство из внешнего источника, если я просто получаю данные файла локально ииспользуйте это как пакеты, я слышу «заикание» в музыке, но оно восстанавливается и воспроизводится нормально, тогда как в случае потоковой передачи звук просто останавливается (довольно странно)
Вот код, который я использую для избавления отаудио-очередь, больше не публикуется, потому что не уверен, какие релевантные части нужно опубликовать, пожалуйста, дайте мне знать, если вы хотите увидеть какой-либо код и постить его плохо
AudioQueueFlush(audioQueue);
AudioQueueStop(audioQueue, true);
if (audioFileStream)
{
err = AudioFileStreamClose(audioFileStream);
audioFileStream = nil;
if (err)
{
[self failWithErrorCode:AS_FILE_STREAM_CLOSE_FAILED];
}
}
//
// Dispose of the Audio Queue
//
if (audioQueue)
{
err = AudioQueueDispose(audioQueue, true);
audioQueue = nil;
if (err)
{
[self failWithErrorCode:AS_AUDIO_QUEUE_DISPOSE_FAILED];
}
}