我正在创建一个Mac OS X CoreAudio命令行程序,通过AudioUnits将一些字母数字终端输入的专有渲染转换为现场音频信号,尽量保持简单。所有工作都可以达到匹配的输出采样率。
作为起点,我正在使用Addisson Wesley的“学习核心音频”的第07章教程代码,CH07_AUGraphSineWave。
我通过书籍“
”初始化AudioComponentvoid CreateAndConnectOutputUnit (MyGenerator *generator)
{
AudioComponentDescription theoutput = {0};
theoutput.componentType = kAudioUnitType_Output;
theoutput.componentSubType = kAudioUnitSubType_DefaultOutput;
theoutput.componentManufacturer = kAudioUnitManufacturer_Apple;
AudioComponent comp = AudioComponentFindNext (NULL, &theoutput);
if (comp == NULL) {
printf ("can't get output unit");
exit (-1);
}
CheckError (AudioComponentInstanceNew(comp, &generator->outputUnit),
"Couldn't open component for outputUnit");
AURenderCallbackStruct input;
input.inputProc = MyRenderProc;
input.inputProcRefCon = generator;
CheckError(AudioUnitSetProperty(generator->outputUnit,
kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Input,
0,
&input,
sizeof(input)),
"AudioUnitSetProperty failed");
CheckError (AudioUnitInitialize(generator->outputUnit),
"Couldn't initialize output unit");
}
我的主要问题是我不知道如何检索渲染AURenderCallbackStruct的输出硬件采样率 因为它确实在信号生成过程中起着至关重要的作用。我不能将采样率硬编码到渲染回调中,虽然知道它是最简单的方法,因为速率不匹配会导致信号以错误的音高播放。
有没有办法在这样的低级API上获取默认输出的采样率? 有没有办法以某种方式匹配它,而不会过于复杂? 我错过了什么吗?
提前致谢。
此致
汤姆
答案 0 :(得分:2)
调用AudioUnitGetProperty时,第6个参数必须是指向将获得答案大小的变量的指针。
Float64 sampleRate;
UInt32 sampleRateSize;
CheckError(AudioUnitGetProperty(generator->outputUnit,
kAudioUnitProperty_SampleRate,
kAudioUnitScope_Input,
0,
&sampleRate,
&sampleRateSize),
"AudioUnitGetProperty failed");
但是,只要未设置采样率,该函数就不会返回值(但也没有错误!) 但是,您可以设置采样率,例如:
Float64 sampleRate = 48000;
CheckError(AudioUnitSetProperty(generator->outputUnit,
kAudioUnitProperty_SampleRate,
kAudioUnitScope_Input,
0,
&sampleRate,
sizeof(sampleRate)),
"AudioUnitGetProperty failed");
从现在开始,您还可以使用Get-call读取值。 这不回答问题,默认值是什么。据我所知,总是44100赫兹。
答案 1 :(得分:1)
采样率是所有AudioUnit的属性 - 请参阅kAudioUnitProperty_SampleRate
(文档here) - 尽管最终它是IO单元(iOS上的RemoteIO或MacOSX上的HAL单元)驱动样本 - 音频接口的速率。这在回叫结构中不可用;您需要在初始化代码中使用AudioUnitGetProperty()
阅读此属性。
在您的情况下,以下可能会这样做:
Float64 sampleRate;
CheckError(AudioUnitGetProperty(generator->outputUnit,
kAudioUnitProperty_SampleRate,
kAudioUnitScope_Input,
0,
&sampleRate,
sizeof(sampleRate)),
如果您的目标是iOS,则还需要与Audio Session进行互动。