Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个音频单元RemoteIO初始化可以在iPhone上工作,但不能在模拟器中工作?_Iphone_Audio_Ios Simulator_Audiotoolbox_Audiounit - Fatal编程技术网

为什么这个音频单元RemoteIO初始化可以在iPhone上工作,但不能在模拟器中工作?

为什么这个音频单元RemoteIO初始化可以在iPhone上工作,但不能在模拟器中工作?,iphone,audio,ios-simulator,audiotoolbox,audiounit,Iphone,Audio,Ios Simulator,Audiotoolbox,Audiounit,我正在使用音频单元服务设置输出渲染回调,以便将合成音频混合在一起。我的代码在我拥有的设备(iPodtouch、iPhone3G和iPad)上似乎运行良好,但在模拟器上却无法运行 在模拟器上,AudioUnitInitialize函数失败并返回-10851的值(根据Apple文档,kAudioUnitErr_InvalidPropertyValue) 这是我的初始化代码。。有谁比我更了解这个API,我在这里做的任何事情都不正确 #define kOutputBus 0 #define kInput

我正在使用音频单元服务设置输出渲染回调,以便将合成音频混合在一起。我的代码在我拥有的设备(iPodtouch、iPhone3G和iPad)上似乎运行良好,但在模拟器上却无法运行

在模拟器上,AudioUnitInitialize函数失败并返回-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调试或发行版中也出现同样的问题)


谢谢,我很感激

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

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

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

我还可以想到一些与AudioStreamBasicD描述有关的小事情,尽管我认为这些不会有多大区别:

  • kAudioFormatFlagsNativeEndian
    属性添加到格式标志中
  • mReserved
    字段显式设置为0

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

    我还可以想到一些与AudioStreamBasicD描述有关的小事情,尽管我认为这些不会有多大区别:

  • kAudioFormatFlagsNativeEndian
    属性添加到格式标志中
  • mReserved
    字段显式设置为0

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

    在我看来,只要它能在设备上工作,这就是我所关心的。当应用程序在设备上正常工作时,不要为了让它在模拟器上工作而拔掉头发

    希望有帮助


    Pk

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

    在我看来,只要它能在设备上工作,这就是我所关心的。当应用程序在设备上正常工作时,不要为了让它在模拟器上工作而拔掉头发

    希望有帮助


    是的。我想可能是这样,但音频会话已在播放类别下激活和配置。:?是 啊我想可能是这样,但音频会话已在播放类别下激活和配置。:?谢谢你的回复!根据苹果的文档,这些值是正确的(我就是从那里得到的)。根据联机示例和apple文档,输入范围定义似乎是正确的。保留字段只是用于结构对齐,所以它不应该有什么区别,但为了安全起见,我已经继续并将所有结构归零。无论如何,这个东西还是不会初始化。哦,好吧!等我不那么沮丧的时候,我会再谈的。谢谢你的回复!根据苹果的文档,这些值是正确的(我就是从那里得到的)。根据联机示例和apple文档,输入范围定义似乎是正确的。保留字段只是用于结构对齐,所以它不应该有什么区别,但为了安全起见,我已经继续并将所有结构归零。无论如何,这个东西还是不会初始化。哦,好吧!当我不那么沮丧的时候,我会回头再看。是的,我同意-这让我很恼火,因为我相信这段代码一个月前在模拟器上运行得很好。我回到它,现在我得到了这个错误。哦,好吧,我现在要离开它了。谢谢至少将此帖子标记为已回答。作为其他用户的参考。谢谢,是的,我同意-这让我很恼火,因为我相信这段代码一个月前在模拟器上运行得很好。我回到它,现在我得到了这个错误。哦,好吧,我现在要离开它了。谢谢至少将此帖子标记为已回答。作为其他用户的参考。谢谢PK