Я пытаюсь сделать простое воспроизведение из функциональности файла, и кажется, что моя функция обратного вызова никогда не вызывается. Это не имеет никакого смысла, потому что все OSStatuses возвращаются 0, и другие числа также кажутся правильными (например, выходные пакеты считывают указатель из AudioFileReadPackets).
Вот настройка:
OSStatus stat;
stat = AudioFileOpenURL(
(CFURLRef)urlpath, kAudioFileReadPermission, 0, &aStreamData->aFile
);
UInt32 dsze = 0;
stat = AudioFileGetPropertyInfo(
aStreamData->aFile, kAudioFilePropertyDataFormat, &dsze, 0
);
stat = AudioFileGetProperty(
aStreamData->aFile, kAudioFilePropertyDataFormat, &dsze, &aStreamData->aDescription
);
stat = AudioQueueNewOutput(
&aStreamData->aDescription, bufferCallback, aStreamData, NULL, NULL, 0, &aStreamData->aQueue
);
aStreamData->pOffset = 0;
for(int i = 0; i < NUM_BUFFERS; i++) {
stat = AudioQueueAllocateBuffer(
aStreamData->aQueue, aStreamData->aDescription.mBytesPerPacket, &aStreamData->aBuffer[i]
);
bufferCallback(aStreamData, aStreamData->aQueue, aStreamData->aBuffer[i]);
}
stat = AudioQueuePrime(aStreamData->aQueue, 0, NULL);
stat = AudioQueueStart(aStreamData->aQueue, NULL);
(Не показано, где я проверяю значение stat
между функциями, он просто возвращается в нормальное состояние.)
И функция обратного вызова:
void bufferCallback(void *uData, AudioQueueRef queue, AudioQueueBufferRef buffer) {
UInt32 bread = 0;
UInt32 pread = buffer->mAudioDataBytesCapacity / player->aStreamData->aDescription.mBytesPerPacket;
OSStatus stat;
stat = AudioFileReadPackets(
player->aStreamData->aFile, false, &bread, NULL, player->aStreamData->pOffset, &pread, buffer->mAudioData
);
buffer->mAudioDataByteSize = bread;
stat = AudioQueueEnqueueBuffer(queue, buffer, 0, NULL);
player->aStreamData->pOffset += pread;
}
Где aStreamData - это моя структура данных пользователя (typedefed, поэтому я могу использовать ее как свойство класса), а игрок является статическим экземпляром класса Objective-C. Если какой-либо другой код нужен, пожалуйста, дайте мне знать. Я немного в своем уме. Печать любого из приведенных здесь чисел дает правильный результат, включая функции в bufferCallback, когда я сам его вызываю в цикле выделения. После этого он никогда не будет вызван. Метод запуска возвращается и ничего не происходит.
Кроме того, я использую периферийное устройство (MBox Pro 3) для воспроизведения звука, который CoreAudio загружает только тогда, когда он собирается выводить. IE, если я запустил iTunes или что-то в этом роде, динамики слегка покачиваются, и есть светодиод, который идет от моргания до твердого. Устройство загружается, как это делает CA, безусловно, что-то делает. (Также я, конечно, пробовал его с встроенным звуком Macbook без устройства.)
Я читал другие решения проблем, которые кажутся похожими, и они не работают. Такие вещи, как использование нескольких буферов, которые я делаю сейчас, и, похоже, не имеют никакого значения.
В основном я предполагаю, что я что-то явно ошибаюсь, но не уверен, что это может быть. Я прочитал соответствующую документацию, посмотрел доступные примеры кода и немного вычислил сеть для ответов, и кажется, что это все, что мне нужно сделать, и это должно просто пойти.
По крайней мере, есть ли что-нибудь еще, что я могу сделать, чтобы исследовать?