📄 u_vc2demo_main.pas
字号:
f_mixer.addConsumer(f_riffOut);
end;
f_playback.open();
f_mixer.open();
end;
//
reEnable(f_playback);
end;
// -- --
procedure Tc_form_vc2DemoMain.ac_chooseOutExecute(Sender: TObject);
var
format: pWAVEFORMATEX;
begin
new(format);
fillPCMFormat(format^, f_waveOutFormat.pcmSamplesPerSecond, f_waveOutFormat.pcmBitsPerSample, f_waveOutFormat.pcmNumChannels);
if (mmNoError(f_playback.formatChoose(format, 'Choose playback format'))) then begin
//
f_waveOutFormat.pcmSamplesPerSecond := format.nSamplesPerSec;
f_waveOutFormat.pcmBitsPerSample := format.wBitsPerSample;
f_waveOutFormat.pcmNumChannels := format.nChannels;
//
f_playback.setSampling(format^);
f_mixer.setSampling(format^);
c_staticText_outFormat.Caption := f_playback.srcFormatInfo;
end;
dispose(format);
end;
// -- --
procedure Tc_form_vc2DemoMain.ac_closeOutExecute(Sender: TObject);
begin
f_channels.clear(1);
f_mixer.close();
f_playback.close();
freeAndNil(f_riffOut);
freeAndNil(f_inOutResampler);
//
reEnable(f_playback);
end;
// -- --
procedure Tc_form_vc2DemoMain.ac_openInExecute(Sender: TObject);
var
format: WAVEFORMATEX;
formatOut: WAVEFORMATEX;
begin
if (not f_recorder.isOpen()) then begin
f_recorder.deviceId := unsigned(int(c_comboBox_recordingDevice.items.objects[c_comboBox_recordingDevice.itemIndex]) - 10);
//f_recorder.mapped := c_checkBox_inMapped.checked;
//f_recorder.direct := c_checkBox_inDirect.checked;
//
fillPCMFormat(format, f_waveInFormat.pcmSamplesPerSecond, f_waveInFormat.pcmBitsPerSample, f_waveInFormat.pcmNumChannels);
//
if (c_checkBox_loop2Playback.checked) then begin
// loop recording to playback (through resampler)
fillPCMFormat(formatOut, f_waveOutFormat.pcmSamplesPerSecond, f_waveOutFormat.pcmBitsPerSample, f_waveOutFormat.pcmNumChannels);
//
f_inOutResampler := unaWaveResampler.create(false);
with (f_inOutResampler) do begin
setSampling(true, format);
setSampling(false, formatOut);
onDataAvailable := myOnDA;
assignStream(false, nil);
end;
//
f_recorder.addConsumer(f_inOutResampler);
//
f_inOutStream := mixer.addStream();
//
f_inOutResampler.open();
end;
//
if (c_checkBox_saveIn2File.Checked) then begin
//
f_riffIn := unaRiffStream.createNew(f_waveInFile, format);
f_riffIn.open();
f_recorder.addConsumer(f_riffIn);
end;
f_recorder.open();
end;
//
reEnable(f_recorder);
end;
// -- --
procedure Tc_form_vc2DemoMain.ac_closeInExecute(Sender: TObject);
begin
f_recorder.close();
freeAndNil(f_inOutResampler);
freeandNil(f_riffIn);
//
if (nil <> f_inOutStream) then
mixer.removeStream(f_inOutStream);
//
f_inOutStream := nil;
//
reEnable(f_recorder);
end;
// -- --
procedure Tc_form_vc2DemoMain.ac_chooseInExecute(Sender: TObject);
var
format: pWAVEFORMATEX;
begin
new(format);
fillPCMFormat(format^, f_waveInFormat.pcmSamplesPerSecond, f_waveInFormat.pcmBitsPerSample, f_waveInFormat.pcmNumChannels);
if (mmNoError(f_recorder.formatChoose(format, 'Choose recording format'))) then begin
//
f_waveInFormat.pcmSamplesPerSecond := format.nSamplesPerSec;
f_waveInFormat.pcmBitsPerSample := format.wBitsPerSample;
f_waveInFormat.pcmNumChannels := format.nChannels;
//
f_recorder.setSampling(format^);
c_staticText_inFormat.Caption := f_recorder.dstFormatInfo;
end;
dispose(format);
end;
// -- --
procedure Tc_form_vc2DemoMain.c_timer_updateTimer(Sender: TObject);
begin
c_statusBar_main.Panels[0].Text := 'Mem: ' + int2Str(ams() shr 10, 10, 3) + ' KB';
//
updateVolume(f_playback);
updateVolume(f_recorder);
//
inc(f_hintColorCount);
inc(f_hintTextCount, 3);
end;
// -- --
procedure Tc_form_vc2DemoMain.ac_addChannelExecute(Sender: TObject);
var
channel: Tc_form_playbackChannel;
begin
channel := Tc_form_playbackChannel.create(nil);
channel.Top := channel.Top + int(f_channels.count) * 20;
channel.Left := channel.Left + int(f_channels.count) * 20;
channel.c_groupBox_main.Caption := ' Channel #' + int2Str(f_channels.count) + ' ';
f_channels.Add(channel);
channel.Show();
end;
// -- --
procedure Tc_form_vc2DemoMain.updateVolume(device: unaWaveDevice);
var
posLeft: unsigned;
posRight: unsigned;
begin
if (nil <> device) then begin
//
if (device.isOpen) then begin
posLeft := device.getVolume(0);
posRight := device.getVolume(1);
end
else begin
posLeft := 0;
posRight := 0;
end;
//
if (device is unaWaveOutDevice) then begin
//
c_progressBar_outLeft.position := waveGetLogVolume(posLeft);
c_progressBar_outRight.position := waveGetLogVolume(posRight);
end
else begin
//
c_progressBar_inLeft.Position := waveGetLogVolume(posLeft);
c_progressBar_inRight.Position := waveGetLogVolume(posRight);
end;
//
end;
end;
// -- --
procedure Tc_form_vc2DemoMain.reEnable(device: unaWaveDevice);
var
isOpen: bool;
begin
isOpen := device.isOpen();
if (device is unaWaveOutDevice) then begin
//
ac_openOut.Enabled := not isOpen;
ac_closeOut.Enabled := isOpen;
ac_chooseOut.Enabled := not isOpen;
ac_addChannel.Enabled := isOpen;
c_comboBox_playbackDevice.Enabled := not isOpen;
//c_checkBox_outDirect.Enabled := not isOpen;
//c_checkBox_outMapped.Enabled := not isOpen;
c_checkBox_saveOut2File.Enabled := not isOpen;
c_edit_waveOutFile.Enabled := not isOpen;
c_speedButton_outFileOpen.Enabled := not isOpen;
c_checkBox_loop2Playback.Enabled := isOpen and not f_recorder.isOpen();
if (not c_checkBox_loop2Playback.Enabled) then
c_checkBox_loop2Playback.Checked := false;
end
else begin
//
ac_openIn.Enabled := not isOpen;
ac_closeIn.Enabled := isOpen;
ac_chooseIn.Enabled := not isOpen;
c_comboBox_recordingDevice.Enabled := not isOpen;
//c_checkBox_inDirect.Enabled := not isOpen;
//c_checkBox_inMapped.Enabled := not isOpen;
c_checkBox_saveIn2File.Enabled := not isOpen;
c_edit_waveInFile.Enabled := not isOpen;
c_speedButton_inFileOpen.Enabled := not isOpen;
c_checkBox_loop2Playback.Enabled := not isOpen and f_playback.isOpen();
end;
end;
// -- --
procedure Tc_form_vc2DemoMain.c_comboBox_playbackDeviceChange(Sender: TObject);
begin
f_waveOutDeviceId := unsigned(c_comboBox_playbackDevice.ItemIndex - 1);
end;
// -- --
procedure Tc_form_vc2DemoMain.c_comboBox_recordingDeviceChange(Sender: TObject);
begin
f_waveInDeviceId := unsigned(c_comboBox_recordingDevice.ItemIndex - 1);
end;
// -- --
procedure Tc_form_vc2DemoMain.c_speedButton_outFileOpenClick(Sender: TObject);
begin
if (c_saveDialog_main.Execute) then begin
//
f_waveOutFile := c_saveDialog_main.FileName;
c_edit_waveOutFile.Text := f_waveOutFile;
ini.section := 'main';
ini.setValue('initialSaveDir', extractFilePath(f_waveOutFile));
end;
end;
// -- --
procedure Tc_form_vc2DemoMain.c_edit_waveOutFileChange(Sender: TObject);
begin
f_waveOutFile := c_edit_waveOutFile.Text;
c_checkBox_saveOut2File.Checked := ('' <> trim(f_waveOutFile));
end;
// -- --
procedure Tc_form_vc2DemoMain.c_speedButton_inFileOpenClick(Sender: TObject);
begin
if (c_saveDialog_main.Execute) then begin
//
f_waveInFile := c_saveDialog_main.FileName;
c_edit_waveInFile.Text := f_waveInFile;
ini.section := 'main';
ini.setValue('initialSaveDir', extractFilePath(f_waveInFile));
end;
end;
// -- --
procedure Tc_form_vc2DemoMain.c_edit_waveInFileChange(Sender: TObject);
begin
f_waveInFile := c_edit_waveInFile.Text;
c_checkBox_saveIn2File.Checked := ('' <> f_waveInFile);
end;
// -- --
procedure Tc_form_vc2DemoMain.myOnDA(sender: tObject; data: pointer; size: unsigned);
begin
// put data from resampler to stream
if (nil <> f_inOutStream) then
f_inOutStream.write(data, size);
end;
// -- --
procedure Tc_form_vc2DemoMain.c_checkBox_saveOut2FileClick(Sender: TObject);
begin
if (c_checkBox_saveOut2File.Checked and ('' = trim(c_edit_waveOutFile.Text))) then begin
//
c_checkBox_saveOut2File.Checked := false;
c_speedButton_outFileOpenClick(nil);
end;
end;
// -- --
procedure Tc_form_vc2DemoMain.c_checkBox_saveIn2FileClick(Sender: TObject);
begin
if (c_checkBox_saveIn2File.Checked and ('' = trim(c_edit_waveInFile.Text))) then begin
//
c_checkBox_saveIn2File.Checked := false;
c_speedButton_inFileOpenClick(nil);
end;
end;
procedure Tc_form_vc2DemoMain.c_panel_infoClick(Sender: TObject);
begin
ShellExecute(0, 'open', 'http://www.lakeofsoft.com/vc', nil, nil, SW_SHOWNORMAL);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -