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.