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

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

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



cend(mmfp, @mminfosub, 0);

// этот кусок только содержит полную длину в выборках...

mminfosub.ckid := FOURCC_FACT;

mminfosub.cksize := sizeof(DWORD);

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

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

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

Result := -4;

Exit;

end;

fTotalSamples := FTotalWaveSize / FWaveFormat.nAvgBytesPerSec *

FWaveFormat.nSamplesPerSec;

dwTotalSamples := Trunc(fTotalSamples);

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

if mmioWrite(mmfp, PChar(@dwTotalSamples), sizeof(dwTotalSamples))

<> sizeof(dwTotalSamples) then begin

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

Result := -4;

Exit;

end;

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

mmioAscend(mmfp, @mminfosub, 0);

// теперь создайте, и запишите wav кусок данных...

mminfosub.ckid := FOURCC_DATA;

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

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

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

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

Result := -5;

Exit;

end;

// копируйте данные из временного файла в wav файл

if CopyDataToWaveFile(mmfp) <> 0 then begin

WFerror(mmfp, Ошибка записи wave данных.);

Result := -5;

Exit;

end;

mmioAscend(mmfp, @mminfosub, 0);

// поднимитесь из куска RIFF...

mmioAscend(mmfp, @mminfopar, 0);

//закрыть

mmioClose(mmfp, 0);

Cursor := crDefault;

Result := 0;

end;

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

// Закрытие wav файла, вывод сообщения об ошибках

procedure TSysWaves.WFerror(

mmfp : HMMIO;

const msg : String);

begin

mmioClose(mmfp, 0);

Cursor := crDefault;

errormsg(msg);

end;

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

// Копирование wav данных из временного файла в wav файл

function TSysWaves.CopyDataToWaveFile(mmfp : HMMIO) : integer;

var

pbuf : PChar;

ht : HFILE;

nbytes : integer;

begin

pbuf := FWaveMem[0]; //используйте один из волновых буферов для копирования

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

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

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

if ht = HFILE_ERROR then begin

Result := -1;

Exit;

end;

// копируйте в RIFF/wave файл

while TRUE do begin

nbytes := _lread(ht, pbuf, WAVE_BUFSIZE);

if nbytes <= 0 then break;

mmioWrite(mmfp, pbuf, nbytes);

end;

// закройте файл чтения

_lclose(ht);

Result := 0;

end;

//======================получение и установка кодеков=====================================

//функция вызывающая визуальный выбор кодека

function TSysWaves.GetWaveFormat : integer;

var

acmopt : TACMFORMATCHOOSE;

err : MMRESULT;

ptmpfmt : PWAVEFORMATEX;

begin

//размещение структуры ptmpfmt в динамич памяти

GetMem(ptmpfmt, FMaxFmtSize);

//если структура не определена

if ptmpfmt = nil then begin

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

Result := -1;

Exit;

end;

//Переместите байты размером FMaxFmtSize из FWaveFormat^ в ptmpfmt^

Move(FWaveFormat^, ptmpfmt^, FMaxFmtSize);

// ACM установка выбирает поля и отображает диалог...

//заполняет нулями acmopt

FillChar(acmopt, sizeof(acmopt), 0);

//заносим предварительные данные

acmopt.cbStruct := sizeof(acmopt);//размер области памяти, занимаемой структурой.

acmopt.fdwStyle := ACMFORMATCHOOSE_STYLEF_INITTOWFXSTRUCT;//флаги стилей

//построения диалога

acmopt.hwndOwner := Handle;//ключ окна-владельца создаваемого диалога

acmopt.pwfx := FWaveFormat;//указатель области памяти для структуры типа

//WAVEFORMATEX

acmopt.cbwfx := FMaxFmtSize;//размер области памяти для структуры описания

//формата

acmopt.pszTitle := Выбор кодека;

acmopt.fdwEnum := ACM_FORMATENUMF_INPUT;//флаги режимов перебора фильтров/форматов.

err := acmFormatChoose(acmopt);//выбираем кодек

//сравниваем полученную и предыдущую структуру TWAVEFORMATEX

if CompareMem(FWaveFormat, ptmpfmt, sizeof(TWAVEFORMATEX)) then

err := ACMERR_CANCELED; //пользователь закрыл диалог кнопкой Cancel

if err <> MMSYSERR_NOERROR then begin

//Переместите байты размером FMaxFmtSize из ptmpfmt^ в FWaveFormat^

Move(ptmpfmt^, FWaveFormat^, FMaxFmtSize);

FreeMem(ptmpfmt);//освобождаем память

if err = ACMERR_CANCELED then begin

Result := 0;

Exit;

end;

errormsg(Ошибка функции FormatChoose);

Result := -2;

Exit;

end;

//запомнить описание формата...его характеристики

FFormatDesc := acmopt.szFormat;

GetFormatTagDetails(acmopt.pwfx.wFormatTag);

FreeMem(ptmpfmt);//освобождаем память

Result := 0;

end;

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

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

function TSysWaves.GetFormatTagDetails(wFormatTag : WORD) : integer;

var

acmtagdetails : TACMFORMATTAGDETAILS;

begin

// обнулить....

FillChar(acmtagdetails, sizeof(acmtagdetails), 0);

acmtagdetails.cbStruct := sizeof(acmtagdetails);

acmtagdetails.dwFormatTag := wFormatTag;

//если запрос о сведении типа формата <> 0 то

if acmFormatTagDetails(nil, acmtagdetails,

ACM_FORMATTAGDETAILSF_FORMATTAG) <> 0 then begin

errormsg(Ошибка функции FormatTagDetails);

Result := -1;

Exit;

end;

//сохраните строку описания деталей формата...

FFormatTag := acmtagdetails.szFormatTag;

Result := 0;

end;

//===================проигрывание звука=========================================

//Чтение волнового файла

function TSysWaves.ReadWaveFile : Integer;

var

mmfp : HMMIO;

mminfopar : TMMCKINFO;

mminfosub : TMMCKINFO;

dwTotalSamples : DWORD;

Sec,Min:variant;

begin

dwTotalSamples:=0;

//получаем имя проигрываемого файла

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

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

// открыть wave файл для чтения...

mmfp := mmioOpen(PChar(FFileName), nil, MMIO_READ + MMIO_ALLOCBUF);

//если файл не открыт

if mmfp = 0 then begin

errormsg(Ошибка открытия файла для чтения.);

Result := -1;

Exit;

end;

Cursor := crHourGlass;

// поиск куска формата...

mminfopar.fccType := FOURCC_WAVE;

if mmioDescend(mmfp, @mminfopar, nil, MMIO_FINDRIFF) <> 0 then begin

WFerror(mmfp, Wave формат не н