Implements Module Player working in Form

* Implements Embedding .xm music in Final Application
This commit is contained in:
2025-06-02 15:15:16 +05:30
parent c09c434653
commit 6a1d80d3b8
342 changed files with 137595 additions and 146 deletions

View File

@@ -0,0 +1,312 @@
unit main_spectrum_mse;
{$ifdef FPC}{$mode objfpc}{$h+}{$endif}
interface
uses
msetypes,
mseglob,
mseguiglob,
mseguiintf,
mseapplication,
msestat,
msemenus,
msegui,
msegraphics,
msegraphutils,
mseevent,
mseclasses,
msewidgets,
mseforms,
ctypes,
msegraphedits,
mseificomp,
mseificompglob,
mseifiglob,
msescrollbar,
mseact,
msebitmap,
msedataedits,
msedatanodes,
msedropdownlist,
mseedit,
msefiledialog,
msegrids,
mselistbrowser,
msestatfile,
msestream,
msesys,
SysUtils,
msesimplewidgets;
type
tmainfo = class(tmainform)
tprogressbar1: tprogressbar;
tprogressbar2: tprogressbar;
tprogressbar3: tprogressbar;
tprogressbar4: tprogressbar;
tprogressbar5: tprogressbar;
tprogressbar6: tprogressbar;
tprogressbar7: tprogressbar;
tprogressbar8: tprogressbar;
tprogressbar9: tprogressbar;
tprogressbar10: tprogressbar;
tfilenameedit1: tfilenameedit;
button1: TButton;
tbutton2: TButton;
label1: tlabel;
procedure formcreated(const Sender: TObject);
procedure closeplayer;
procedure FormDestroy(Sender: TObject);
procedure LoopProcPlayer;
procedure button1click(const Sender: TObject);
procedure butstopclick(const Sender: TObject);
end;
equalizer_band_type = record
lo_freq, hi_freq: integer;
Text: string[10];
end;
var
mainfo: tmainfo;
Equalizer_Bands: array[1..10] of equalizer_band_type;
UOSLoaded: Boolean = False;
res, x, y, z: integer;
thearray: array of cfloat;
ordir, SoundFilename, PA_FileName, SF_FileName, MP_FileName: string;
PlayerIndex1, InputIndex1, OutputIndex1: integer;
implementation
uses
main_spectrum_mse_mfm,
uos_flat;
procedure tmainfo.formcreated(const Sender: TObject);
var
i: integer = 1;
begin
ordir := IncludeTrailingBackslash(ExtractFilePath(ParamStr(0)));
{$IFDEF Windows}
{$if defined(cpu64)}
PA_FileName := ordir + 'lib\Windows\64bit\LibPortaudio-64.dll';
SF_FileName := ordir + 'lib\Windows\64bit\LibSndFile-64.dll';
MP_FileName := ordir + 'lib\Windows\64bit\LibMpg123-64.dll';
{$else}
PA_FileName := ordir + 'lib\Windows\32bit\LibPortaudio-32.dll';
SF_FileName := ordir + 'lib\Windows\32bit\LibSndFile-32.dll';
MP_FileName := ordir + 'lib\Windows\32bit\LibMpg123-32.dll';
{$endif}
SoundFilename := ordir + 'sound\test.mp3';
{$ENDIF}
{$if defined(CPUAMD64) and defined(linux) }
SF_FileName := ordir + 'lib/Linux/64bit/LibSndFile-64.so';
PA_FileName := ordir + 'lib/Linux/64bit/LibPortaudio-64.so';
MP_FileName := ordir + 'lib/Linux/64bit/LibMpg123-64.so';
SoundFilename := ordir + 'sound/test.mp3';
{$ENDIF}
{$if defined(CPUAMD64) and defined(openbsd) }
SF_FileName := ordir + 'lib/OpenBSD/64bit/LibSndFile-64.so';
PA_FileName := ordir + 'lib/OpenBSD/64bit/LibPortaudio-64.so';
MP_FileName := ordir + 'lib/OpenBSD/64bit/LibMpg123-64.so';
SoundFilename := ordir + 'sound/test.mp3';
{$ENDIF}
{$if defined(cpu86) and defined(linux)}
PA_FileName := ordir + 'lib/Linux/32bit/LibPortaudio-32.so';
SF_FileName := ordir + 'lib/Linux/32bit/LibSndFile-32.so';
MP_FileName := ordir + 'lib/Linux/32bit/LibMpg123-32.so';
SoundFilename := ordir + 'sound/test.mp3';
{$ENDIF}
{$if defined(linux) and defined(cpuarm)}
PA_FileName := ordir + 'lib/Linux/arm_raspberrypi/libportaudio-arm.so';
SF_FileName := ordir + 'lib/Linux/arm_raspberrypi/libsndfile-arm.so';
MP_FileName := ordir + 'lib/Linux/arm_raspberrypi/libmpg123-arm.so';
SoundFilename := ordir + 'sound/test.mp3';
{$ENDIF}
{$if defined(linux) and defined(cpuaarch64)}
PA_FileName := ordir + 'lib/Linux/aarch64_raspberrypi/libportaudio_aarch64.so';
SF_FileName := ordir + 'lib/Linux/aarch64_raspberrypi/libsndfile_aarch64.so';
MP_FileName := ordir + 'lib/Linux/aarch64_raspberrypi/libmpg123_aarch64.so';
SoundFilename := ordir + 'sound/test.mp3';
{$ENDIF}
{$IFDEF freebsd}
{$if defined(cpu64)}
PA_FileName := ordir + 'lib/FreeBSD/64bit/libportaudio-64.so';
SF_FileName := ordir + 'lib/FreeBSD/64bit/libsndfile-64.so';
MP_FileName := ordir + 'lib/FreeBSD/64bit/libmpg123-64.so';
{$else}
PA_FileName := ordir + 'lib/FreeBSD/32bit/libportaudio-32.so';
SF_FileName := ordir + 'lib/FreeBSD/32bit/libsndfile-32.so';
MP_FileName := ordir + 'lib/FreeBSD/32bit/libmpg123-32.so';
{$endif}
SoundFilename := ordir + 'sound/test.mp3';
{$ENDIF}
{$IFDEF Darwin}
{$IFDEF CPU32}
opath := ordir;
opath := copy(opath, 1, Pos('/uos', opath) - 1);
PA_FileName := opath + '/lib/Mac/32bit/LibPortaudio-32.dylib';
SF_FileName := opath + '/lib/Mac/32bit/LibSndFile-32.dylib';
MP_FileName := opath + '/lib/Mac/32bit/LibMpg123-32.dylib';
SoundFilename := ordir + '/sound/test.ogg';
{$ENDIF}
{$IFDEF CPU64}
opath := ordir;
opath := copy(opath, 1, Pos('/uos', opath) - 1);
PA_FileName := opath + '/lib/Mac/64bit/LibPortaudio-64.dylib';
SF_FileName := opath + '/lib/Mac/64bit/LibSndFile-64.dylib';
MP_FileName := opath + '/lib/Mac/64bit/LibMpg123-64.dylib';
SoundFilename := ordir + '/sound/test.ogg';
{$ENDIF}
{$ENDIF}
{$if defined(CPUAMD64) and defined(linux) }
// For Linux amd64, check libsndfile.so
if (SF_FileName <> 'system') and (SF_FileName <> '') then
if uos_TestLoadLibrary(PChar(SF_FileName)) = false then
SF_FileName := SF_FileName + '.2';
{$endif}
tfilenameedit1.Value := SoundFilename;
res := uos_LoadLib(PChar(PA_FileName), PChar(SF_FileName), PChar(MP_FileName), nil, nil, nil,nil);
if Res <> 0 then
begin
label1.Caption := 'UOS libraries in Error';
Button1.Enabled := False;
end
else
Button1.Enabled := True;
Equalizer_Bands[1].lo_freq := 18;
Equalizer_Bands[1].hi_freq := 46;
Equalizer_Bands[1].Text := '31.25';
Equalizer_Bands[2].lo_freq := 47;
Equalizer_Bands[2].hi_freq := 94;
Equalizer_Bands[2].Text := '62.5';
Equalizer_Bands[3].lo_freq := 95;
Equalizer_Bands[3].hi_freq := 188;
Equalizer_Bands[3].Text := '125';
Equalizer_Bands[4].lo_freq := 189;
Equalizer_Bands[4].hi_freq := 375;
Equalizer_Bands[4].Text := '250';
Equalizer_Bands[5].lo_freq := 376;
Equalizer_Bands[5].hi_freq := 750;
Equalizer_Bands[5].Text := '500';
Equalizer_Bands[6].lo_freq := 751;
Equalizer_Bands[6].hi_freq := 1500;
Equalizer_Bands[6].Text := '1K';
Equalizer_Bands[7].lo_freq := 1501;
Equalizer_Bands[7].hi_freq := 3000;
Equalizer_Bands[7].Text := '2K';
Equalizer_Bands[8].lo_freq := 3001;
Equalizer_Bands[8].hi_freq := 6000;
Equalizer_Bands[8].Text := '4K';
Equalizer_Bands[9].lo_freq := 6001;
Equalizer_Bands[9].hi_freq := 12000;
Equalizer_Bands[9].Text := '8K';
Equalizer_Bands[10].lo_freq := 12001;
Equalizer_Bands[10].hi_freq := 20000;
Equalizer_Bands[10].Text := '16K';
while i < 11 do
begin
TProgressBar(findcomponent('tprogressbar' + IntToStr(i))).frame.Caption :=
Equalizer_Bands[i].Text;
Inc(i);
end;
end;
procedure tmainfo.button1click(const Sender: TObject);
var
i: integer;
begin
PlayerIndex1 := 0;
SoundFilename := tfilenameedit1.Value;
if uos_CreatePlayer(PlayerIndex1) then
begin
InputIndex1 := uos_AddFromFile(PlayerIndex1, (PChar(SoundFilename)), -1, -1, 4096);
if InputIndex1 > -1 then
begin
OutputIndex1 := uos_AddIntoDevOut(PlayerIndex1, -1, 0.3, -1, -1, -1, 4096, -1);
if OutputIndex1 > -1 then
begin
// Spectrum : create bandpass filters with alsobuf set to false, how many you want:
for i := 1 to 10 do
uos_InputAddFilter(PlayerIndex1, InputIndex1,
3, Equalizer_Bands[i].lo_freq, Equalizer_Bands[i].hi_freq, 1,
3, Equalizer_Bands[i].lo_freq, Equalizer_Bands[i].hi_freq, 1, False, nil);
uos_EndProc(PlayerIndex1, @ClosePlayer);
uos_LoopProcIn(PlayerIndex1, InputIndex1, @LoopProcPlayer);
/////// everything is ready, here we are, lets play it...
uos_Play(PlayerIndex1);
Button1.Enabled := False;
end;
end;
end;
end;
procedure tmainfo.ClosePlayer;
begin
button1.Enabled := True;
end;
procedure tmainfo.FormDestroy(Sender: TObject);
begin
uos_stop(PlayerIndex1);
uos_free();
end;
procedure tmainfo.LoopProcPlayer;
var
i: integer;
v: cfloat;
begin
if uos_getstatus(PlayerIndex1) > 0 then
begin
i := 1;
thearray := uos_InputFiltersGetLevelArray(PlayerIndex1, InputIndex1);
x := 0;
while x < length(thearray) - 1 do
begin
if i <= 10 then
begin
v := (thearray[x] + thearray[x + 1]) / 2;
TProgressBar(findcomponent('Tprogressbar' + IntToStr(i))).Value := v;
end;
x := x + 2;
Inc(i);
end;
end;
end;
procedure tmainfo.butstopclick(const Sender: TObject);
begin
uos_stop(PlayerIndex1);
end;
end.