1

我正在使用 Novocaine 在应用程序中播放音频,并且在执行以下步骤后我一直在崩溃:

  1. 在没有插入耳机的情况下在 iPhone 上打开应用程序
  2. 在应用程序中开始音频播放
  3. 插入耳机

该应用程序在outData[i*stride] = mData[whichChannel][idx];以下函数中崩溃:

void RingBuffer::FetchData(float *outData, SInt64 numFrames, SInt64 whichChannel, SInt64 stride)
{
    int idx;
    for (int i=0; i < numFrames; ++i) {
        idx = (int)((mLastReadIndex[whichChannel] + i) % (mSizeOfBuffer));
        outData[i*stride] = mData[whichChannel][idx];
    }

    mLastReadIndex[whichChannel] = (mLastReadIndex[whichChannel] + numFrames) % (mSizeOfBuffer);

    mNumUnreadFrames[whichChannel] -= numFrames;
    if (mNumUnreadFrames[whichChannel] <= 0) mNumUnreadFrames[whichChannel] = 0;

}

在头文件中,mData声明为float **mData;,编辑器中的错误消息为“AURemoteIO::IOThread(14): EXC_BAD_ACCESS (code=1, address=0x0)”。

如果我po mData[whichChannel][idx]在控制台中输入,我会收到消息“错误:无法应用表达式副作用:无法解除结果变量:无法读取其内存。”

这里发生了什么,我该如何避免它?作为一名 Objective-C/Swift 开发人员,这对我来说是陌生的水域,所以任何帮助都将不胜感激。谢谢阅读!

编辑:崩溃时的附加调试信息:

numFrames=1024
whichChannel=1
stride=2
idx=6 // though it's been several different numbers before at the time of crash
4

1 回答 1

2

变量 whichChannel 是罪魁祸首,当我们在扬声器上播放歌曲并随后连接耳机时,一旦 whichChannel 变为 1,它就会崩溃,我试图在这种情况下将其硬编码为 0 并且崩溃停止但音频变得失真!在 novocaine.mm 中,将第 901 和 902 行更改为此

// self.numOutputChannels = newNumChannels; self.numOutputChannels = 1;

这将解决问题:)

于 2016-09-07T14:22:23.303 回答