Система регистрации речи диспетчерских переговоров

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



? загрузки данных не успешна

if not ((waveInPrepareHeader(FWaveIn, FWaveHdr[0], sizeof(TWAVEHDR)) = 0) and

(waveInPrepareHeader(FWaveIn, FWaveHdr[1], sizeof(TWAVEHDR)) = 0))

then begin

CloseWaveDeviceRecord;//закрыть устройство

errormsg(Ошибка подготовки заголовка для записи.);

Result := -2;

Exit;

end;

// добавляем первый буфер...

if AddNextBuffer <> 0 then begin

Result := -3;

Exit;

end;

//Создаем временный файл, в который мы будем писать...

if CreateTmpFile <> 0 then begin

CloseWaveDeviceRecord;//закрыть устройство

Result := -4;

Exit;

end;

// запускаем начало записи

if waveInStart(FWaveIn) <> 0 then begin

CloseWaveDeviceRecord;//закрыть устройство

errormsg(Ошибка начала записи.);

Result := -5;

Exit;

end;

FRecorderMode := recModeRecord;//режим рекордера - запись

// установка таймера чтобы модифицировать дисплей...

Timer3.Interval := 1000;

Timer3.Enabled := TRUE;

UpdateLength(0, FDiskFreeSpace);

//добавляем в очередь следующий буфер...

if AddNextBuffer <> 0 then begin

Result := -6;

Exit;

end;

Result := 0;

end;

////////////////////////////////////////////////////////////////////////////////

// Обнуляем заголовки wav и инициализируем указатели данных и буферные длины

procedure TSysWaves.InitWaveHeaders;

begin

// делаем размер буфера , который выравнивает множитель блока ...

FWaveBufSize := (WAVE_BUFSIZE - WAVE_BUFSIZE mod FWaveFormat.nBlockAlign);

// обнулить заголовки wav

FillChar(FWaveHdr[0]^, sizeof(TWAVEHDR), 0);

FillChar(FWaveHdr[1]^, sizeof(TWAVEHDR), 0);

// теперь инициализируем указатели данных и буферные длины...

FWaveHdr[0].dwBufferLength := FWaveBufSize;

FWaveHdr[1].dwBufferLength := FWaveBufSize;

FWaveHdr[0].lpData := FWaveMem[0];

FWaveHdr[1].lpData := FWaveMem[1];

end;

///////////////////////////////////////////////////////////////////////////////

//Закрытие временного файла и устройства, делающего запись.

procedure TSysWaves.CloseWaveDeviceRecord;

begin

// если устройство уже закрыто, возвращаться...

if not FDeviceOpened then Exit;

//освобождение памяти занимаемой заголовком1...

if waveInUnprepareHeader(FWaveIn, FWaveHdr[0], sizeof(TWAVEHDR)) <> 0 then

errormsg(Ошибка в waveInUnprepareHeader (1));

//освобождение памяти занимаемой заголовком2...

if waveInUnprepareHeader(FWaveIn, FWaveHdr[1], sizeof(TWAVEHDR)) <> 0 then

errormsg(Ошибка в waveInUnprepareHeader (2));

// сохранение зарегистрированого полного размера зап. данных, и обновление дисплея

FTotalWaveSize := FByteDataSize;

UpdateLength(FTotalWaveSize, FDiskFreeSpace);

//признак записи данных

FRecordedData := TRUE;

// закрыть временый файл

CloseTmpFile;

// закрыть wav устройство

if waveInClose(FWaveIn) <> 0 then errormsg(Ошибка закрытия устройства входа);

//признак открытия устройства

FDeviceOpened := FALSE;

// обновление дисплея

Display(Запись остановлена);

end;

//////////////////////////////////////////////////////////////////////////////

//Обновление на экране числа записанных байт

procedure TSysWaves.UpdateLength(BytePosition : DWORD; BytePositiontotal : DWORD);

var

v:variant;

begin

LengthPosLabel.Caption := IntToStr(BytePosition);//число байт

LengthDispLabel.Caption := IntToStr(BytePositiontotal);//позиция

end;

//////////////////////////////////////////////////////////////////////////////

// Добавление буфера к очереди и переключение индекса буфера

function TSysWaves.AddNextBuffer : integer;

begin

//ставит в очередь на загрузку данными буфер памяти

if waveInAddBuffer(FWaveIn, FWaveHdr[FBufIndex], sizeof(TWAVEHDR)) <> 0 then begin

StopWaveRecord;

errormsg(Ошибка добавления буфера.);

Result := -1;

Exit;

end;

// переключение индекса для следующего буфера...

FBufIndex := 1 - FBufIndex;

Result := 0;

end;

///////////////////////////////////////////////////////////////////////////

//обновления количества записанных байтов

procedure TSysWaves.UpdateRecordDisplay;

var

mmtime : TMMTIME;

begin

mmtime.wType := TIME_BYTES;

//Функция восстанавливает текущее положение{позицию} данного звукового устройства

waveInGetPosition(FWaveIn, @mmtime, sizeof(mmtime));

UpdateLength(mmtime.cb, FDiskFreeSpace);//Обновление на экране числа записанных байт

FTotalWaveSize:=mmtime.cb;//накапливает максимальный размер

end;

//================сохранение файла==============================================

// Сохранение wav файла

function TSysWaves.SaveWaveFile : Integer;

var

mmfp : HMMIO;

dwTotalSamples : DWORD;

fTotalSamples : double;

mminfopar : TMMCKINFO;

mminfosub : TMMCKINFO;

GetDT : TSystemTime;

str : string;

begin

// если никакие данные не зарегистрированы ,то выход

if FTotalWaveSize = 0 then begin

errormsg(Не записаны звуковые данные чтобы сохранить их.);

Result := 0;

Exit;

end;

//получение имени файла

DateTimeToSystemTime(Now,GetDT);

with GetDT do begin

Datamodule1.WavBase.FieldByName(FileName).AsString:=IntToStr(Integer(wYear))+

IntToStr(Integer(wMonth))+IntToStr(Integer(wDay))+IntToStr(Integer(wHour))+

IntToStr(Integer(wMinute))+IntToStr(Integer(wSecond))+.wav;

FFilename:=IncludeTrailingBackslash(ExtractFilePath(Application.ExeName))+

WavBase\+ Datamodule1.WavBase.FieldByName(FileName).AsString;

end;

// откройте wav файл для записи...

mmfp := mmioOpen(PChar(FFilename), nil,

MMIO_CREATE or MMIO_WRITE or MMIO_ALLOCBUF);

//если произошла ошибка открытия файла, то

if mmfp = 0 then begin

errormsg(Ошибка открытия файла для записи.);

Result := -1;

Exit;

end;

Cursor := crHourGlass;

// создайте wav кусок RIFF

mminfopar.fccType := FOURCC_WAVE;

mminfopar.cksize := 0;//пусть функция определит размер

//если создание куска неудачно

if mmioCreateChunk(mmfp, @mminfopar, MMIO_CREATERIFF) <> 0 then begin

WFerror(mmfp, Ошибка создания RIFF wave куска.);

Result := -2;

Exit;

end;

//создайте кусок формата, и запишите wav формат...

mminfosub.ckid := FOURCC_FMT;

mminfosub.cksize := FMaxFmtSize;

//если создание куска неудачно

if mmioCreateChunk(mmfp, @mminfosub, 0) <> 0 then begin

WFerror(mmfp, Ошибка создания RIFF формата куска.);

Result := -3;

Exit;

end;

//если ошибка записи RIFF

if mmioWrite(mmfp, PChar(FWaveFormat), FMaxFmtSize) <> LongInt(FMaxFmtSize) then begin

WFerror(mmfp, Ошибка записи RIFF формата данных.);

Result := -3;

Exit;

end;

// назад из куска формата...

mmioAs