Core Audioのデバイス


■■■ サウンドデバイス ■■■

Mac OS XのサウンドフレームワークのCore Audioではかなりいろいろなデバイスが OS自体でサポートされている。USBデバイスの場合チップレベルでのサポートに なるようだ。手元は以下のようなデバイスがある。

メーカー 型番 USB インプット アウトプット デバイス表示
Texas Instruments PCM2704 1.1 無し LINE,S/PDIF USB Audio DAC
Texas Instruments PCM2706 1.1 無し LINE,S/PDIF,I2S USB Audio DAC
C-Media CM6206 1.1 LINE,S/PDIF LINE,S/PDIF USB Sound Device
C-Media CM6317 1.1 LINE 無し USB PnP Audio DAC
tenx technology TP6911 1.1 LINE LINE USB AUDIO
Tenor TE7022L 1.1 LINE,S/PDIF LINE,S/PDIF Audinst HUD-mx1

USBのオーディオクラスのサポートで認識されているのかと思われるが、動作が怪し い感じの物もある。CM6206は認識しているがノイズが入って使い物にならない。

Audinst HUD-mx1はCoreAudioのTE7022Lのサポートの一部なのだと思われる。このため 無いはずの入力ポートが表示される。

Roland UA-4FXとTEAC US-144MKIIはそれぞれのメーカーがドライバを作成している。

■■■ 入力の切り替えについて ■■■

以下はCM106をつないだ場合に表示される「システム環境設定」の「サウンド」だが デバイス(USB Sound Device)に複数のソースがあり選択する事で入力の切り替えが できる。

スクリーンショット(2012-12-08 15.03.37)

デフォルトのサンプリングレートは、「アプケーション」フォルダの 「ユティリティフォルダ」にある「Audio Midi 設定」でおこなえる。この設定は システムを終了されても保持される。S/PDIFをソースにした場合、サンプリング レートが正しく設定されていないと正常に録音できない事があります。

スクリーンショット(2012-12-08 19.48.18)

TEAC US-144MKIIのドライバはデバイスに一つしかソースがなく、ユーティリティで 入力を選べるようなってる。

スクリーンショット(2011-10-31 7.36.33)

Roland UA-4FXはS/PDIF/LINEとサンプリングレートの切り替えはユニットのディップ スイッチになっている。切り替え後にいったんUSBを外さないと有効にならない。

猫のお留守番の1.2まではデバイスの複数ソースに対応していなかったので、ソース が一つだけの場合の方が都合が良かったが、アプリケーション側が複数ソースに対応 できていればこちらの方が便利とも思える。

猫のお留守番の複数ソース対応を行っていて分かったのだがCore Audioの入力 オーディオデバイスにはソースが0の場合と1の場合と複数の場合がある。 Roland UA-4FXは0でTEAC US-144MKIIが1つでCM106が複数になる。
UInt32 sourceSize = sizeof(UInt32);
err = AudioDeviceGetPropertyInfo(devid, 0, 1, kAudioDevicePropertyDataSources, &sourceSize, NULL);
上のコードを実行するとRoland UA-4FXはsourceSizeが0で、TEAC US-144MKIIは4で 返ってくる。0以外の場合は以下でソースのidの配列が取得できる。
UInt32 * srcids = (UInt32 *) malloc(sourceSize);
err = AudioDeviceGetProperty(devid, 0, 1, kAudioDevicePropertyDataSources, &sourceSize, srcids);
この配列の値を使い、以下を実行するとソースの名前が拾える。
CFStringRef sourceRef;
AudioValueTranslation theTranslation = { &srcids[j], sizeof(UInt32), &sourceRef, sizeof(CFStringRef) };
propsize = sizeof(AudioValueTranslation);
AudioDeviceGetProperty(devid, 0, 1, kAudioDevicePropertyDataSourceNameForIDCFString, & propsize, &theTranslation);
0か1の場合はデバイス直でもいけるが、複数ある場合は以下のおまじないが必要 になる。
propsize = sizeof(UInt32);
AudioDeviceSetProperty(devid, NULL, 0, 1, kAudioDevicePropertyDataSource, propsize, &inSrc);
なんともややっこしい。

猫のお留守番もいろいろデバッグライトが入っているがTASCAMのUS-144MKIIの ドライバー(2.10)も以下のようなデバックライトが入っているようだ。
fwUpdaterActive: No updater detected
init: mpRegistry->getRouting(1,0,0)
init: mpRegistry->getRouting(1,1,0)
init: mpRegistry->getRouting(1,2,0)
init: mpRegistry->getRouting(0,0,0)
init: mpRegistry->getRouting(0,1,0)

~PGOSXDevice Saving routing 1, 0 with value 0
~PGOSXDevice Saving routing 1, 1 with value 0
~PGOSXDevice Saving routing 1, 2 with value 0
~PGOSXDevice Saving routing 0, 0 with value 0
~PGOSXDevice Saving routing 0, 1 with value 0
PGOSXDevice::closeDevice, callDetach

MacOS 9の頃に販売されていたオンキョーのSE-U55がハードオフで324円だったので 買ってきてMacOS Xで接続したところ認識された。USBのAudioクラスのCoreAudioでの サポートによるものと思われるが、本体にMacとWinの切り替えがあり切り替えると 以下のようにUSBのレスポンスが変わる。

bash-3.2$ diff "USB Bus Probe Win.txt" "USB Bus Probe Mac.txt"
1255c1255
<             Raw Descriptor (hex)    0030: 02 00 02 00 00 09 24 03  03 04 03 00
 02 02 0C 24  
---
>             Raw Descriptor (hex)    0030: 02 00 02 00 00 09 24 03  03 02 06 00
 02 02 0C 24  
1331c1331
<                 Output Terminal Type:   0x304 (Desktop speaker)
---
>                 Output Terminal Type:   0x602 (Digital audio connector)

オンキョーはSE-U55シリーズを現在も販売しているが、Macのサポートは明記されてい ない。現在もAudioクラスであれば使えると思われるのだが。付属ソフトが対応してい ない為なのかもしれない。

LossLessで録音した時にデバイスは24Bitなのだが16Bitとして録音されてしまうという 指摘があった。ちょっと調べたところLossLessの場合、Formatを kAppleLosslessFormatFlag_16BitSourceDataを設定していて、これが原因のようだ。 デバイスのBit数を拾ってその値を突っ込むようにすれば良さそうだが、デバイスの Bit数の拾い方がわからない。。。

CoreAudioの通常の処理ではデバイスが24Bitであっても、int値を32BitFloatに変換 してアプリに引き渡されるのでLossLessといっても完全に元と同じなるわけではない。

kAudioDevicePropertyStreamFormatではmBitsPerChannelはつねに32が返ってくるが kAudioStreamPropertyPhysicalFormatsではデバイスの生のビット数が拾えた。ただ これはAudioStreamBasicDescription配列として返ってきて、現在どれが使われてい るかはどうやったらわかるのかな。。。

何の事はなくてkAudioStreamPropertyPhysicalFormatで拾えた。ヘッダーの定義が 別のところにあったので昨日は気がつかなかった。。。

caindev

デバイスによってはAudio MIDI設定でビット数が設定可能なようだ。

96KのソースをAACで録音しようとするとエラーで録音できない。おそらくAACの仕様なんだと 思うが、エラーも出してなくてすんません。ExtAudioFileSetPropertyでエラーになる ようだ。AACで録音する場合は48Kか44.1Kでデバイスを設定してお使いください。

薮の雀を起動中にUS-144 MKIIをUSBから抜き差しすると、AudioHardwareAddPropertyListener で設定した関数が呼ばれて、デバイスをスキャンすると96Kに設定しているにも関わらず kAudioDevicePropertyNominalSampleRateが44100で返ってくる事があるようだ。 たまに正しく96Kで返ってくる事もある。ドライバーバジョン2.10のバグかもしれないな。


Copyright (C) 2012 Hiroki Mori All Rights Reserved.