如何在mac os中使用核心音频API的“kAudioUnitSubType_VoiceProcessingIO”子类型?

时间:2012-05-29 02:36:12

标签: macos core-audio

我在macosx中找到了使用内置麦克风/扬声器和 kAudioUnitSubType_VoiceProcessingIO 子类型(不是kAudioUnitSubType_HALOutput)的简单播放应用程序的示例。关于核心音频api的评论说kAudioUnitSubType_VoiceProcessingIO可以在桌面上使用iPhone 3.0或更高版本,所以我认为必须有一个适用于macos的例子。

你知道样品在哪里吗?或者是否有人知道如何在macos中使用kAudioUnitSubType_VoiceProcessingIO子类型?我已经尝试过与iOS相同的方式,但它没有用。

3 个答案:

答案 0 :(得分:5)

我发现了启用此IO单元的一些功能。

  1. 流格式非常挑剔。它一定要是
    • LinearPCM
    • FlagsCononical
    • 每通道32位
    • (我做了1个频道,但它可以使用更多) -
    • 采样率44100(可能与其他人合作可能不会)
  2. 您没有在其上设置EnableIO。默认情况下启用IO,该属性不可写。
  3. 在初始化之前设置流格式。
  4. 与其他核心音频工作一样,您只需要检查每个函数调用的错误状态,确定错误是什么,并在每个步骤中进行少量更改,直到最终使其工作。

答案 1 :(得分:1)

我根据频道数设置了两个不同的kAudioUnitProperty_StreamFormat。

size_t bytesPerSample = sizeof (AudioUnitSampleType);
stereoStreamFormat.mFormatID          = kAudioFormatLinearPCM;
stereoStreamFormat.mFormatFlags       = kAudioFormatFlagsAudioUnitCanonical;
stereoStreamFormat.mBytesPerPacket    = bytesPerSample;
stereoStreamFormat.mFramesPerPacket   = 1;
stereoStreamFormat.mBytesPerFrame     = bytesPerSample;
stereoStreamFormat.mChannelsPerFrame  = 2;
stereoStreamFormat.mBitsPerChannel    = 8 * bytesPerSample;
stereoStreamFormat.mSampleRate        = graphSampleRate;

size_t bytesPerSample = sizeof (AudioUnitSampleType);
monoStreamFormat.mFormatID          = kAudioFormatLinearPCM;
monoStreamFormat.mFormatFlags       = kAudioFormatFlagsAudioUnitCanonical;
monoStreamFormat.mBytesPerPacket    = bytesPerSample;
monoStreamFormat.mFramesPerPacket   = 1;
monoStreamFormat.mBytesPerFrame     = bytesPerSample;
monoStreamFormat.mChannelsPerFrame  = 1;                  // 1 indicates mono
monoStreamFormat.mBitsPerChannel    = 8 * bytesPerSample;
monoStreamFormat.mSampleRate        = graphSampleRate;
使用I / O单元作为kAudioUnitSubType_VoiceProcessingIO时,使用此音频流格式

AudioComponentDescription iOUnitDescription;
iOUnitDescription.componentType = kAudioUnitType_Output;
iOUnitDescription.componentSubType = kAudioUnitSubType_VoiceProcessingIO;
iOUnitDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
iOUnitDescription.componentFlags = 0;
iOUnitDescription.componentFlagsMask = 0;

我可以清楚地看到音频输出中断,因为缓冲区大小小于此AudioUnit中的缓冲区大小。

切换回kAudioUnitSubType_RemoteIO

iOUnitDescription.componentSubType = kAudioUnitSubType_RemoteIO;

中断消失了。

我正在处理来自麦克风的音频输入并在音频缓冲区上应用一些实时计算。

在方法中,graphSampleRate是AVSession采样率

graphSampleRate = [AVAudioSession sharedInstance] sampleRate];

也许在这里我错了。

最后,配置参数值如下:

立体声流格式:

Sample Rate:              44100
Format ID:                 lpcm
Format Flags:              3116
Bytes per Packet:             4
Frames per Packet:            1
Bytes per Frame:              4
Channels per Frame:           2
Bits per Channel:            32

单声道格式:

Sample Rate:              44100
Format ID:                 lpcm
Format Flags:              3116
Bytes per Packet:             4
Frames per Packet:            1
Bytes per Frame:              4
Channels per Frame:           1
Bits per Channel:            32

答案 2 :(得分:0)

感谢SO post here我意识到我应该使用这个标志:

 z <- data.frame(a=1:10)
 xlist <- list(z,z,z,z)
# wrong
 lapply(xlist, function(x) { x$b <- rep(8,10)})
#correct
lapply(xlist, function(x) { x$b <- rep(8,10);return(x)})