Objective-C, CoreAudio: возможные причины, по которым воспроизводимый звук имеет дополнительный шум, шипение и хлопки?

#c #objective-c #c #core-audio

#c #objective-c #c #core-audio

Вопрос:

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

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

 //init
playedBufferSize=audioFilesSize[audioFilesIndex];
startPointForPlayedBuffer=0;



//feed the audio
static OSStatus playbackCallback(void *inRefCon, 
                          AudioUnitRenderActionFlags *ioActionFlags, 
                          const AudioTimeStamp *inTimeStamp, 
                          UInt32 inBusNumber, 
                          UInt32 inNumberFrames, 
                          AudioBufferList *ioData) {

    AudioBuffer buffer = ioData->mBuffers[0];

    if (playedBufferSize>=buffer.mDataByteSize) {
        memcpy(buffer.mData , audioFiles[audioFilesIndex] startPointForPlayedBuffer, buffer.mDataByteSize);
        playedBufferSize-=buffer.mDataByteSize;
        startPointForPlayedBuffer =buffer.mDataByteSize;
    }else {
        memcpy(buffer.mData , audioFiles[audioFilesIndex] startPointForPlayedBuffer, playedBufferSize);
        nextAudioFileIndex();

        memcpy(buffer.mData playedBufferSize, audioFiles[audioFilesIndex], playedBufferSize);

        playedBufferSize = audioFilesSize[audioFilesIndex]-(buffer.mDataByteSize-playedBufferSize);
        startPointForPlayedBuffer = (buffer.mDataByteSize-playedBufferSize);
    }


    return noErr;
}
  

РЕДАКТИРОВАТЬ: Я знаю, что этот приведенный выше код не будет воспроизводить звук непрерывно, потому что в какой-то момент он заполняет буфер множеством нулей, однако вместе с этим я получаю много странных звуков, если звук будет воспроизводиться, ненадолго останавливаться и начинаться снова, я был бы счастлив, хорошее начало 🙂

ПРАВКА 2: Я отредактировал код так, чтобы он больше не выводил тишину, к сожалению, я все еще получаю шипение и хлопки…

Спасибо!

Комментарии:

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

2. Что это за указатель startPointForPlayedBuffer? Важно, что вы добавляете, когда выполняете startPointForPlayedBuffer =buffer. mDataByteSize

Ответ №1:

Я не совсем знаком с тем, что вы делаете, но у меня была похожая проблема с использованием графического ядра в OSX — когда я получал видимый «шум» на своих изображениях в определенных ситуациях. Проблема была с моими буферами, мне пришлось фактически обнулить их, иначе я бы получил шум на них. Можете ли вы попробовать создать memset в буфере.mData[] перед его использованием?

Проблема, которая возникла при воспроизведении, и почему я думаю, что вы можете видеть вещи того же типа, заключается в том, что когда вы выделяете большие куски памяти в OSX, она обычно обнуляется по соображениям безопасности, но для небольших кусков памяти она не будет обнулена. Это может привести к странным ошибкам — т. Е. Сначала вы можете выделить достаточно большую часть памяти, чтобы она была очищена для вас, но по мере продолжения потоковой передачи вы можете выделить меньшие части, которые не очищены.