2015-09-20 2 views
1

Я использую новокаин для воспроизведения звука в приложении, и я постоянно получаю зависания после следующих шагов:ошибка буфера аудио, когда наушники подключены

  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], я получаю сообщение «error: Невозможно применить эффекты выражения: не удалось дематериализовать переменную результата: не удалось прочитать ее память».

Что здесь происходит и как его избежать? Как разработчик Objective-C/Swift, для меня это странные воды, поэтому любая помощь будет высоко оценена. Спасибо за прочтение!

EDIT: Дополнительная информация отладки во время аварии:

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

Вам нужно запустить это в отладчик, установить точку останова на 'OutData [я * шаг] = mData [whichChannel] [IDX];' и смотреть значения ' stride', 'whichChannel' и' numFrames'. Мы не можем видеть, что эти значения есть, поскольку они передаются в функцию. –

+0

Привет @JamesMoore, спасибо за комментарий. См. Изменение выше. – Rogare

+0

@Rogare ли вы избавились от проблемы? Даже у меня такая же проблема. – Vishnuvardhan

ответ

2

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

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

это исправит вопрос :)

+0

Даже набор для 1 аудиосигнала искажается и бит бит быстрее, чем фактический. Есть идея об этом? – Vishnuvardhan

+0

он отлично работал для меня, не смотрел в него с тех пор, поэтому нет такой идеи, извините –