Nagrywanie do bufora

0

Witam wszystkich.

Mam prośbę. Czy ktoś mógłby mi pomóc w napisaniu procedury przechwytywania dźwięku nie do pliku ale do bufora?
Chciałbym w nieskończonej pętli zbierać próbki dźwięku (2048 lub 4096 próbek) i po przepełnieniu bufora poddawać je konwersji (np transformacji Fouriera).

Znalazłem wątek podobny, ale działający w drugą stronę - odtwarzanie z tablicy.
http://4programmers.net/Forum/viewtopic.php?id=78424
Czy ktoś może wie jak to przekształcić aby móc nagrywać do tablicy?

Obecnie używam przerobionej biblioteki uwaviein autorstwa Gary-ego Darby, lecz sprawia mi ona wiele problemów. Przede wszystkim działa tylko w Windowsie XP. W Viscie, 2000, 9x nie moge zainiciować nagrywania.
http://www.esanu.name/delphi/Multimedia/Sound/Low%20Level%20WaveIn%20routine.html

0

Czesc, a probowales FMODa?

http://www.fmod.org/

Wiem, ze umozliwia kodowanie dzwieku w locie do danego formatu wiec zapewne operuje tez na jakims buforze. Dopytaj sie na ichnim forum ;-)

0

Dzieki za podpowiedz. Sprawdzalem tez ta opcje. Jednak chcialbym pozostac przy nagrywaniu na niskim poziomie - MMSystem.
Obecnie jednak szukam innego rozwiazania gdyz moje poprzednie dzialalo poprawnie tylko na platformie XP. W Windowsie 2000 pojawialy sie dziwne bledy, a na Viscie wcale nie udalo mi sie zainiciowac nagrywania.

0

Znalazlem prosty i przede wszystkim w pelni dzialajacy komponent. Mam jednak problem z przeksztalceniem formy bufora.
W jaki sposob wyselekcjonowac z niego kanal lewy i prawy?
Oto kod wykonywany w momencie zapelnienia bufora:

function TForm1.AudioIn1BufferFilled(Buffer: PAnsiChar; var Size: Integer): Boolean;
Var
  SP    : ^SmallInt;
  i, N,  v  : Integer;
  xMin, xMax : Integer;

begin
  N := Size Div 2;
  SP := Pointer(Buffer);
  xMin := SP^;
  xMax := xMin;


  For i := 0 to N-1 Do
     Begin
       v := SP^; Inc(SP);
       If (xMin > v) Then xMin := v;
       If (xMax < v) Then xMax := v;
     End;

  If (Min > xMin) Then Min := xMin;
  If (Max < xMax) Then Max := xMax;

  TempMax := xMax;
  If (Abs(xMin) > xMax) Then TempMax := Abs(xMin);
  Result := TRUE;
end;

Ponizej link to komponentu (jeden plik AudioIO.pas oraz 3 skompilowane sample wraz z kodem).
http://www.torry.net/vcl/mmedia/audio/taudioio.zip

1 użytkowników online, w tym zalogowanych: 0, gości: 1