iphone - 为什么此音频单元RemoteIO初始化可在iPhone上但不能在模拟器中使用?

标签 iphone audio ios-simulator audiotoolbox audiounit

我正在使用音频单元服务来设置输出渲染回调,以便可以将合成音频混合在一起。我拥有的代码似乎可以在我拥有的设备(iPod Touch,iPhone 3G和iPad)上完美运行,但是无法在模拟器上运行。

在模拟器上,AudioUnitInitialise函数失败并返回值-10851(根据Apple文档,其值为kAudioUnitErr_InvalidPropertyValue)。

这是我的初始化代码..在此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调试或发行版中会发生相同的问题)

谢谢,我很感激!

最佳答案

为设备和模拟器进行编译完全不同。最常见的事物具有相同的预期结果。例如,在它们之间加载 View 开关以播放声音等。但是,当涉及其他事情时,例如使用OpenAL加载10个缓冲区播放声音,然后在它们之间切换时,模拟器无法处理,但是设备可以处理。

只要能在我关心的设备上正常运行,我就可以看到它。当设备上的应用程序运行正常时,请不要仅仅为了使应用程序在模拟器上正常工作而拔掉头发。

希望能有所帮助

k

关于iphone - 为什么此音频单元RemoteIO初始化可在iPhone上但不能在模拟器中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3809377/

相关文章:

iphone - UITextView 不尊重 secureTextEntry 属性

matlab - 从视频文件中提取音频

iphone - iPhone应用程序崩溃?

iphone - 为什么 iPhone Simulator 3.0 没有显示在 Xcode 中?

iphone - 在 iOS 的更新过程中,系统是否会杀死后台/内存中的应用程序?

ios - 缩放任何 View 的内容并允许动画

ios - 如何通过通讯录获取用户

audio - WAV到AIF的转换-记录的AIF之间的差异

java - 了解加工过程中圆是如何形成的

swift - xcode 9.4.1 中缺少模拟器