Только ради архивов.
QTKit также страдает от разрыва между концом одного воспроизведения и началом следующего.Кажется, это связано с повторной инициализацией данных (возможно, повторным чтением их с диска?).Это гораздо более заметно при использовании гораздо меньшего, но сильно сжатого формата m4a, чем при воспроизведении несжатых aiff-файлов, но оно все еще там.
Решение, которое я нашел, заключается в использовании Audio Queue Services:
http://developer.apple.com/mac/library/documentation/MusicAudio/Conceptual/AudioQueueProgrammingGuide/AQPlayback/PlayingAudio.html#//apple_ref/doc/uid/TP40005343-CH3-SW1
и
http://developer.apple.com/mac/library/samplecode/AudioQueueTools/Listings/aqplay_cpp.html#//apple_ref/doc/uid/DTS10004380-aqplay_cpp-DontLinkElementID_4
Аудио-очередь вызывает функцию обратного вызова, которая подготавливает и ставит в очередь следующий буфер, поэтому, когда вы достигнете концатекущий файл нужно начинать заново с самого начала.Это обеспечивает абсолютно безупречное воспроизведение.
В примере кода в документации есть два недочета.
Первый - это настоящая ошибка (я сообщу об этом в DTS, чтобы они могли ее исправить).Перед выделением и заполнением аудио-буферов пользовательская структура должна включить воспроизведение, иначе аудио-буфер никогда не будет заполнен, и ничего не будет воспроизведено:
aqData.mIsRunning = 1;
Второй момент заключается в том, что код не запускается в Какао, нокак автономный инструмент, поэтому код соединяет аудио-очередь с новым циклом выполнения и фактически реализует сам цикл выполнения в качестве последнего шага программы.
Вместо передачи CFRunLoopGetCurrent (), просто передайте NULL, что вызываетAudioQueue для запуска в своем собственном цикле выполнения.
result = AudioQueueNewOutput ( // 1
&aqData.mDataFormat, // 2
HandleOutputBuffer, // 3
&aqData, // 4
NULL, //CFRunLoopGetCurrent (), // 5
kCFRunLoopCommonModes, // 6
0, // 7
&aqData.mQueue // 8
);
Я надеюсь, что это может спасти бедняков, пытающихся сделать то же самое в будущем немного времени: -)