こんにちは、川合です。 Hidemi KAWAI は 2003/08/03 14:00:01 の「[OSASK 6373] playcd0c.」 で書きました: > このplaycd0cではあっきぃさんのマシンでのCD再生ができそうな雰囲 >気です。ということで、今まで動かなかった人も動作報告ページの表を >見ながら、そろそろやってみようかな、とかを検討したり、いやまだ様 >子見だなとかを検討してください。 > > 動作報告: > http://remo.s10.xrea.com/osawiki/pukiwiki.php?playcd0_report あっきぃさんが自分のマシンで動いたのに気をよくして、なにやらオ リジナルCDプレイヤを作りたいみたいなので、今から適当にplaycd0cの テクニカルドキュメントを作ります。 --- とりあえず、playcd0c.cの中のOsaskMain()以下を自由に書き換えて ください。 関数一覧: int testatapi(int drv, int *buf); UCHAR testdrive(UCHAR drv, UCHAR status, UCHAR *buf); int playaudio(int drv, int len, int lba); int pauseresume(int drv, UCHAR flag); それぞれの関数の意味&使い方: testatapi()は指定されたドライブがATAPIデバイスなのかどうかをチ ェックします。bufには1024バイトの作業用バッファを与えてください 。ATAPIデバイスだと認識すると、0が返ってきます。0以外が返ってき たら失敗です(番号によって失敗の原因が分かる)。これが成功したら 自分で変数statusを1にしてください。 testdrive()は指定したドライブの状態をチェックします。bufには 1024バイトの作業バッファを与えてください。無事にプレイリストが取 得できた場合、このbufに格納されます。返ってきた値をstatusに代入 してやってください。たぶんbufはint buf[1024 / 4];で宣言している ことと思いますので、(UCHAR *)でキャストしてやってください。返っ てきたプレイリストはこのようになっています。 buf[1] : 1曲目のトラック番号と演奏開始位置 buf[2] : 1曲目の属性 buf[3] : 2曲目のトラック番号と演奏開始位置 buf[4] : 2曲目の属性 buf[5] : 3曲目のトラック番号と演奏開始位置 buf[6] : 3曲目の属性 以下ずっと続きます。トラック番号0xaaが見付かったらおしまいです。 トラック番号0xaaの演奏開始位置=CDの最後になっています。 lba = buf[1] & 0x00ffffff;とやると、演奏開始位置が取り出せます 。trk = (buf[1] >> 24) & 0xff;とやるとトラック番号が取り出せます 。属性はattr = (buf[2] >> 24) & 0xff;です。 なお、buf[255]にはトラック番号0xaaの演奏開始位置のコピーが入っ ています。testdrive()の返値が3以上なら、bufにプレイリストが入っ ています。 playaudio()は、演奏開始コマンドをドライブに送ります。statusが3 以上のときだけ送ってください。無事にコマンドが送れたら、playaudi o()関数は0を返します。そのときはstatusを4にするといいでしょう。 lenは演奏時間で、lbaは演奏開始位置です。ちなみに、lenやlbaですが こういう単位になっています。len=75で1秒です。len=75*60で1分。lba も75を加えれば1秒先から演奏できます。もちろん、lenやlbaが負にな ったりしてはいけません。 pauseresume()は演奏の一時停止と、再開を制御します。要求が成功 すると関数は0を返します。flagが0なら一時停止、1なら停止していた 演奏の再開です。鳴っていないときに一時停止するとか、停止していな いときに再開するとか、そういうドライブが混乱する状況にならないよ うに制御してください(playcd0c.cでは、statusで制御しています)。 --- まあ分かんないことがあったら、聞いてください。 それでは。 -- 川合 秀実(KAWAI Hidemi) OSASK計画代表 / システム設計開発担当 E-mail:kawai !Atmark! imasy.org Homepage http://www.imasy.org/~kawai/