2013-04-29 4 views
-1

После определения местоположения блока данных с помощью mmioDescend, как я могу считать и отобразить образцы данных, например, в памятку в delphi 7?Отображение результата mmioRead

Я следую шагу, как открыть файл, найти рифф, найти fmt, найти фрагмент данных.

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

Я тоже использовать mmioRead, но я не знаю, как отобразить data.Can кто поможет привести пример, как использовать mmioRead, а затем отобразить результат?

ответ

2

Ну, я бы, наверное, прочитал в буфер, который был объявлен с использованием более подходящего типа.

Например, предположим, что ваши данные являются 16-битными целыми числами, Smallint в Delphi. Затем объявите динамический массив 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 не имеет отдельных байтов и типов символов, функция объявляется как принимающая указатель на массив символов. На самом деле перевод 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 
+0

ThankYou очень .. почему я не думаю, что эти Uuh –

+0

Могу ли я спросить еще 1, почему я получаю ** NAN ** значение при попытке прочитать .wav-файл и непосредственно хранить его данные образца в ** double **? разве это не разрешено? Мне просто интересно. –

+0

Это происходит, когда код чтения неверен, и вы читаете данные, которые на самом деле не являются двойными. –

Смежные вопросы