📄 u_vcmp3demo_main.pas
字号:
else
c_comboBox_decoder.items.add('Ogg/Vorbis Decoder - required module(s) was not found.');
//
// BASS MP3/Ogg DECODER
if (f_bassOK) then
c_comboBox_decoder.items.add('BASS MP3/Ogg decoder, version ' + f_bassDecoder.get_versionStr())
else
c_comboBox_decoder.items.add('BASS MP3/Ogg decoder - required module(s) was not found.');
//
// MpgLib DECODER
if (f_mpgOK) then
c_comboBox_decoder.items.add('MpgLib MP3 decoder, version ' + int2str(0)) // no version info
else
c_comboBox_decoder.items.add('MpgLib MP3 decoder - required module(s) was not found.');
//
//
c_comboBox_encoder.itemIndex := f_config.get('encoder.index', unsigned(0));
c_comboBox_decoder.itemIndex := f_config.get('decoder.index', unsigned(0));
end;
// -- --
procedure Tc_form_main.formCreate(sender: tObject);
var
e: tIPComponentEnum;
begin
f_config := unaIniFile.create();
loadControlPosition(self, f_config);
//
f_blade := unaBladeMp3Enc.create('');
f_lame := unaLameMp3Enc.create('');
f_vorbisEncode := unaVorbisEnc.create();
f_vorbisDecode := unaVorbisDecoder.create();
//
f_bassDecoder := unaBass.create('', {$IFDEF BASS_AFTER_18 }0{$ELSE }-1{$ENDIF }, 44100, 32, handle);
//
f_blade.onDataAvailable := myOnEncoderDataAvail;
f_lame.onDataAvailable := myOnEncoderDataAvail;
f_vorbisEncode.onDataAvailable := myOnEncoderDataAvail;
//
f_mpgDecoder := tMpgLibDecoder.create('');
f_mpgDecoder.onDataAvail := myOnDecoderDataAvail;
//
f_bladeOK := (BE_ERR_SUCCESSFUL = f_blade.errorCode);
f_lameOK := (BE_ERR_SUCCESSFUL = f_lame.errorCode);
f_vorbisEncodeOK := (BE_ERR_SUCCESSFUL = f_vorbisEncode.errorCode);
f_vorbisDecodeOK := (BE_ERR_SUCCESSFUL = f_vorbisDecode.errorCode);
f_vorbisDecodeVersion := f_vorbisDecode.version;
freeAndNil(f_vorbisDecode); // no longer needed here
//
f_bassOK := (BASS_OK = f_bassDecoder.get_errorCode());
f_mpgOK := (mpglib_error_OK = f_mpgDecoder.errorCode);
//
f_feedBuf := nil;
f_feedBufSize := 0;
//
f_socks := unaSocks.create();
f_socks.onEvent := myOnSocksEvent;
//
for e := low(e) to high(e) do
f_sockClients[e] := unaList.create();
//
enumAudioDevices();
enumEngineDevices();
//
c_comboBox_encoderChange(self);
c_comboBox_maxBR.items.Assign(c_comboBox_minBR.items);
c_comboBox_minBR.itemIndex := f_config.get('encoder.bitrate.min.index', unsigned(8));
c_comboBox_maxBR.itemIndex := f_config.get('encoder.bitrate.max.index', unsigned(8));
c_comboBox_avBR.itemIndex := f_config.get('encoder.bitrate.av.index', unsigned(8));
c_checkBox_enableVBRClick(self);
//
c_checkBox_disBRS.checked := f_config.get('encoder.lame.disableBrs', false);
//
c_comboBox_samplesRate.itemIndex := 5;
c_comboBox_stereoMode.itemIndex := 1;
c_comboBox_vbrQuality.itemIndex := 0;
//
c_edit_destFile.text := f_config.get('output.file.name', '');
c_checkBox_overwriteP.checked := f_config.get('output.file.overwritePrompt', true);
c_edit_sourceFile.text := f_config.get('input.file.name', '');
//
c_edit_encSrvAddr.text := f_config.get('enc.ip.addr', '192.168.1.1');
c_edit_encPortNumber.text := f_config.get('enc.ip.port', '17840');
c_comboBox_encSocketType.itemIndex := f_config.get('enc.ip.socketType.index', int(0));
c_edit_decSrvAddr.text := f_config.get('dec.ip.addr', '192.168.1.1');
c_edit_decSrvPort.text := f_config.get('dec.ip.port', '17840');
c_comboBox_decSrvSocketType.itemIndex := f_config.get('dec.ip.socketType.index', int(0));
//
c_comboBox_inputDevice.itemIndex := f_config.get('input.device.index', int(0));
c_comboBox_inputDeviceChange(self);
c_comboBox_outputDevice.itemIndex := f_config.get('output.device.index', int(0));
c_comboBox_outputDeviceChange(self);
//
c_comboBox_encodedDest.itemIndex := f_config.get('output.encoded.index', int(0));
c_comboBox_encodedDestChange(self);
c_comboBox_decoderSource.itemIndex := f_config.get('input.encoded.index', int(0));
c_comboBox_decoderSourceChange(self);
end;
// -- --
procedure Tc_form_main.formDestroy(sender: tObject);
var
e: tIPComponentEnum;
begin
a_encode_stop.execute();
a_decode_stop.execute();
//
freeAndNil(f_blade);
freeAndNil(f_lame);
freeAndNil(f_vorbisEncode);
freeAndNil(f_vorbisDecode);
freeAndNil(f_bassDecoder);
freeAndNil(f_mpgDecoder);
//
f_feedBufSize := 0;
mrealloc(f_feedBuf);
//
freeAndNil(f_socks);
for e := low(e) to high(e) do
freeAndNil(f_sockClients[e]);
//
saveControlPosition(self, f_config);
with (f_config) do begin
setValue('encoder.index', c_comboBox_encoder.itemIndex);
setValue('decoder.index', c_comboBox_decoder.itemIndex);
//
setValue('encoder.lame.disableBrs', c_checkBox_disBRS.Checked);
setValue('encoder.bitrate.min.index', c_comboBox_minBR.ItemIndex);
setValue('encoder.bitrate.max.index', c_comboBox_maxBR.ItemIndex);
setValue('encoder.bitrate.av.index', c_comboBox_avBR.ItemIndex);
//
setValue('enc.ip.addr', c_edit_encSrvAddr.text);
setValue('enc.ip.port', c_edit_encPortNumber.text);
setValue('enc.ip.socketType.index', c_comboBox_encSocketType.itemIndex);
setValue('dec.ip.addr', c_edit_decSrvAddr.text);
setValue('dec.ip.port', c_edit_decSrvPort.text);
setValue('dec.ip.socketType.index', c_comboBox_decSrvSocketType.itemIndex);
//
setValue('output.file.name', c_edit_destFile.text);
setValue('input.file.name', c_edit_sourceFile.text);
setValue('output.file.overwritePrompt', c_checkBox_overwriteP.Checked);
setValue('output.encoded.index', c_comboBox_encodedDest.itemIndex);
setValue('input.encoded.index', c_comboBox_decoderSource.itemIndex);
setValue('output.device.index', c_comboBox_outputDevice.itemIndex);
setValue('input.device.index', c_comboBox_inputDevice.itemIndex);
end;
//
freeAndNil(f_config);
end;
// -- --
procedure Tc_form_main.myOnSocksEvent(sender: tObject; event: unaSocketEvent; id, connId: unsigned; data: pointer; size: unsigned);
var
e: tIPComponentEnum;
begin
//
if (id = f_sockId[tipeEnc]) then
e := tipeEnc
else
if (id = f_sockId[tipeDec]) then
e := tipeDec
else
exit; // unknown sockId
//
case (event) of
// -- server --
unaseServerListen: begin
//
// server is listening
if (tiptSrv = f_ipComponentType[e]) then
f_ipComponentReady[e] := true;
end;
unaseServerStop: begin
//
// server is not listening
if (tiptSrv = f_ipComponentType[e]) then
f_ipComponentReady[e] := false;
end;
unaseServerConnect: begin
//
// new client connection
if (tipeEnc = e) then
f_sockClients[e].add(connId)
else
if (tipeDec = e) then begin
//
// only one client is allowed per decoder
if (1 > f_sockClients[e].count) then
f_sockClients[e].add(connId);
end;
end;
unaseServerData: begin
//
if (tipeEnc = e) then
// some data from client, ignore, since encoder always takes data from waveIn only
else
if (tipeDec = e) then begin
//
// is that a client we have added at unaseServerConnect?
if ((0 < f_sockClients[e].count) and (connId = unsigned(f_sockClients[e][0]))) then begin
//
// feed decoder with new data from client
case (f_decoderIndex) of
0: begin // vorbis
// not supported
end;
1: begin // BASS
// not supported
end;
2: begin // mpgLib
f_mpgDecoder.write(data, size);
end;
end; // case (f_decoderIndex)
end;
end;
end;
unaseServerDisconnect: begin
//
// client connection dropped
f_sockClients[e].removeItem(connId);
end;
// -- client --
unaseClientConnect: begin
//
// client was connected
if (tiptCln = f_ipComponentType[e]) then begin
//
if (not f_ipComponentReady[e]) then begin
//
f_ipComponentReady[e] := true;
//
// we also need to "ping" the server once so it will know we are connected
f_socks.sendData(id, @id, sizeOf(id), connId);
end;
end;
end;
unaseClientData: begin
//
if (tipeEnc = e) then
// some data from client, ignore, since encoder always takes data from waveIn only
else
if (tipeDec = e) then begin
//
// feed decoder with new data from server
case (f_decoderIndex) of
0: begin // vorbis
// not supported
end;
1: begin // BASS
// not supported
end;
2: begin // mpgLib
f_mpgDecoder.write(data, size);
end;
end; // case (f_decoderIndex)
end;
end;
unaseClientDisconnect: begin
//
// client was disconnected
if (tiptCln = f_ipComponentType[e]) then
f_ipComponentReady[e] := false;
end;
// thread
unaseThreadStartupError: begin
//
f_sockId[e] := 0;
f_sockConnId[e] := 0;
f_ipComponentReady[e] := false;
f_sockClients[e].clear();
end;
end;
end;
// -- --
function index2proto(index: int): int;
begin
if (0 = index) then
result := IPPROTO_UDP
else
result := IPPROTO_TCP;
//
end;
// -- --
procedure Tc_form_main.a_encode_startExecute(Sender: TObject);
var
bladeConfig: BE_CONFIG;
lameConfig: BE_CONFIG_FORMATLAME;
vorbisConfig: tVorbisSetup;
config: pointer;
//
ok: bool;
//
minBR,
maxBR,
avBR: unsigned;
samplesRate: unsigned;
stereoMode: int;
begin
c_statusBar_main.panels[1].text := '';
f_encoderDestIndex := c_comboBox_encodedDest.itemIndex;
//
f_ipComponentReady[tipeEnc] := false;
case (c_comboBox_encodedDest.itemIndex) of
1: f_ipComponentType[tipeEnc] := tiptCln;
2: f_ipComponentType[tipeEnc] := tiptSrv;
end;
//
case (c_comboBox_encoder.itemIndex) of
0: f_encoder := f_blade;
1: f_encoder := f_lame;
2: f_encoder := f_vorbisEncode;
else
f_encoder := nil;
end;
//
if (nil <> f_encoder) then begin
//
config := nil;
//
if (0 = c_comboBox_avBR.ItemIndex) then
avBR := 0
else
avBR := str2intUnsigned(c_comboBox_avBR.text, 128);
//
if (c_checkBox_enableVBR.Checked) then begin
minBR := str2intUnsigned(c_comboBox_minBR.text, 128);
maxBR := str2intUnsigned(c_comboBox_maxBR.text, 128);
end
else begin
minBR := avBR;
maxBR := avBR;
end;
//
samplesRate := str2intUnsigned(c_comboBox_samplesRate.Text, 44100);
//
waveIn.pcm_NumChannels := 2;
case (c_comboBox_stereoMode.itemIndex) of
0: begin
//
stereoMode := BE_MP3_MODE_MONO;
waveIn.pcm_NumChannels := 1;
end;
1: stereoMode := BE_MP3_MODE_STEREO;
2: stereoMode := BE_MP3_MODE_JSTEREO;
3: stereoMode := BE_MP3_MODE_DUALCHANNEL;
else
stereoMode := BE_MP3_MODE_STEREO;
end;
//
waveIn.pcm_SamplesPerSec := samplesRate;
waveIn.pcm_BitsPerSample := 16;
//
if (f_blade = f_encoder) then begin
//
fillChar(bladeConfig, sizeOf(bladeConfig), #0);
bladeConfig.dwConfig := BE_CONFIG_MP3;
with bladeConfig.r_mp3 do begin
//
dwSampleRate := samplesRate;
byMode := stereoMode;
wBitrate := avBR;
//
bPrivate := c_checkBox_private.checked;
bCRC := c_checkBox_crc.checked;
bCopyright := c_checkBox_copyrighted.checked;
bOriginal := c_checkBox_original.checked;
end;
config := @bladeConfig;
end;
//
if ((nil = config) and (f_lame = f_encoder)) then begin
//
fillChar(lameConfig, sizeOf(lameConfig), #0);
lameConfig.dwConfig := BE_CONFIG_LAME;
with lameConfig.r_lhv1 do begin
//
dwStructVersion := CURRENT_STRUCT_VERSION;
dwStructSize := sizeOf(lameConfig);
dwSampleRate := samplesRate;
//dwReSampleRate := 0;
nMode := stereoMode;
dwBitrate := minBR;
dwMaxBitrate := maxBR;
nPreset := LQP_NOPRESET;
dwMpegVersion := MPEG2;
//dwPsyModel := 0;
//dwEmphasis := 0;
bPrivate := c_checkBox_private.checked;
bCRC := c_checkBox_crc.checked;
bCopyright := c_checkBox_copyrighted.checked;
bOriginal := c_checkBox_original.checked;
//
bWriteVBRHeader := false;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -