Mam taki program w delphi:
Teoretycznie mozna kozystac z Unitu 'mmsystem' ale ja sam definiowalem API (z winmm.dll).


const
 CALLBACK_WINDOW = $000010000;
 CALLBACK_THREAD = $000020000;
 WAVE_MAPPER = -1;

var
  Form1: TForm1;
  audio, proc: HWND; 
  dev: WAVEINCAPS;
  inf: WAVEFORMATEX; 
  WH: Array[0..1] of WAVEHDR;

procedure Debug(w: DWORD; co: String);
begin
 Form1.Memo1.Lines.Add(co+': '+IntToStr(w));
end;

function WaveIn(): DWORD;
var
 msg: tagMSG;
 w: DWORD;
begin
 GetMessage(msg, 0, 0, 0);
// msg.message:
// 958 - Open device
// 959 - Close device
// 960 - data
 Debug(msg.message, 'WaveIn');
 // dalsza czesc kodu....
end;

procedure TForm1.Button1Click(Sender: TObject);  // Rozpoczecie nagrywania
var
 w, tid: DWORD;
begin
 ZeroMemory(@WH[0], sizeof(WAVEHDR)*2);
//
 inf.wFormatTag := 1;
 inf.Kanaly := 2;
 inf.Probkowanie := 44100;
 inf.BitowNaProbke := 16;
 inf.BlockAlign := inf.Kanaly*(inf.BitowNaProbke div 8);
 inf.BajtowNaSek := (inf.Probkowanie*inf.BlockAlign);
 inf.cbSize := 0;

 proc := CreateThread(0, 0, @WaveIn, 0, 0, tid);
 CloseHandle(proc);
 w := waveInOpen(audio, WAVE_MAPPER, inf, tid, 0, CALLBACK_THREAD); Debug(w, 'Open');

 WH[0].dwBufferLength := inf.BajtowNaSek shl 1;
 WH[1].dwBufferLength := WH[0].dwBufferLength;
 WH[0].lpData := VirtualAlloc(0, WH[0].dwBufferLength * 2, MEM_COMMIT, PAGE_READWRITE);
 WH[1].lpData := WH[0].lpData + WH[0].dwBufferLength;
 w := waveInPrepareHeader(audio, WH[0], SizeOf(WAVEHDR)); Debug(w, 'Header1');
 w := waveInPrepareHeader(audio, WH[1], SizeOf(WAVEHDR)); Debug(w, 'Header2');
 w := waveInAddBuffer(audio, WH[0], sizeof(WAVEHDR)); Debug(w, 'AddBuf1');
 w := waveInAddBuffer(audio, WH[1], sizeof(WAVEHDR)); Debug(w, 'AddBuf2');
 w := waveInStart(audio); Debug(w, 'Start');
end;

procedure TForm1.Button2Click(Sender: TObject); // Zakonczenie nagrywania
var
 w: Integer;
begin
 w := waveInStop(audio); Debug(w, 'Stop');
 w := waveInClose(audio); Debug(w, 'Close'); 
// VirtualFree(WH[0].lpData, 0, MEM_RELEASE);
end;

Moje pytanie brzmi dlaczego function WaveIn(): DWORD; odbiera TYLKO komunikat o "otworzeniu urzadzenia" (Open Device) a nie odbiera o zamknieciu i danych..?? Ponad to dlaczego przy probie zamknieca funkcja zwraca kod 5 (MMSYSERR_INVALHANDLE) - uchwut urządzenia jest nie właściwy... ?? Głowie się nad tym już sporo czasu... [stuk] Proszę o pomoc.


Powodzenia! No comments, yet!