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