Проблема с записью звука
 Добавлено: 05.01.2011 02:21:02
Добавлено: 05.01.2011 02:21:02Доброго времени суток! Имеется программа на Лазарусе для записи и обработки звука с линейного входа, конвертированная из Delphi 6. Запись происходит с помощью WinApi функций из Winmm.dll (используется модуль MMSystem). Проблема заключается в том, что прога не получает сообщения от винды об открытии/заполнении буфера/закрытии устройства записи, однако функции для работы со звуком ошибок не возвращают. Проект нормально компилится в обоих IDE, но корректно работает только в дельфи 6. Пробовал на Лазарусах 0.9.29 (FPC 2.2.4) и 0.9.31 (FPC 2.5.1). Возможно я не учел какую-нибуть особенность FPC? Помогите пожалуйста разобраться. 
Код следующий:
			Код следующий:
- Код: Выделить всё
- ..........
 uses
 LCLIntf, SysUtils, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, MMSystem, FuncUnit, Ap, ComCtrls, LResources, Math,
 Windows;
 TFTuner = class(TForm)
 .........
 private
 hwi:HWAVEIN;
 wh: TWaveHdr;
 WaveData1:PChar;
 stop:boolean;
 n:integer;
 procedure MMProcOpen(var Message: TMessage); message MM_WIM_OPEN;
 procedure MMProcClose(var Message: TMessage); message MM_WIM_CLOSE;
 procedure MMProcData(var Message: TMessage); message MM_WIM_DATA;
 procedure
 { Private declarations }
 public;
 { Public declarations }
 end;
 var
 FTuner: TFTuner;
 implementation
 procedure TFTuner.MMProcOpen(var Message: TMessage);
 begin
 ShowMessage('Opened');
 end;
 procedure TFTuner.MMProcClose(var Message: TMessage);
 begin
 GlobalFree(integer(WaveData1));
 end;
 procedure TFTuner.MMProcData(var Message: TMessage);
 begin
 /// что то делаем
 end;
 // Запись инициируется по нажатию кнопки
 procedure TFTuner.Button1Click(Sender: TObject);
 var Device:integer;
 Result:MMResult;
 begin
 // выбор устройства из списка. список генерится правильно
 Device:=cbDev.ItemIndex;
 wfx:=GetWaveFormat(Device);
 if waveInOpen(@hwi,Device,@wfx,self.Handle, 0,CALLBACK_WINDOW)<>0 then exit;
 if Result<>MMSYSERR_NOERROR then Exit;
 
 wh.lpData:=WaveData1;
 wh.dwBufferLength:=WaveDataLength*sizeof(byte);
 wh.dwUser:=0;
 wh.dwFlags:=0;
 Result:=waveInPrepareHeader(hwi,@wh,sizeof(TWaveHdr));
 if Result<>MMSYSERR_NOERROR then Exit;
 Result:=waveInAddBuffer(hwi,@wh,sizeof(TWaveHdr));
 if Result<>MMSYSERR_NOERROR then Exit;
 Result:=waveInStart(hwi);
 if Result<>MMSYSERR_NOERROR then Exit;
 end;
 ................