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

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

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



av буфер не определен

if FWaveMem[i] = nil then begin

errormsg(Ошибка размещения wave буфера в памяти.);

Result := -1;

Exit;

end;

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

end;

Result := 0;

end;

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

//========================завершение============================================

//Освобождение памяти, связанной с буферами wav

procedure TSysWaves.DestroyWaveRecorder;

begin

FreeWaveFormatEx;// Освобождение памяти от структуры WAVEFORMATEX

FreePCMBuffers;//Освобождение памяти от wav буферов.

FreeWaveHeader;//Освобождение памяти заголовка wav.

DeleteTmpFile;//Удаление временного файла

end;

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

//Освобождение памяти от структуры WAVEFORMATEX

procedure TSysWaves.FreeWaveFormatEx;

begin

//если FWaveFormat не является неопределенной

if FWaveFormat <> nil then begin

FreeMem(FWaveFormat);

FWaveFormat := nil;

end;

end;

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

//Освобождение памяти wav буферов.

procedure TSysWaves.FreePCMBuffers;

var

i : Integer;

begin

for i := Low(FWaveMem) to High(FWaveMem) do begin

if FWaveMem[i] <> nil then begin

FreeMem(FWaveMem[i]);

FWaveMem[i] := nil;

end;

end;

end;

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

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

procedure TSysWaves.FreeWaveHeader;

var

i : Integer;

begin

for i := Low(FWaveHdr) to High(FWaveHdr) do begin

if FWaveHdr[i] <> nil then begin

FreeMem(FWaveHdr[i]);

FWaveHdr[i] := nil;

end;

end;

end;

//==============работа с временым файлом========================================

//Создание временного файла чтобы писать wav данные.

function TSysWaves.CreateTmpFile : integer;

var

RootPathName : array [0..MAX_PATH] of char;

SectorsPerCluster : DWORD;

BytesPerSector : DWORD;

NumberOfFreeClusters : DWORD;

TotalNumberOfClusters : DWORD;

begin

FTmpFileHandle := _lcreat(PChar(FTmpFileName), 0);//получение дескриптора

//временного файла и его создание

//если произошла ошибка создания временого файла

if FTmpFileHandle = HFILE_ERROR then begin

errormsg(Ошибка создания временого файла);

Result := -1;

Exit;

end;

// получение доступного пространства на временном диске...

//если в полном имени файла есть знак :

if FTmpFileName[2] = : then

//то имя диска определяется так

RootPathName[0] := FTmpFileName[1]

else //иначе

//получение текущей дериктории

GetCurrentDirectory(sizeof(RootPathName), @RootPathName);

RootPathName[1] := :;

RootPathName[2] := \;

RootPathName[3] := #0;

//получение свободного места на диске

GetDiskFreeSpace(@RootPathName,

SectorsPerCluster,

BytesPerSector,

NumberOfFreeClusters,

TotalNumberOfClusters);

//FDiskFreeSpace = кол-во Свободных Кластеров * секторов в кластере

FDiskFreeSpace := NumberOfFreeClusters * SectorsPerCluster;

// FDiskFreeSpace = кол-во Свободных секторов * байт в секторе

FDiskFreeSpace := FDiskFreeSpace * BytesPerSector;

Result := 0;

end;

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

// Закройте временный файл содержащий недавно записаные данные.

procedure TSysWaves.CloseTmpFile;

begin

if _lclose(FTmpFileHandle) = HFILE_ERROR then

errormsg(Ошибка закрытия временного файла);

end;

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

// Удалите временный файл

procedure TSysWaves.DeleteTmpFile;

begin

//если длина временного файла > 0

if Length(FTmpFileName) > 0 then

DeleteFile(FTmpFileName);//удалить файл

end;

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

// Откройте временный файл для чтения.

function TSysWaves.OpenTmpFile : Integer;

begin

// Открываем временный файл для чтения.

FTmpFileHandle := _lopen(PChar(FTmpFileName), OF_READ);

//если произошла ошибка открытия временного файла

if FTmpFileHandle = HFILE_ERROR then

Result := 0

else

Result := 1;

end;

//==================работа с записью============================================

// Остановка записи

procedure TSysWaves.StopWaveRecord;

var

v:variant;

begin

FRecorderMode := recModeOff;//устанавливаем режим рекордера - выключен

//Функция waveInReset останавливает операцию загрузки данных.

//Все текущие буферы отмечаются как обработанные и приложение уведомляется

//о завершении загрузки данных

if waveInReset(FWaveIn) <> 0 then

errormsg(Ошибка остановки записи);

CloseWaveDeviceRecord;//закрытие устройства записи

Timer3.Enabled := FALSE;// стоп таймер

end;

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

// Подготовка заголовков, добавление буфера, подготовка показа, и начало записи.

function TSysWaves.StartWaveRecord : Integer;

var

Status : MMRESULT;

Flags:DWord;

WaveInCaps:PWaveInCaps;

begin

//обнуляем номер записанных выборок, размер записаных данных и номер буфера

FTotalWaveSize := 0;

FByteDataSize := 0;

FBufIndex := 0;

//получаем номер открываемого устройства типа модем

FWaveInID :=TAPICall1.GetWaveID(wave/in);

//если номер открываемого устройства равен полученному автоматически то

if FWaveInID= Wave_Mapper then

Flags:=WAVE_FORMAT_QUERY//устанавливаем флаг , чтобы функция запрашивала

//устройство для определения, поддерживает ли оно указанный формат, но не открывала его;

else

Flags:=WAVE_FORMAT_QUERY or WAVE_MAPPED;

Status := waveInOpen(@FWaveIn, FWaveInID, FWaveFormat,

0, 0, Flags);

if Status <> MMSYSERR_NOERROR then begin

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

Result := -1;

Exit;

end;

if FWaveInID = Wave_Mapper then Flags:=CALLBACK_WINDOW

else

Flags:=CALLBACK_WINDOW or WAVE_MAPPED;

Status := waveInOpen(@FWaveIn, FWaveInID, FWaveFormat,

HWND(SysWaves.Handle), 0, Flags);

if Status <> MMSYSERR_NOERROR then begin

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

Result := -1;

Exit;

end;

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

FDeviceOpened := TRUE;

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

InitWaveHeaders;

//если подготовка буферов для операци