Запись MacOS Core Audio CAF производит все нули - PullRequest
0 голосов
/ 08 апреля 2020

Я следую учебному пособию 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");
}

Я попытался напечатать некоторые переменные, и все нормально. Скажите, хотите ли вы вывод какой-либо переменной или какого-то другого фрагмента кода.

Я знаю, что вам очень трудно быть полезным с таким небольшим количеством информации, но мне действительно нужна эта функция, и я надеюсь, что вы хотя бы сделаете предположение или проведете меня через отладку.

Спасибо

...