显示mmioRead的结果

时间:2013-04-29 01:24:16

标签: delphi winapi delphi-7 wav

使用mmioDescend定位数据块之后,我想如何读取示例数据并将其显示到例如delphi 7中的备忘录中?

我按照步骤打开文件,找到riff,找到fmt,定位数据块。

if (mmioDescend(HMMIO, @ckiData, @ckiRIFF, MMIO_FINDCHUNK) = MMSYSERR_NOERROR) then
SetLength(buf, ckiData.cksize);
mmioRead(HMMIO, PAnsiChar(buf), ckiData.cksize);

我也使用mmioRead,但我不知道如何显示数据。任何人都可以帮忙举例说明如何使用mmioRead然后显示结果?

1 个答案:

答案 0 :(得分:2)

好吧,我可能会读到一个使用更合适的类型声明的缓冲区。

例如,假设您的数据是16位整数,在Delphi中为Smallint。然后声明一个Smallint的动态数组。

var
  buf: array of Smallint;

然后为数据分配足够的空间:

Assert(ckiData.cksize mod SizeOf(buf[0])=0);
SetLength(buf, ckiData.cksize div SizeOf(buf[0]));

然后阅读缓冲区:

mmioRead(HMMIO, PAnsiChar(buf), ckiData.cksize);

现在,您可以将这些元素作为Smallint值进行访问。

如果您有不同的元素类型,则可以调整数组声明。如果直到运行时才知道元素类型是什么,那么使用array of Byte然后使用指针算法和转换来访问实际内容可能会更好。

我会说mmioRead接口的设计有点弱。缓冲区实际上不是一个字符串。它可能最好被视为字节数组。但也许因为C没有单独的字节和字符类型,该函数被声明为采用指向char数组的指针。实际上Delphi转换会更好地在我的视图中暴露指向字节的指针,甚至更好,一种简单的无类型Pointer类型。


我认为您正在努力解释mmioRead的输出,因为那是您在问题中包含的代码。但是,根据现在删除的评论,你的问题是一个GUI问题。

您想要将内容添加到备忘录中。这样做:

Memo1.Clear;
for i := low(buf) to high(buf) do
  Memo1.Items.Add(IntToStr(buf[i]));

如果要转换为浮点,那么仍然假设16位有符号数据,请执行以下操作:

Memo1.Clear;
for i := low(buf) to high(buf) do
  Memo1.Items.Add(FormatFloat('0.00000', buf[i]/32768.0));//show 5dp