Почему инициализация AudioIO RemoteIO работает на iPhone, а не на симуляторе? - PullRequest
1 голос
/ 28 сентября 2010

Я использую службы Audio Unit для настройки обратного вызова рендеринга вывода, чтобы я мог смешивать синтезированный звук. Код, который у меня есть, отлично работает на моих устройствах (iPod Touch, iPhone 3G и iPad), но не работает на симуляторе.

В симуляторе функция AudioUnitInitialise завершается ошибкой и возвращает значение -10851 (kAudioUnitErr_InvalidPropertyValue в соответствии с документацией Apple).

Вот мой код инициализации. Кто-нибудь с большим опытом работы с этим API, чем я, видит что-то, что я делаю здесь неправильно?

#define kOutputBus 0
#define kInputBus  1 

... 

static OSStatus playbackCallback(void *inRefCon, 
                             AudioUnitRenderActionFlags* ioActionFlags, 
                             const AudioTimeStamp*       inTimeStamp, 
                             UInt32                      inBusNumber, 
                             UInt32                      inNumberFrames, 
                             AudioBufferList*            ioData) 
{
    // Mix audio here - but it never gets here on the simulator
    return noErr;
}

...



{
    OSStatus status;

    // Describe audio component
    AudioComponentDescription desc;
    desc.componentType         = kAudioUnitType_Output;
    desc.componentSubType      = kAudioUnitSubType_RemoteIO;
    desc.componentFlags        = 0;
    desc.componentFlagsMask    = 0;
    desc.componentManufacturer = kAudioUnitManufacturer_Apple;

    // Get component
    AudioComponent inputComponent = AudioComponentFindNext(NULL, &desc);

    // Get audio units
    status = AudioComponentInstanceNew(inputComponent, &m_audio_unit);
    if(status != noErr) {
        NSLog(@"Failed to get audio component instance: %d", status);
    }

    // Enable IO for playback
    UInt32 flag = 1;
    status = AudioUnitSetProperty(m_audio_unit, 
                                  kAudioOutputUnitProperty_EnableIO, 
                                  kAudioUnitScope_Output, 
                                  kOutputBus,
                                  &flag, 
                                  sizeof(flag));
    if(status != noErr) {
        NSLog(@"Failed to enable audio i/o for playback: %d", status);
    }

    // Describe format
    AudioStreamBasicDescription audioFormat;
    audioFormat.mSampleRate       = 44100.00;
    audioFormat.mFormatID         = kAudioFormatLinearPCM;
    audioFormat.mFormatFlags      = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
    audioFormat.mFramesPerPacket  = 1;      
    audioFormat.mChannelsPerFrame = 2;
    audioFormat.mBitsPerChannel   = 16;
    audioFormat.mBytesPerPacket   = 4;
    audioFormat.mBytesPerFrame    = 4;      

    // Apply format
    status = AudioUnitSetProperty(m_audio_unit, 
                                  kAudioUnitProperty_StreamFormat, 
                                  kAudioUnitScope_Input, 
                                  kOutputBus, 
                                  &audioFormat, 
                                  sizeof(audioFormat));
    if(status != noErr) {
        NSLog(@"Failed to set format descriptor: %d", status);
    }

    // Set output callback
    AURenderCallbackStruct callbackStruct;
    callbackStruct.inputProc       = playbackCallback;
    callbackStruct.inputProcRefCon = self;
    status = AudioUnitSetProperty(m_audio_unit, 
                                  kAudioUnitProperty_SetRenderCallback, 
                                  kAudioUnitScope_Global, 
                                  kOutputBus,
                                  &callbackStruct, 
                                  sizeof(callbackStruct));
    if(status != noErr) {
        NSLog(@"Failed to set output callback: %d", status);
    }

    // Initialize (This is where it fails on the simulator)
    status = AudioUnitInitialize(m_audio_unit);
    if(status != noErr) {
        NSLog(@"Failed to initialise audio unit: %d", status);
    }

}

Моя версия XCode - 3.2.2 (64 бит) Версия моего симулятора - 3.2 (хотя такая же проблема возникает в 3.1.3 Debug или Release)

Спасибо, я ценю это!

Ответы [ 3 ]

1 голос
/ 29 сентября 2010

компиляция для устройства и для симулятора совершенно разные.Наиболее распространенные вещи имеют тот же ожидаемый результат.Например, загрузка вида переключается между ними, воспроизводя звуки и так далее.Однако, когда дело доходит до других вещей, таких как воспроизведение звука с загрузкой OpenAL 10 буферов, а затем переключение между ними, симулятор не может справиться с этим, но устройства могут.это все, что меня волнует.Постарайтесь не выдергивать волосы, чтобы приложение работало на симуляторе, когда оно нормально работает на устройстве.

Надеюсь, это поможет

0 голосов
/ 28 сентября 2010

Когда вы устанавливаете свойства потока для шины ввода, вы используете kOutputBus для своей области ввода.Это, вероятно, не хорошо.Кроме того, вам, вероятно, не нужно применять обратный вызов рендеринга к глобальной области видимости, поскольку он нужен только для вывода.Кроме того, я думаю, что ваши определения kOutputBus и kInputBus неверны ... когда я смотрю на рабочий код iPhone Audio, он использует 0 для входной шины и 1 для выходной шины.

IМожно также подумать о некоторых незначительных вещах в отношении AudioStreamBasicDescription, хотя я не думаю, что они будут иметь большое значение:

  1. Добавьте свойство kAudioFormatFlagsNativeEndian к вашим флагам формата
  2. Явно установите для поля mReserved значение 0.
0 голосов
/ 28 сентября 2010

Вы настроили и включили аудиосеанс до вызова кода инициализации RemoteIO?

...