Ошибка аудио буфера при подключении наушников

Я использую 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 (код = 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

1

Решение

Переменная whichChannel является виновником, когда мы воспроизводим песню на колонках и потом подключаем наушники, она падает, как только whichChannel становится 1, я попытался жестко закодировать его в 0 для такого сценария, и сбой прекратился, но звук стал искаженным! в файле novocaine.mm измените строки 901 и 902 на эту

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

это решит проблему 🙂

2

Другие решения


По вопросам рекламы [email protected]