program simpleplayer_fpGUI_noflat; {$mode objfpc}{$H+} {$DEFINE UseCThreads} uses {$IFDEF UNIX} {$IFDEF UseCThreads} // cmem, cthreads, cwstring, {$ENDIF} {$ENDIF} SysUtils, uos, ctypes, //Math, Classes, fpg_button, fpg_widget, fpg_label, fpg_Editbtn, fpg_RadioButton, fpg_trackbar, fpg_CheckBox, fpg_Panel, fpg_base, fpg_main, fpg_form { you can add units after this }; type TSimpleplayer = class(TfpgForm) procedure uos_logo(Sender: TObject); private {@VFD_HEAD_BEGIN: Simpleplayer} Custom1: TfpgWidget; Labelport: TfpgLabel; btnLoad: TfpgButton; FilenameEdit1: TfpgFileNameEdit; FilenameEdit2: TfpgFileNameEdit; FilenameEdit4: TfpgFileNameEdit; btnStart: TfpgButton; btnStop: TfpgButton; lposition: TfpgLabel; Labelsnf: TfpgLabel; Labelmpg: TfpgLabel; Labelst: TfpgLabel; FilenameEdit3: TfpgFileNameEdit; FilenameEdit5: TfpgFileNameEdit; Label1: TfpgLabel; Llength: TfpgLabel; btnpause: TfpgButton; btnresume: TfpgButton; CheckBox1: TfpgCheckBox; RadioButton1: TfpgRadioButton; RadioButton2: TfpgRadioButton; RadioButton3: TfpgRadioButton; Label2: TfpgLabel; TrackBar1: TfpgTrackBar; TrackBar2: TfpgTrackBar; TrackBar3: TfpgTrackBar; Label3: TfpgLabel; Label4: TfpgLabel; Label5: TfpgLabel; vuleft: TfpgPanel; vuright: TfpgPanel; CheckBox2: TfpgCheckBox; Label6: TfpgLabel; Label7: TfpgLabel; TrackBar4: TfpgTrackBar; TrackBar5: TfpgTrackBar; Button1: TfpgButton; chkst2b: TfpgCheckBox; Labelst1: TfpgLabel; FilenameEdit6: TfpgFileNameEdit; chkstereo2mono: TfpgCheckBox; Labelst11: TfpgLabel; FilenameEdit7: TfpgFileNameEdit; Labelst111: TfpgLabel; FilenameEdit8: TfpgFileNameEdit; {@VFD_HEAD_END: Simpleplayer} public procedure AfterCreate; override; // constructor Create(AOwner: TComponent); procedure btnLoadClick(Sender: TObject); procedure btnCloseClick(Sender: TObject); procedure btnStartClick(Sender: TObject); procedure btnStopClick(Sender: TObject); procedure btnPauseClick(Sender: TObject); procedure btnResumeClick(Sender: TObject); procedure btnTrackOnClick(Sender: TObject; Button: TMouseButton; Shift: TShiftState; const pos: TPoint); procedure btnTrackOffClick(Sender: TObject; Button: TMouseButton; Shift: TShiftState; const pos: TPoint); {$IF (FPC_FULLVERSION >= 20701) or DEFINED(Windows)} {$else} procedure CustomMsgReceived(var msg: TfpgMessageRec); message MSG_CUSTOM1; {$ENDIF} procedure ClosePlayer1; procedure LoopProcPlayer1; procedure ShowPosition; procedure ShowLevel; procedure changecheck(Sender: TObject); procedure VolumeChange(Sender: TObject; pos: integer); procedure ChangeStereo2Mono(Sender: TObject); procedure ChangePlugSetSoundTouch(Sender: TObject); procedure ChangePlugSetbs2b(Sender: TObject); procedure TrackChangePlugSetSoundTouch(Sender: TObject; pos: integer); procedure ResetPlugClick(Sender: TObject); end; {@VFD_NEWFORM_DECL} {@VFD_NEWFORM_IMPL} var PlayerIndex1: Tuos_Player; ordir, opath: string; OutputIndex1, InputIndex1, DSPIndex1, DSPIndex2, DSPVolume, PluginIndex1, PluginIndex2: integer; plugsoundtouch: Boolean = False; plugbs2b: Boolean = False; procedure TSimpleplayer.btnTrackOnClick(Sender: TObject; Button: TMouseButton; Shift: TShiftState; const pos: TPoint); begin TrackBar1.Tag := 1; end; procedure TSimpleplayer.ChangePlugSetBs2b(Sender: TObject); begin if radiobutton1.Enabled = False then /// player1 was created PlayerIndex1.SetPluginBs2b(PluginIndex1, -1, -1, -1, chkst2b.Checked); end; procedure TSimpleplayer.Changestereo2mono(Sender: TObject); begin if radiobutton1.Enabled = False then /// player1 was created PlayerIndex1.InputSetDSP(InputIndex1, DSPIndex2, chkstereo2mono.Checked); end; procedure TSimpleplayer.ChangePlugSetSoundTouch(Sender: TObject); var tempo, rate: cfloat; begin if (trim(PChar(filenameedit5.FileName)) <> '') and fileexists(filenameedit5.FileName) then begin if 2 - (2 * (TrackBar4.Position / 100)) < 0.3 then tempo := 0.3 else tempo := 2 - (2 * (TrackBar4.Position / 100)); if 2 - (2 * (TrackBar5.Position / 100)) < 0.3 then rate := 0.3 else rate := 2 - (2 * (TrackBar5.Position / 100)); label6.Text := 'Tempo: ' + floattostrf(tempo, ffFixed, 15, 1); label7.Text := 'Pitch: ' + floattostrf(rate, ffFixed, 15, 1); if radiobutton1.Enabled = False then /// player1 was created PlayerIndex1.SetPluginSoundTouch(PluginIndex2, tempo, rate, checkbox2.Checked); end; end; procedure TSimpleplayer.ResetPlugClick(Sender: TObject); begin TrackBar4.Position := 50; TrackBar5.Position := 50; if radiobutton1.Enabled = False then /// player1 was created PlayerIndex1.SetPluginSoundTouch(PluginIndex2, 1, 1, checkbox2.Checked); end; procedure TSimpleplayer.TrackChangePlugSetSoundTouch(Sender: TObject; pos: integer); begin if (trim(PChar(filenameedit5.FileName)) <> '') and fileexists(filenameedit5.FileName) then ChangePlugSetSoundTouch(Sender); end; procedure TSimpleplayer.btnTrackoffClick(Sender: TObject; Button: TMouseButton; Shift: TShiftState; const pos: TPoint); begin PlayerIndex1.Seek(InputIndex1, TrackBar1.position); TrackBar1.Tag := 0; end; procedure TSimpleplayer.btnResumeClick(Sender: TObject); begin PlayerIndex1.RePlay(); btnStart.Enabled := False; btnStop.Enabled := True; btnPause.Enabled := True; btnresume.Enabled := False; end; procedure TSimpleplayer.btnPauseClick(Sender: TObject); begin PlayerIndex1.Pause(); btnStart.Enabled := False; btnStop.Enabled := True; btnPause.Enabled := False; btnresume.Enabled := True; vuLeft.Visible := False; vuRight.Visible := False; vuright.Height := 0; vuleft.Height := 0; vuright.UpdateWindowPosition; vuLeft.UpdateWindowPosition; end; procedure TSimpleplayer.changecheck(Sender: TObject); begin if (btnstart.Enabled = False) then PlayerIndex1.InputSetDSP(InputIndex1, DSPIndex1, checkbox1.Checked); end; procedure TSimpleplayer.VolumeChange(Sender: TObject; pos: integer); begin if (btnstart.Enabled = False) then PlayerIndex1.InputSetDSPVolume(InputIndex1, DSPVolume, (100 - TrackBar2.position) / 100, (100 - TrackBar3.position) / 100, True); end; procedure TSimpleplayer.ShowLevel; begin vuLeft.Visible := True; vuRight.Visible := True; if round(PlayerIndex1.InputGetLevelLeft(InputIndex1) * 74) >= 0 then vuLeft.Height := round(PlayerIndex1.InputGetLevelLeft(InputIndex1) * 74); if round(PlayerIndex1.InputGetLevelRight(InputIndex1) * 74) >= 0 then vuRight.Height := round(PlayerIndex1.InputGetLevelRight(InputIndex1) * 74); vuLeft.top := 402 - vuLeft.Height; vuRight.top := 402 - vuRight.Height; vuright.UpdateWindowPosition; vuLeft.UpdateWindowPosition; end; procedure TSimpleplayer.btnCloseClick(Sender: TObject); begin if (btnstart.Enabled = False) then begin PlayerIndex1.stop(); vuLeft.Visible := False; vuRight.Visible := False; vuright.Height := 0; vuleft.Height := 0; vuright.UpdateWindowPosition; vuLeft.UpdateWindowPosition; sleep(100); end; if btnLoad.Enabled = False then begin uos_UnloadPlugin('soundtouch'); uos_UnloadPlugin('bs2b'); uos_UnloadLib(); end; end; procedure TSimpleplayer.btnLoadClick(Sender: TObject); var loadok: Boolean = False; begin {$if defined(CPUAMD64) and defined(linux) } // For Linux amd64, check libsndfile.so if (FilenameEdit2.FileName <> 'system') and (FilenameEdit2.FileName <> '') then if uos_TestLoadLibrary(PChar(FilenameEdit2.FileName)) = false then FilenameEdit2.FileName := FilenameEdit2.FileName + '.2'; {$endif} // Load the libraries // function uos_loadlib(PortAudioFileName, SndFileFileName, Mpg123FileName, Mp4ffFileName, FaadFileName, opusfilefilename, libxmpfilename: PChar) : LongInt; if uos_LoadLib(PChar(FilenameEdit1.FileName), PChar(FilenameEdit2.FileName), PChar(FilenameEdit3.FileName), PChar(FilenameEdit7.FileName), PChar(FilenameEdit8.FileName), nil, nil) = 0 then begin hide; loadok := True; Height := 514; btnStart.Enabled := True; btnLoad.Enabled := False; FilenameEdit1.ReadOnly := True; FilenameEdit2.ReadOnly := True; FilenameEdit3.ReadOnly := True; FilenameEdit5.ReadOnly := True; FilenameEdit6.ReadOnly := True; FilenameEdit7.ReadOnly := True; FilenameEdit8.ReadOnly := True; UpdateWindowPosition; btnLoad.Text := 'PortAudio, SndFile, Mpg123, AAC libraries are loaded...'; end else btnLoad.Text := 'One or more libraries did not load, check filenames...'; if loadok = True then begin if ((trim(PChar(filenameedit5.FileName)) <> '') and fileexists(filenameedit5.FileName)) then if (uos_LoadPlugin('soundtouch', PChar(FilenameEdit5.FileName)) = 0) then begin plugsoundtouch := True; btnLoad.Text := 'PortAudio, SndFile, Mpg123, AAC and Plugin are loaded...'; end else begin TrackBar4.Enabled := False; TrackBar5.Enabled := False; CheckBox2.Enabled := False; Button1.Enabled := False; label6.Enabled := False; label7.Enabled := False; end; if ((trim(PChar(filenameedit6.FileName)) <> '') and fileexists(filenameedit6.FileName)) then if (uos_LoadPlugin('bs2b', PChar(FilenameEdit6.FileName)) = 0) then plugbs2b := True else chkst2b.Enabled := False; WindowPosition := wpScreenCenter; WindowTitle := 'Simple Player. uos Version ' + IntToStr(uos_getversion()); fpgapplication.ProcessMessages; sleep(500); Show; end; end; procedure TSimpleplayer.ClosePlayer1; begin radiobutton1.Enabled := True; radiobutton2.Enabled := True; radiobutton3.Enabled := True; vuLeft.Visible := False; vuRight.Visible := False; vuright.Height := 0; vuleft.Height := 0; vuright.UpdateWindowPosition; vuLeft.UpdateWindowPosition; btnStart.Enabled := True; btnStop.Enabled := False; btnPause.Enabled := False; btnresume.Enabled := False; trackbar1.Position := 0; lposition.Text := '00:00:00.000'; end; procedure TSimpleplayer.btnStopClick(Sender: TObject); begin PlayerIndex1.Stop(); closeplayer1; end; ///// example how to do custom dsp function DSPReverseBefore(Data: Tuos_Data; fft: Tuos_FFT): TDArFloat; begin if Data.position > Data.OutFrames div Data.ratio then PlayerIndex1.Seek(InputIndex1, Data.position - 2 - (Data.OutFrames div Data.Ratio)); end; function DSPReverseAfter(Data: Tuos_Data; fft: Tuos_FFT): TDArFloat; var x: integer = 0; arfl: TDArFloat; begin SetLength(arfl, length(Data.Buffer)); while x < length(Data.Buffer) + 1 do begin arfl[x] := Data.Buffer[length(Data.Buffer) - x - 1]; arfl[x + 1] := Data.Buffer[length(Data.Buffer) - x]; x := x + 2; end; Result := arfl; end; /// WARNING: This is only to show a DSP effect, it is not the best reverb it exists ;-) function DSPReverb(Data: Tuos_Data; fft: Tuos_FFT): TDArFloat; var x: integer = 0; arfl: TDArFloat; begin SetLength(arfl, length(Data.Buffer)); while x < length(Data.Buffer) do begin if x > 10000 then begin arfl[x] := Data.Buffer[x] + (Data.Buffer[x - 10000] / 2); arfl[x + 1] := Data.Buffer[x + 1] + (Data.Buffer[x + 1 - 10000] / 2); end else begin arfl[x] := Data.Buffer[x]; arfl[x + 1] := Data.Buffer[x + 1]; end; x := x + 2; end; Result := arfl; end; function DSPStereo2Mono(Data: Tuos_Data; fft: Tuos_FFT): TDArFloat; var x: integer = 0; ps: PDArShort; //////// if input is Int16 format pl: PDArLong; //////// if input is Int32 format pf: PDArFloat; //////// if input is Float32 format samplef: cFloat; samplei: integer; begin if (Data.channels = 2) then begin case Data.SampleFormat of 2: begin ps := @Data.Buffer; while x < Data.OutFrames do begin samplei := round((ps^[x] + ps^[x + 1]) / 2); ps^[x] := samplei; ps^[x + 1] := samplei; x := x + 2; end; end; 1: begin pl := @Data.Buffer; while x < Data.OutFrames do begin samplei := round((pl^[x] + pl^[x + 1]) / 2); pl^[x] := samplei; pl^[x + 1] := samplei; x := x + 2; end; end; 0: begin pf := @Data.Buffer; while x < Data.OutFrames do begin samplef := (pf^[x] + pf^[x + 1]) / 2; pf^[x] := samplef; pf^[x + 1] := samplef; x := x + 2; end; end; end; Result := Data.Buffer; end else Result := Data.Buffer; end; procedure TSimpleplayer.btnStartClick(Sender: TObject); var samformat: shortint; temptime: ttime; ho, mi, se, ms: word; begin if radiobutton1.Checked = True then samformat := 0; if radiobutton2.Checked = True then samformat := 1; if radiobutton3.Checked = True then samformat := 2; radiobutton1.Enabled := False; radiobutton2.Enabled := False; radiobutton3.Enabled := False; {$IF (FPC_FULLVERSION >= 20701) or DEFINED(Windows)} PlayerIndex1 := Tuos_Player.Create(True); {$else} PlayerIndex1 := Tuos_Player.Create(true,self); {$endif} //// Create the player. //// PlayerIndex : from 0 to what your computer can do ! //// If PlayerIndex exists already, it will be overwriten... InputIndex1 := PlayerIndex1.AddFromFile(PChar(filenameEdit4.filename), -1, samformat, -1); //// add input from audio file with custom parameters ////////// FileName : filename of audio file //////////// PlayerIndex : Index of a existing Player ////////// OutputIndex : OutputIndex of existing Output // -1 : all output, -2: no output, other integer : existing output) ////////// SampleFormat : -1 default : Int16 : (0: Float32, 1:Int32, 2:Int16) SampleFormat of Input can be <= SampleFormat float of Output //////////// FramesCount : default : -1 (65536 div channels) // result : -1 nothing created, otherwise Input Index in array if InputIndex1 > -1 then begin // OutputIndex1 := uos_AddIntoDevOut(PlayerIndex1) ; //// add a Output into device with default parameters {$if defined(cpuarm) or defined(cpuaarch64)} // need a lower latency OutputIndex1 := PlayerIndex1.AddIntoDevOut(-1, 0.3, PlayerIndex1.StreamIn[InputIndex1].Data.SampleRate, -1, samformat, -1); {$else} OutputIndex1 := PlayerIndex1.AddIntoDevOut(-1, -1, PlayerIndex1.StreamIn[InputIndex1].Data.SampleRate, -1, samformat, -1); {$endif} //// add a Output into device with custom parameters //////////// PlayerIndex : Index of a existing Player //////////// Device ( -1 is default Output device ) //////////// Latency ( -1 is latency suggested ) ) //////////// SampleRate : delault : -1 (44100) /// here default samplerate of input //////////// Channels : delault : -1 (2:stereo) (0: no channels, 1:mono, 2:stereo, ...) //////////// SampleFormat : -1 default : Int16 : (0: Float32, 1:Int32, 2:Int16) //////////// FramesCount : default : -1 (65536) // result : -1 nothing created, otherwise Output Index in array // PlayerIndex1.StreamIn[In1Index].Data.levelEnable:=2 ; PlayerIndex1.InputSetLevelEnable(InputIndex1, 2); ///// set calculation of level/volume (usefull for showvolume procedure) ///////// set level calculation (default is 0) // 0 => no calcul // 1 => calcul before all DSP procedures. // 2 => calcul after all DSP procedures. // 3 => calcul before and after all DSP procedures. // PlayerIndex1.StreamIn[In1Index].Data.PositionEnable:= 1 ; PlayerIndex1.InputSetPositionEnable(InputIndex1, 1); ///// set calculation of position (usefull for positions procedure) ///////// set position calculation (default is 0) // 0 => no calcul // 1 => calcul position. PlayerIndex1.StreamIn[InputIndex1].LoopProc := @LoopProcPlayer1; ///// Assign the procedure of object to execute inside the loop //////////// PlayerIndex : Index of a existing Player //////////// InputIndex1 : Index of a existing Input //////////// LoopProcPlayer1 : procedure of object to execute inside the loop DSPVolume := PlayerIndex1.InputAddDSPVolume(InputIndex1, 1, 1); ///// DSP Volume changer ////////// PlayerIndex1 : Index of a existing Player ////////// InputIndex1 : Index of a existing input ////////// VolLeft : Left volume ////////// VolRight : Right volume // { PlayerIndex1.InputSetDSPVolume(InputIndex1, DSPVolume, (100 - TrackBar2.position) / 100, (100 - TrackBar3.position) / 100, True); // } /// Set volume ////////// PlayerIndex1 : Index of a existing Player ////////// DSPVolume : Index of a existing dsp ////////// InputIndex1 : InputIndex of a existing Input ////////// VolLeft : Left volume ////////// VolRight : Right volume ////////// Enable : Enabled DSPIndex1 := PlayerIndex1.InputAddDSP(InputIndex1, @DSPReverseBefore, @DSPReverseAfter, nil, nil); ///// add a custom DSP procedure for input ////////// PlayerIndex1 : Index of a existing Player ////////// InputIndex1: InputIndex of existing input ////////// BeforeFunc : function to do before the buffer is filled ////////// AfterFunc : function to do after the buffer is filled ////////// EndedFunc : function to do at end of thread ////////// LoopProc : external procedure to do after the buffer is filled //// set the parameters of custom DSP PlayerIndex1.InputSetDSP(InputIndex1, DSPIndex1, checkbox1.Checked); // This is a other custom DSP...stereo to mono to show how to do a DSP ;-) DSPIndex2 := PlayerIndex1.InputAddDSP(InputIndex1, nil, @DSPStereo2Mono, nil, nil); PlayerIndex1.InputSetDSP(InputIndex1, DSPIndex2, chkstereo2mono.Checked); ///// add bs2b plugin with samplerate_of_input1 / default channels (2 = stereo) if plugbs2b = True then begin PlugInIndex1 := PlayerIndex1.AddPlugin('bs2b', PlayerIndex1.StreamIn[InputIndex1].Data.SampleRate, -1); PlayerIndex1.SetPluginbs2b(PluginIndex1, -1, -1, -1, chkst2b.Checked); end; /// add SoundTouch plugin with samplerate of input1 / default channels (2 = stereo) /// SoundTouch plugin should be the last added. if plugsoundtouch = True then begin PlugInIndex2 := PlayerIndex1.AddPlugin('soundtouch', PlayerIndex1.StreamIn[InputIndex1].Data.SampleRate, -1); ChangePlugSetSoundTouch(self); //// custom procedure to Change plugin settings end; trackbar1.Max := PlayerIndex1.InputLength(InputIndex1); ////// Length of Input in samples temptime := PlayerIndex1.InputLengthTime(InputIndex1); ////// Length of input in time DecodeTime(temptime, ho, mi, se, ms); llength.Text := format('%d:%d:%d.%d', [ho, mi, se, ms]); /////// procedure to execute when stream is terminated PlayerIndex1.EndProc := @ClosePlayer1; ///// Assign the procedure of object to execute at end //////////// PlayerIndex : Index of a existing Player //////////// ClosePlayer1 : procedure of object to execute inside the general loop TrackBar1.position := 0; trackbar1.Enabled := True; CheckBox1.Enabled := True; btnStart.Enabled := False; btnStop.Enabled := True; btnpause.Enabled := True; btnresume.Enabled := False; PlayerIndex1.Play(); end; end; procedure TSimpleplayer.ShowPosition; var temptime: ttime; ho, mi, se, ms: word; begin if (TrackBar1.Tag = 0) then if PlayerIndex1.InputPosition(InputIndex1) > 0 then begin TrackBar1.Position := PlayerIndex1.InputPosition(InputIndex1); temptime := PlayerIndex1.InputPositionTime(InputIndex1); ////// Length of input in time DecodeTime(temptime, ho, mi, se, ms); lposition.Text := format('%.2d:%.2d:%.2d.%.3d', [ho, mi, se, ms]); end; end; {$IF (FPC_FULLVERSION >= 20701) or DEFINED(Windows)} {$else} procedure TSimpleplayer.CustomMsgReceived(var msg: TfpgMessageRec); begin ShowLevel; ShowPosition ; end; {$ENDIF} procedure TSimpleplayer.LoopProcPlayer1; begin ShowPosition; ShowLevel; end; procedure TSimpleplayer.AfterCreate; begin {%region 'Auto-generated GUI code' -fold} {@VFD_BODY_BEGIN: Simpleplayer} Name := 'Simpleplayer'; SetPosition(600, 57, 503, 515); WindowTitle := 'Simple player '; IconName := ''; BackGroundColor := $80000001; Hint := ''; WindowPosition := wpScreenCenter; Ondestroy := @btnCloseClick; Custom1 := TfpgWidget.Create(self); with Custom1 do begin Name := 'Custom1'; SetPosition(10, 16, 115, 259); OnPaint := @uos_logo; end; Labelport := TfpgLabel.Create(self); with Labelport do begin Name := 'Labelport'; SetPosition(136, 0, 320, 15); Alignment := taCenter; FontDesc := '#Label1'; ParentShowHint := False; Text := 'Folder + filename of PortAudio Library'; Hint := ''; end; btnLoad := TfpgButton.Create(self); with btnLoad do begin Name := 'btnLoad'; SetPosition(8, 282, 488, 24); Text := 'Load that libraries'; FontDesc := '#Label1'; ImageName := ''; ParentShowHint := False; TabOrder := 0; Hint := ''; onclick := @btnLoadClick; end; FilenameEdit1 := TfpgFileNameEdit.Create(self); with FilenameEdit1 do begin Name := 'FilenameEdit1'; SetPosition(136, 16, 356, 24); ExtraHint := ''; FileName := ''; Filter := ''; InitialDir := ''; TabOrder := 3; end; FilenameEdit2 := TfpgFileNameEdit.Create(self); with FilenameEdit2 do begin Name := 'FilenameEdit2'; SetPosition(136, 56, 356, 24); ExtraHint := ''; FileName := ''; Filter := ''; InitialDir := ''; TabOrder := 4; end; FilenameEdit4 := TfpgFileNameEdit.Create(self); with FilenameEdit4 do begin Name := 'FilenameEdit4'; SetPosition(132, 312, 360, 24); ExtraHint := ''; FileName := ''; Filter := ''; InitialDir := ''; TabOrder := 5; end; btnStart := TfpgButton.Create(self); with btnStart do begin Name := 'btnStart'; SetPosition(140, 480, 66, 23); Text := 'Play'; Enabled := False; FontDesc := '#Label1'; ImageName := ''; ParentShowHint := False; TabOrder := 6; Hint := ''; onclick := @btnstartClick; end; btnStop := TfpgButton.Create(self); with btnStop do begin Name := 'btnStop'; SetPosition(368, 480, 66, 23); Text := 'Stop'; Enabled := False; FontDesc := '#Label1'; ImageName := ''; ParentShowHint := False; TabOrder := 7; Hint := ''; onclick := @btnStopClick; end; lposition := TfpgLabel.Create(self); with lposition do begin Name := 'lposition'; SetPosition(228, 373, 84, 19); Alignment := taCenter; FontDesc := '#Label2'; ParentShowHint := False; Text := '00:00:00.000'; Hint := ''; end; Labelsnf := TfpgLabel.Create(self); with Labelsnf do begin Name := 'Labelsnf'; SetPosition(140, 40, 316, 15); Alignment := taCenter; FontDesc := '#Label1'; ParentShowHint := False; Text := 'Folder + filename of SndFile Library'; Hint := ''; end; Labelmpg := TfpgLabel.Create(self); with Labelmpg do begin Name := 'Labelmpg'; SetPosition(136, 80, 316, 15); Alignment := taCenter; FontDesc := '#Label1'; ParentShowHint := False; Text := 'Folder + filename of Mpg123 Library'; Hint := ''; end; Labelst := TfpgLabel.Create(self); with Labelst do begin Name := 'Labelst'; SetPosition(140, 200, 316, 15); Alignment := taCenter; FontDesc := '#Label1'; ParentShowHint := False; Text := 'Folder + filename of SoundTouch plugin Library'; Hint := ''; end; FilenameEdit3 := TfpgFileNameEdit.Create(self); with FilenameEdit3 do begin Name := 'FilenameEdit3'; SetPosition(136, 96, 356, 24); ExtraHint := ''; FileName := ''; Filter := ''; InitialDir := ''; TabOrder := 12; end; FilenameEdit5 := TfpgFileNameEdit.Create(self); with FilenameEdit5 do begin Name := 'FilenameEdit5'; SetPosition(138, 216, 356, 24); ExtraHint := ''; FileName := ''; Filter := ''; InitialDir := ''; TabOrder := 12; end; Label1 := TfpgLabel.Create(self); with Label1 do begin Name := 'Label1'; SetPosition(312, 373, 12, 15); FontDesc := '#Label1'; ParentShowHint := False; Text := '/'; Hint := ''; end; Llength := TfpgLabel.Create(self); with Llength do begin Name := 'Llength'; SetPosition(320, 373, 80, 15); FontDesc := '#Label2'; ParentShowHint := False; Text := '00:00:00.000'; Hint := ''; end; btnpause := TfpgButton.Create(self); with btnpause do begin Name := 'btnpause'; SetPosition(216, 480, 66, 23); Text := 'Pause'; Enabled := False; FontDesc := '#Label1'; ImageName := ''; ParentShowHint := False; TabOrder := 15; Hint := ''; onclick := @btnPauseClick; end; btnresume := TfpgButton.Create(self); with btnresume do begin Name := 'btnresume'; SetPosition(292, 480, 66, 23); Text := 'Resume'; Enabled := False; FontDesc := '#Label1'; ImageName := ''; ParentShowHint := False; TabOrder := 16; Hint := ''; onclick := @btnResumeClick; end; CheckBox1 := TfpgCheckBox.Create(self); with CheckBox1 do begin Name := 'CheckBox1'; SetPosition(132, 452, 104, 19); FontDesc := '#Label1'; ParentShowHint := False; TabOrder := 17; Text := 'Play Reverse'; Hint := ''; end; RadioButton1 := TfpgRadioButton.Create(self); with RadioButton1 do begin Name := 'RadioButton1'; SetPosition(12, 444, 96, 19); Checked := True; FontDesc := '#Label1'; GroupIndex := 0; ParentShowHint := False; TabOrder := 18; Text := 'Float 32 bit'; Hint := ''; end; RadioButton2 := TfpgRadioButton.Create(self); with RadioButton2 do begin Name := 'RadioButton2'; SetPosition(12, 460, 100, 19); FontDesc := '#Label1'; GroupIndex := 0; ParentShowHint := False; TabOrder := 19; Text := 'Int 32 bit'; Hint := ''; end; RadioButton3 := TfpgRadioButton.Create(self); with RadioButton3 do begin Name := 'RadioButton3'; SetPosition(12, 478, 100, 19); FontDesc := '#Label1'; GroupIndex := 0; ParentShowHint := False; TabOrder := 20; Text := 'Int 16 bit'; Hint := ''; end; Label2 := TfpgLabel.Create(self); with Label2 do begin Name := 'Label2'; SetPosition(12, 428, 104, 15); FontDesc := '#Label2'; ParentShowHint := False; Text := 'Sample format'; Hint := ''; end; TrackBar1 := TfpgTrackBar.Create(self); with TrackBar1 do begin Name := 'TrackBar1'; SetPosition(136, 340, 356, 30); ParentShowHint := False; TabOrder := 22; Hint := ''; TrackBar1.OnMouseDown := @btntrackonClick; TrackBar1.OnMouseUp := @btntrackoffClick; end; TrackBar2 := TfpgTrackBar.Create(self); with TrackBar2 do begin Name := 'TrackBar2'; SetPosition(8, 324, 32, 78); Orientation := orVertical; ParentShowHint := False; TabOrder := 23; Hint := ''; OnChange := @volumechange; end; TrackBar3 := TfpgTrackBar.Create(self); with TrackBar3 do begin Name := 'TrackBar3'; SetPosition(76, 324, 28, 78); Orientation := orVertical; ParentShowHint := False; TabOrder := 24; Hint := ''; OnChange := @volumechange; end; Label3 := TfpgLabel.Create(self); with Label3 do begin Name := 'Label3'; SetPosition(16, 308, 84, 15); Alignment := taCenter; FontDesc := '#Label2'; ParentShowHint := False; Text := 'Volume'; Hint := ''; end; Label4 := TfpgLabel.Create(self); with Label4 do begin Name := 'Label4'; SetPosition(8, 404, 40, 15); Alignment := taCenter; FontDesc := '#Label1'; ParentShowHint := False; Text := 'Left'; Hint := ''; end; Label5 := TfpgLabel.Create(self); with Label5 do begin Name := 'Label5'; SetPosition(72, 404, 36, 19); Alignment := taCenter; FontDesc := '#Label1'; ParentShowHint := False; Text := 'Right'; Hint := ''; end; vuleft := TfpgPanel.Create(self); with vuleft do begin Name := 'vuleft'; SetPosition(44, 328, 8, 74); BackgroundColor := TfpgColor($00D51D); FontDesc := '#Label1'; ParentShowHint := False; Style := bsFlat; Text := ''; Hint := ''; end; vuright := TfpgPanel.Create(self); with vuright do begin Name := 'vuright'; SetPosition(64, 328, 8, 74); BackgroundColor := TfpgColor($1DD523); FontDesc := '#Label1'; ParentShowHint := False; Style := bsFlat; Text := ''; Hint := ''; end; CheckBox2 := TfpgCheckBox.Create(self); with CheckBox2 do begin Name := 'CheckBox2'; SetPosition(280, 396, 184, 19); FontDesc := '#Label1'; ParentShowHint := False; TabOrder := 32; Text := 'Enable SoundTouch PlugIn'; Hint := 'Change Tempo with same tuning or change Tuning with same tempo'; OnChange := @ChangePlugSetSoundTouch; end; Label6 := TfpgLabel.Create(self); with Label6 do begin Name := 'Label6'; SetPosition(272, 416, 80, 19); FontDesc := '#Label1'; ParentShowHint := False; Text := 'Tempo: 1.0'; Hint := ''; end; Label7 := TfpgLabel.Create(self); with Label7 do begin Name := 'Label7'; SetPosition(384, 416, 68, 15); FontDesc := '#Label1'; ParentShowHint := False; Text := 'Pitch: 1.0'; Hint := ''; end; TrackBar4 := TfpgTrackBar.Create(self); with TrackBar4 do begin Name := 'TrackBar4'; SetPosition(348, 416, 28, 54); Orientation := orVertical; ParentShowHint := False; Position := 50; TabOrder := 35; Hint := ''; OnChange := @TrackChangePlugSetSoundTouch; end; TrackBar5 := TfpgTrackBar.Create(self); with TrackBar5 do begin Name := 'TrackBar5'; SetPosition(444, 416, 28, 54); Orientation := orVertical; ParentShowHint := False; Position := 50; TabOrder := 36; Hint := ''; OnChange := @TrackChangePlugSetSoundTouch; end; Button1 := TfpgButton.Create(self); with Button1 do begin Name := 'Button1'; SetPosition(276, 444, 60, 23); Text := 'Reset'; FontDesc := '#Label1'; ImageName := ''; ParentShowHint := False; TabOrder := 37; Hint := ''; OnClick := @ResetPlugClick; end; chkst2b := TfpgCheckBox.Create(self); with chkst2b do begin Name := 'chkst2b'; SetPosition(132, 424, 136, 19); FontDesc := '#Label1'; ParentShowHint := False; TabOrder := 38; Text := 'Stereo to BinAural'; Hint := 'Stereo to BinAural (for headphones)'; OnChange := @ChangePlugSetBs2b; end; Labelst1 := TfpgLabel.Create(self); with Labelst1 do begin Name := 'Labelst1'; SetPosition(146, 240, 316, 15); Alignment := taCenter; FontDesc := '#Label1'; ParentShowHint := False; Text := 'Folder + filename of bs2b plugin Library'; end; FilenameEdit6 := TfpgFileNameEdit.Create(self); with FilenameEdit6 do begin Name := 'FilenameEdit6'; SetPosition(138, 256, 356, 24); ExtraHint := ''; FileName := ''; Filter := ''; InitialDir := ''; TabOrder := 40; end; chkstereo2mono := TfpgCheckBox.Create(self); with chkstereo2mono do begin Name := 'chkstereo2mono'; SetPosition(132, 392, 120, 19); FontDesc := '#Label1'; ParentShowHint := False; TabOrder := 42; Text := 'Stereo to Mono'; Hint := 'Convert Stereo to Mono'; OnChange := @Changestereo2mono; end; Labelst11 := TfpgLabel.Create(self); with Labelst11 do begin Name := 'Labelst11'; SetPosition(140, 120, 316, 15); Alignment := taCenter; FontDesc := '#Label1'; ParentShowHint := False; Text := 'Folder + filename of mp4ff Library'; end; FilenameEdit7 := TfpgFileNameEdit.Create(self); with FilenameEdit7 do begin Name := 'FilenameEdit7'; SetPosition(138, 136, 356, 24); ExtraHint := ''; FileName := ''; Filter := ''; InitialDir := ''; TabOrder := 44; end; Labelst111 := TfpgLabel.Create(self); with Labelst111 do begin Name := 'Labelst111'; SetPosition(138, 160, 316, 15); Alignment := taCenter; FontDesc := '#Label1'; ParentShowHint := False; Text := 'Folder + filename of Faad Library'; end; FilenameEdit8 := TfpgFileNameEdit.Create(self); with FilenameEdit8 do begin Name := 'FilenameEdit8'; SetPosition(138, 176, 356, 24); ExtraHint := ''; FileName := ''; Filter := ''; InitialDir := ''; TabOrder := 46; end; {@VFD_BODY_END: Simpleplayer} {%endregion} ////////////////////// ordir := IncludeTrailingBackslash(ExtractFilePath(ParamStr(0))); checkbox1.OnChange := @changecheck; RadioButton1.Checked := True; Height := 312; {$IFDEF Windows} {$if defined(cpu64)} FilenameEdit1.FileName := ordir + 'lib\Windows\64bit\LibPortaudio-64.dll'; FilenameEdit2.FileName := ordir + 'lib\Windows\64bit\LibSndFile-64.dll'; FilenameEdit3.FileName := ordir + 'lib\Windows\64bit\LibMpg123-64.dll'; FilenameEdit5.FileName := ordir + 'lib\Windows\64bit\plugin\LibSoundTouch-64.dll'; {$else} FilenameEdit1.FileName := ordir + 'lib\Windows\32bit\LibPortaudio-32.dll'; FilenameEdit2.FileName := ordir + 'lib\Windows\32bit\LibSndFile-32.dll'; FilenameEdit3.FileName := ordir + 'lib\Windows\32bit\LibMpg123-32.dll'; FilenameEdit7.FileName := ordir + 'lib\Windows\32bit\LibMp4ff-32.dll'; FilenameEdit8.FileName := ordir + 'lib\Windows\32bit\LibFaad2-32.dll'; FilenameEdit5.FileName := ordir + 'lib\Windows\32bit\plugin\libSoundTouch-32.dll'; FilenameEdit6.FileName := ordir + 'lib\Windows\32bit\plugin\LibBs2b-32.dll'; {$endif} FilenameEdit4.FileName := ordir + 'sound\test.mp3'; {$ENDIF} {$IFDEF Darwin} opath := ordir; opath := copy(opath, 1, Pos('/uos', opath) - 1); FilenameEdit1.FileName := opath + '/lib/Mac/32bit/LibPortaudio-32.dylib'; FilenameEdit2.FileName := opath + '/lib/Mac/32bit/LibSndFile-32.dylib'; FilenameEdit3.FileName := opath + '/lib/Mac/32bit/LibMpg123-32.dylib'; FilenameEdit5.FileName := opath + '/lib/Mac/32bit/plugin/libSoundTouch-32.dylib'; FilenameEdit4.FileName := opath + 'sound/test.mp3'; {$ENDIF} {$if defined(CPUAMD64) and defined(linux) } FilenameEdit1.FileName := ordir + 'lib/Linux/64bit/LibPortaudio-64.so'; FilenameEdit2.FileName := ordir + 'lib/Linux/64bit/LibSndFile-64.so'; FilenameEdit3.FileName := ordir + 'lib/Linux/64bit/LibMpg123-64.so'; FilenameEdit7.FileName := ordir + 'lib/Linux/64bit/LibMp4ff-64.so'; FilenameEdit8.FileName := ordir + 'lib/Linux/64bit/LibFaad2-64.so'; FilenameEdit5.FileName := ordir + 'lib/Linux/64bit/plugin/LibSoundTouch-64.so'; FilenameEdit6.FileName := ordir + 'lib/Linux/64bit/plugin/libbs2b-64.so'; FilenameEdit4.FileName := ordir + 'sound/test.ogg'; {$ENDIF} {$if defined(cpu86) and defined(linux)} FilenameEdit1.FileName := ordir + 'lib/Linux/32bit/LibPortaudio-32.so'; FilenameEdit2.FileName := ordir + 'lib/Linux/32bit/LibSndFile-32.so'; FilenameEdit3.FileName := ordir + 'lib/Linux/32bit/LibMpg123-32.so'; FilenameEdit7.FileName := ordir + 'lib/Linux/32bit/LibMp4ff-32.so'; FilenameEdit8.FileName := ordir + 'lib/Linux/32bit/LibFaad2-32.so'; FilenameEdit5.FileName := ordir + 'lib/Linux/32bit/plugin/LibSoundTouch-32.so'; FilenameEdit6.FileName := ordir + 'lib/Linux/32bit/plugin/libbs2b-32.so'; FilenameEdit4.FileName := ordir + 'sound/test.ogg'; {$ENDIF} {$if defined(linux) and defined(cpuarm)} FilenameEdit1.FileName := ordir + 'lib/Linux/arm_raspberrypi/libportaudio-arm.so'; FilenameEdit2.FileName := ordir + 'lib/Linux/arm_raspberrypi/libsndfile-arm.so'; FilenameEdit3.FileName := ordir + 'lib/Linux/arm_raspberrypi/libmpg123-arm.so'; FilenameEdit5.FileName := ordir + 'lib/Linux/arm_raspberrypi/libsoundtouch-arm.so'; FilenameEdit4.FileName := ordir + 'sound/test.ogg'; {$ENDIF} {$if defined(linux) and defined(cpuaarch64)} FilenameEdit1.FileName := ordir + 'lib/Linux/aarch64_raspberrypi/libportaudio_aarch64.so'; FilenameEdit2.FileName := ordir + 'lib/Linux/aarch64_raspberrypi/libsndfile_aarch64.so'; FilenameEdit3.FileName := ordir + 'lib/Linux/aarch64_raspberrypi/libmpg123_aarch64.so'; FilenameEdit5.FileName := ordir + 'lib/Linux/aarch64_raspberrypi/plugin/libsoundtouch_aarch64.so'; FilenameEdit4.FileName := ordir + 'sound/test.ogg'; {$ENDIF} {$IFDEF freebsd} {$if defined(cpu64)} FilenameEdit1.FileName := ordir + 'lib/FreeBSD/64bit/libportaudio-64.so'; FilenameEdit2.FileName := ordir + 'lib/FreeBSD/64bit/libsndfile-64.so'; FilenameEdit3.FileName := ordir + 'lib/FreeBSD/64bit/libmpg123-64.so'; FilenameEdit5.FileName := ordir + 'lib/FreeBSD/64bit/plugin/libsoundtouch-64.so'; FilenameEdit6.FileName := ordir + 'lib/FreeBSD/64bit/plugin/libbs2b-64.so'; {$else} FilenameEdit1.FileName := ordir + 'lib/FreeBSD/32bit/libportaudio-32.so'; FilenameEdit2.FileName := ordir + 'lib/FreeBSD/32bit/libsndfile-32.so'; FilenameEdit3.FileName := ordir + 'lib/FreeBSD/32bit/libmpg123-32.so'; FilenameEdit5.FileName := ''; {$endif} FilenameEdit4.FileName := ordir + 'sound/test.mp3'; {$ENDIF} FilenameEdit4.Initialdir := ordir + 'sound'; FilenameEdit1.Initialdir := ordir + 'lib'; FilenameEdit2.Initialdir := ordir + 'lib'; FilenameEdit3.Initialdir := ordir + 'lib'; FilenameEdit5.Initialdir := ordir + 'lib'; vuLeft.Visible := False; vuRight.Visible := False; vuLeft.Height := 0; vuRight.Height := 0; vuright.UpdateWindowPosition; vuLeft.UpdateWindowPosition; end; procedure TSimpleplayer.uos_logo(Sender: TObject); begin with Custom1 do begin Canvas.GradientFill(GetClientRect, clgreen, clBlack, gdVertical); Canvas.TextColor := clWhite; Canvas.DrawText(60, 20, 'uos'); end; end; procedure MainProc; var frm: TSimpleplayer; begin fpgApplication.Initialize; fpgApplication.CreateForm(TSimpleplayer, frm); try frm.Show; fpgApplication.Run; finally PlayerIndex1.Free; uos_free; frm.Free; end; end; begin MainProc; end.