MeMP - Mein einfacher Mp3-Player

Kapitel 1. Überblick und Vorbereitung

tl_files/memp/memp.pngIn diesem Tutorial möchte ich einen Einstieg in die Programmierung eines Mp3-Players bieten. Es richtet sich an Delphi-Programmierer, die schon etwas Erfahrung mit Delphi gesammelt haben und sich nun an ein neues, etwas größeres Projekt wagen wollen. Wenn man von einem eigenen Editor oder Taschenrechner die Nase voll hat, dann wird nicht selten ein eigener Player programmiert. Und dann kommen immer wieder dieselben Fragen.

  • Wie spiele ich eine mp3 ab?
  • Wie kann man automatisch das nächste Lied starten?
  • Wie kann ich machen, dass da der Titel steht, und nicht der Dateiname?
  • Wieso bekomme ich ein list index out of bounds (-1)?
  • ...

Diese Fragen (und ein paar mehr) werden hier erläutert werden. Wir werden von Anfang an darauf achten, dass „da nicht der Dateiname steht“. Das mit dem nächsten Titel wird auch klappen. List index out of bounds gibt es nicht, und wir spielen mühelos mp3, ogg, wav, wma, ape, flac und einiges mehr ab. Wir werden Playlisten laden und speichern. Und diese Balken, die bei fast allen Playern rumhüpfen, haben wir dann auch.

Wir werden hier nicht alles selbst entwickeln, sondern „uns auf die Schultern von Giganten stellen“. Wir werden z.B. die bass.dll zum Abspielen benutzen. Auch das Auslesen der Informationen („ID3-Tags“) aus den verschiedenen Dateien werden wir anderen Klassen überlassen und bereiten diese Informationen nur für uns passend auf.

Delphi startklar machen

Um das Beispiel-Programm zu diesem Tutorial kompilieren zu können, benötigen wir zunächst einmal Delphi. Getestet wurde es mit Delphi 7 Personal und Turbo Delphi Explorer.

Zusätzlich benötigen wir folgendes:

  • Die bass.dll. Sie wird das Abspielen der Musik für uns übernehmen. Sie kann auf http://www.un4seen.com/ heruntergeladen werden. Aus dem Downloadarchiv benötigen wir am Ende auch einige Teile der Demoprojekte, nämlich die beiden Units spectrum_vis und CommonTypes aus dem Projekt SampleVis.
  • Optional Addons zur bass.dll zum Abspielen weiterer Formate wie BassWma, BassFlac, BassApe etc.
  • Die Unit Mp3FileUtils, die uns den Großteil der Arbeit mit mp3-Dateien abnimmt.
  • Die Unit ATL_WmaFile zum Auslesen der Informationen aus wma-Dateien.

Hinweis: Natürlich können anstelle meiner Mp3FileUtils auch andere Units zum Auslesen der ID3-Tags benutzt werden. Dann müssen ggf. einige Stellen im Quellcode angepasst werden. Als mir bekannte Alternativen seien hier die Audio Tools Library (ATL), die Jedis oder die ID3Lib von Muetze1 aus der Delphipraxis genannt. Wie die einzelnen Aufrufe der ID3-Tag-Leseroutinen im Einzelnen genau angepasst werden müssen, sollte man der entsprechenden Dokumentation entnehmen. Ein besonders großer Aufwand dürfte das nicht sein.

Hinweis zu Unicode und Delphi 2009

Der Text in diesem Tutorial ist für Delphi 2007 oder früher ausgelegt. Für Delphi 2009 oder später sind auf Grund der Umstellung auf Unicode einige Anpassungen nötig. Im Quellcode, der in dem Download-Archiv enthalten ist, sind an den entsprechenden Stellen Compilerschalter eingefügt, so dass sich der Code mit allen Delphi-Versionen seit Delphi 7 (evtl. auch früher) korrekt compilieren lassen sollte. Die Änderungen beschränken sich im Wesentlichen auf das zusätzlich zu verwendende Flag BASS_UNICODE bei einigen Bass-Funktionen.

Hinweis zu den Lizenzen

Die bass.dll kann in nicht-kommerziellen Produkten frei verwendet werden, genauere Angaben werden da meines Wissens nach nicht gemacht. Mp3FileUtils steht unter der LGPL, alternativ unter einer BSD-ähnlichen Lizenz. ATL_WmaFile steht wie die gesamte ATL unter der LGPL.

Die in diesem Tutorial entwickelten Klassen stehen unter keiner besonderen Lizenz. Sie können „einfach so“ benutzt werden. Ich überlasse es dir, das auf faire Art und Weise zu tun. Bei einem 10.000 Zeilen Programm ist ein Hinweis auf das Tutorial sicherlich kaum noch nötig, bei 1500 Zeilen und damit nur rund 30% Eigenanteil schon eher.

Hinweise zur bass.dll

Das ursprüngliche Tutorial war für die Version 2.3 der bass.dll ausgelegt. Mit der aktuellen Version 2.4 wurden einige Änderungen eingeführt. Genaueres ist im Changelog der bass.dll nachzulesen – betroffen sind hier im Wesentlichen die Funktionsaufrufe von BASS_ChannelGetAttributes, -SetAttributes, -Getlength, -GetPosition und -SetPosition. Und, ganz wichtig: Volume ist jetzt ein Float-Typ mit 0=stumm und 1=laut.