Core Audio: причудливая проблема с передачей через обратный вызов рендеринга - PullRequest
0 голосов
/ 11 ноября 2010

Я реализую передачу звука с помощью аудиоустройства RemoteIO, добавив обратный вызов рендеринга к входной области выходной шины (т.е. к динамикам).

Все работает плавно, ...

OSStatus RenderTone(
                    void *                      inRefCon, 
                    AudioUnitRenderActionFlags  * ioActionFlags, 
                    const AudioTimeStamp        * inTimeStamp, 
                    UInt32                      inBusNumber, 
                    UInt32                      inNumberFrames, 
                    AudioBufferList             * ioData)

{   
    SoundEngine * soundEngine = (SoundEngine *) inRefCon;

    // grab data from the MIC (ie fill up ioData)
    AudioUnit thisUnit = soundEngine->remoteIOUnit->audioUnit;
    OSStatus err = AudioUnitRender(thisUnit, 
                                   ioActionFlags, 
                                   inTimeStamp, 
                                   1, 
                                   inNumberFrames, 
                                   ioData);
    if (result)
    {
        printf("Error pulling mic data");
    }

    assert(ioData->mNumberBuffers > 0);

    // only need the first buffer
    const int channel = 0;
    Float32 * buff = (Float32 *) ioData->mBuffers[channel].mData;
}

, пока я не добавлю эту последнюю строку.

    Float32 * buff = (Float32 *) ioData->mBuffers[channel].mData;

С этой строкой нет ошибок, просто тишина.Без него я могу щелкнуть пальцами перед микрофоном и услышать его в наушниках.

РЕДАКТИРОВАТЬ: AudioBuffer buf0 = ioData-> mBuffers [0];// Достаточно вызвать сбой

Что происходит?

Это не ошибка, вызванная компилятором, оптимизирующим неиспользуемую переменную.Если я установлю buff ++;на следующей строке поведение такое же.хотя, возможно, компилятор все еще может обнаружить, что переменная фактически не используется.

1 Ответ

0 голосов
/ 11 ноября 2010

Проблема заключалась в том, что запрос на получение данных с микрофона не удался при первом срабатывании этого обратного вызова.

И что я должен был сделать, это проверить возвращаемое значение и вернуть его (то есть выйти из обратного вызова)если это не было успешным

Вероятно, это происходило из-за того, что я обращался к недействительным данным

Это все еще довольно странно, но не нужно вдаваться в подробности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...