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