マスター、みなさん 助けてください。
ダブルバッファで連続して音データを再生するプログラムの一部です。
MM_WOM_DONEで返されたメッセージのMsg.lParamにwhdr1またはwhdr2の
どちらかのアドレスが格納されて返ってきます。
そのアドレスでabuf1もしくはabuf2の配列を操作したいのです。
以下がソースの一部です。長くてごめんなさい。
type
Tabuf = array[1..44100] of smallint;
var
abuf1:Tabuf; // abuf1:array[1..44100] of smallint;
abuf2:Tabuf; // abuf2:array[1..44100] of smallint;
whdr1,whdr2:Twavehdr;
// 再生開始
procedure TForm1.StartPlay;
begin
// ウェブヘッダーをセット
with whdr1 do
begin
lpdata := @abuf1;
dwbufferlength := sizeof(abuf1);
dwbytesrecorded := 0;
dwUser := 0;
dwFlags := WHDR_BEGINLOOP or WHDR_ENDLOOP;
dwloops := 1;
lpNext := NIL;
reserved := 0;
end;
with whdr2 do
begin
lpdata := @abuf2;
dwbufferlength := sizeof(abuf2);
dwbytesrecorded := 0;
dwUser := 0;
dwFlags := WHDR_BEGINLOOP or WHDR_ENDLOOP;
dwloops := 1;
lpNext := NIL;
reserved := 0;
end;
// 出力デバイスを開く
waveOutOpen(@hwo,WAVE_MAPPER,@wfe,handle,0,CALLBACK_WINDOW);
// 波形データを準備する
waveOutPrepareHeader(hwo,@whdr1,sizeof(Twavehdr));
waveOutPrepareHeader(hwo,@whdr2,sizeof(Twavehdr));
//
end;
// ここが問題の手続き
procedure SetWaveData(buf:Pointer); // 引数で受け取る時はPointer型
var
i:integer;
begin
for i := 1 to Length(buf) do begin // 内部では配列として操作したい
buf[i] := XXX;
end;
end;
// メッセージ処理
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
・・・略・・・
// MM_WOM_DONE ///////////////////////
if Msg.message = MM_WOM_DONE then begin
// Msg.lParam には、出力バッファを表す WAVEHDR 構造体へのポインタが格納されています
// SetWaveData手続きでabuf1もしくはabuf2にデータをセットする
SetWaveData(Twavehdr(Pointer(Msg.lParam)^).lpData)); // <-ここで使いたい
// waveOutWrite(hwo,@whdr1,sizeof(Twavehdr));
waveOutWrite(hwo,Msg.lParam,sizeof(Twavehdr)); // <-こんな感じでも使えるかも
end;
・・・略・・・
end;
Tabuf(buf)とかすると、「正しくない型キャスト」と叱られてしまいました。
|