メーカー | 型番 | 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 |
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);なんともややっこしい。
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で拾えた。ヘッダーの定義が 別のところにあったので昨日は気がつかなかった。。。
デバイスによってはAudio MIDI設定でビット数が設定可能なようだ。
96KのソースをAACで録音しようとするとエラーで録音できない。おそらくAACの仕様なんだと 思うが、エラーも出してなくてすんません。ExtAudioFileSetPropertyでエラーになる ようだ。AACで録音する場合は48Kか44.1Kでデバイスを設定してお使いください。
薮の雀を起動中にUS-144 MKIIをUSBから抜き差しすると、AudioHardwareAddPropertyListener で設定した関数が呼ばれて、デバイスをスキャンすると96Kに設定しているにも関わらず kAudioDevicePropertyNominalSampleRateが44100で返ってくる事があるようだ。 たまに正しく96Kで返ってくる事もある。ドライバーバジョン2.10のバグかもしれないな。