Всем доброго времени суток, не могу решить проблемку... Нужно записать звук с микрофона, взял для этого bass.dll v2.4 нашел в примерах исходник, отаркыл его в DELPHI 7, все прекрасно скомпилировалось, запустилось и заработало, но мне нужно использовать библиотеку в delphi 2010 и тут началось веселье.
Код:
implementation
{$R *.dfm}
function RecordingCallback(Handle: HRECORD; buffer: Pointer; length, user: DWord): boolean; stdcall;
begin
if ARecordSet.idpclnt1.Active = True then
begin
ARecordSet.idpclnt1.SendBuffer(ARecordSet.idpclnt1.Host,ARecordSet.idpclnt1.Port,buffer);
end;
WaveStream.Write(buffer^, length);
Result := True;
end;
procedure TARecordSet.btn2Click(Sender: TObject);
begin
BASS_ChannelPlay(chan, True);
end;
procedure TARecordSet.btn3Click(Sender: TObject);
begin
if dlgSave1.Execute then
WaveStream.SaveToFile(dlgSave1.FileName);
end;
procedure TARecordSet.btn4Click(Sender: TObject);
begin
idpclnt1.Host := '127.0.0.1';
idpclnt1.Active:=True;
rchan := BASS_RecordStart(44100, 2, 0, @RecordingCallback, nil);
end;
procedure TARecordSet.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
procedure TARecordSet.FormCreate(Sender: TObject);
var
i: Integer;
dName: PChar;
level: Single;
begin
// check the correct BASS was loaded
if (HIWORD(BASS_GetVersion) <> BASSVERSION) then
begin
MessageBox(0,'Не верная версия bass.dll', nil,MB_ICONERROR);
Halt;
end;
if (not BASS_RecordInit(-1)) or (not BASS_Init(-1, 44100, 0, Handle, nil)) then
begin
BASS_RecordFree;
BASS_Free();
MessageDlg('Cannot start default recording device!', mtError, [mbOk], 0);
Halt;
end;
WaveStream := TMemoryStream.Create;
i := 0;
dName := BASS_RecordGetInputName(i);
while dName <> nil do
begin
cbb1.Items.Add(StrPas(dName));
// is this one currently "on"?
if (BASS_RecordGetInput(i, level) and BASS_INPUT_OFF) = 0 then
cbb1.ItemIndex := i;
Inc(i);
dName := BASS_RecordGetInputName(i);
end;
cbb1Change(Self); // display info
end;
procedure TARecordSet.FormDestroy(Sender: TObject);
begin
WaveStream.Free;
BASS_RecordFree;
BASS_Free;
BASS_Stop;
end;
procedure TARecordSet.StartRecording;
begin
if cbb1.ItemIndex < 0 then Exit;
if WaveStream.Size > 0 then
begin // free old recording
BASS_StreamFree(chan);
WaveStream.Clear;
end;
// generate header for WAV file
with WaveHdr do
begin
riff := 'RIFF';
len := 36;
cWavFmt := 'WAVEfmt ';
dwHdrLen := 16;
wFormat := 1;
wNumChannels := 2;
dwSampleRate := 44100;
wBlockAlign := 4;
dwBytesPerSec := 176400;
wBitsPerSample := 16;
cData := 'data';
dwDataLen := 0;
end;
WaveStream.Write(WaveHdr, SizeOf(WAVHDR));
// start recording @ 44100hz 16-bit stereo
rchan := BASS_RecordStart(44100, 2, 0, @RecordingCallback, nil);
if rchan = 0 then
begin
MessageDlg('Невозможно начать запись!', mtError, [mbOk], 0);
WaveStream.Clear;
end
else
begin
btn1.Caption := 'Стоп';
btn2.Enabled := false;
btn3.Enabled := False;
end;
end;
procedure TARecordSet.StopRecording;
var
i: integer;
begin
BASS_ChannelStop(rchan);
// complete the WAV header
WaveStream.Position := 4;
i := WaveStream.Size - 8;
WaveStream.Write(i, 4);
i := i - $24;
WaveStream.Position := 40;
WaveStream.Write(i, 4);
WaveStream.Position := 0;
// create a stream from the recorded data
chan := BASS_StreamCreateFile(false, PChar(WaveStream.Memory), BASS_UNICODE, 0, 0);
if chan <> 0 then
begin
// enable "Play" & "Save" buttons
end
else
begin
mmo1.Lines.Add(IntToStr(BASS_ErrorGetCode()));
MessageDlg('Error creating stream from recorded data!', mtError, [mbOk], 0);
end;
end;
procedure TARecordSet.tmr1Timer(Sender: TObject);
begin
if WaveStream.Size < 1 then Exit;
if BASS_ChannelIsActive(chan) = BASS_ACTIVE_STOPPED then
lbl3.Caption := IntToStr(WaveStream.Size) else
lbl3.Caption := IntToStr(BASS_ChannelGetPosition(chan, BASS_POS_BYTE)) + ' / ' + IntToStr(WaveStream.Size);
end;
procedure TARecordSet.trckbr1Change(Sender: TObject);
begin
BASS_RecordSetInput(cbb1.ItemIndex, 0, trckbr1.Position / 100);
lbl2.Caption := IntToStr(trckbr1.Position);
end;
end.
все компилируется без ошибок, запись запускажется тоже нормально, но вот когда я использую процедуру остановки записи(TARecordSet.StopRecording

, получаю ошибку "2: невозможно открыть файл", помогитей пожалуйста, что я делаю не так ?
Ошибку выдает
Код:
chan := BASS_StreamCreateFile(false, PChar(WaveStream.Memory), BASS_UNICODE, 0, 0);