C++ Objective-C,CoreAudio:播放的声音有额外噪音、嘶嘶声和砰砰声的可能原因?

C++ Objective-C,CoreAudio:播放的声音有额外噪音、嘶嘶声和砰砰声的可能原因?,c++,objective-c,c,core-audio,C++,Objective C,C,Core Audio,我用CoreAudio播放一些连续的声音。我设法让它工作,但我现在有一个问题,我不能克服。它播放的声音,更多的是我需要的真实声音,不仅仅是噪音,还有噪音、嘶嘶声和砰砰声 我验证了采样率,将所有静默缓冲区归零,检查了通道(我肯定我只有1个),并再次检查了为回放方法提供数据的算法(但我将在这里添加它以确保)。我对声音的体验很淡薄,所以我可能做错了什么。我想知道是否还有其他事情需要检查,或者最好的方法是什么,首先看哪里 //init playedBufferSize=audioFilesSize[au

我用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;
}
编辑:我知道上面的代码不会连续播放声音,因为它会在某个点用一堆0填充缓冲区,但是,我会听到许多奇怪的声音,如果声音播放并停止一会儿,然后重新开始,我会很高兴,一个好的开始:)

编辑2:我编辑了代码,这样它就不会再输出静音了,但不幸的是,我还是收到了嘶嘶声和砰砰声


谢谢

我并不完全熟悉你在做什么,但我在OSX上使用核心图形时遇到了类似的问题——在某些情况下,我的图像上会出现明显的“噪音”。问题是我的缓冲区,我必须把它们归零,否则会有噪音。在使用buffer.mData[]之前,是否可以尝试在其上执行memset


问题是,当你在OSX中分配大块内存时,出于安全原因,它通常为零,但对于小块内存,它不会为零。这可能会导致奇怪的错误-例如,起初您可能分配了足够大的内存块,以便为您清除,但当您继续流式处理时,您可能会分配较小的未清除内存块。

我不需要解决此问题,因为据我所知,它的信息非常有限,很多事情可能会出错,一个关于有经验的声音开发人员如何调试这个的提示仍然很好!startPointForPlayedBuffer是什么类型的指针?当您执行startPointForPlayedBuffer+=buffer.mDataByteSize时,添加什么很重要