Система регистрации речи диспетчерских переговоров
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
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;
//если подготовка буферов для операци