2012-05-29 7 views
5

私は、macosxのkAudioUnitSubType_VoiceProcessingIOサブタイプ(kAudioUnitSubType_HALOutput)の内蔵マイク/スピーカーを使って簡単なプレイスルーアプリケーションの例を見つけました。コアオーディオAPIのコメントによれば、kAudioUnitSubType_VoiceProcessingIOはデスクトップとiPhone 3.0以上で使用できるので、macosのどこかに例があるはずです。mac osのコアオーディオAPIの "kAudioUnitSubType_VoiceProcessingIO"サブタイプの使用方法は?

サンプルはどこにありますか?または、macosでkAudioUnitSubType_VoiceProcessingIOサブタイプを使用する方法を知っている人はいますか?私はすでにiOSで行ったのと同じ方法で試しましたが、うまくいきませんでした。

答えて

5

このIOユニットを有効にするいくつかのことを発見しました。

  1. ストリーム形式は本当に厄介です。これは、チャネルあたり
    • リニアPCM
    • FlagsCononical
    • 32ビットである必要があり
    • (私は1つのチャネルをしましたが、それはより多くで動作するかもしれません) -
    • サンプルレート44100(他の人とうまくいくかもしれない可能性があります)
  2. EnableIOを設定しません。 IOはデフォルトで有効になっており、そのプロパティは書き込み可能ではありません。
  3. 初期化の前にストリームフォーマットを設定します。

他のコアオーディオの仕事と同じように、単一の関数呼び出しごとのエラーステータスを確認し、エラーの内容を特定し、最終的に動作させるまで各ステップでほとんど変更を加える必要があります。

+0

他のサンプルレートでも動作します(16 000を使用しています)。 FlagsCanonicalフォーマットは、MAC OS X Float32で-1.0から1.0までの範囲を意味します。 – sarsonj

+0

@sarsonj:デフォルトの44100以外のサンプルレートで動作させることはできますか?私は16000または48000を設定しようとするとkAudioUnitErr_FormatNotSupportedを取得します。 – Erfan

+0

MacでkAudioFormatFlagsCanonicalと1つのチャンネル、16000を使用していて、正常に動作しています。 – sarsonj

2

チャンネルの数に基づいて2つの異なる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; 

kAudioUnitSubType_VoiceProcessingIO

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

をI/Oユニットを使用する場合、私は明確として、オーディオ出力の中断を確認することができバッファサイズはこの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 
0

私がすべき実現SO post hereおかげこのフラグを使用しました:

audioFormat.mFormatFlags  = kAudioFormatFlagsCanonical; 
関連する問題