1

我正在使用音频单元服务来设置输出渲染回调,以便将合成音频混合在一起。我拥有的代码似乎可以在我拥有的设备(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 Debug 或 Release 中)

谢谢,我很感激!

4

3 回答 3

1

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

我看到它的方式是只要它在我关心的设备上工作。当应用程序在设备上运行良好时,尽量不要为了让应用程序在模拟器上运行而费尽心思。

希望有帮助

PK

于 2010-09-29T15:50:01.317 回答
0

在调用 RemoteIO 初始化代码之前,您是否配置并启用了音频会话?

于 2010-09-28T06:49:48.607 回答
0

当您将流属性设置为输入总线时,您正在使用kOutputBus输入范围。那可能不太好。此外,您可能不需要将渲染回调应用于全局范围,因为您只需要它用于输出。此外,我认为您对kOutputBusand的定义kInputBus是错误的......当我查看工作 iPhone 音频代码时,它使用 0 作为输入总线,使用 1 作为输出总线。

我还可以想到一些关于 AudioStreamBasicDescription 的小事情,尽管我认为这些不会有太大的不同:

  1. kAudioFormatFlagsNativeEndian属性添加到您的格式标志
  2. 将字段显式设置mReserved为 0。
于 2010-09-28T09:10:00.390 回答