Показать сообщение отдельно
  #1  
Старый 06.07.2012, 14:57
JekaDefer JekaDefer вне форума
Прохожий
 
Регистрация: 05.07.2012
Сообщения: 5
Версия Delphi: 7
Репутация: 10
По умолчанию Проблема с указателем на буфер...

Задача вообще всего этого: есть одномерный массив AllSamples, в котором сэмплы на всю звуковую дорожку(т.е. не на одну секунду а на все) и вот нужно теперь чередуя массив Second[0, 0..7999] и Second[1, 0..7999] отыграть все сэмплы массива AllSamples. Попробовал так:
Код:
Код:
type
  int16 = smallint;
Var
  hdr: array[0..1] of WAVEHDR;
  AllSamples: array of Int16;
  Second: array[0..1, 0..7999] of int16;
  CheckSec: Boolean;                 
  CurSec: Byte;                      
...

WaveOutOpen(@wout, cardinal(-1), @fmt, 0, 0, 0);
  if (0 <> wout) then
  begin
    CheckSec:= False;
    For i:= 0 to nBlocks-1 do
    Begin
      if CheckSec then CurSec:= 1 else CurSec:= 0;

      For j:= 0 to SPS-1 do
      Begin
        if (i = nBlocks-1) and (j+SPS*i > Length(AllSamples)-1) then Second[CurSec, j]:= 0 else Second[CurSec, j]:= AllSamples[j+(SPS)*i];
      End;

      fillChar(hdr[0], sizeof(hdr[CurSec]), #0);
      hdr[CurSec].lpData := @second[CurSec];
      hdr[CurSec].dwBufferLength := sizeof(second[CurSec]);

      waveOutPrepareHeader(wout, @hdr[CurSec], sizeof(hdr[CurSec]));
      WaveOutWrite(wout, @hdr[CurSec], sizeof(hdr[CurSec]));
      CheckSec:= NOT CheckSec;
    End;
    waveOutUnprepareHeader(wout, @hdr, sizeof(TWAVEHDR));
    WaveOutClose(wout);
  end;
Сам массив Second заполняется весь как надо и и если на последней секунде дорожка кончилась то остаток заполняется нулями. то есть все как надо, но вот как теперь правильно указать на этот чередующийся массив головке?
Ответить с цитированием