⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 u_vcmp3demo_main.pas

📁 Voice Commnucation Components for Delphi
💻 PAS
📖 第 1 页 / 共 4 页
字号:
  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 + -