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

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

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



айден в файле.);

Result := -2;

Exit;

end;

mminfosub.ckid := FOURCC_FMT;

if mmioDescend(mmfp, @mminfosub, @mminfopar, MMIO_FINDCHUNK) <> 0 then begin

WFerror(mmfp, Формат куска не найден.);

Result := -3;

Exit;

end;

//если размер wav формата > максимального размера ACM

FMaxFmtSizethenbegin"> if mminfosub.cksize > FMaxFmtSize then begin

WFerror(mmfp, Размер формата в файле не соответствует типам ACM.);

Result := -4;

Exit;

end;

// читайте wav формат....

if mmioRead(mmfp, PChar(FWaveFormat), mminfosub.cksize)

LongInt(mminfosub.cksize)thenbegin"> <> LongInt(mminfosub.cksize) then begin

WFerror(mmfp, Ошибка чтения куска формата.);

Result := -4;

Exit;

end;

//назад

mmioAscend(mmfp, @mminfosub, 0);

//поиск фактического куска

mminfosub.ckid := FOURCC_FACT;

if mmioDescend(mmfp, @mminfosub, @mminfopar, MMIO_FINDCHUNK) <> 0 then begin

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

Result := -7;

Exit;

end;

//чтение фактических данных

if mmioRead(mmfp, PChar(@dwTotalSamples), mminfosub.cksize)

LongInt(mminfosub.cksize)thenbegin"> <> LongInt(mminfosub.cksize) then begin

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

Result := -7;

Exit;

end;

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

min:=0;

Sec:=dwTotalSamples/FWaveFormat.nSamplesPerSec ;

trackbar1.Max:= trunc(Sec);

if Sec/60 < 1 then Sec:=trunc(Sec)

else begin

Min:=trunc(Sec/60);

Sec:=trunc((Sec/60-Min)*60);

end;

Label10.Caption:=Format(%.2d:%.2d,[integer(Min),integer(Sec)]);

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

mmioAscend(mmfp, @mminfosub, 0);

// получите полный wav размер данных (mminfo.cksize)..

mminfosub.ckid := FOURCC_DATA;

if mmioDescend(mmfp, @mminfosub, @mminfopar, MMIO_FINDCHUNK) <> 0 then begin

WFerror(mmfp, Кусок данных не найден.);

Result := -5;

Exit;

end;

// если нет никаких данных,

if mminfosub.cksize = 0 then begin

WFerror(mmfp, Кусок данных не содержит никаких данных.);

Result := -6;

Exit;

end;

// теперь читайте wav данные и копируйте во временный файл...

0thenbegin"> if CopyWaveToTempFile(mmfp, mminfosub.cksize) <> 0 then begin

mminfosub.cksize := 0;

errormsg(Ошибка чтения wave данных.);

end;

//закрытие wav файл

mmioClose(mmfp, 0);

Cursor := crDefault;

FTotalWaveSize := mminfosub.cksize;

// признак записи данных

FRecordedData := FALSE;

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

GetFormatTagDetails(FWaveFormat.wFormatTag);

GetFormatDetails(FWaveFormat);

FTLabel.Caption := FFormatTag;

FDLabel.Caption := FFormatDesc;

Result := 0;

end;

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

// Копируйте данные волны из файла RIFF в временый файл.

function TSysWaves.CopyWaveToTempFile(mmfp: HMMIO;datasize : DWORD) : Integer;

var

pbuf : PChar;

ntotal : DWORD;

nbytes : integer;

readsize : DWORD;

begin

pbuf := FWaveMem[0];

readsize := WAVE_BUFSIZE;

ntotal := 0;

Result := 0;

// создайте временный файл, основанный на текущем временном имени

if CreateTmpFile <> 0 then begin

Result := -1;

Exit;

end;

//введите чтение/копирование цикл

while ntotal < datasize do begin

if (ntotal + readsize) > datasize then readsize := datasize - ntotal;

nbytes := mmioRead(mmfp, pbuf, readsize);

if nbytes = 0 then begin

Result := -2;

break;

end;

if _lwrite(FTmpFileHandle, pbuf, nbytes) <> UINT(nbytes) then begin

Result := -3;

break;

end;

Inc(ntotal, nbytes);

end;

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

CloseTmpFile;

end;

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

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

function TSysWaves.StartWavePlay : Integer;

begin

FByteDataSize := 0;

FBufIndex := 0;

// откройте устройство для регистрации(записи)...

if waveOutOpen(@FWaveOut, WAVE_MAPPER, FWaveFormat,

Handle, 0, CALLBACK_WINDOW or WAVE_ALLOWSYNC) <> 0 then begin

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

Result := -1;

Exit;

end;

FDeviceOpened := TRUE;

// подготовка заголовков...

InitWaveHeaders;

if (waveOutPrepareHeader(FWaveOut, FWaveHdr[0], sizeof(TWAVEHDR)) <> 0) or

(waveOutPrepareHeader(FWaveOut, FWaveHdr[1], sizeof(TWAVEHDR)) <> 0)

then begin

CloseWaveDevicePlay;

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

Result := -2;

Exit;

end;

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

if OpenTmpFile = 0 then begin

CloseWaveDevicePlay;

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

Result := -3;

Exit;

end;

// запишите первый буфер, чтобы запустить играть..

if QueueNextBuffer <> 0 then begin

CloseWaveDevicePlay;

Result := -4;

Exit;

end;

FRecorderMode := recModePlay;

FMoreToPlay := TRUE;

// установите таймер чтобы модифицировать дисплей....

Timer1.Interval := 1000;

Timer1.Enabled := TRUE;

// и очередь следующий буфер..

QueueNextBuffer;

Result := 0;

end;

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

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

procedure TSysWaves.CloseWaveDevicePlay;

begin

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

if (waveOutUnprepareHeader(FWaveOut, FWaveHdr[0], sizeof(TWAVEHDR)) <> 0) or

(waveOutUnprepareHeader(FWaveOut, FWaveHdr[1], sizeof(TWAVEHDR)) <> 0)

then errormsg(Ошибка работы с заголовками.);

// закрыть устройство

if waveOutClose(FWaveOut) <> 0 then

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

FDeviceOpened := FALSE;

// закрыть временый файл

CloseTmpFile;

Play.Caption:=Играть;

Select.Enabled:=true;

NoSelect.Enabled:=true;

DelTrack.Enabled:=true;

TrackBar1.Position:=0;

Play.Enabled:=true;

Stop.Enabled:=false;

Label10.Caption :=Format(%.2d:%.2d,[0,0]);

Label11.Caption :=Format(%.2d:%.2d,[0,0]);

end;

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

// Запись из буфера в устройство проигрывания и переключение индекса буфера .

function TSysWaves.QueueNextBuffer : Integer;

begin

// заполните волновой буфер данными от файла...

if ReadWaveBuffer = 0 then begin

// сбросьте поля признака (удалите атрибут WHDR_DONE)...

FWaveHdr[FBufIndex].dwFlags := WHDR_PREPARED;

// теперь очередь буфер для вывода...

if waveOutWrite(FWaveOut, FWaveHdr[FBufIndex], sizeof(TWAVEHDR)) <> 0

then begin

StopWavePlay;

errormsg(Ошибка записи