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 ) ;
我对@987654323@ 和kAudioUnitType_FormatConverter
/kAudioUnitSubType_AUConverter
和mOutputNode
和kAudioUnitType_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 版本上的属性不可用标识符