Почему этот звуковой агрегат дистанционной инициализации работает на iPhone, но не в симуляторе?

StackOverflow https://stackoverflow.com/questions/3809377

Вопрос

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

На симуляторе функция аудионитинициализации не удается и возвращает значение -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 Отладка или освобождение)

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

Это было полезно?

Решение

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

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

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

Писать

Другие советы

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

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

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

  1. Добавить kAudioFormatFlagsNativeEndian Свойство на ваши флаги формата
  2. Явно установить mReserved поле до 0.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top