高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technote 1187

Digital CD Audio


目次

これまでの方法

これからの方法

アプリケーションに必要な変更

CD/DVD ドライバに必要な変更

その他の注意事項とコメント

要約

ファイルのダウンロード

Mac OS 9.0 以降、CD オーディオを再生する新しい方法、つまりデジタル再生を行う方法が導入されました。純粋なデジタルデータが CD から読み出され、Sound Manager を介して PCM (Pulse Code Modulation - 標準的な非圧縮オーディオ) データ ストリームとして再生されてスピーカに出力されます (もちろん、耳で聴くことができるようにここでアナログ信号に変換する必要はありますが)。

 

このテクニカルノートでは、アプリケーションでこの新しいデジタル CD オーディオのサポートを利用する方法と、オーディオのデジタル再生をサポートするために CD または DVD ドライバがすべきことについて説明します。


これまでの方法

Macintosh に CD-ROM が組み込まれて以来、オーディオはアナログサウンドストリームとして再生されてきました。CD-ROM ドライブは、マイクロフォンとまったく同様にアナログサウンドを出力していました。また、Mac はそのようなオーディオを録音し、必要な場合は、それをスピーカ経由で出力していました (同時再生)。

オーディオデータの流れ (便宜上 CD-ROM からの) を図式化すると、次のようになります。

tn1187.1.gif

オーディオデータは CD-ROM ドライブから読み込まれ、CD-ROM ドライブの内部でアナログオーディオに変換されていました。そこからアナログオーディオは Macintosh 上のサウンドハードウェアに出力されます。また、アナログオーディオは再度デジタルデータに変換され、Sound Manager に渡されます。Sound Manager では、CD オーディオ入力源を録音しているアプリケーションにこのオーディオを渡していました。同時再生が「入」になっていると、サウンドハードウェアは、オーディオを聴取するために CPU の介在またはオーバーヘッドを必要とすることなく、再度アナログに変換したサウンドをスピーカ (またはヘッドフォン) に出力していました。このような度重なるオーディオの変換はノイズ発生や音質低下の原因になるだけでなく、再生されたものをサンプリング精度で厳密に認識することを困難にしていました。

しかし、Mac OS 9.0 によってすべてが変わりました。

ページの先頭に戻る

これからの方法

Mac OS 9.0 以降、「内部 CD」と呼ばれる新しいサウンド入力デバイスが導入されました。内部 CD が入力源として選択されていると、Macintosh は CD から直接的にデジタルデータを読み込み、それをデジタルオーディオとして再生します。これにより、アプリケーションは標準的な Sound Input Manager 録音呼び出しを使って、CD から高品位のデジタルオーディオを録音できるようになります。なお、ユーザが CD を聴くために内部 CD 入力ドライバを選択する必要はありません。このドライバの選択が必要なのは録音を行うときだけです。

tn1187.2gif

CD-ROM に内蔵されているデジタル - アナログコンバータ (これが、オーディオファンに評判の悪い音質の原因になっていました) を使用するのではなく、通常のファイルが CD から読み込まれるときとまったく同様に、オーディオはデジタルデータとして読み込まれます。さらに、このデジタルオーディオは、これまで同様に Sound Manager に渡されて再生されます。

これにより、サウンドが Macintosh の組み込みサウンドハードウェアや組み込みスピーカ、あるいは USB スピーカなどのその他のハードウェアから再生することが可能になります。これまでは、サードパーティ製のハードウェアを使わないと内部オーディオ CD を再生することは不可能でした。

オーディオデータの流れは次のようになります。

tn1187.3.gif

ただし、このことは、CPU がオーディオを再生するコードを実行するようになったということを意味します。この新機能をサポートするために、ごくわずかですがパフォーマンスの低下が認められます。サウンド出力レートが 44.1 kHz に設定されているとき、PowerBook G3 300MHz では計測結果から判断すると約 0.5% の CPU が消費されます。この数値には、サウンド出力に必要な Sound Manager サウンドチャネルの CPU 消費量は含まれていません。

ページの先頭に戻る

アプリケーションに必要な変更

組み込み入力ドライバから内部 CD を選択するオプションは今後提供されません。ユーザの CPU がデジタル CD オーディオをサポートできる場合、Macintosh に一貫したユーザインタフェースを提供するため、古いアナログ方式で内部 CD を選択するオプションは削除されました。

アプリケーションのユーザに新しい内部 CD 入力源を使ってデジタル CD オーディオを録音する機能を提供したい場合は、録音源として内部 CD を選択する必要があります。これは、組み込みサウンド入力デバイスの異なる入力源ではなく、まったく独立したサウンド入力ドライバです。デフォルトの入力デバイスであることを前提にできないため、さまざまな入力源を選択するための方法が必要になります。

ユーザが全面的な変更を必要としないかぎり、「サウンド」コントロールパネルを使って、ユーザにデフォルトの入力源を変更させることはお勧めできません。通常、ただ 1 つのアプリケーションだけが内部 CD 入力源からの録音を必要とするような場合に、この方法は適切ではありません。大部分のアプリケーションがマイクロフォンからの録音や入力への関与を要求する可能性があるためです。したがって、ユーザにシステム全体の動作を変更させることは得策とはいえません。

このための独自のインタフェース要素を用意するには、アプリケーション内ですべてのサウンド設定を変更する方法を提供するのが望ましいといえます。内部 CD 入力源を選択する最適な方法は、すべてのサウンド入力ドライバのリストを作成して (繰り返し SPBGetIndexedDevice に対する呼び出しを使って)、その内容をメニューまたはリストボックスに展開することです。アプリケーションでは、これらの設定をその初期設定に格納し、起動のたびにその初期設定にしたがってサウンド入力ドライバとサウンド出力コンポーネントを設定する必要があります。「サウンド」コントロールパネルでユーザにこれらの項目を設定させないでください。また、それらの設定が常にデフォルトのサウンド設定であるとは考えないでください。

次に、内部 CD 入力源に関して注意すべきキーポイントを示します。

  • 内部 CD 入力源は独立した入力デバイスであるため、ユーザはあるアプリケーション (音声認識プログラムなど) でマイクロフォンから録音を行いながら、同時に CD オーディオを聴くことができます。
  • アプリケーションが CD から録音を行っているとき、内部 CD 入力デバイスはビジーになります。この状況をうまく処理するための準備が必要です。なお、CD を再生しているだけでは内部 CD 入力デバイスはビジーになりません
  • 同時再生は常に「入」になります。将来的には大部分のアプリケーションが、今後削除される予定の siPlayThruOnOff セレクタがサポートされていない状況を正しく処理できるように更新されることが望ましいといえます。今のところは、入力ソースの同時再生設定をチェックまたは設定できない状況を正しく処理できるようにアプリケーションのコードを更新してください。なお、siPlayThruOnOff セレクタはオプションであるため、すべての入力デバイスがこのセレクタをサポートしているわけではありません。

ページの先頭に戻る

CD/DVD ドライバに必要な変更

CD または DVD ドライバのデベロッパは、新しい内部 CD 入力ドライバをサポートする必要があります。このためには、内部 CD PPC コードフラグメントに含まれるいくつかの関数を呼び出すようにドライバを更新しなければなりません。68K コードからこれらの関数を呼び出すことはサポートされていません。どうしても必要な場合は、「未サポート」の禁を犯すことは可能ですが、それはデベロッパ自身の責任となります。

これらの関数は CD/DVD ドライバによって呼び出され、CD/DVD ドライバが AudioPlay 制御呼び出しを取得するときに、ドライバから内部 CD ドライバにデジタルデータを渡す方法を制御します。

DigitalCDSoundLib のエクスポート関数は次のとおりです。


OSErr   SetupSound( UInt32 bytesInRingBuffer,
                    ReadMoreCDAudioUPP readMoreCDUPP,
                    SInt32 refCon,
                    Component outputDevice,
                    UInt32 numMarkers );
OSErr   TeardownSound( void );
                  
void    StartSound( void );
void    StopSound( void );
                  
void    PlayRing( void );
void    PauseRing( void );
                  
SInt32  RingBytesAvailable( void );                  
void    WriteAudioToRing( SInt16 *newData, UInt32 numFrames );
void    StitchAudioIntoRing( Ptr wholeBuff,
                             UInt32 buffFrames,
                             UInt32 overlapFrames );
void    InvalidateRingBuffer( void );
                  
SInt32  GetVolume( void );
OSErr   SetVolume( SInt32 volume );
                  
OSErr   Set3DSoundOn( void );
OSErr   Set3DSoundOff( void );
                  
void    SetTrackMarker( UInt32 marker );
void    GetCurrentTrackMarker( UInt32 *marker,
                               UInt32 *framesBeyondMarker );

以下に、これらのルーチンの使い方と一般的な処理の手順を示します。

  1. SetupSound を呼び出します。SetupSound は必要なデータ構造体をすべて割り当てます。この関数には、使用したいリングバッファのサイズをバイト単位で渡します。また、ReadMoreCDAudio 関数に対する UPP へのポインタを渡し、さらに必要な場合は、ReadMoreCDAudio 関数に渡される refCon を渡します。最後から 2 つ目のパラメータには、使用する出力デバイスのコンポーネント参照を指定します。デフォルトの出力デバイスを使用するには、このパラメータに nil を設定します。最後のパラメータには、割り当てるトラックマーカの数を指定します。この関数は、タスクレベルで呼び出す必要があり、現在の実行レベルがタスクレベルでない場合は、controlErr が返されます。

    注意: SetupSound は、メモリ不足、不正なハードウェアなどの条件により、いくつかのエラーを返す可能性があります。これらのエラーを処理できるように適切な対処を行ってください。


  2. オーディオ CD データの読み込みを開始します。
  3. StartSound を呼び出します。StartSound は出力の実行を開始します。ただし、リングバッファにデータを格納しないかぎりユーザにサウンドが聞こえることはありません。
  4. CD の読み込みが完了した時点で WriteAudioToRing または StitchAudioIntoRing を呼び出します。最初のデータを書き込む場合、または使用中の CD ドライブがステッチングを必要としない場合は WriteAudioToRing を使用します。CD ドライブがステッチングを必要とし、しかもそれが再生するデータの先頭のビットではない (つまり、前の読み込みとのオーバーラップが存在することになります) 場合は、StitchAudioIntoRing を使用します。

    注意: CD ドライブがステッチングを必要とする場合は、ドライブからオーバーラップするデータを読み込む必要があります。たとえば、ある読み込みでアドレス 01:15:50 (1 分、15 秒、50 ブロック) から始まる 75 ブロックを取得した場合、次の読み込みでは一定の量をオーバーラップさせる必要があります。経験的に言って、7 ブロックのオーバーラップなら良好な結果が得られます。したがって、次の読み込みでは、アドレス 01:16:43 から始まる 75 ブロック (まる 1 秒に 7 ブロックのオーバーラップ) を読み込むことになります。StitchAudioIntoRing には使用しているオーバーラップするフレーム数を渡す必要があります。


  5. PlayRing と PauseRing を使用すると、必要なときにいつでもオーディオの再生開始と停止を行うことができます。これらの関数は割り込み時に呼び出すことができます。PlayRing はできるだけ早くサウンドの再生を開始し、PauseRing はできるだけ早くサウンドの再生を停止します。
  6. RingBytesAvailable を呼び出し、CD データの別の読み込みをキューに格納すべきかどうかを判断します。リングバッファに十分な容量がある場合は、別の読み込みをキューに格納します。また、そうでない場合は、読み込みを停止してください。データの読み込みを再開する方法については、次の「ReadMoreCDAudio」を参照してください。
  7. ReadMoreCDAudio は、オーディオ割り込みが発生するたびにサウンド割り込みコードによって呼び出される関数です。この呼び出しは割り込み時に実行されます。この方法で、オーディオタスクは CD からさらにデータを読み込むべきであることを通知します。CD ドライブはサウンドの再生よりも高速にデータを読み込むことができるため、最終的に CD オーディオを取得する関数はそれ以上のオーディオデータをリングバッファに挿入する余裕がなくなってしまいます。RingBytesAvailable を使用すると、リングバッファに残されている使用可能な容量を判断できます。CD からさらにデータを取得するための容量が残されていて、しかもデータが現在まで CD から読み込まれていない場合は、別の読み込みをキューに格納します。
  8. ミッドトラックスイッチなどのユーザが指定したさまざまなデータを再生するときには、InvalidateRingBuffer を呼び出します。この関数を呼び出すと、リングバッファに格納されている既存のオーディオデータを即座に無効化できます。また、この関数により、それまでに設定されているトラックマーカ情報はすべて削除されます
  9. StopSound を呼び出して、サウンド出力の発生を停止します。すべてのサウンドは即座に停止します。この関数は、それ以上再生するデータがなくなったときに使用します。
  10. TeardownSound を呼び出して、リングバッファを含めたすべてのデータ構造体の割り当てを解除します。この関数を呼び出してから SetupSound を再度呼び出すまでの間は、リングバッファを処理するルーチンを呼び出さないでください。この関数は、タスクレベルで呼び出す必要があり、現在の実行レベルがタスクレベルでないと controlErr が返されます。

次の関数は、オーディオを再生する方法を制御したり、現在のオーディオストリームに関するフィードバックを取得するために使用されます。

  • GetVolume を使用すると、CD オーディオストリーム (のみ) のボリュームを取得できます。ボリュームは、0x0RRR0LLL という形式の long 型の値として返されます。ここで RRR は右側のボリュームを表し、LLL は左側のボリュームを表します。RRR と LLL の値の範囲は 0x000 から 0x100 です。
  • SetVolume を使用すると、CD オーディオストリーム (のみ) のボリュームを取得して設定できます。ボリュームは、0x0RRR0LLL という形式の long 型の値として返されます。ここで RRR は右側のボリュームを表し、LLL は左側のボリュームを表します。RRR と LLL の値の範囲は 0x000 から 0x100 です。
  • Set3DSoundOn を使用すると、3D サウンド拡張機能が「入」になります。
  • Set3DSoundOff を使用すると、3D サウンド拡張機能が「切」になります。

    注意: ハードウェアで 3D サウンド拡張機能がサポートされていない場合は、Set3DSoundOn と Set3DSoundOff はエラーを返します。


  • SetTrackMarker を使用すると、リングに書き込まれる次のデータにマーカを付けることができます。この関数には任意の 4 バイト値を渡すことができます。GetCurrentTrackMarker を呼び出したときに、対応するデータが再生されていると、この値が返されます。
  • GetCurrentTrackMarker を使用すると、オーディオデータの再生に伴って最後に渡されたマーカを取得できます。渡されたマーカとともに、マーカが再生されてから経過した時間を示すフレームカウントも返されます。

デジタル CD オーディオに関連して多数のデータ構造体やメモリ割り当てが必要になります。必要のないシステムリソースの浪費を最小限に抑えるため、実際に CD の再生を行うまでは SetupSound を呼び出さないでください。同様に、CD の再生が終了した後はただちに TeardownSound を呼び出し、他のアプリケーションで使用できるようにシステムリソースを解放してください。

ページの先頭に戻る

その他の注意事項とコメント

唯一の方法

ユーザが USB スピーカを使って CD を聴くことができるようになるための唯一の方法は、CD/DVD ドライバがデジタルオーディオをサポートすることです。CD または DVD ドライバのデベロッパは、できるだけ早くこの機能をドライバに追加するように作業を行ってください。

Apple の CD/DVD ドライバでは、ATAPI CD または DVD ドライブを搭載した Macintosh だけでデジタル CD オーディオをサポートします。SCSI CD ドライブはサポートされていません。SCSI CD ドライブを搭載した Macintosh で Apple の CD/DVD ドライバを使用しても、従来同様の動作が実行されるだけです。

サウンドチップにアナログ - デジタルコンバータが組み込まれていないため、iBook はデジタル CD オーディオだけを処理します (iBook には組み込みマイクロフォンもありません)。すべての iBook は、前述の API を使ってオーディオ CD を再生します。ユーザが iBook にサードパーティ製の CD ドライバをインストールする場合は、それがデジタル CD オーディオをサポートしていることが絶対条件になります。そうでないと、ユーザはオーディオ CD を聴くことができなくなってしまいます。

3D サウンド

提供されている 3D サウンド拡張機能は単純なフィルタです。これは、「ステレオスプレッダ」と呼ばれるフィルタのクラスの 1 つです。このタイプの拡張機能はある種の音楽とは相性よく動作しますが、その他のものとの相性はよくありません。このため、ユーザが自分の好みに応じて拡張機能の「入」、「切」を切り替えることができようにしてください。

ステレオスプレッダから送られる追加の信号はオリジナルの信号の中に追加されるため、全体としての信号はクリッピングの発生を抑えるために減衰されます。これにより、3D エフェクトを「入」にすると、サウンドの全体的なボリュームレベルが下がります (また、「切」にすると、ボリュームは上がります)。ユーザは、Mac、CD、または外付けスピーカのボリュームを調整することでこの現象を相殺できます。

3D ステレオコンポーネントの現在のインプリメンテーションは、300MHz PowerBook G3 で約 1.4% の CPU を消費します。


ページの先頭に戻る

要約

以上のように、アプリケーションが適切なエラー処理とユーザインタフェースを実現するように書かれていれば、アプリケーション側で何らかの特殊な処理を行う必要はなく、アプリケーションは正常に動作し続けるはずです。ただし、サウンド設定のための独自のユーザインタフェースを持たず、その機能を「サウンド」コントロールパネルに依存している場合は、早急にアプリケーションのコードを改善してください。

デジタル CD オーディオをサポートするため、ドライバにはいくらか面倒な変更を加える必要がありますが、ユーザが USB スピーカを介して CD を再生できるようになることを考えれば、これはやりがいのある作業といえます。


参考文献


ページの先頭に戻る

ファイルのダウンロード

bluebook.gif DigitalCDSound.h (13K)

bluebook.gif DigitalCDSoundLib.stub (1K)


ページの先頭に戻る