MeMP

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
alex793
Beiträge: 5
Registriert: Di 11. Mär 2014, 11:03

MeMP

Beitrag von alex793 »

Hallo,
Hatte seit Wochen nach einer einfachen Möglichkeit gesucht .mp3-Dateien in mein Programm einzubinden.
Anscheinend komme ich dabei ja nicht um die bass.dll herum
außerdem hab ich mir noch die Datein zum MeMP runtergeladen und durchgelesen.
Als ich den Player dann nachbauen wollte, meldete Lazarus folgendes Problem:
__________________
[type

TTextEncoding = (TE_Ansi, TE_UTF16, TE_UTF16BE, UTF8);

// Type for this one big const-array "ID3v2KnownFrames" (scroll down to see it)
TID3v2FrameDescriptionData = record
IDs: Array[TID3v2FrameVersions] of AnsiString; // MUST be AnsiString
Description: String; // Doesn't matter, use Delphi-Default
end; ]

Error:Enums with assignments can't be used as array index.
____________________

Ich hab daraufhin mal den fehler gegoogelt und irgendwas gelesen, dass dieser Fehler unter Delphi nicht existiert.Siehe hier
Weiß jemand, wie man dieses Problem beheben kann, damit es in Lazarus funktioniert ?

Danke im Voraus ;)
Windows 8, 64 bit, Lazarus 1.4

creed steiger
Beiträge: 957
Registriert: Mo 11. Sep 2006, 22:56

Re: MeMP

Beitrag von creed steiger »

bevor du dich an Delphi Sourcen abarbeitest könntest du das hier ausprobieren
http://wiki.lazarus.freepascal.org/uos

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: MeMP

Beitrag von Christian »

W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

wp_xyz
Beiträge: 4892
Registriert: Fr 8. Apr 2011, 09:01

Re: MeMP

Beitrag von wp_xyz »

Ich habe mir den Memp mal angesehen und das Delphi-Projekt für Lazarus konvertiert. Das mache ich zum ersten Mal und bin begeistert, wie gut das inzwischen geht.

Seltsam, bei einem Rechner wird die genannte Stelle akzeptiert, der andere stolpert aber auch über den Aufzählungstyp mit Wertzuweisung:

Code: Alles auswählen

 
type
  TID3v2FrameVersions = (FV_2 = 2, FV_3, FV_4)

Ich habe zunächst die Zahlenwerte weggelassen, aber damit läuft das Programm nicht, weil die Zahlenwerte nicht mehr stimmen. Dann habe ich vor FV_2 zwei Dummy-Werte ergänzt, damit die Nummerierung wieder stimmt, aber das erzeugt extrem viel korrekturen, da viele Konstanten als Array[TID3v2FrameVersions] deklariert sind. Schließlich bin ich auf die Lösung

Code: Alles auswählen

 
type
  TID3v2FrameVersions = 2..4;  

gekommen. Auch hier muss man noch korrigieren: überall wo in Quelltext einer der Bezeichner FV_2, FV_3, FV_4 vorkommt, muss man das FV_ wegeditieren, aber der Compiler sagt ja, wo's noch zwickt.

Aber das ist nicht alles, es kommt noch mehr. Bei den Units mp3fileUtils und PlayerKlasse musste ich noch "Windows" in die Uses-Zeile schreiben - geht vielleicht auch anders, aber ich wollte ein schnelles Ergebnis. Bei Unit1 muss "XPManifest1: TXPManifest" aus der Deklaration von TForm1 gelöscht werden; ebenfalls, mit einem Editor Unit1.lfm öffnen und den Block zu XPManifest1 löschen. Stattdessen in den Projekt-Optionen unter "Anwendung" das Häkchen vor dem Manifest setzen.

Das größte Rätsel-Raten bereitete mir in der Bass Unit das Konstrukt

Code: Alles auswählen

 
const
  // special STREAMPROCs
  STREAMPROC_DUMMY : STREAMPROC = STREAMPROC(0)// "dummy" stream
  STREAMPROC_PUSH  : STREAMPROC = STREAMPROC(-1); // push stream 

Zum Glück ist das hier im Forum schon einmal behandelt worden (--> Forumsuche!), die Lösung ist

Code: Alles auswählen

 
const
  // special STREAMPROCs
 {$IFDEF DELPHI}
  STREAMPROC_DUMMY : STREAMPROC = STREAMPROC(0)// "dummy" stream
  STREAMPROC_PUSH  : STREAMPROC = STREAMPROC(-1); // push stream
 {$ELSE}
  STREAMPROC_DUMMY = pointer(0);   // "dummy" stream
  STREAMPROC_PUSH  = pointer(-1)// push stream
 {$ENDIF}  

Damit war der Compiler zufrieden. Blieb noch der Absturz beim Starten wegen fehlender bass.dll. Aber nach dem Rüberkopieren dieser dll ins exe-Verzeichnis läuft das Programm und spielt meine mp3's ab.

alex793
Beiträge: 5
Registriert: Di 11. Mär 2014, 11:03

Re: MeMP

Beitrag von alex793 »

Danke erstmal für eure antworten ;)
ACS is mir persönlich auf den ersten blick zu viel. Ich würd mich selbst noch als einsteiger in Lazarus bezeichnen. hab bis jetzt nur das übliche programmiert(taschenrechner, bissl tabellen, quize und mathe lernprogramme)
UOS hab ich vorhin gegooglet. sieht vergleichsweise machbarer aus. ich gugg gleich auch mal nachn paar tutorials.
@wp_xyz:
hab das jetzt alles soweit abgeändert, wie du's erklärt hast.
der compiler meckert nich, und das programm läuft. zumindest bis zu dem zeitpunkt, wenn ich eine mp3 datei auswähle und abspielen möchte.
da erscheint der offenbar vielseitige Fehlermeldung:
Externel SIGSEV an der stelle 403BB0.
wenn jemand ne Lösung hat, immer her damit
Windows 8, 64 bit, Lazarus 1.4

wp_xyz
Beiträge: 4892
Registriert: Fr 8. Apr 2011, 09:01

Re: MeMP

Beitrag von wp_xyz »

Die Fehlermeldung hatte ich auch, als ich in der ersten Lösung die Wertzuweisungen in der Deklaration der Aufzählung entfernt hatte. Setze einen Breakpoint zu Beginn der Routine TID3v2Frame.ReadFromStream und lass dir anzeigen, welchen Wert fVersion hat. Meine mp3-Datei hatte die Version 3 (bzw. FV_3), aber nach der missglückten Manipulation des Aufzählungstyps war der Wert 3 nicht mehr in der Aufzählung enthalten, so dass die für den Fall FV_3 vorgesehenen Anweisungen nicht ausgeführt wurden. Wenn das auch bei dir der Fall ist, ist etwas bei der Umstellung des Typs von TID3v2FrameVersions falsch gelaufen.

Seltsamerweise kommt der Rechner, an dem ich eben sitze, mit den Aufzählungen mit Wertzuweisung klar, der zuhause nicht. Beide haben WIndows 7 mit Lazarus 1.3 / fpc 2.6.2. Das Lazarus hier stammt aus einem recht aktuellen Snapshot, das zuhause aus vorgestern neu gebautem trunk. Hat jemand eine Ahnung, was da der Unterschied sein könnte?

wp_xyz
Beiträge: 4892
Registriert: Fr 8. Apr 2011, 09:01

Re: MeMP

Beitrag von wp_xyz »

Ich bin jetzt nochmal dem ursprünglichen Problem mit dem Aufzählungstypen mit Wertzuweisung nachgegangen: Lazarus kann sehr wohl damit umgehen, und zwar im Modus "Delphi". Damit kann die Typdeklaration "TID3v2FrameVersions = (FV_2 = 2, FV_3, FV_4)" bleiben, so wie sie war.

Leider war die Unit Id3v2Frames.pas nicht in dem Delphi-Projekt enthalten, und daher hat sie der Delphi-Lazarus-Konverter vermutlich übersehen.

Hol dir also die Id3v2Frames.pas wieder aus dem Archiv und setze

Code: Alles auswählen

 
{$IFDEF FPC}
  {$MODE Delphi}{$H+}
{$ENDIF}
 

an den Anfang. In Unit mp3fileutils gibt es dann noch zwei Stellen, an denen von mir vorgeschlagenen Änderungen rückgängig gemacht werden müssen - der Compiler sagt dir, welche.

Antworten