Я использую Novocaine для воспроизведения звука в приложении, и я последовательно получаю сбой после следующих шагов:
Приложение вылетает на линии 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 (код = 1, адрес = 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
Переменная whichChannel является виновником, когда мы воспроизводим песню на колонках и потом подключаем наушники, она падает, как только whichChannel становится 1, я попытался жестко закодировать его в 0 для такого сценария, и сбой прекратился, но звук стал искаженным! в файле novocaine.mm измените строки 901 и 902 на эту
// self.numOutputChannels = newNumChannels;
self.numOutputChannels = 1;
это решит проблему 🙂