CoreAudio获得输出采样率

时间:2013-12-07 20:59:42

标签: core-audio

我正在创建一个Mac OS X CoreAudio命令行程序,通过AudioUnits将一些字母数字终端输入的专有渲染转换为现场音频信号,尽量保持简单。所有工作都可以达到匹配的输出采样率。

作为起点,我正在使用Addisson Wesley的“学习核心音频”的第07章教程代码,CH07_AUGraphSineWave。

我通过书籍“

”初始化AudioComponent
void 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上获取默认输出的采样率? 有没有办法以某种方式匹配它,而不会过于复杂? 我错过了什么吗?

提前致谢。

此致

汤姆

2 个答案:

答案 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进行互动。