Mucken statt drucken

Tausende ausgemusterter PCs sehen in klammen Kellern und klebrigen Kinderzimmern ihrem Ende im städtischen E-Müll-Container entgegen.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 35 Min.
Von
  • Carsten Meyer
Inhaltsverzeichnis

Seit sich der Audio-Kompressionsstandard MPEG Audio Layer 3 oder kurz MP3 mehr und mehr durchsetzt, beginnt so mancher Musiker, seine Stücke derart 'geschrumpft' direkt im Internet zu veröffentlichen, und viele PC-Besitzer archivieren die heimische CD-Sammlung in diesem kompakten Format. Zum Abspielen blieb dem Hörer bislang nur die Möglichkeit, mit Hilfe eines leidlich schnellen Computers mit Soundkarte und geeigneter Software wie zum Beispiel dem legendären WinAmp/MacAmp den komprimierten Datenstrom in hörbare Töne zurückzuverwandeln. An dieser Situation hat sich erst wenig geändert, auch wenn die ersten tragbaren Solid-State-Player von der zunehmenden Akzeptanz des Standards außerhalb der Rechner-Welt künden.

Im Rahmen dieses Projektes stellen wir Ihnen ein Abspielgerät für die MP3-Musikdateien vor, das man notfalls ohne Monitor und Tastatur bedienen und ohne Probleme in die Stereoanlage oder sogar in ein Auto integrieren kann. Am Druckerport angeschlossen, läßt es sich praktisch mit jedem Alt-PC oder Notebook vom 286er an aufwärts betreiben - MSDOS, ein CDROM- und ein Diskettenlaufwerk sind dafür die einzigen Voraussetzungen.

Es muß nämlich nicht immer Pentium sein: Ein knackfrischer MPEG-Audio-Decoderchip nimmt den zahmen MP3-Datenstrom vom PC entgegen und wandelt ihn umgehend in ein Audio-Signal. So hat der PC nur noch die Daten von CDROM zu lesen und an den Druckerport zu senden, die rechenintensive Dekodierung der MP3-Dateien, die sonst einen kräftigen Pentium oder PowerPC-Prozessor erfordert, erledigt unser Projekt ganz nebenbei.

Als Datenquelle für die MP3s kommen vor allem CD-Rs in Frage, die Platz für rund 13 Stunden Musik in HiFi-Qualität bieten. Die Daten sind auf diesen CDs üblicherweise in einem ISO-9660-Dateisystem abgelegt. Ein PC liest die Daten von der CD und schickt sie über den Parallelport an einen digitalen Signalprozessor, der die Dekodierung des Datenstroms übernimmt und das noch digitale Musiksignal einem hochwertigen D/A-Wandler zuführt. Von dort geht es über zwei Cinch-Buchsen zum Verstärker der Stereoanlage. Die Soundqualität ist deutlich besser als das von PC-internen Störern verseuchte Signal, das man von vielen ISA-Soundkarten kennt.

Die (optionale) Bedienschnittstelle besteht aus einem LC-Display, mehreren Tastern, einem Drehknopf sowie einer Infrarotschnittstelle für Fernbedienungen. Neben den Funktionen, die ein handelsüblicher CD-Spieler anbietet, kann der MP3-Player, entsprechende Datenformate vorausgesetzt, auch Titel, Playlisten und Spieldauer anzeigen. Er kann selektiv nur die Lieder abspielen, die zum Genre Pop, Rock oder Classic gehören und gleichzeitig die Verwaltung der Musiksammlung übernehmen. Zu guter Letzt kann der MP3-Player implizit auch das, was ein normaler CD-Player auch kann: Audio-CDs abspielen.

Der MP3-Player gibt sich somit recht genügsam, was seine Anforderungen an die umgebende Hardware angeht. Der Prozessor des PCs kann durchaus ein betagter 286er sein, der vorher ein Gnadenbrot als Türstopper fristete; schließlich muß er nur die Daten vom CDROM-Laufwerk auf die parallele Schnittstelle schieben. Gleiches gilt für das CDROM-Laufwerk - benötigt werden von den 150 KByte/s eines Single-Speed-Laufwerks nur ganze 16, denn die Datenrate des verbreitetsten MP3-Formats beträgt gerade einmal 128 KBit/s. Ein altes Diskettenlaufwerk, um ein Minimal-DOS zu booten und das Programm zu starten, sowie eine unidirektionale parallele Schnittstelle sind alles, was noch zum audiophilen MP3-Genuß fehlt.

Natürlich hat keiner geglaubt, man könne einen MPEG-Datenstrom mit einer diskreten Schaltung dekodieren, dennoch hält sich der Aufwand dank eines speziellen Chips in Grenzen. Herz der MP3-Platine ist ein DSP (digitaler Signalprozessor), der MAS 3507D von Micronas/Intermetall (ex ITT), der wie für dieses Projekt geschaffen scheint und auf den später gebührend eingegangen wird. Er ist von Haus aus mit einem ROM ausgestattet, aus dem er nach dem Power-Up ein Programm startet, das den ankommenden seriellen MP3-Datenstrom nach I2S dekodiert. I2S ist ein Standardformat, das von einem hochwertigen D/A-Wandler in ein Audio-Signal verwandelt wird. Als Zulieferer der Daten und zur Steuerung der restlichen Peripherie des Players kommt ein Mikrocontroller vom Typ ATMEL 908515 zum Einsatz, der dem Player die nötige Flexibilität verleiht und dem daher ebenfalls ein eigener Abschnitt gewidmet ist.

Die Software ist in verschiedene Teile gegliedert, die im folgenden noch detaillierter erläutert werden. Zum einen gibt es einige Low-Level-Routinen, die die direkte Kommunikation mit der Hardware abwickeln. Dazu gehört das Schreiben auf das Display, das Versenden eines MP3-Datenstroms oder ähnliches. Darauf setzt eine Benutzerschnittstelle auf, die es dem Benutzer erlaubt, Dateien auszuwählen und abzuspielen. Die auf dem PC laufenden Teile sind in C geschrieben und sollten deshalb weitestgehend portabel sein. Auf dem Mikrocontroller läuft dagegen ein in Assembler geschriebenes, proprietäres Programm. Doch keine Angst: von eMedia (s. Inserenten-Teil) wird es zu diesem Projekt fertig programmierte Controller geben, auch der DSP-Chip MAS 3507 wird dort verfügbar sein.

Die Hardware-Kosten einschließlich der in der nächsten c't vorgestellten, optionalen Bedien-/Display-Einheit belaufen sich auf rund 180 Mark. Die Platine ist mit 6 x 10 cm recht klein - und das trotz minimalem Einsatz von SMD-Bauteilen; der Nachbau sollte auch weniger geübten Bastlern gelingen. Verwendet man statt eines ausgemusterten PCs eine PC-on-a-Chip-Lösung oder einen Einplatinencomputer, kann man den fertigen Player ohne Probleme auch in ein Auto einbauen.

Wie bereits erwähnt, wird der Player an den Printerport des Rechners angeschlossen, der einzigen gängigen Schnittstelle in der PC-Welt (außer dem USB vielleicht), die in der Lage ist, die geforderte Datenrate ohne weiteren Aufwand zu liefern. Mit der Forderung, auch ältere Hardware verwenden zu können, scheiden modernere Betriebsmodi ('enhanced' oder bidirektional) aus - eine unidirektionale Variante, wie sie auf den meisten Multi-IO-Karten zu finden ist, reicht aber auch völlig aus. Viel wichtiger für unterbrechungsfreien Betrieb ist eine gewisse Mindestgeschwindigkeit des auf dem PC laufenden Programms: zu große Latenzzeiten beim Abarbeiten der PC-Interruptroutine führen unweigerlich zum interruptus musicalis.

Mit der Druckerschnittstelle stehen effektiv zwölf Leitungen zur Ausgabe (D0 ... D7, Init, Select, Autolinefeed, Strobe) und drei zur Eingabe (Ack, Busy, Error) von Daten zur Verfügung. Gemessen am zu bewältigenden Funktionsumfang ist das zwar eher knapp bemessen, aber mit entsprechendem Protokoll ausreichend. Praktisch wird der acht Bit breite Datenbus der Druckerschnittstelle direkt an das LC-Display und den Mikrocontroller angeschlossen, wobei letzterer ebenfalls die Adreßleitungen belauscht und ein passendes Chipselect-Signal für das Display erzeugt. Die zur Bedienung des Players vorgesehenen acht Tasten und der Drehknopf sind direkt an dem Mikrocontroller angeschlossen, der mit seinen intern zuschaltbaren Pull-up-Widerständen für saubere Logikpegel auf den Leitungen sorgt. Das unvermeidliche Prellen der Tasten wird vom Programm des Mikrocontrollers aufgefangen, und die tatsächlichen Zustände der einzelnen Tasten können aus dem passenden Register des Mikrocontrollers gelesen werden. Ähnliches passiert bei der Auswertung des Drehknopfes: Der bei der Drehung des Mehrfachkontakters erzeugte Gray-Code wird vom Mikrocontroller ausgewertet, woraufhin im Register lediglich die Aktivität und Drehrichtung vermerkt wird.

Aufwendiger ist die Versorgung des digitalen Signalprozessors MAS3507D: Der Rechenkünstler verlangt nach einem wohldefinierten seriellen Datenstrom, den er sich in kleinen Schüben einverleibt. Häppchenweise wird der Datenstrom mit dem Anlegen des demand-Signals (DEM) vom DSP verlangt. Daraufhin erzeugt der Mikrocontroller ein demand-clock-Signal (SIC) und verfüttert einen seriellen Bitstrom (SII) an den DSP. Ein kleiner Puffer von 160 Bytes im RAM des Mikrocontrollers gewährleistet die sichere Bevorratung von Rohdaten, so daß auch kleinere Latenzzeiten des PCs überbrückt werden können, ohne daß der Datenstrom gleich abreißt. Sobald eine kritische Grenze unterschritten wird, erzeugt der Controller wiederum einen Interrupt am Parallelport, um seinen Bedarf an MP3-Daten anzuzeigen. Nachdem der DSP sein internes RAM gefüllt hat, beginnt der rechenintensive Prozeß des Dekodierens der MP3-Daten, welcher in einem seriellen PCM-Datenstrom gemäß I2S endet. Das ist ein weit verbreitetes Datenformat für digitale Audiosignale, welches direkt an den Digital-Analog-Umsetzer (DAC) geleitet wird. Mittels mehrfachen Oversamplings und aufwendiger Filterung wird daraus ein HiFi-taugliches Audiosignal.

Startet man den Versuch, MPEG-kodierte Musik auf dem heimischen PC abzuspielen, wird man daran erst die rechte Freude haben, wenn der Hauptprozessor des Allround-Genies eine magische Leistungsgrenze überschreitet. In der Praxis liefert erst ein 486DX mit 100MHz Takt einen unterbrechungsfrei dekodierten Stereo-Datenstrom mit 44,1 kHz und 16 Bit - und das auch noch abhängig vom Betriebssystem und bitteschön ohne Anwendung im Hintergrund!

Das einfache Blockschaltbild des MAS3507 täuscht: Hier werkelt ein waschechter DSP. Bei entsprechender Voreinstellung an den PIO-Pins wird ein steuernder Mikrocontroller nicht unbedingt benötigt.

Grund für das Dilemma ist ein gänzlich ungeeigneter Befehlssatz und die falsche Architektur der Intel-CPU. Abhilfe schafft da ein RISC-DSP (Reduced Instruction Set Computing), der gemäß seiner Anlage speziell auf diese Aufgabe zugeschnitten ist. Mittels leistungsfähiger Bitmanipulationsbefehle (Maskieren, Invertieren, Verknüpfen und beliebig Rotieren), die in der Regel innerhalb eines Taktzyklus abgearbeitet werden, und speziellen Hardwarefeatures wie Schieberegister und Multiplizierer, schafft ein DSP solche Aufgaben sogar mit erstaunlich geringen Taktfrequenzen. Beim MAS3507D liegen gerade mal 14,5 MHz an, womit er eher zu den ganz Kleinen zählt.

Etwas On-Chip-RAM, Pipelines, Branch Prediction Units, Look-Up-Tables und die passende Speicherhierarchie nach Harvard (getrennter Programm- und Datenspeicher) tun ein übriges. Bereits 1994 wurde sein Vorgänger als erster 'mixed signal single chip decoder' vorgestellt. In einem ROM hat Micronas Intermetall dem bescheidenen Rechenknecht das passende Dekoder-Programm mitgeliefert. Außerdem ist auch noch eine applikationsgebundene Erweiterung des internen Codes via Download auf den Chip vom Hersteller vorgesehen. Warum also nicht noch gleich eine Frequenzgangkorrektur mittels IFF-Filter vornehmen? Nicht nötig - ist auch schon integriert.

Das ist aber noch nicht alles. Der Chip wurde für reinrassige Multimedia-Anwendungen entwickelt und bringt aus diesem Grund noch ein paar weitere Features mit. Im wesentlichen sind zwei Hauptbetriebsmodi zu unterscheiden: 'Multimedia' und 'Broadcast'. Unterschieden wird hier zwischen einer kontinuierlichen und einer blockorientierten Datenzufuhr. Blockorientiert für Anwendungen beispielsweise in PCs, bei denen der DSP Daten nach Bedarf anfordert und kontinuierlich für Decoder in Stand-alone-Geräten wie Radios, Fernsehern oder Fahrplanauskunftterminals, die einen konstanten Datenstrom empfangen.

Wenn Centronics das geahnt hätte: Der RISC-Microcontroller bringt die parallel eintreffenden MP3-Daten in eine dem MAS3507 gerechte serielle Form, und der wiederum liefert sein Elaborat an einen gängigen D/A-Wandler-Chip.

Batteriebetriebenen Geräten hilft der sehr sparsame MAS3507D mit einem On-Chip-Schaltregler für die Stromversorgung auf die Sprünge. Als kontaktfreudig könnte man ihn bezeichnen, weil er sich sowohl in einer 3,3-V- als auch in einer Standard-TTL-Umgebung einfach integrieren läßt. Um auch in komplexen Anwendungen kommunikativ genug zu sein, hat der DSP noch einen I2C-Bus implementiert, mit dem man sämtliche Betriebsparameter des Chips erreichen kann. Wo das zu aufwendig ist, wird eine Startup-Konfiguration mittels TTL-Pegel an die I/O-Pins gelegt. Kein Wunder, daß der MAS3507D in den meisten portablen MP3-Playern zu finden ist.

Auch andere Hersteller liefern Ansätze, um MPEG-Bitstreams auf DSPs zu dekodieren, jedoch sind in diesen Fällen keine maskenprogrammierten Typen verfügbar, so daß diese einen Rattenschwanz von Entwicklungswerkzeugen nach sich ziehen. Mit entsprechend leistungsfähigen Typen ist dann auch die Dekomprimierung eines MPEG Videostreams kein Problem, aber das ist ein ganz anderes Thema.

Im folgenden gehen wir recht ausführlich auf die Eigenheiten des MP3-Players ein, um versierten Lesern die Chance auf eigene Erweiterungen und Änderungen zu geben. Der erfolgreiche Nachbau der Schaltung ist natürlich auch ohne tieferes Verständnis der inneren Zusammenhänge möglich, nur mit dem Lötkolben sollte man schon umgehen können.

Wesentlicher Bestandteil der Schaltung ist neben dem Signalprozessor eine Logik, die die Verbindung zwischen den einzelnen digitalen Komponenten und dem Parallelport herstellt. Da der hier geforderte Umfang sich nicht mehr in einem preiswerten, programmierbaren Logikbaustein unterbringen läßt, kommt ein einfacher 8-Bit-Microcontroller zum Einsatz. Die Wahl fiel auf den RISC-Prozessor AT90S8515 der Firma Atmel, bei dem zum Betrieb lediglich eine externe Reset-Schaltung sowie eine geeignete Taktversorgung erforderlich sind. Intern verfügt der Chip bereits über 512 Byte RAM, 8 KByte Flash-ROM als Programmspeicher, zwei Timer sowie einige weitere Goodies, die jedoch in unserem Player derzeit keine Verwendung finden.

Wichtig für den Einsatz im Player sind zunächst eine genügend große Portanzahl zum Anschluß der Peripherie und die Möglichkeit zur Programmierung im System. Dabei kann über eine einfache (serielle!) Verbindung mit der frei vom Hersteller verfügbaren Programmiersoftware relativ leicht das Programm mit Hilfe des ebenfalls freien Assemblers geändert werden. In Kombination mit einem Systemtakt von fast 8 MHz und dem relativ großen Flash-ROM läßt dies noch genügend Spielraum für zukünftige Erweiterungen an dem Assemblercode des Mikrocontroller. Derzeit sind die wesentlichen Funktionen die Pufferung und Serialisierung des vom PC gelieferten Datenstroms sowie die Ansteuerung des Displays und das Einlesen der verschiedenen Eingabekanäle. Um die unvermeidbaren und zudem stark schwankenden Interrupt-Latenzzeiten seitens der Datenquelle zu kompensieren, bietet sich ein 160 Bytes großer Bereich des internen RAM als Zwischenpuffer an, wodurch zugleich die Interruptfrequenz an der parallelen Schnittstelle reduziert wird.

Weiterhin werden durch einen Timer, der alle 0,1 ms einen INT auslöst, die Steuereingänge abgefragt und deren momentaner Zustand in einem internen Register zur späteren Abfrage durch den PC gespeichert. Dabei wird im Gegensatz zu dem bloßen Zustand der Tasten im Falle des Drehknopfes zusätzlich die Drehrichtung ermittelt, um keine zusätzliche Last auf dem Parallelport zu erzeugen. Optional kann ferner noch das von einer IR-Diode mit TTL-Ausgang empfangene IR-Signal (auf der Display-Platine) dekodiert und ebenfalls in entsprechenden Registern für den nächsten Pollingzyklus des PC abgelegt werden. Das Polling, ebenso wie die Schreibzugriffe auf den Controller, erfolgt durch Togglen des STROBE-Signals seitens des PC, das immer ein Atmel-INT auslöst. Daraufhin werden das passende Register gewählt und die entsprechenden Daten übertragen. Die dabei gegebenenfalls zusätzlich erforderlichen Steuersignale für das Display erzeugt stets der Controller.

Auffällig ist hier noch die Unterscheidung zwischen dem Lesen von Status und Wert. Hierdurch ist es trotz der byteweisen Übertragung mit einem zwischenzeitlich gesendeten WR input select möglich, mehrere Bytes zu einer Eingabe (beispielsweise RC5-Fernsteuer-Code) zu lesen. Ferner müssen zwischen den relativ langsamen Schreibsequenzen auf das Display angemessene Pausen einfügt werden, wozu ebenfalls eine Auslesefunktion bereitgestellt wird. Zusammen mit den anderen Lesezugriffen auf den Atmel ergibt sich hier ein Problem mit älteren, parallelen Schnittstellen. Entgegen den heutigen Portbausteinen, die im bidirektionalen Modus das Lesen eines ganzen Bytes zulassen, ist hier aus Kompatibilitätsgründen serielles Lesen als Standardoption vorgesehen. Um dies zu (de)aktivieren, braucht lediglich die PC-Software mit entsprechenden 'Schaltern' gestartet zu werden, wobei das zugeordnete Signal an der Schnittstelle dem Controller die gewünschte Betriebsart mitteilt. Neben dem wiederholten Togglen werden dabei die Daten mit dem Takt der INIT-Leitung sequentiell über den ERROR-Eingang in den Rechner getaktet.

Die beste Hardware nützt nichts ohne entsprechende Software. Das im folgenden vorgestellte Programm liegt als ausführbare Datei CTPLAYER.EXE * und als Quellcode-Archiv auf dem Heise-FTP-Server bereit und zeigt die Basisfunktionalität des Players. Es soll zum einen dem programmiertechnisch weniger Versierten einen MP3-Player bieten, zum anderen Lesern mit Programmierkenntnissen als Basis für Erweiterungen dienen.

Das Programm listet dem Benutzer bei Programmstart alle Laufwerke seines Rechners ab Laufwerk C auf. Mit den jeweils zugeordneten Tasten der Bedieneinheit oder der PC-Tastatur, so vorhanden, kann dann in ein bestimmtes Laufwerk gewechselt werden. Falls dieses Laufwerk MP3-Dateien enthält, werden diese wieder als Liste ausgegeben, und man hat die Möglichkeit, beliebige Dateinamen zu deselektieren bzw. wieder zu selektieren. Nach Bestätigung gelangt man in den eigentlichen MP3-Player, welcher die Funktionen 'Pause', 'Skip', 'Skip Verzeichnis' und 'Stop' bietet. Um möglichst flexibel zu sein, bietet das Programm mehrere Optionen, die beim Start als Kommandozeilenparameter übergeben und bei Aufruf des Programms mit dem Parameter '-h' angezeigt werden können.

Der platineneigene Microcontroller arbeitet diese einfache Schleife ab und übernimmt auch die zeitkritische Serialisierung des Datenstroms.

Es werden zwei Typen von Displays unterstützt: Typen mit 16 Zeichen und zwei Zeilen und solche mit 16 Zeichen und vier Zeilen. Falls das angeschlossene Display nur zwei * Zeilen hat, so muß dies als Argument <-z2> * übergeben werden, damit die Menüs entsprechend anders aufgebaut werden. Hitachi-kompatible Typen mit 3 Zeilen oder mehr als 16 Zeichen pro Zeile wurden zwar nicht getestet, dürften jedoch ebenfalls sinnvolle Ausgaben liefern.

Damit man beim Betrieb des Players nicht auf den Standard-Druckerport (LPT1) angewiesen ist, kann man dem Programm als Argument die Adresse <-pX> und den Interrupt <-iX> des gewünschten Druckerports angeben. Falls es sich dabei um einen bidirektionalen Port (die meisten neueren Ports) handelt, so kann man dies per Argument <-b> angeben. Das Lesen vom Port arbeitet dann mit 8 Bit parallel und nicht seriell. Generell funktionieren alle Druckerports im seriellen Modus. Der Parallelmodus dient nur zur Erhöhung der Übertragungsgeschwindigkeit und damit zur Entlastung der Mainboard-CPU.

Falls man zusätzlich oder alternativ die Eingabe per PC-Tastatur und/oder die Ausgabe der Display-Zeilen auf den Monitor benötigt, so kann man als Argument <-e> übergeben. Es gilt dann folgende Tastenzuordnung:

L Bestätigen
I Cursor auf
M Cursor ab
J Abbruch
K Toggle Selektion
O nächstes Verzeichnis
U vorheriges Verzeichnis  

Die acht Tasten und die zwei Drehrichtungen der Bedienelemente sowie optional RCS-Codes des IR-Empfängers lassen sich mit einer Datei namens 'mapper.txt' den sieben internen Befehlen zuordnen. Dabei kann der Dateiname der Prefs-Datei, falls er vom Standarddateinamen abweicht, als Argument <-fDateiname> angegeben werden. Das Format der Prefs-Datei erklärt der Kasten auf der nächsten Seite.

Wenn man das Programm ohne weitere Parameter startet, nimmt es folgende Standardwerte an:

Zweizeiliges Display LPT1 (IRQ7,0x378), unidirektional Prefs-Datei = 'mapper.txt' Taste 0	(Drehknopf rechts) Cursor ab Taste 1	(Drehknopf links) Cursor auf Taste 2	Abbruch Taste 3	Bestätigung Taste 4	(Drehknopf drücken), Selektion an/aus Taste 5	Verzeichnis zurück Taste 6	Verzeichnis vor  

Die Parameter-Optionen des Programms CTPLAYER wurden um einige Punkte erweitert - zudem nennt es sich jetzt PUMP (Parallel Universal MP3 Player, auf der neuen Autoren-Webpage). Beim ersten Starten des frisch aufgebauten Projekts ist auf jeden Fall einmal die Option -kNN aufzurufen (NN je nach gewünschtem Kontrast von ca. 20 bis 50, also z.B. PUMP -k40), um den internen EEPROM-Speicher des Controllers zu initialisieren. Wird kein Display eingesetzt, muß die Ausgabe mit -d deaktiviert werden, da sonst Aussetzter bei der Wiedergabe auftreten können. Hier die möglichen Parameter in der Übersicht: *

Parameter Bedeutung
-h Hilfe anzeigen
-pNNN LPT-Adresse (default=$378)
-iNN LPT-Interrupt (default=7)
-b LPT ist bidirektional (default=unidirektional)
-zZ Anzahl der LCD-Zeilen {2|4} (default=4)
-e Zusätzliche Bildschirmausgabe und Eingabe über PC-Tastatur (default=aus)
-fName Dateiname für Mapper-Datei (default=mapper.txt)
-lNNNN Füllstandslimit für internen MP3-Datenpuffer (default=4096 Bytes)
-rNNNN Burstlänge beim Nachladen (default=2048 Bytes)
-kNN EEPROM Initialisierung mit LCD-Kontrastwert (default=20)
-d Display deaktivieren, auch falls nicht vorhanden
-t Hardware-Tastenpolling deaktivieren, auch falls nicht vorhanden
-sNN Scanrate der Tasten, ggf. vergrößerte Reaktionszeit bei verminderter LPT-Last
-c nur eine Flanke des Busy-Signals auswerten, für langsame Rechner
-C Ähnlich wie "-c", jedoch komplette Deaktivierung des Handshake bei INT-Übertragung. In Kombination mit "-d" und "-t" ergibt sich die schnellstmögliche Programmvariante für sehr langsame Rechner.

Das Programm unterteilt sich in drei Hauptschleifen - für jedes Menü eine. In diesen Hauptschleifen wird bei jedem Durchlauf geprüft, ob der Benutzer ein Ereignis (z. B. Drücken einer Taste) ausgelöst hat. Alles, was an das Display geschickt werden soll, landet in einer Warteschlange. In den Menüschleifen wird jeweils zunächst der gesamte Warteschlangen-Inhalt und dann pro Durchlauf ein Element an das Display geschickt. Damit wird einerseits eine merkliche Verzögerung bei Benutzereingabe vermieden und andererseits die Reaktionszeit des Interrupthandlers verkürzt.

Alle MP3-Daten, die an den MAS geschickt werden sollen, landen ebenfalls in einer Warteschlange, welche in den Menüschleifen ständig nachgefüllt wird. Wenn der MAS per Interrupt Daten anfordert, so wird in der Interruptbehandlungsroutine ('ISR') die nötige Anzahl an Bytes aus der Warteschlange an den MAS geschickt. Die Software wurde mit Borland-C++ 4.0 entwickelt. Prinzipiell sollte sich das Programm jedoch ohne wesentliche Änderungen auch mit anderen 16-Bit-Compilern kompilieren lassen.

Es ist vorgesehen, den Player auch per Infrarot (RC5) zu bedienen. In der Mapper-Datei kann man als jeweils ersten Wert (nach ) den RC5-Code (als CODE+ADRESSE) angeben. Da in dieser Version der Software keine Lernfunktion enthalten ist, muß man sich die Codes im Emulationsmodus wohl oder übel vom Display abschreiben und dann in die Mapper-Datei eintragen. Natürlich muß die in der nächsten c't beschriebene Bedieneinheit dann auch mit einem Infrarot-Empfänger bestückt sein.

Das hier vorgestellte Projekt versteht sich nicht als fertiges Produkt, sondern vielmehr als Anleitung, einen autarken MP3-Player selbst aufzubauen, wobei viel Spielraum für die konkrete Umsetzung und eigene Erweiterungen bleibt. Als Extreme seien hier zwei mögliche Konfigurationen vorgestellt:

Zum einen ist da die Billig-Lösung: Ein alter PC ohne Monitor, Festplatte, Tastatur, Sound- oder Netzwerkkarte, aber mit einem Floppy-Laufwerk und einem Single-Speed-CD-ROM an einer Controller-Karte - Hardware, die mangels Aktualität oft für einen Kasten Kaltgetränk den Besitzer wechselt. Unser Projekt verwandelt den PC in ein Gerät, mit dem man komplette MP3-CDs sequentiell, im Shuffle-Betrieb oder nach auf der Diskette gespeicherten Playlisten abspielen kann. Ganz nebenbei bietet er natürlich die Funktionalität eines normalen Audio-CD-Players.

Die MP3-Player-Platine paßt mitsamt Bedieneinheit in ein kompaktes Kunststoffgehäuse von 130 x 66 x 35 mm3. Möglich ist aber auch der Einbau mitsamt PC-Board in ein professionelles 19"-Rack.

Den Gegensatz dazu stellt die High-End-Version dar: Ein 486er Mini-AT-Board mit einem BIOS, das den Rechner in einen stromsparenden Suspend-Modus versetzt, wenn er nicht mit Abspielen beschäftigt ist, stellt das Herzstück dar. Zum schnellen geräuschlosen Booten dient eine EPROM-Karte, als Quelle für die MP3-Daten ein Atapi-CD-ROM- oder -DVD-Laufwerk und eine Netzwerkkarte, über die man Zugriff auf MP3-Dateien auf anderen Rechner im Netzwerk hat. Dank der geringen Stromaufnahme kann auf einen Lüfter verzichtet werden. Bringt man die beiden Steckkarten auf einer sogenannten Raiser-Card unter, einem Adapter, der den Einbau von ISA-Karten parallel zum Mainboard ermöglicht, paßt der Rechner in ein sehr flaches Slimline-Gehäuse, dessen Frontseite gerade genug Platz für die CD-ROM-Schublade, ein paar Tasten, den digitalen Drehknopf, und ein 48 x 240 Pixel großes grafikfähiges LC-Display bietet. Auf letzterem läßt sich eine komfortable Benutzeroberfläche realisieren, die keine Wünsche offenläßt und die trotz der Menge der Musikstücke deutlich einfacher zu bedienen ist als ein CD-Player.

Die beiden Beispiele zeigen, daß die Software nur als Grundlage zu verstehen ist - zu unterschiedlich sind die Anforderungen, die an sie im jeweiligen Umfeld gestellt werden. Durch einen vollständigen Satz an Low-Level-Routinen ist es jedoch für einen Benutzer, der über Programmier-Kenntnisse in C verfügt, nicht schwer, eigene Ideen umzusetzen. Als Beispiel sei eine Timer-Funktion genannt, die das morgendliche Wecken übernimmt, oder eine Bewertung des gerade laufenden Musikstückes per Knopfdruck, die fortan in der Wahrscheinlichkeit beim Abspielen im Shuffle-Play berücksichtigt wird. Einzelne Komponenten (Drehknopf, Tasten, Display und Fernbedienung) können auch unabhängig vom eigentlichen MP3-Player für andere Zwecke verwendet werden, zum Beispiel eine Statusanzeige eines Druckerspoolers auf dem Display oder eine Fernsteuerung beliebiger Funktionen per Infrarot-Fernbedienung.

Auch das Entwicklerteam des MP3-Players verfolgt natürlich noch weitergehende Ziele: Auf der Agenda stehen derzeit eine flexible Benutzeroberfläche, Anzeige langer Dateinamen und weiterer Informationen, eine mobile Version des Players sowie eine Version, die unter Multitasking-Betriebssystemen einsetzbar ist. Für alle diese Punkte gibt es bereits konkrete Vorstellungen, die hier kurz vorgestellt werden:

Zur Benutzeroberfläche: leider ist sie stark abhängig vom verwendeten Display und bei konventioneller Programmierung schwer anzupassen. Daher ist es sinnvoll, die Logik der Oberfläche als Automaten zu formalisieren: Das System befindet sich beispielsweise im Zustand A, führt bei Empfang des Signals x die Funktion f aus und geht in den Zustand B über. Für derartige Zustandsautomaten gibt es eine Reihe von Tools zum Erstellen von Übergangstabellen, die wiederum der Player einlesen kann, um so das Verhalten der Oberfläche zu steuern. So erhält man einerseits eine Menüstruktur, die relativ leicht erweiterbar ist, zum anderen genügt es für die Übertragung auf ein anderes Display, die jeweiligen Funktionen anzupassen.

Am vom Layout-Programm ausgeworfenen Schaltplan des MP3-Players haben wir zur Vorbeugung von Zeichenfehlern nichts geändert - daher die gewöhnungsbedürftige Darstellung.

Zu den MP3-Dateien: die einzigen Datei-Informationen, die unter MSDOS direkt verfügbar sind, sind kurze Dateinamen gemäß ISO9660-Konvention. Das reicht nicht aus, um auf einer CDROM mit 150 und mehr Dateien den Überblick zu behalten. Eine Alternative wäre das Erstellen von CDs mit Erweiterungen zur Speicherung langer Dateinamen auf einer CD gemäß Rock-Ridge Extensions (Unix) oder Joliet (Windows 32 Bit). Während erstere die langen Dateinamen in separaten Dateien speichern ('trans. tbl'), erfordern letztere eine Modifikation des CDROM-Dateisystem-Treibers (MSCDEX), beispielsweise auf Basis des frei verfügbaren MSCDEX-Ersatzes SHSUCDX von John H. McCoy. Allerdings sind Lohn der Mühe 'nur' lange Dateinamen, aus denen man bestenfalls Titel und Interpret des Musikstückes extrahieren kann. Ein besserer Ansatz ist das Speichern der Daten in einer separaten Textdatei, die die gewünschten Informationen für alle auf dem Datenträger vorhandenen MP3-Dateien enthält.

Die Platine (hier in 1,4facher Vergrößerung) benötigt eine Versorgungsspannung zwischen 7,5 und 10 V (Pluspol am Stift der Koax-Buchse). Das Layout als PostScript-File finden Sie hier. Abgebildet ist die korrigierte Version; bitte beachten Sie bei der

Zum Multitasking: Ob eine Taste gedrückt oder ein Infrarot-Signal empfangen wurde, kann die vorliegende Version des MP3-Players nur bemerken, indem sie die entsprechenden Daten vom MP3-Player anfordert. Dieses sogenannte Polling verbraucht Systemressourcen selbst dann, wenn überhaupt keine Eingabe erfolgt - eine unerwünschte Eigenschaft, wenn auf dem Rechner gleichzeitig andere Programme Rechenzeit benötigen. Abhilfe kann eine andere Programmierung des Mikrocontrollers schaffen, so daß Eingaben einen Interrupt auslösen, auf den die Software reagieren kann. Nach dieser Änderung stünde auch einem Einsatz des MP3-Players unter Linux nichts mehr im Wege - und wer würde nicht gerne seine Freunde mit einem Device beeindrucken, das den schönen Namen /dev/mp3 trägt?

Der MP3-Player selbst übt sich in Bescheidenheit, was Größe und Stromverbrauch angeht (55 x 103 x 10 mm3 und 140 mA bei 5 V); dem mobilen Einsatz steht also eher die Größe und der Strombedarf des verwendeten Computers und Speichermediums entgegen. PCs von der Größe eine Euro-Platine (100 x 160 mm2), die über alle nötigen Anschlüsse (Parallelport, IDE-Anschluß), ein angepaßtes DOS im ROM und etwas Flash-RAM verfügen, sind zwar erhältlich, jedoch nicht gerade billig. Noch schwieriger gestaltet sich die Auswahl eines geeigneten Speichermediums: CD-ROM-Laufwerke für gewöhnliche PCs oder Laptops, DVD-Laufwerke, ZIP-Drives und Flash-Speicher, alle stellen einen Kompromiß zwischen Größe, Kapazität und Preis dar. Wer also partout nicht auf MP3-Beschallung im eigenen PKW verzichten will, muß schon etwas tiefer in den Geldbeutel greifen, wenngleich nicht so tief wie für einen handelsüblichen Auto-CD-Wechsler.

Im abgedruckten Layout auf S. 209 der c't 9/99 ist die Polarität des Elkos C14 falsch eingezeichnet. Der Pluspol muß in Richtung Steckverbinder S8 weisen. Gleiches gilt für die LED D3 (zeigt gültigen MP3-Datenstrom an), ihre Kathode soll in Richtung R1 zeigen.

Zu beachten gilt bei der Zenerdiode, daß der verwendete Typ 1V4 aus zwei in Serie geschalteten Si-Dioden besteht (ein Zener-Effekt ist bei Spannungen unter 2V nicht zu erzielen). Dummerweise muß ein solches Exemplar in Durchlaßrichtung und nicht in Sperrichtung betrieben werden, so daß hier ebenfalls gilt: Umdrehen! Das Zener-Symbol ist zwar sinngemäß richtig, aber trotzdem muß der Kathodenring von D1 in Richtung C10 weisen. Ersatzweise können für D1 auch zwei in Serie geschaltete 1N4148 herhalten (Kathodenring ebenfalls in Richtung C10).

N3 ist kein 10k*8-Netzwerk, sondern eines mit 9 Widerständen (10k*9). Im gedruckten Bestückungsplan ist es um einen Pin zu kurz eingezeichnet. Die benötigte Versorgungsspannung läßt sich ggf. aus dem Rechner beziehen (z.B. gelbes +12V-Kabel der Laufwerks-Stromversorgung an Pin 2 von Steckverbinder S9). Der Spannungsregler U5 ist dann allerdings mit einem kleinen Kühlkörper zu versehen. Die Positionen R10 und R20 werden nicht bestückt, da der LCD-Kontrastwert per Programmparameter eingestellt wird. Der hier abgebildete Bestückungsplan wurde bereits entsprechend korrigiert. *

Der Aufbau der Platine dürfte dank der überwiegenden Verwendung 'bedrahteter' Bauteile kaum Probleme bereiten. Beachten Sie, daß die ICs U3 (Crystal CS4331) und U7 (74HC191) auf der Lötseite der Platine zu bestücken sind. Für die zwei SMD-Bauteile ist natürlich ein Lötkolben mit sehr dünner Spitze erforderlich. Für U1 und U2 sind 44polige PLCC-Fassungen vorgesehen; achten Sie auf die Ausrichtungen der abgeschrägten Kanten. Der erste Test kann selbstverständlich ohne die im nächsten Teil vorgestellte Bedieneinheit erfolgen. Bleibt nur noch der Hinweis, die kleinsten und flachsten Bauteile zuerst zu bestücken und die Platine vor dem Anschließen der Versorgungsspannung auf eventuell unterbrochene Leiterbahnen und Kurzschlüsse durch verirrte Lötperlen zu überprüfen. 

Weitere Hinweise und Berichtigungen unter: c't-Projekte

[1] Matthias Carstens, Musik kompakt, Audio-Kompression mit MPEG Layer 3, c't 21/98 S. 242

[2] Preliminary Data Sheet 'MAS 3507D MPEG 1/2 Layer 2/3 Audio Decoder', Micronas Intermetall

[3] Webpage von Crystal Semiconductor

[4] Webpage von Atmel

[5] Webpage von Micronas Intermetall: http://www.itt-sc.de

[6] Homepage der Autoren

MPEG Layer 3, im folgenden kurz MP3 genannt, beschreibt einen inzwischen weit verbreiteten Standard zur verlustbehafteten Kompression von digitalen Audiosignalen. Entwickelt wurde dieses Kompressionsverfahren seit 1987 am Fraunhofer-Institut in Erlangen (IIS) in Kooperation mit der dort ansässigen Universität im Rahmen des sogenannten EUREKA-Projektes. Ziel war es dabei, die ursprünglich relativ hohe Datenrate eines Audio-PCM-Signals, beispielsweise der CD mit mehr als 1,4 MBit/s, drastisch zu reduzieren. Entgegen den vorausgegangenen, einfacheren Kompressionsverfahren MPEG Layer 2 und Layer-1 war hier nicht die verfügbare Rechenleistung, sondern der erreichbare Kompressionsfaktor entscheidender Entwicklungsschwerpunkt. Mit diesem Ziel ließ sich die Kompressionsrate von ursprünglich 1:4 auf 1:10 bis 1:12 ohne merkliche Qualitätseinbußen steigern. So kann beispielsweise der komprimierte Audiodatenstrom einer CD in Echtzeit über eine 128 kBit/s schnelle ISDN-Leitung übertragen werden. Ursprünglich für den Einsatz bei Videokonferenzen und im Digital-Fernsehen (DVB) vorgesehen, setzte es sich zur Übertragung von Livereportagen bei Radiosendern und später im Internet durch.

Dabei ist die 'nahezu' verlustlose Kompression digitaler Audiodaten an sich nicht neu. So verwendete beispielsweise die inzwischen schon wieder historische digitale Kompaktkassette (DCC) von Philips eine Audiokomprimierung nach MPEG Layer 1, wodurch es möglich war, den auf ein Viertel reduzierten Datenstrom auf einer speziellen Kassette in der üblichen Längsaufzeichnung zu speichern. Ähnliches gilt für die von Sony vorgestellte MiniDisc, bei der ein nicht MPEG-konformes Komprimierungsverfahren mit einem Faktor von rund 1:5 verwendet wird.

Nach dieser kurzen Rückschau stellt sich nun die Frage, wie diese Komprimierungsverfahren und damit letztendlich das abwärtskompatible MP3 funktionieren. Gemeinsam ist allen Verfahren, daß sie zur Datenreduktion psychoakustische Phänomene ausnutzen, also Unzulänglichkeiten des menschlichen Gehörs - im Unterschied zu reinen Sprachkompressionsverfahren, wie sie beispielsweise in gängigen Mobiltelefonen zu einer noch wirksameren Kompression herangezogen werden. Maßgeblich ausgenutzt wird bei den MPEG-Verfahren der sogenannte Verdeckungseffekt, der prinzipiell in zwei Formen auftritt. Dem Menschen ist es nicht möglich, zwei frequenzmäßig benachbarte Töne mit einem gewissen Pegelunterschied aufzulösen, wobei der leisere Ton nicht wahrgenommen wird und somit nicht explizit mit übertragen werden muß. Ferner existiert noch ein zeitlicher Verdeckungseffekt, was zur Folge hat, daß unmittelbar vor und hinter einem überdurchschnittlich lauten Ton die leiseren Passagen nicht wahrgenommen werden. Diese Effekte legen es nahe, verschiedene Teilbereiche des wiedergegebenen Frequenzspektrums je nach aktuellen Anforderungen unterschiedlich genau pegelmäßig aufzulösen, d.h. zu quantisieren, wobei ohnehin nicht hörbare Signalanteile schlicht im Rauschen durch die Quantisierung mit wenigen Bits versinken.

Dieser Grundgedanke ist maßgeblich für die Kompression mit MPEG Layer 1 und alle folgenden. Hier wird durch eine Filterbank das Signal in 32 Teilbänder aufgespalten, wobei nach Normierung der verschiedenen Pegel in den Teilbändern mittels der Skalenfaktoren jedes Teilband einzeln mit einer dynamisch veränderlichen Auflösung zwischen zwei und 15 Bit (von ursprünglich 16 Bit) quantisiert wird. Die dazu erforderliche dynamische Bitzuweisung für die Teilbänder erfolgt an Hand eines psychoakustischen Modells im Kodierer. Die hierfür erforderliche, möglichst präzise Auflösung des Spektrums wird mittels einer schnellen Fouriertransformation (FFT) periodisch aus dem unkodierten Signals gewonnen. Zusammen mit den bereits errechneten Skalenfaktoren kann so die dynamische Bitzuweisung erfolgen. Abschließend werden alle angefallenen Bits zusammen mit weiteren Steuerinformationen gemultiplext und rahmenweise ausgegeben. Der dabei in dem wenige 100 Bytes lange Rahmen enthaltene Header dient unter anderem zur Synchronisation auf den fortlaufenden Datenstrom, falls beispielsweise der Dekodiervorgang mitten in einem MP3-Stück beginnt.

Um eine weitere Steigerung der Kompression ohne merkliche Qualitätseinbußen zu erzielen, müssen die Eigenschaften des psychoakustischen Modells bei erhöhter Rechenleistung auch besser ausgenutzt werden. Dies führt bei MPEG Layer 2 zu längeren Blöcken, die innerhalb eines Zyklus ausgewertet werden. Die neue Blocklänge von 36 statt 12 PCM-Abtastwerten hat dabei zur Folge, daß die zeitlichen Verdeckungseffekte innerhalb eines Blocks nicht mehr unberücksichtigt bleiben dürfen, so daß es notwendig wird, je nach Signal mehrere zeitlich aufeinanderfolgende Skalierungsfaktoren innerhalb eines Blocks zu verwenden. Hierzu erfolgt bei Layer-2 eine dynamische Zuweisung dieser Faktoren zu den verschiedenen Teilbändern. Zudem arbeitet die FFT zur Speisung des psychoakustischen Modells nun mit der doppelten Auflösung, um eine genauere Abschätzung der notwendigen Quantisierungsstufen zu ermitteln. Hochfrequente Signalanteile werden gezielt mit weniger Quantisierungsabstufungen behandelt, da hier die Signalenergie sehr viel geringer ist - womit sich in Kombination mit dem Packen der kodierten Bits die Datenrate weiter reduzieren läßt.

Um schließlich von dem bisher erreichten Kompressionsfaktor von acht auf zwölf zu kommen, erfolgt bei MPEG Layer 3 eine weitere Verfeinerung der Kompression, indem nun nicht mehr in 32, sondern 576 nicht gleichbreite Teilbänder aufgespalten wird. Anschließend wird in Anlehnung an das menschliche Gehör nicht mehr linear quantisiert, sondern nach entsprechenden Kennlinien. Zu guter Letzt sorgt eine Huffman-Kodierung, wie sie beispielsweise auch bei Packprogrammen wie 'pkzip' verwendet wird, für eine Unterdrückung redundanter Bits im Datenstrom. Natürlich ist auch mit diesem Aufwand keine bitgenaue Reproduktion der Original-Audio-Daten möglich, wie sie HiFi-Puristen (siehe auch http://www.heise.de/ct/Redaktion/cm/highendpc.html) gern verlangen. 

Layer und Datenraten
L1 1:4 384 kbps (Stereosignal, 16 Bit, 44,1 kHz)
L2 1:6 - 1:8 256 kbps bis 192 kbps (Stereosignal, 16 Bit, 44,1 kHz)
L3 1:10 - 1:12 128 kbps bis 112 kbps (Stereosignal, 16 Bit, 44,1 kHz)
Links zu MP3-Grundlagen
http://www.mp3.de Deutscher Info-Server
http://www.mp3-online.de Weitere Infos
http://www.mp3.com/faq Fragen und Antworten als Einstieg
http://mp3.free-web.de/mp3/technik.html Einige technische Infos
http://www.iis.fhg.de/amm/index.html Technik und Kompressionsverfahren
Stückliste
Halbleiter
D1 ZPD1V4 (Achtung: inverse Polung zu normalen Z-Dioden!) oder 2mal 1N4148 in Reihe *
D2 1N4001...1N4007 (stehend einlöten) *
D3 Low-Current-LED 3mm rot
T1 BC337
U1 AT90S8515 (PLCC, Atmel, programmiert)
U2 MAS3507D (PLCC, Micronas Intermetall)
U3 CS4331 SMD (Crystal)
U4 14,7456 MHz Quarz-Oszillator
U5 7805, Spannungsregler TO220
U7 74HC191 SMD
Kondensatoren
C2, C1 10µF/25V
C3, C4 680pF
C5...C9, C11,C12 100nF ker. RM 2,54
C10, C14, C17 22µF/16V Tantal
C13 100µF/25V
C15, C16 1n
Widerstände
N1 10k x 5 R-Array
N2 10k x 8 R-Array
N3 10k x 9 R-Array *
R1, R11, R21...R24 1k
R2,R3 2k2
R4,R5 56k
R6 15R (Displaybel., ggf. anpassen) *
R8 4k7
R9 15R
R12...R19, R25, R26 680R
R10, R20 obsolet, nicht bestücken *
Sonstiges
L1 100µH Drossel, axial, Widerstandsbauform
Platine MP3-Player, eMedia-Nr. 9909200dB
D-Sub25 male Printstecker *
2 Pfostenleisten 3pol., Pfostenleiste 6pol.
Steckerwannen 14pol.,16pol., 26pol. 2 PLCC-Fassungen
44pol. Koax-Kleinspannungsbuchse Print
Gleichspannungs-Netzteil 7,5 bis 10 V, 200 mA

(cm)