●このサンプルプログラムについて
                                                1998年12月17日
                                                セガ・エンタープライゼス
                                                テクニカルサポートセンター


このサンプルプログラムは、GDROMからPCMデータを取得して、再生させるサンプル
プログラムです。
構造の可視性を良くするために余計な処理を入れていません。
そのため、本サンプルでは同時再生、連続再生、ポーズ、ループ、ステレオ
ストリームなどの機能には対応しておりません。
特にステレオストリームや同時再生などを行う場合には、GDドライブのピックの状態を
把握しながら、ストリームが途切れないようにデータの転送を行わなければ
いけませんので、非常に高度なストリーム処理を必要とします。

【サンプルプログラムの構造】
再生準備から、再生終了までは大体において以下のようなステップを踏みます。
  再生準備(pcmInit)
  PCMデータの事前準備(pcmSetPara)
  再生指示待ち(pcmWait)
  再生指示(pcmPlay)
  GDからのデータ転送(pcmTransGd)
  サウンドRAMへのデータ転送(pcmTransSnd)
  すべてのPCMデータの再生待ち(pcmWaitEnd)
  再生終了(pcmStop)

・再生準備
  再生に必要な変数の設定を行います。
  また、必要なハンドルはこの時点で確保します。
  SDMEMBLKハンドルは転送の際にのみ必要で、転送の前後でCreate/Destroyしても
  構わないのですが、この時点で確保して後は使い回ししてしまえば、
  メインタスクの余計な負荷を軽減できます。

・PCMデータの事前準備
  PCMデータを、予めある程度バッファに貯えておき、再生指示の際のタイムラグを
  軽減します。
  このサンプルのSH側のリングバッファの管理方法は、大きく一つバッファを確保し
  そのバッファを二つのページに分割し、空いた方、つまりサウンドデータを転送して
  しまったページに、次のデータをGDROMから転送するようにします。
  このSH側のリングバッファをこの時点で確保します。
  確保した後、そのバッファを全て埋めるだけのデータをGDROMから転送します。
  転送にはgdFsReqRd32関数を使用します。
  GDFSには、gdFsReqRd32とgdFsReqGdRd関数の二つが存在しますが、ここでは
  gdFsReqRd32関数を使用します。
  現在提供しているPCMストリームのデータのようなシンプルなフォーマットであれば、
  gdFsReqGdRd関数とgdFsTrans32でも十分使用に耐えられますが、例えば自前で
  インターリーブのデータを作成する場合には、かえってこの関数では不向きかも
  しれません。

・再生指示待ち
  PCMデータの事前準備の時点で要求したデータ転送が、終了したかを確認し
  再生指示待ちのステータスに変更します。
  以後、再生指示を受け付けます。

・再生指示
  再生させるために、周波数を必要としますが、この周波数はOCT/FNSと呼ばれる
  特殊な単位系を使用します。通常主に使用される、周波数はライブラリヘッダ
  として用意されていますが、このサンプルではHzからOCT/FNSに直接変換しています。

以後の処理はタスク関数pcmTask関数の中で実行されます。

・GDからのデータ転送
  GDからのデータ転送を行う場合には、前述の通り、常にページ単位で行います。
  ページが空いた時点で、gdFsReqRd32関数を用いて転送要求を行っています。
  このサンプルがループ再生、連続再生などに対応していないのは、ここの
  アルゴリズムを簡略化したためで、このアルゴリズムの改良によって、ある程度の
  高機能なPCMストリーム再生を実現することも可能です。

・サウンドRAMへのデータ転送
  サウンドRAMへは1000h単位でデータを転送しています。
  sdPstmTransferWaveData関数の仕様から、サウンドRAMのリングバッファの
  末端から、先頭にかけてデータを転送することは出来ませんので、
  一回のデータ転送とサウンドRAMのリングバッファのサイズは帳尻が合うように
  しなければいけません。
  本サンプルでは、リングバッファサイズ4000h、転送サイズ1000hで帳尻が合うように
  調整しています。
  また、サウンドデータの転送はDMAを用い、転送終了コールバックを利用して
  転送先アドレスの変更などを行っています。(pcmTransSndEnd関数)

・すべてのPCMデータの再生待ち
  GDからすべてのPCMデータを転送し終えると、この状態になります。
  実際、GDからデータが転送し終えたからといっ、すぐに再生終了できるわけでは
  ありません。転送したデータが再生し終わった時点で再生を終了させなければ
  いけません。そのため、この処理では、総再生サンプル数を見ながら、
  目的のサンプル数になるのを待って、その後再生を停止しています。
  曲の最後が切れてしまうのを防ぐ目的もあり、総再生サンプル数は、
  本来曲の持っているサンプル数より大きくなった時点で再生終了します。
  その時、余計なデータが再生されないように、無音データを転送します。

・再生終了
  再生を終了し、パラメータを再生指示待ちの状態まで戻します。
