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