Ðåôåðàòû. Ñèñòåìà îáðàáîòêè àóäèîèíôîðìàöèè. Ïîäñèñòåìà ôèëüòðàöèè è îáðàáîòêè ñèãíàëà

{$R *.dfm}

procedure TMainForm.FormCreate(Sender: TObject);

var

 WaveOutCaps: TWaveOutCaps;

 WaveInCaps: TWaveInCaps;

 i: Cardinal;

begin

 SamplesPerPoint := 16;

 BorderIcons := BorderIcons - [biMaximize];

 AudioData := TAudioData.Create;

 AudioClipBoard := TAudioData.Create;

 with AudioData do

 begin

 nChannels := 2;

 nBitsPerSample := 16;

 nSamplesPerSec := 44100;

 Calculate_nBlockAlign;

 end;

 AudioPosition := 0;

 if WaveOutGetNumDevs<>0 then

 begin

 for i := 0 to WaveOutGetNumDevs-1 do

 begin

 WaveOutGetDevCaps(i, @WaveOutCaps, SizeOf(TWaveOutCaps));

 OutDeviceComboBox.Items.Add(PChar(@WaveOutCaps.szPname));

 end;

 OutDeviceComboBox.ItemIndex := 0;

 end;

 if WaveInGetNumDevs<>0 then

 begin

 for i := 0 to WaveInGetNumDevs-1 do

 begin

 WaveInGetDevCaps(i, @WaveInCaps, SizeOf(TWaveInCaps));

 InDeviceComboBox.Items.Add(PChar(@WaveInCaps.szPname));

 end;

 InDeviceComboBox.ItemIndex := 0;

 end;

 AudioData.Calculate_nBlockAlign;

 UndoInfo.AudioData := TAudioData.Create;

 Status := 'starting';

end;


procedure TMainForm.SetAudioPosition;

var

 AudioSize, Long: Cardinal;

 S, S2: String;

begin

 PaintBox1.Repaint;

 with AudioData do AudioSize := Data.Size div nBlockAlign;

 if AudioSize = 0 then Exit;

 if AudioSize<TrackBar.Width then TrackBar.Max := AudioSize else TrackBar.Max := TrackBar.Width;

 with PositionSpinEdit do

 begin

 Value := AudioPosition;

 MinValue := 0;

 MaxValue := AudioSize;

 end;

 if TrackBar.Position <> Round(AudioPosition*TrackBar.Max/AudioSize) then TrackBar.Position := Round(AudioPosition*TrackBar.Max/AudioSize);

 S2 := '';

 Long := Trunc(AudioPosition/AudioData.nSamplesPerSec);

 Str(Trunc(Long/3600), S);

 Long := Long - Trunc(Long/3600)*3600;

 S2 := S2 + S +':';

 Str(Trunc(Long/60), S);

 Long := Long - Trunc(Long/60)*60;

 if Length(S)=1 then S2 := S2 + '0';

 S2 := S2 + S +':';

 Str(Long, S);

 if Length(S)=1 then S2 := S2 + '0';

 S2 := S2 + S +' / ';

 Long := Trunc(AudioSize/AudioData.nSamplesPerSec);

 Str(Trunc(Long/3600), S);

 Long := Long - Trunc(Long/3600)*3600;

 S2 := S2 + S +':';

 Str(Trunc(Long/60), S);

 Long := Long - Trunc(Long/60)*60;

 if Length(S)=1 then S2 := S2 + '0';

 S2 := S2 + S +':';

 Str(Long, S);

 if Length(S)=1 then S2 := S2 + '0';

 S2 := S2 + S + ' ';

 if TimePosition.Caption<>S2 then TimePosition.Caption := S2;

 {PaintBox1.Repaint;}

 PaintAudioGraph;

end;

procedure TMainForm.SetMarker;

var

 AudioSize: Cardinal;

begin

 if (Status = 'starting') then Exit;

 with AudioData do AudioSize := Data.Size div nBlockAlign;

 with Selection do

 begin

 if (AudioPosition=Start)and(StartExists) or (AudioPosition=Finish)and(FinishExists) then Exit;

 if not StartExists then

 begin

 Start := AudioPosition;

 StartExists := True;

 Marker1.Left := 8+Round(Start*(TrackBar.Max-20)/AudioSize);

 Marker1.Visible := True;

 Exit;

 end;

 if (StartExists) and (not FinishExists) then

 begin

 if AudioPosition>Start then

 Finish := AudioPosition

 else

 begin

 Finish := Start;

 Start := AudioPosition;

 end;

 FinishExists := True;

 TrackBar.SelStart := Round(Start*TrackBar.Max/AudioSize);

 TrackBar.SelEnd := Round(Finish*TrackBar.Max/AudioSize);

 Marker1.Left := 8+Round(Start*(TrackBar.Max-20)/AudioSize);

 Marker1.Visible := True;

 Marker2.Left := 8+Round(Finish*(TrackBar.Max-20)/AudioSize);

 Marker2.Visible := True;

 PaintBox1.Repaint;

 Exit;

 end;

 if (StartExists) and (FinishExists) then

 begin

 if AudioPosition<Start then

 Start := AudioPosition

 else

 if AudioPosition>Finish then

 Finish := AudioPosition;

 TrackBar.SelStart := Round(Start*TrackBar.Max/AudioSize);

 TrackBar.SelEnd := Round(Finish*TrackBar.Max/AudioSize);

 Marker1.Left := 8+Round(Start*(TrackBar.Max-20)/AudioSize);

 Marker1.Visible := True;

 Marker2.Left := 8+Round(Finish*(TrackBar.Max-20)/AudioSize);

 Marker2.Visible := True;

 PaintBox1.Repaint;

 Exit;

 end;

 end;

end;

procedure TMainForm.DeleteMarkers;

begin

 Selection.StartExists := False;

 Selection.FinishExists := False;

 Marker1.Visible := False;

 Marker2.Visible := False;

 TrackBar.SelStart := 0;

 TrackBar.SelEnd := 0;

 PaintBox1.Repaint;

end;

procedure TMainForm.OpenButtonClick(Sender: TObject);

var

 FileName, S, Ext: String;

 i: Byte;

 PCM: TPCMFile;

 MP3: TMP3File;

 EM1: TEM1File;

begin

 if (Status<>'starting')and(Status<>'waiting') then Exit;

 if OpenDialog.Execute then FileName := OpenDialog.FileName else Exit;

 Status := 'opening';

 AudioData.Data.Clear;

 if GetFileAttributes(PChar(FileName)) and FILE_ATTRIBUTE_READONLY = FILE_ATTRIBUTE_READONLY then

 SetFileAttributes(PChar(FileName), GetFileAttributes(PChar(FileName)) xor FILE_ATTRIBUTE_READONLY);

 Ext := ExtractFileExt(FileName);

 for i := 1 to Length(Ext) do Ext[i] := UpCase(Ext[i]);

 if Ext = '.WAV' then

 begin

 PCM := TPCMFile.Open(FileName);

 PCM.ReadAudioData(AudioData);

 PCM.Destroy;

 end;

 if Ext = '.MP3' then

 begin

 MP3 := TMP3File.Open(FileName);

 MP3.ReadAudioData(AudioData);

 MP3.Destroy;

 end;

 if Ext = '.EM1' then

 begin

 EM1 := TEM1File.Open(FileName);

 EM1.ReadAudioData(AudioData);

 EM1.Destroy;

 end;

 Str(AudioData.nChannels, S);

 AudioOptionsForm.nChannelsText.Caption := S + ' channels';

 Str(AudioData.nBitsPerSample, S);

 AudioOptionsForm.nBitsPerSampleText.Caption := S + ' bits';

 Str(AudioData.nSamplesPerSec, S);

 AudioOptionsForm.nSamplesPerSecText.Caption := S + ' Hz';

 AudioPosition := 0;

 AudioData.Calculate_nBlockAlign;

 SetAudioPosition;

 DeleteMarkers;

 Status := 'waiting';

end;

procedure TMainForm.PlayButtonClick(Sender: TObject);

begin

 if Status<>'waiting' then Exit;

 if OutDeviceComboBox.ItemIndex = -1 then Exit;

 if AudioPosition*AudioData.nBlockAlign >= AudioData.Data.Size then Exit;

 Status := 'playing';

 PlayThread := TPlayThread.Create(False);

end;

procedure TPlayThread.Execute;

const

 BlockSize = 1024*24;

var

 hEvent: THandle;

 WaveFormatEx: TWaveFormatEx;

 WaveHdr: array [0..1] of TWaveHdr;

 Buf: array [0..1] of array [0..BlockSize-1] of Byte;

 i: Cardinal;

begin

 with WaveFormatEx do

 begin

 wFormatTag := WAVE_FORMAT_PCM;

 nChannels := AudioData.nChannels;

 nSamplesPerSec := AudioData.nSamplesPerSec;

 wBitsPerSample := AudioData.nBitsPerSample;

 nBlockAlign := wBitsPerSample div 8 * nChannels;

 nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;

 cbSize := 0;

 end;

 hEvent := CreateEvent(nil, False, False, nil);

 if WaveOutOpen(@WaveOut, MainForm.OutDeviceComboBox.ItemIndex , @WaveFormatEx, hEvent, 0, CALLBACK_EVENT) <> MMSYSERR_NOERROR then

 begin

 Status := 'waiting';

 CloseHandle(hEvent);

 Terminate;

 Exit;

 end;

 MainForm.PlayButton.Flat := True;

 for i := 0 to 1 do

 begin

 WaveHdr[i].lpData := @Buf[i];

 WaveHdr[i].dwBufferLength := BlockSize;

 AudioData.Data.Position := AudioPosition*AudioData.nBlockAlign;

 if i<>1 then

 begin

 AudioData.Data.Read(Buf[i], BlockSize);

 AudioPosition := AudioPosition + BlockSize div AudioData.nBlockAlign;

 if AudioPosition*AudioData.nBlockAlign >= AudioData.Data.Size then AudioPosition := AudioData.Data.Size div AudioData.nBlockAlign;

 end;

 WaveOutPrepareHeader(WaveOut, @WaveHdr[i], SizeOf(TWaveHdr));

 end;

 i := 0;

 while (not Terminated) and (AudioData.Data.Position<AudioData.Data.Size) do

 begin

 WaveOutWrite(WaveOut, @WaveHdr[i], SizeOf(TWaveHdr));

 WaitForSingleObject(hEvent, INFINITE);

 i := i xor 1;

 AudioData.Data.Position := AudioPosition*AudioData.nBlockAlign;

 AudioData.Data.Read(Buf[i], BlockSize);

 AudioPosition := AudioPosition + (BlockSize div AudioData.nBlockAlign);

 if AudioPosition*AudioData.nBlockAlign >= AudioData.Data.Size then AudioPosition := AudioData.Data.Size div AudioData.nBlockAlign;

 MainForm.SetAudioPosition;

 end;

 WaveOutReset(WaveOut);

 for i := 0 to 1 do WaveOutUnprepareHeader(WaveOut, @WaveHdr[i], SizeOf(WaveHdr));

 WaveOutClose(WaveOut);

 CloseHandle(hEvent);

 if not Terminated then Terminate;

 MainForm.PlayButton.Flat := False;

 Status := 'waiting';

end;

procedure TMainForm.RecordButtonClick(Sender: TObject);

begin

 if (Status<>'waiting')and(Status<>'starting') then Exit;

 if InDeviceComboBox.ItemIndex = -1 then Exit;

 Status := 'recording';

 RecordThread := TRecordThread.Create(False);

end;

procedure TRecordThread.Execute;

const

 BlockSize = 1024*24;

 BufNumber = 8;

var

 hEvent: THandle;

 WaveFormatEx: TWaveFormatEx;

 WaveHdr: array [0..BufNumber-1] of TWaveHdr;

 Buf: array [0..BufNumber-1] of array [0..BlockSize-1] of Byte;

 i: Cardinal;

begin

 with WaveFormatEx do

 begin

 wFormatTag := WAVE_FORMAT_PCM;

 nChannels := AudioData.nChannels;

 nSamplesPerSec := AudioData.nSamplesPerSec;

 wBitsPerSample := AudioData.nBitsPerSample;

 nBlockAlign := wBitsPerSample div 8 * nChannels;

 nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;

 cbSize := 0;

 end;

 hEvent := CreateEvent(nil, False, False, nil);

 if WaveInOpen(@WaveIn, MainForm.InDeviceComboBox.ItemIndex , @WaveFormatEx, hEvent, 0, CALLBACK_EVENT) <> MMSYSERR_NOERROR then

 begin

 Status := 'waiting';

 CloseHandle(hEvent);

Ñòðàíèöû: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25



2012 © Âñå ïðàâà çàùèùåíû
Ïðè èñïîëüçîâàíèè ìàòåðèàëîâ àêòèâíàÿ ññûëêà íà èñòî÷íèê îáÿçàòåëüíà.