【问题标题】:Not able to hear 'noise' when writing random values AudioBuffer in iOS在 iOS 中写入随机值 AudioBuffer 时无法听到“噪音”
【发布时间】:2015-01-04 23:11:00
【问题描述】:

我正在使用 EZAudio 并尝试将我的软件生成的一些样本写入此库 https://github.com/syedhali/EZAudio 提供的 AudioBuffer,如示例“手动覆盖播放”中所示。

我的代码看起来像这样...

// Completely override the output callback function
- (void)
                 output:(EZOutput *)output
callbackWithActionFlags:(AudioUnitRenderActionFlags *)ioActionFlags
            inTimeStamp:(const AudioTimeStamp *)inTimeStamp
            inBusNumber:(UInt32)inBusNumber
         inNumberFrames:(UInt32)inNumberFrames
                 ioData:(AudioBufferList *)ioData {
    //grab latest sample from sample queue
    if (currentAudioPiece == nil || currentAudioPiece.duration >= currentAudioPieceIndex) {
        self.currentAudioPiece = sampleQueue.dequeue;
    }
    AudioBuffer audioBuffer = ioData->mBuffers[0];


    if (true) {
        for (int i = 0; i < audioBuffer.mDataByteSize; i++) {
            uint8_t rofl[2048];
            arc4random_buf(&rofl, 2048);
            audioBuffer.mData = rofl;
        }

        return;
    }

    //... more code that I'll debug later...'

基本上我无法进行健全性检查,即随机播放的一堆内存会产生一些噪音。我认为问题在于“audioBuffer.mData = rofl;”。我对在 void* 使用内存感到很困惑。

【问题讨论】:

  • 你在设备上测试过吗?
  • 假设一切设置正确(音频初始化等),我怀疑您对问题行的看法是正确的。不要创建自己的变量 (rofl),然后尝试将其分配给 mData(很可能是问题),而是直接在 audioBuffer.mData 上调用 arc4random_buf,如果 EZAudio 工作正常,它应该已经为您初始化与 iOS/OSX 中的普通 RemoteIO 相同。

标签: ios objective-c audio core-audio


【解决方案1】:

jn_pdx 正确,您需要复制/填写mData 而不是重新分配。

- (void)
                 output:(EZOutput *)output
callbackWithActionFlags:(AudioUnitRenderActionFlags *)ioActionFlags
            inTimeStamp:(const AudioTimeStamp *)inTimeStamp
            inBusNumber:(UInt32)inBusNumber
         inNumberFrames:(UInt32)inNumberFrames
                 ioData:(AudioBufferList *)ioData {
    //grab latest sample from sample queue
    if (currentAudioPiece == nil || currentAudioPiece.duration >= currentAudioPieceIndex) {
        self.currentAudioPiece = sampleQueue.dequeue;
    }
    AudioBuffer audioBuffer = ioData->mBuffers[0];


    if (true) {
        arc4random_buf(audioBuffer.mData, audioBuffer.mDataByteSize);

        return;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多