Objective-C, CoreAudio: возможные причины, по которым воспроизводимый звук имеет дополнительный шум, шипение и треск? - PullRequest
0 голосов
/ 15 апреля 2011

Я использую 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;
}

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

EDIT2: я отредактировал код так, чтобы он больше не выводил тишину, но, к сожалению, я слышу шипение и шипение ...

Спасибо!

1 Ответ

1 голос
/ 15 апреля 2011

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

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

...