Я следую учебному пособию Learning Core Audio , в главе 4 есть упражнение, которое состоит из создания очереди буферов, прослушивания входного микрофона по умолчанию и сохранения буфера в * 1003. * файл. Я пытался выполнить код, который автор также предоставляет версию, несколько раз. Но все время все, что я получаю, это 30-килобайтный кафе-файл с начальными и конечными магическими c печеньями и всеми нулями посередине.
xxd output.caf выдержка:
00006fb0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00006fc0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00006fd0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00006fe0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
Я много раз пытался сбросить настройки конфиденциальности микрофона, разрешил использование микрофона в настройках как для XCode, так и для терминала, запустил приложение CLI как в режиме отладки и выпуска, так и в разных папках, но Ничего не изменилось. Все, что я получаю, - это файлы размером 30 КБ caf , независимо от продолжительности.
Я не думаю, что очень полезно сообщать обо всем коде, так как, похоже, он работает для других людей. Но вот реализация обратного вызова:
// Audio Queue callback function, called when an input buffer has been filled.
static void MyAQInputCallback(void *inUserData, AudioQueueRef inQueue,
AudioQueueBufferRef inBuffer,
const AudioTimeStamp *inStartTime,
UInt32 inNumPackets,
const AudioStreamPacketDescription *inPacketDesc)
{
MyRecorder *recorder = (MyRecorder *)inUserData;
// if inNumPackets is greater then zero, our buffer contains audio data
// in the format we specified (AAC)
if (inNumPackets > 0)
{
// write packets to file
CheckError(AudioFileWritePackets(recorder->recordFile, FALSE, inBuffer->mAudioDataByteSize,
inPacketDesc, recorder->recordPacket, &inNumPackets,
inBuffer->mAudioData), "AudioFileWritePackets failed");
// increment packet index
recorder->recordPacket += inNumPackets;
}
// if we're not stopping, re-enqueue the buffer so that it gets filled again
if (recorder->running)
CheckError(AudioQueueEnqueueBuffer(inQueue, inBuffer,
0, NULL), "AudioQueueEnqueueBuffer failed");
}
Я попытался напечатать некоторые переменные, и все нормально. Скажите, хотите ли вы вывод какой-либо переменной или какого-то другого фрагмента кода.
Я знаю, что вам очень трудно быть полезным с таким небольшим количеством информации, но мне действительно нужна эта функция, и я надеюсь, что вы хотя бы сделаете предположение или проведете меня через отладку.
Спасибо