OS X AudioUnit:在生成器上设置杂项属性时出现 kAudio_ParamError

Posted

技术标签:

【中文标题】OS X AudioUnit:在生成器上设置杂项属性时出现 kAudio_ParamError【英文标题】:OS X AudioUnit: kAudio_ParamError when setting misc properties on a Generator 【发布时间】:2016-12-25 04:23:43 【问题描述】:

我正在构建一个简单的 AudioUnit 应用程序,它应该使用 AUGraph 将发生器(例如,生成正弦波)连接到格式转换器(因为这似乎是我需要的)到输出设备。

代码sn-ps:


    AudioComponentDescription desc ;
    desc.componentType          =   kAudioUnitType_Generator ;
    desc.componentSubType       =   kAudioUnitSubType_ScheduledSoundPlayer ;
    desc.componentFlags         =   0 ;
    desc.componentFlagsMask     =   0 ;
    desc.componentManufacturer  =   kAudioUnitManufacturer_Apple ;

    status = AUGraphAddNode ( mGraph , &desc , &mGeneratorNode ) ;
    checkOSStatus ( "creating generator node" , status ) ;

我对@9​​87654323@ 和kAudioUnitType_FormatConverter/kAudioUnitSubType_AUConvertermOutputNodekAudioUnitType_Output/kAudioUnitSubType_DefaultOutput 做类似的事情。

然后我打开图表:

AUGraphOpen ( mGraph ) ; // error checking code omitted from example

然后我得到对它们的引用:

AUGraphNodeInfo ( mGraph , mGeneratorNode , 0,&mGeneratorRef ) ; // error checking code omitted from example

然后我设置格式:


    AudiostreamBasicDescription format ;
    format.mSampleRate          =   mSamplingRate ;
    format.mFormatID            =   kAudioFormatLinearPCM ;
    format.mFormatFlags         =   kAudioFormatFlagIsSignedInteger ;
    format.mFramesPerPacket     =   1 ;
    format.mChannelsPerFrame    =   1 ; // mono
    format.mBitsPerChannel      =   16 ;
    format.mBytesPerFrame       =   format.mBitsPerChannel*format.mChannelsPerFrame/8 ;
    format.mBytesPerPacket      =   format.mBytesPerFrame*format.mFramesPerPacket ;

    status = AudioUnitSetProperty ( mGeneratorRef , kAudioUnitProperty_StreamFormat , kAudioUnitScope_Output , kOutputBus , &format,sizeof(format) ) ;
    checkOSStatus ( "setting output format" , status ) ;

(注意:kOutputBus 是 0 的枚举;它与我发现的上一个示例不合时宜。另外,mSamplingRate 是一个 size_t,其值为 48000

并设置渲染回调:


    AURenderCallbackStruct cb ;
    cb.inputProc = &_callbackProxy ;
    cb.inputProcRefCon = static_cast<void*> ( this ) ;
    status = AudioUnitSetProperty ( mGeneratorRef , kAudioUnitProperty_SetRenderCallback , kAudioUnitScope_Output , 0 , &cb,sizeof(cb) ) ;
    checkOSStatus ( "setting the generator callback" , status ) ;

但是,对于 both 流格式和渲染回调,我得到kAudio_ParamError 作为结果状态。

无论我做什么(单声道/立体声,当我下达命令等),我都无法让它工作。

注意:我稍后会这样做:

AUGraphConnectNodeInput ( mGraph , mGeneratorNode,0 , mConverterNode,0 ) ;
AUGraphConnectNodeInput ( mGraph , mConverterNode,0 , mOutputNode,0 ) ;
AUGraphInitialize ( mGraph ) ;
AUGraphStart ( mGraph ) ;
// again, error-checking code omitted from example

它可以工作........但我无法设置这些属性,因此无法生成音频。

我错过了什么?

(对于拥有 1500+ 声誉的人:请制作一个“osx-sierra”标签;我对那个标记有点害羞)

【问题讨论】:

您对 mSamplingRate 使用什么值? 48000 用于这些测试。 【参考方案1】:

来自本文末尾的一条晦涩的评论:

https://discussions.apple.com/thread/1989797?tstart=0

我在创建东西之前一开始就运行AUGraphOpen(为什么?),它成功了。

但是后来我遇到了无效的格式错误,所以我在转换器的输入而不是生成器的输出上设置了格式。

然后它没有调用渲染回调,所以我完全移除了生成器并将渲染回调放在转换器的输入上。

在这一点上,它工作并产生了我的声音。

我希望这可以帮助其他人在未来使用这个记录如此糟糕的 API。

【讨论】:

以上是关于OS X AudioUnit:在生成器上设置杂项属性时出现 kAudio_ParamError的主要内容,如果未能解决你的问题,请参考以下文章

配置 Mac OS X AudioUnit 以提供 SignedInteger 示例

界面生成器:10.7 之前的 Mac OS X 版本上的属性不可用标识符

Python:在生成器对象上调用 list() 会产生不正确的结果

如何在苹果的 AudioUnit 3D 混音器上设置总线?

带有if条件的生成器上的python列表理解

准备一个函数以在生成器运行器中重复使用