[gelöst] Audio abspielen

Für Fragen von Einsteigern und Programmieranfängern...
Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Audio abspielen

Beitrag von Michl »

Stefan67 hat geschrieben:Das Beispiel consoleplay erzeugt ein leeres Formular, aber keinen Ton.
Eigentlich müsste eine Consolefenster geöffnet werden, mit Statusmeldungen. Keine Fehlermeldung?!
Stefan67 hat geschrieben:Folgendes Listing durchläuft auch den Compiler ohne Fehlermeldung, aber ebenfalls kein Ton:
Der gepostete Code entspricht aber nicht dem, was theo geschrieben hatte.

Öffne mal deine "Projekt".lpr (unter Hauptmenu -> Projekt -> .lpr-Datei anzeigen). Dort müssten die Units entsprechend eingetragen werden. Wenn morseTL bei dir funktioniert sollte deine .lpr dieser von morseTL entsprechen (kannst ja die Variante von theo und morseTL beide mal ausprobieren). z.B.:

Code: Alles auswählen

program project1;
 
{$mode objfpc}{$H+}
{$DEFINE UseCThreads}     //Diese Zeile ist wichtig
 
uses
  {$IFDEF UNIX} {$IFDEF UseCThreads} //und diese Zeilen sollten übereinstimmen
  cthreads,                          //und diese Zeilen sollten übereinstimmen
  cwstring, {$ENDIF} {$ENDIF}        //und diese Zeilen sollten übereinstimmen
  Interfaces, // this includes the LCL widgetset
  Forms, Unit1
  { you can add units after this }; 
...

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Stefan67
Beiträge: 33
Registriert: Di 2. Sep 2014, 23:49
OS, Lazarus, FPC: Linux 3.16, Lazarus 1.0.14, FPC 2.6.2
CPU-Target: 32Bit

Re: Audio abspielen

Beitrag von Stefan67 »

Michl hat geschrieben:
Stefan67 hat geschrieben:Das Beispiel consoleplay erzeugt ein leeres Formular, aber keinen Ton.
Eigentlich müsste eine Consolefenster geöffnet werden, mit Statusmeldungen. Keine Fehlermeldung?!
Keine Fehlermeldung.

Ich habe den Quelltext nochmal geändert, ich hoffe nun theos Zeilen richtig berücksichtigt zu haben:

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
{$DEFINE UseCThreads}
interface
 
uses
  cmem, {$IFDEF UNIX}  {$IFDEF UseCThreads}
  cthreads,
  cwstring,
  {$ENDIF} {$ENDIF}
  Interfaces, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, uos_flat;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
uos_LoadLib('lib/Linux/32bit/LibPortaudio-32.so', 'lib/Linux/32bit/LibSndFile-32.so', 'lib/Linux/32bit/LibMpg123-32.so', 'lib/Linux/32bit/libSoundTouch-32.so');
uos_CreatePlayer(0);
uos_AddIntoDevOut(0);
uos_AddFromFile(0, Pchar('startgong.mp3'));
uos_Play(0);
end;
 
end.                  
Kompilieren lässt sich das, aber wenn ich auf den Button klicke, kommt die Fehlermeldung "Access violation."

MorseTL benutzt uos statt uos_flat. Der Vergleich geht wohl nicht. Aber "Multiplayer" läuft auch und dessen *.lpr entspricht meiner, bzw. theos:

Code: Alles auswählen

program multiplayer;
 
{$mode objfpc}{$H+}
 {$DEFINE UseCThreads}
 
uses
  Cmem, {$IFDEF UNIX} {$IFDEF UseCThreads}
  cthreads,
  cwstring, {$ENDIF} {$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms,
  main_mp { you can add units after this };
 
 {$R *.res}
begin
  Application.Title := 'MultiPlayer';
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Zuletzt geändert von Lori am Fr 5. Sep 2014, 19:36, insgesamt 1-mal geändert.
Grund: Bitte den richtigen Highlighter verwenden.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Audio abspielen

Beitrag von Michl »

Wenn in Deiner projekt.lpr schon "uses cmem, cthreads, cwstring..." steht, brauchst Du das nicht nochmal extra in Unit1 einfügen! Woher die "Access violation" kommt weiss ich nicht. Dazu müsstest Du mal debuggen (Breakpoint auf "uos_LoadLib('lib/Lin..." setzen und mit <F7> oder/und <F8> durch den Code steppen, bis es zu der Zugriffsverletzung kommt.
Stefan67 hat geschrieben:
Michl hat geschrieben: Eigentlich müsste eine Consolefenster geöffnet werden, mit Statusmeldungen. Keine Fehlermeldung?!
Keine Fehlermeldung.
Wenn das Projekt "ConsolePlay" bei Dir nicht funktioniert (ohne eine Fehlermeldung) wird das Projekt, an dem Du die ganze Zeit rumdoktorst auch nicht funktionieren, da die aufgerufenen Methoden identisch sind. Du müsstest mMn erst versuchen den Fehler zu finden, warum ConsolePlay nicht funktioniert, wenn Du die Lösung dort gefunden hast, kannst Du den Ansatz auf den aktuelles Projekt übertragen.
Stefan67 hat geschrieben:MorseTL benutzt uos statt uos_flat. Der Vergleich geht wohl nicht.
Das ist nicht richtig. UOS wird unter uses in der .lpr implementiert (was Du bei Deinem Projekt durchaus auch nochmal versuchen könntest). Die Aufrufe zur Initialisierung von UOS (Bibliothekeneinbindung), Playererstellung und abspielen des Sounds sind Methoden von uos_flat (eingebunden unter uses in der Unit "main_mt").

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Audio abspielen

Beitrag von theo »

Ich hab mal eine Minimalvariante gebastelt. Bei mir spielt das so.
Achtung: *.lpr wie besprochen ändern!
Dies ist nur die 64Bit Linux Variante. Für andere System Pfade anpassen.
Musikpfad auch anpassen!

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  uos_flat, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);  
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var
  In1Index, Out1Index, PlayerIndex1, LibsLoaded: integer;
  ordir: string;
begin
  PlayerIndex1 := 0;
  ordir := application.Location;
  LibsLoaded := uos_LoadLib(
    PChar(ordir+'/lib/Linux/64bit/LibPortaudio-64.so'),
    PChar(ordir+'/lib/Linux/64bit/LibSndFile-64.so'), 
    PChar(ordir+'/lib/Linux/64bit/LibMpg123-64.so'), 
    PChar(ordir+'/lib/Linux/64bit/libSoundTouch-64.so')
  );
  if LibsLoaded = 0 then
  begin
    uos_CreatePlayer(PlayerIndex1);
    In1Index := uos_AddFromFile(PlayerIndex1, PChar('/home/theo/Musik/Test.mp3'), -1, 0, -1);
    Out1Index := uos_AddIntoDevOut(PlayerIndex1, -1, -1, uos_InputGetSampleRate(PlayerIndex1, In1Index), -1, 0, -1);
    uos_Play(PlayerIndex1);
  end
  else
    ShowMessage('Libs not loaded');
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  uos_unloadlib();
end;
 
 
end.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Audio abspielen

Beitrag von pluto »

Gib mal bei deiner Datei, den ganzen Pfad an.

In der Regel gibt es bei solchen Libs eine Fehler Funktion, die zurück gibt, warum es nicht klappt.

Oder: Ich nehme an, es sind Funktionen, die du da aufrufst. Lass dir mal die Rückgabewerte ausgeben in der Console.
MFG
Michael Springwald

Stefan67
Beiträge: 33
Registriert: Di 2. Sep 2014, 23:49
OS, Lazarus, FPC: Linux 3.16, Lazarus 1.0.14, FPC 2.6.2
CPU-Target: 32Bit

Re: Audio abspielen

Beitrag von Stefan67 »

@theo
Deine Minimalvariante läuft hier auch nicht. Keine Fehlermeldung, aber auch kein Ton.

@pluto
Das mit der kompletten Pfadangabe hat auch nicht geholfen.

Danke für eure vielen Tipps. Manche verstehe ich zwar (noch) nicht, aber ich werde dran arbeiten. Bin eben Anfänger und sicher fehlen mir noch einige Grundlagen, aber ein paar blöde Audio-Dateien abspielen zu können ist doch nicht zu hoch gegriffen, oder? Vielleicht liegt es ja auch an meiner Installation?
Ich werde jetzt erst mal versuchen ein paar grundlegende Sachen aus dieser Misere zu lernen und dann, wie empfohlen, mich an ConsolePlay versuchen.
Ich schaffe das schon! :wink:

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Audio abspielen

Beitrag von pluto »

Bin eben Anfänger und sicher fehlen mir noch einige Grundlagen, aber ein paar blöde Audio-Dateien abspielen zu können ist doch nicht zu hoch gegriffen, oder? Vielleicht liegt es ja auch an meiner Installation?
Eigentlich nicht. Aber in Lazarus ist das bereits ein Problem. Selbst ich hatte einige Probleme.

Wie war das noch, das muss unter Windows laufen oder?
Sonst könnte ich dir noch meine Xine Vereinfachung geben. Die läuft aber leider nur unter Linux und dürfte inzwischen auch veraltet sein wobei, ich habe noch eine neuere Xine-Lib für Lazarus gefunden. Die sogar unter 64 Bit und 32 Bit läuft.
MFG
Michael Springwald

Stefan67
Beiträge: 33
Registriert: Di 2. Sep 2014, 23:49
OS, Lazarus, FPC: Linux 3.16, Lazarus 1.0.14, FPC 2.6.2
CPU-Target: 32Bit

Re: Audio abspielen

Beitrag von Stefan67 »

Ja, das soll vor allem auch unter Windows laufen, am besten auch auf 'nem tablet.

Ich habe nochmal mit dem letzten Code von theo gearbeitet, leider ohne Erfolg. Immerhin kommt nun die "Libs not loaded"-Nachricht. Bei den Pfadangaben zu den libs habe ich alle möglichen Schreibweisen versucht. In den Projekteinstellungen ist der Pfad zu den units auch angegeben. Hier nochmal meine Versuche:

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
 
interface
 
uses
    uos, uos_flat, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var
  In1Index, Out1Index, PlayerIndex1, LibsLoaded: integer;
  ordir: string;
begin
    PlayerIndex1 := 0;
  ordir := application.Location;
  LibsLoaded := uos_LoadLib(
    PChar('/home/stefan/free_pascal/lib/i386-linux/LibPortaudio-32.so'),
    PChar('/home/stefan/free_pascal/lib/i386-linux/LibSndFile-32.so'),
    PChar('/home/stefan/free_pascal/lib/i386-linux/LibMpg123-32.so'),
    PChar('/home/stefan/free_pascal/lib/i386-linux/libSoundTouch-32.so')
  );
  if LibsLoaded = 0 then
  begin
    uos_CreatePlayer(PlayerIndex1);
    In1Index := uos_AddFromFile(PlayerIndex1, PChar('startgong.mp3'), -1, 0, -1);
    Out1Index := uos_AddIntoDevOut(PlayerIndex1, -1, -1, uos_InputGetSampleRate(PlayerIndex1, In1Index), -1, 0, -1);
    uos_Play(PlayerIndex1);
  end
  else
    ShowMessage('Libs not loaded');
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  uos_unloadlib();
end;
 
end.                             

Code: Alles auswählen

program project1;
 
{$mode objfpc}{$H+}
{$DEFINE UseCThreads}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  cwstring, {$ENDIF} {$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, Unit1
  { you can add units after this };
 
{$R *.res}
 
begin
  RequireDerivedFormResource := True;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
 
Vielleicht habt ihr ja noch 'ne Idee.... :wink:

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Audio abspielen

Beitrag von Michl »

Ich weiss zwar nicht, ob das zu der Fehlermeldung passt, doch wenn MorseTL läuft, würde ich versuchen (wie zuvor schon theo schrieb), als erstes in der .lpr unter uses CMem (http://wiki.lazarus.freepascal.org/CMem/de) einzubinden!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Audio abspielen

Beitrag von pluto »

Wenn das unter Windows laufen soll, sollte die Endung der "DLLS" nicht auf SO lauten:
/home/stefan/free_pascal/lib/i386-linux/LibPortaudio-32.so
sondern auf .dll

Und ganz wichtig, ob es auf einem 32 Bit System laufen soll oder auf ein 64 Bit... unter Umständen kann es Probleme bereiten.

EDIT:
Ups, mir ist gar nicht aufgefallen, dass es alles Linux Pfad Angaben sind und keine Windows Pfad angaben.

Weil du geschrieben hast, es soll vorallem auf Windows laufen.
MFG
Michael Springwald

Stefan67
Beiträge: 33
Registriert: Di 2. Sep 2014, 23:49
OS, Lazarus, FPC: Linux 3.16, Lazarus 1.0.14, FPC 2.6.2
CPU-Target: 32Bit

Re: Audio abspielen

Beitrag von Stefan67 »

Michl hat geschrieben:Ich weiss zwar nicht, ob das zu der Fehlermeldung passt, doch wenn MorseTL läuft, würde ich versuchen (wie zuvor schon theo schrieb), als erstes in der .lpr unter uses CMem (http://wiki.lazarus.freepascal.org/CMem/de) einzubinden!
So?

Code: Alles auswählen

program project1;
 
{$mode objfpc}{$H+}
{$DEFINE UseCThreads}
 
uses
  cmem,
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  cwstring, {$ENDIF} {$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, Unit1
  { you can add units after this };
 
{$R *.res}
 
begin
  RequireDerivedFormResource := True;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.              
Keine Veränderung.

@pluto
Ich bin froh, wenn ich das erst mal auf meinem Linux-PC zum Laufen bekomme. Alles andere kommt dann. ;)

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Audio abspielen

Beitrag von Michl »

Nun fällt mir nur noch ein, dass Du statt 32bit evtl. 64bit nutzt?! Auch weiss ich nicht, ob die Libs und der Pfad tatsächlich so geschrieben werden (bin gerade unterwegs und habe UOS nicht vor mir) oder ob sie nicht klein geschrieben werden - Linux ist case-sensitive!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Stefan67
Beiträge: 33
Registriert: Di 2. Sep 2014, 23:49
OS, Lazarus, FPC: Linux 3.16, Lazarus 1.0.14, FPC 2.6.2
CPU-Target: 32Bit

Re: Audio abspielen

Beitrag von Stefan67 »

Michl hat geschrieben:Nun fällt mir nur noch ein, dass Du statt 32bit evtl. 64bit nutzt?! Auch weiss ich nicht, ob die Libs und der Pfad tatsächlich so geschrieben werden (bin gerade unterwegs und habe UOS nicht vor mir) oder ob sie nicht klein geschrieben werden - Linux ist casesensitiv!
Nein, ich nutze 32bit und die Schreibweise ist auch richtig (copy-paste).

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Audio abspielen

Beitrag von Michl »

Und was bringt der Test?!:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  if FileExists('/home/stefan/free_pascal/lib/i386-linux/LibPortaudio-32.so') and
    FileExists('/home/stefan/free_pascal/lib/i386-linux/LibSndFile-32.so') and
    FileExists('/home/stefan/free_pascal/lib/i386-linux/LibMpg123-32.so') and
    FileExists('/home/stefan/free_pascal/lib/i386-linux/libSoundTouch-32.so')
  then
    ShowMessage('Libs vorhanden')
  else
    ShowMessage('Libs nicht vorhanden!');
end;  

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Audio abspielen

Beitrag von pluto »

Unter Linux befinden sich die Libs normalerweise woanders. Und zwar unter
/lib/
oder
/usr/lib/

Sie werden auch meistens anders angegeben. Schau dir mal andere Libs an. Wie der Pfad und der Name aussieht.
MFG
Michael Springwald

Antworten