Music TO GO!

2010年10月31日

MacのCoreAudioとプレーヤーソフトの関係について

AyreWaveのところで、自動サンプルレート切り替え(Auto sample rate switchingまたはsample rate following)について書きましたが、今回はこの辺をもう少し詳しく解説していきます。あわせてCoreAudioの排他制御や、AyreWaveでもサポートされていてPure Musicの次期バージョンでも実装されるIntgerモードなどについても触れます。
これでビットパーフェクトから、CoreAudioの動作、Macのプレーヤーソフト事情の最新のところ、今後のDACの展望までこの記事でカバーしてみたいと思います。

情報はAppleのCoreaudio ML、CoreAudio reference、そしてCAやComputer AsylumなどへのPureMusicなどソフトウエア開発者のポストなどによります。iPadのUSBサポートもそうですが、CoreAudio MLはAppleの開発者も返答するので、アップル側の見解として重要なソースです。
また以前書いたWindows7のWASAPIの仕組みの記事もあわせて読むと面白いかもしれません。

*CoreAudioとは

まずCoreAudioについてですが、Mac上で外部DAC機器などを接続してプレーヤーソフトがそこから音を出すためにはかならずCoreAudioというOSの一部を使用します。前に書いたようにWindowsでもVista以降は刷新された音声システムのことをCoreAudioと呼びますが、今回特に指定が無ければMacOSXのCoreAudioのことです。
音を出すソフトウエアというとミュージックプレーヤーだけではなく、かならずOSが介在しますので、この辺はコンピューターオーディオにとっては重要なポイントです。ドライバーとハードであるDACなどはHALというレイヤーで抽象化されます。アプリケーションはAudioUnitというオブジェクトを介してHALにアクセスします。簡単に書くとこんな感じです。

プレーヤーソフト->Audio Unit -> HAL ->オーディオデバイス

ではCoreAudioとは具体的に何かと言うと、プログラム的に見るとWASAPIと同様にプログラミングインターフェース(API)とライブラリ群で、実体としてはcoreaudiodというDaemon(Unixにおける常駐プログラム・サービス)があります。ターミナルを開けてps ax|grep coreaudioとやるとプロセスが走っているのがわかります。

*MacOSXでハイサンプリングファイルをビットパーフェクトで再生する方法

まずAyreWaveやPureMusicでの自動サンプルレート切替を説明する前に、それがないとどうなるのかということをiTunes(現行の10.0)を用いて説明します。言い換えるとMacOSXでハイサンプリングファイルをビットパーフェクトで再生するための手順ということになります。

1. DACなどをMacに繋ぎます。サウンド設定でその機器を選んでください。
次にAudioMidi設定を開けて、その機器がどのサンプリングレートに対応しているかを確認してください。
2. 再生したい楽曲ファイルのデータのサンプリングレートを確認して、AudioMidiのサンプリングレートを同じところに設定する。
たとえば44.1kHzのデータであれば、44.1kHzに、96kHzのデータであれば、96kHzにあわせます。
3. iTunesを立ち上げます。その楽曲ファイルを再生します。
4. 楽曲ファイルのデータのサンプリングレートが変わった場合、iTunesをいったん閉じてください。
5. 再度再生したい楽曲ファイルのデータのサンプリングレートを確認して、AudioMidiのサンプリングレートを同じところに設定します。
6. iTunesを立ち上げます。その楽曲ファイルを再生します。

つまり楽曲ファイルのデータのサンプリングレートが変わるごとにこの手順を繰り返えさねばなりません。
もし再生楽曲ファイルのサンプルレートがAudioMidi設定と合わない場合、CoreAudio(AU)がAudioMidi設定にあわせるようにリサンプリングをします。
これはWindowsのいわゆるカーネルミキサーと同じです。さまざまなOS上のプログラムが一斉に音を出すときに、ばらばらのサンプリングレートでひとつのDACに出すわけにはいきませんので、どれかひとつに統一するということです。Macの場合はAudioMidiの設定値がそうです。

このApple MLのところにこの辺のところが書いてあります。これはStereophileに書かれたCoreAudioのリサンプリングに関しての問題提起を受けた記事です。http://lists.apple.com/archives/coreaudio-api/2008/Jan/msg00273.html
文を読むとわかりますが、このポストはアップルの技術者です(おそらくアプリ側)。CoreAudioで使用しているサンプリングレート変更のAPIにおいて、その設定値があまり高くないというのは注意すべき点でしょう。これは応答速度を重視するOSの一部としては致し方ないことですね。
(現時点では違うかもしれませんので念のため)

*自動サンプルレート切り替えとhogモード

これではサンプリングレートが異なる楽曲がプレイリストにまじっているとあまりに大変なので、いくつかのアプリケーションは「自動サンプルレート切り替え」というサンプルレートにあわせて自動的にAudioMidi設定を切り替える動作ができます。ミュージックプレーヤーでこれが出来るのはたとえばAmarra、Pure Music、AyreWaveです。
これを使うと再生しているサンプルレートにあわせてAudioMidiの設定が自動で変わるのが分かると思います。つまり前章で書いたことを自動でやっていることになります。

ただしこれには考慮点があります。
それはさきに書いたようにOS上で音声出力を使うのはそのミュージックプレーヤーだけではないため、もし自動サンプルレート切り替えをするなら他のアプリと競合してしまうからです。
これはみながいっしょにテレビを見ているのに一人の人が勝手にチャンネルをがちゃがちゃやっているようなものです。
このため、あるミュージックプレーヤーソフトが自動サンプルレート切り替えを使うためには前提として、そのデバイスを排他的に占有使用します。これがCoreAudioにおけるhogモードというもので、デバイスの排他使用を可能にします。

iTunesは自動サンプルレート切り替えを行わないのですが、これは上のリンクにあるようにバグであるとも、アップルはこれを推奨してないからとも言われています。というのは、他のソフトがhogモードのデバイスをアクセスに行くとエラーを返されますが、もしそのソフトがこれに対応(想定)していないとクラッシュする可能性もあります。そのため、iTunes(というかアップル)ではhogモードを避けていると言うことです。
エラー処理をするかどうかはプログラムの実装上の問題だし、hogモード自体はOSX初期の頃からあったようですがいまでも使ってるプログラムはそう多くありません。そうするとデバイスを当然アクセスできるものと考えているプログラムが多くても無理はないところです。
こうした点ではやはり後発のWindowsのCoreAudioのほうがよりOSレベルで排他制御はスマートに処理していると思います。

*CoreAudioのビットパーフェクトについて

さて、ここからがまた問題ですが、hogモードが排他WASAPIみたいなものなら、これがビットパーフェクトの仕組みと思いたくなります。しかしhogモードとビットパーフェクトは直接関係ありません。たとえばさきに書いたようにhogモードやオートサンプルレートスイッチを使わないiTunesでもさきのようにきちんと手順を踏めばビットパーフェクトが達成できます。次にこの辺を少し詳しく見ていきます。

Windows XPではビットパーフェクトを達成するにはカーネルミキサーをバイパスするのが必須であるため、ビットパーフェクトを達成するにはCoreAudioのミキサーをバイパスするのではないかと思いたくなります。
しかしMacのCoreAudioではそうした手段をとらなくてもビットパーフェクトでありえます。

これはデータの型変換の仕組みにあります。まずデータの型がどう変わるかを見ていきます。
もとのハイレゾ楽曲ファイルのデータは24bit整数型です。CoreAudioではデータの表現として内部的に32bit浮動小数点型を使います。24bitのDACではドライバーに24bit整数型を渡します。
ここで24bit整数型->32bit浮動小数点型->24bit整数型とわたりますので、型変換により壊れるように一見見えます。しかし、そうはなりません。

もう少し子細にそれぞれの型について見ていきましょう。
24bit整数型は1bitの符号と23bitの整数からなります。32bit小数点型は1bitの符号と23bitの仮数部と8bitの指数部からなります。浮動小数点形式とは(仮数)x(基数)^(指数)で数を表現するものです。つまり指数がゼロであれば(基数)^0で1ですから、実質仮数部の値がデータの値となります。つまり、これは32bitの入れ物に24bitデータを左詰めでパディングしたのと同じことです。だからリサンプルなどの計算がなければ元の値は保たれます。
逆にドライバーに出すときも、そのまま24bitを元の値で返すことができます。つまりビットパーフェクトが達成できます。

この辺はCAフォーラムのPureMusicスレッドのこの辺でhogモードとかビットパーフェクトについて語られています。PureMusicの開発者も書いています。

http://www.computeraudiophile.com/content/Pure-Music#comment-40895

さて、多少わかりにくくてもここを説明したのはもう一つわけがあります。それはintegerモードについて説明するためです。

*integerモードと32bit DAC

前章を受けるとinterger(整数)モードが必要な理由もここから明らかです。
つまりCoreAudioでは32bit浮動小数点形式を内部的に使うといっても、さきに書いたように32bit浮動小数点形式は実質24bit整数の「精度」しかありません。これはMacOSXの音声出力は通常は24bitが限界であるということです。そうすると32bitDACが32bitの整数型データを必要とするとき、プレーヤーがそれに応えて32bitを返しても、CoreAudioで32bit浮動小数点をいったん介すると今度はそこで壊れてしまいます。そのため経路を32bit浮動小数点ではなく、32bit整数とみなすのがこのIntegerモードということのようです。
上のスレッドの中でPureMusicの開発者もintegerモードは32bit DACに出すためと言っています。
そして具体的に言うとその背景にあるのはESS Sabre32のようです。

海外ではかなり流行り始めているオーディオ製品に ESS Sabre32を使ったDACがあります。例えばHeadFi界隈でも有名なAudio-gdのDAC NFB-1やNFB-10などが使ってるES9018というDACチップはSabre32アーキテクチャです。
ESSという会社は最近かなり評価が高くて、例えば今年評判のよかったPeachtree NovaはES9006という同社のSabreチップでした。Sabre(セーバー)は8チャンネルのDACを使ってSNを稼ぐアーキテクチャのようで、ハイパーストリーミングとかタイムドメイン・ジッター制御とか特徴的な技術満載です。これらはもともとAnalog Devicesにいた技術者が自分のアイデアを生かしたいということで設計をしたようです。Sabre32はその32bit版です。Pure Musicの作者はこの辺に注目しているようです。
またAyreWaveはその名のとおりAyreWaveLengthが関係しているのですが、その背景にはゴードンさんがSabre32のDACモジュールを作ってるということもありそうです。

これを見ても分かるように、ミュージックプレーヤーソフト、OS、DACというのは足並みを揃えていく必要があるのがコンピューターオーディオです。さもないとどこかにボトルネックが生じてしまいます。
うちのブログを見ている方はわかると思いますが、これはUSBオーディオクラス2.0でも同じことが言えます。

来年32bit DACがブレークするかは定かではありませんが、Macにおいてはキーはミュージックプレーヤーのintegerサポートでしょうか。
まあこれ以上はCES2011ですね。と、ヘッドフォン祭や他のオーディオショウシーズンが終わるとそろそろもう来年の展望を考えたくなってきます。
posted by ささき at 23:23 | TrackBack(0) | __→ PCオーディオ・ソフト編 | このブログの読者になる | 更新情報をチェックする

この記事へのトラックバック