=====================================================================
http://www.piece-me.com/kyview/article/d/devpiece/5/dopkfl/index.html
=====================================================================

wavデータの再生について 
新しく発言する EXIT インデックスへ 

--------------------------------------------------------------------------------

　　wavデータの再生について たにぐち　まこと 2001/12/24 12:13:18 
　　├少々判りにくくなってたようで、解説します みゃくさ 2001/12/24 13:06:40 
　　├たぶん、直接参考にされたであろうソースを... Florian 2001/12/24 13:11:14 
　　├(2) Florian 2001/12/24 13:11:40 
　　└大変よく分かりました！ たにぐち　まこと 2001/12/24 15:01:02 


--------------------------------------------------------------------------------

　　wavデータの再生について たにぐち　まこと 2001/12/24 12:13:18  ツリーへ
wavデータの再生について 返事を書く ノートメニュー
 
 
たにぐち　まこと 2001/12/24 12:13:18  
初めて投稿いたします、たにぐち と申します。
早速ですが、分からないことがあり、教えていただければ幸いです。

.wav ファイルを再生するプログラムを作ろうと思い、APIマニュアルやみなさんの公開されているソースなどを参考に作ってみたのですが、一応動作はしたもの、ソースの内容が理解できず困っております。

以下のソースです。

w[1]=*((PCEWAVEINFO*)(TEST+8));
w[1].pData=TEST+8+sizeof(PCEWAVEINFO);

pceWaveDataOut(1, &w[1]);
pceWaveSetChAtt(1, 9);

ここで、PCEWAVEINFO 構造体を作っている部分ですが、一行目はどんな動きをするのでしょう。
TEST というのは、.wav を C言語ソースに変換した配列です。それに 8 を加えたものを、構造体のポインタでキャストして、そのポインタを w[1] に代入している？　お恥ずかしながら、ポインタが絡んでくると C言語がとたんに苦手になってしまって・・・

恐れ入りますが、どんな動きなのか教えていただけると大変幸いです。
どうぞよろしくお願いいたします。

- たにぐち まこと 


　　├少々判りにくくなってたようで、解説します みゃくさ 2001/12/24 13:06:40  ツリーへ
Re: wavデータの再生について 返事を書く ノートメニュー
 
 
みゃくさ 2001/12/24 13:06:40  
少々判りにくくなってたようで、解説します
たぶんどこにも解説文が入ってなかったと思いますし。

最初の４BYTEは、p/ece形式のPCMファイルであることを示す
'PPCM'という文字が入ってます
（unsigned long型にキャストしてるので、文字配列としては逆順の"MCPP"となってます）
次の4BYTEは、PCMデータ部のファイルサイズ(byte)です。

.cファイルとして、ソースにくっつけてしまう場合は上記のように
ポインタを+8して読み飛ばしてしまって問題ないです
が、.ppdファイルとして読み込む場合には
・PCMフィルであることを確認して
・ファイルサイズを調べてから、その容量＋ヘッダ分だけ読み込む
という手順を取ることが出来るようにそういったヘッダがついています

それ以降の構文は、たにぐちさんの想定しているとおりの動作です。 


　　├たぶん、直接参考にされたであろうソースを... Florian 2001/12/24 13:11:14  ツリーへ
Re: wavデータの再生について 返事を書く ノートメニュー
 
 
Florian 2001/12/24 13:11:14  
たぶん、直接参考にされたであろうソースを書いた Florian です。
---
static PCEWAVEINFO w[4];

w[1]=*((PCEWAVEINFO*)(TEST+8)); //(1)
w[1].pData=TEST+8+sizeof(PCEWAVEINFO); //(2)

pceWaveDataOut(1, &w[1]); //(3)
---
(1)
PCEWAVEINFO(再生をするときに使うデータ)に、PPD(PIECE用PCMのデータ)の「一部」を入れています。

と、いうのも、PCEWAVEINFOは、APIリファレンスの「pceWaveDataOut」に書かれているようなデータ構造になっていて、これらの情報は元のPPDからとってこなくてはなりません。

このうち、「ステータス」「次へのポインタ」「終了時コールバック」は再生に使うものですので、PPDとは直接関係ありません。また、「データへのポインタ」は設定が必要ですが、PPDを作った時点ではPIECE内のどこにデータが置かれるか判らないので、この時点ではとりあえず0が入っています。
ですが、それ以外の部分(「データ形式」「データの長さ」)については、一応PPDのデータの「8バイト目」から先には、PCEWAVEINFOで直接使える情報が入っています。
なので、PPDデータの先頭から8バイトずらしたところ(TEST+8)からさきを、「PCEWAVEINFO」だと見なして、まるまる構造体としてコピーしています。

ま、こうしておけば、データの長さやデータ形式などを気にせずに再生できる、ということを実現しています。
(続く) 


　　├(2) Florian 2001/12/24 13:11:40  ツリーへ
Re: wavデータの再生について 返事を書く ノートメニュー
 
 
Florian 2001/12/24 13:11:40  
(2)
先に設定したもののうち、「データへのポインタ」は正常に設定されていませんでした。
そこで、これを手動で設定しています。
位置は、PPDデータの先頭から「8バイト」ずらし、さらに「PCEWAVEINFO」の大きさ分(sizeof)だけずらしたところです(TEST+8+sizeof(PCEWAVEINFO))。

ここまでで、再生用のデータをPCEWAVEINFOに設定することができました。

(3)
再生しています。

これは、AQUAPLUSのサンプルからとってきた手法です。書きやすいし、将来フォーマットが増えたりしたときにも素直に対応できるいい方法なのですが、メモリの構造が判らないと何をやっているのわけわかめですね(^^;)。
でも、覚えておくと、Windows BITMAPのロードなどでも同じような手法をとっているので、いろいろ便利だと思います。

がんばってください(^^)。 


　　└大変よく分かりました！ たにぐち　まこと 2001/12/24 15:01:02  ツリーへ
Re: wavデータの再生について 返事を書く ノートメニュー
 
 
たにぐち　まこと 2001/12/24 15:01:02  
大変よく分かりました！
素早いお返事ありがとうございました。なるほど、データの中身をデータの並んだ順番などを考慮して、直接扱っていたのですね。データ構造が分かっていないと、難しいですね。

大変助かりました。ありがとうございました。 



--------------------------------------------------------------------------------
インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。  
