我正在使用音频单元框架在 mac os x 上开发一个 VOIP 应用程序。在我的程序中,我设置了一个输入 AUHAL 并使用默认的流格式(44.1kHz,32bit/channel)从麦克风捕获音频。在这种情况下,我的程序运行良好。
这是代码:
//The default setting in my program
CheckError(AudioUnitGetProperty(m_audCapUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Output, //the value is 0
inputBus, //the value is 1
&m_audCapUnitOutputStreamFormat,
&propertySize),
"Couldn't get OutputSample ASBD from input unit") ;
//the inOutputSampleRate is 44100.0
m_audCapUnitOutputStreamFormat.mSampleRate = inOutputSampleRate ;
CheckError(AudioUnitSetProperty(m_audCapUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Output,
inputBus,
&m_audCapUnitOutputStreamFormat,
propertySize),
"Couldn't set OutputSample ASBD on input unit");
//
由于我正在开发一个 VOIP 应用程序,默认格式(44.1kHz,32bits/Channel)不适合我的程序,所以我想将采样率更改为 8kHz。我编写了这段代码来更改程序中的格式:
//......
inOutputFormat.mSampleRate = 8000. ;
inOutputFormat.mFormatID = kAudioFormatLinearPCM ;
inOutputFormat.mChannelsPerFrame = 2 ;
inOutputFormat.mBitsPerChannel = 16 ;
inOutputFormat.mBytesPerFrame = 2 ;
inOutputFormat.mBytesPerPacket = 2 ;
inOutputFormat.mFramesPerPacket = 1 ;
inOutputFormat.mFormatFlags = kAudioFormatFlagsAudioUnitCanonical ;
inOutputFormat.mReserved = 0 ;
CheckError(AudioUnitSetProperty(m_audCapUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Output,
inputBus,
&inOutputFormat,
ui32PropSize),
"Couldn't set AUHAL Unit Output Format") ;
//.......
在这种情况下,程序运行良好,直到我的程序调用AudioUnitRender
回调函数中的 它无法使用文档中AudioUnitRender
的错误代码-10876
调用
kAudioUnitErr_NoConnection
。错误代码让我很困惑,所以我用谷歌搜索了它,但找不到任何有用的信息。有人可以告诉我错误的实际含义吗?
这还没有结束,我通过这段代码再次更改了格式:
//.....
inOutputFormat.mSampleRate = 8000. ;
inOutputFormat.mFormatID = kAudioFormatLinearPCM ;
inOutputFormat.mChannelsPerFrame = 2 ;
inOutputFormat.mBitsPerChannel = 32 ;
inOutputFormat.mBytesPerFrame = 4 ;
inOutputFormat.mBytesPerPacket = 4 ;
inOutputFormat.mFramesPerPacket = 1 ;
inOutputFormat.mFormatFlags = kAudioFormatFlagsAudioUnitCanonical ;
inOutputFormat.mReserved = 0 ;
CheckError(AudioUnitSetProperty(m_audCapUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Output,
inputBus,
&inOutputFormat,
ui32PropSize),
"Couldn't set AUHAL Unit Output Format") ;
//........
在这种情况下,程序AudioUnitRender
再次调用失败并返回另一个错误代码-10863(kAudioUnitErr_CannotDoInCurrentContext)
。我用谷歌搜索了它,但我发现
了一些有用的东西。阅读那里的信息后,我猜我在 AUHAL 上设置的采样率或格式可能不受硬件支持。
所以我写了一些代码来检查默认输入设备上的可用采样率:
//..........
UInt32 propertySize = sizeof(AudioDeviceID) ;
Boolean isWritable = false ;
CheckError(AudioDeviceGetPropertyInfo(inDeviceID, //the inDeviceID is the default input device
0,
true,
kAudioDevicePropertyAvailableNominalSampleRates,
&propertySize,
&isWritable),
"Get the Available Sample Rate Count Failed") ;
m_valueCount = propertySize / sizeof(AudioValueRange) ;
printf("Available %d Sample Rate\n",m_valueCount) ;
CheckError(AudioDeviceGetProperty(inDeviceID,
0,
false,
kAudioDevicePropertyAvailableNominalSampleRates,
&propertySize,
m_valueTabe),
"Get the Available Sample Rate Count Failed") ;
for(UInt32 i = 0 ; i < m_valueCount ; ++i)
{
printf("Available Sample Rate value : %ld\n",(long)m_valueTabe[i].mMinimum) ;
}
//..............
然后我发现可用的采样率是 8000、16000、32000、44100、48000、88200 和 96000。
8000的采样率是我刚才设置的,但是调用得到错误码AudioUnitRender
,我只想说,为什么?
google了这么多,也看了很多文档,都没有得到答案,有没有人能解决我遇到的这个问题?</p>
换句话说; 如何在仅输入的 AUHAL 上更改采样率或格式?</p>