| Zeile 1: | Zeile 1: | ||
AC'97 (Audio Codec '97) ist ein Audio-Standard, der von Intel im Jahre 1997 veröffentlicht wurde. Er wird hauptsächlich von On-Board-Chips und seltener von Soundkarten (bzw. Modems) verwendet. Seit 2004 wird er mehr und mehr von High Definition Audio Interface (HD Audio) abgelöst. | AC'97 (Audio Codec '97) ist ein Audio-Standard, der von Intel im Jahre 1997 veröffentlicht wurde. Er wird hauptsächlich von On-Board-Chips und seltener von Soundkarten (bzw. Modems) verwendet. Seit 2004 wird er mehr und mehr von High Definition Audio Interface (HD Audio) abgelöst. | ||
| − | Ich gehe in diesem (mehr oder weniger) Tutorial davon aus, dass ihr einen einigermaßen funktionierenden PCI-Treiber habt, von dem ihr von einem Gerät mit einer bestimmten Hersteller- und Geräte-ID die BARs (in diesem Fall I/O-Räume) herausfinden könnt. Außerdem solltet ihr euch einigermaßen mit dem Aufbau von Sounddateien (WAV, also unkomprimiert) und somit auch mit Begriffen wie PCM oder Samplerate auskennen. | + | Ich gehe in diesem (mehr oder weniger) Tutorial davon aus, dass ihr einen einigermaßen funktionierenden [[PCI]]-Treiber habt, von dem ihr von einem Gerät mit einer bestimmten Hersteller- und Geräte-ID die BARs (in diesem Fall I/O-Räume) herausfinden könnt. Außerdem solltet ihr euch einigermaßen mit dem Aufbau von Sounddateien (WAV, also unkomprimiert) und somit auch mit Begriffen wie PCM oder Samplerate auskennen. |
== Initialisierung == | == Initialisierung == | ||
| − | AC'97-kompatible Geräte erscheinen als PCI-Geräte mit dem Basisklassencode 04h (Multimediacontroller) und dem Subklassencode 01h (Audio). Doch das sind nur Soundkarten und entsprechende Chips im Allgemeinen, es kann sich bei solchen Geräten also auch um HD-Audio-Soundkarten oder andere inkompatible Audiogeräte handeln. Daher hier eine unvollständige Liste von AC'97-Geräten: | + | AC'97-kompatible Geräte erscheinen als [[PCI]]-Geräte mit dem Basisklassencode 04h (Multimediacontroller) und dem Subklassencode 01h (Audio). Doch das sind nur Soundkarten und entsprechende Chips im Allgemeinen, es kann sich bei solchen Geräten also auch um HD-Audio-Soundkarten oder andere inkompatible Audiogeräte handeln. Daher hier eine unvollständige Liste von AC'97-Geräten: |
{| {{Prettytable}} | {| {{Prettytable}} | ||
| Zeile 18: | Zeile 18: | ||
|} | |} | ||
| − | QEMU (0.10.0) und VirtualBox (2.1.4) nutzen ICH. Die in diesem Tutorial vorgestellten Codes funktionieren leider anscheinend auch nur dort. | + | [[QEMU]] (0.10.0) und [[VirtualBox]] (2.1.4) nutzen ICH. Die in diesem Tutorial vorgestellten Codes funktionieren leider anscheinend auch nur dort. |
| − | Die Geräte besitzen zwei I/O-Räume, der erste heißt NAM-BAR (Native Audio Mixer BAR) und der zweite NABM-BAR (Native Audio Bus Master BAR). Mit den Registern in NAM-BAR wird der Mixer gesteuert (also Lautstärke, Samplerate, ...), mit denen in NABM-BAR wird das Abspielen gesteuert (Play/Pause, Soundbuffer, ...). Um diese I/O-Räume zu aktivieren und den Bus Master zu starten, muss der Wert des Registers „COMMAND“ im PCI-Konfigurationsraum mit 0x05 „ge-Or-t“ werden. Ein Beispiel: | + | Die Geräte besitzen zwei I/O-Räume, der erste heißt NAM-BAR (Native Audio Mixer BAR) und der zweite NABM-BAR (Native Audio Bus Master BAR). Mit den Registern in NAM-BAR wird der Mixer gesteuert (also Lautstärke, Samplerate, ...), mit denen in NABM-BAR wird das Abspielen gesteuert (Play/Pause, Soundbuffer, ...). Um diese I/O-Räume zu aktivieren und den Bus Master zu starten, muss der Wert des Registers „COMMAND“ im [[PCI]]-Konfigurationsraum mit 0x05 „ge-Or-t“ werden. Ein Beispiel: |
<c>pciConfigWrite(Bus, Geraet, Funktion, PCI_COMMAND, pciConfigRead(Bus, Geraet, Funktion, PCI_COMMAND) | 5)</c> | <c>pciConfigWrite(Bus, Geraet, Funktion, PCI_COMMAND, pciConfigRead(Bus, Geraet, Funktion, PCI_COMMAND) | 5)</c> | ||
| Zeile 94: | Zeile 94: | ||
|} | |} | ||
| − | * IOC (Interrupt On Completion): Wenn gesetzt, so sendet das Gerät | + | * IOC (Interrupt On Completion): Wenn gesetzt, so sendet das Gerät einen [[Interrupt]], wenn dieser Buffer abgespielt wurde. |
* BUP (Buffer Underrun Policy): Dieses Bit wird dann wichtig, wenn dieser Buffer der letzte abzuspielende oder der nächste Buffer noch nicht bereit ist: Ist das Bit dann nicht gesetzt, so wird nach dem Abspielen das letzte Sample dieses Buffers gehalten, ist es gesetzt, so wird „0“ gesendet. Typischerweise ist es beim letzten abzuspielenden Buffer gesetzt. | * BUP (Buffer Underrun Policy): Dieses Bit wird dann wichtig, wenn dieser Buffer der letzte abzuspielende oder der nächste Buffer noch nicht bereit ist: Ist das Bit dann nicht gesetzt, so wird nach dem Abspielen das letzte Sample dieses Buffers gehalten, ist es gesetzt, so wird „0“ gesendet. Typischerweise ist es beim letzten abzuspielenden Buffer gesetzt. | ||
| Zeile 143: | Zeile 143: | ||
outb(nabmbar + PORT_NABM_POCONTROL, 0x15); //Abspielen, und danach auch Interrupt generieren!</c> | outb(nabmbar + PORT_NABM_POCONTROL, 0x15); //Abspielen, und danach auch Interrupt generieren!</c> | ||
| − | Funktioniert unter QEMU 0.10.0 und VirtualBox 2.1.4... Im Speicher müssen, wie oben gesagt, 16-Bit-Stereosamples mit einer Samplerate von 44,1 kHz (oder was ihr auch immer eingestellt habt), stehen. | + | Funktioniert unter [[QEMU]] 0.10.0 und [[VirtualBox]] 2.1.4... Im Speicher müssen, wie oben gesagt, 16-Bit-Stereosamples mit einer Samplerate von 44,1 kHz (oder was ihr auch immer eingestellt habt), stehen. |
== Anhang == | == Anhang == | ||
| Zeile 164: | Zeile 164: | ||
== Hinweise zu den Codes == | == Hinweise zu den Codes == | ||
| − | Die Codes stammen (ganz leicht modifiziert) aus dem Betriebssystem MyXomycota, stehen somit also unter der GPL. Da ich aber die Lizenz bestimmen kann, erlaube ich natürlich auch die Freigabe unter einer BSD-artigen Lizenz, der LGPL oder unter den CC-Lizenzen, die „by“ enthalten. Credits wären natürlich schön, wenn der Code größtenteils unverändert übernommen wird. | + | Die Codes stammen (ganz leicht modifiziert) aus dem Betriebssystem MyXomycota, stehen somit also unter der [[GPL]]. Da ich aber die Lizenz bestimmen kann, erlaube ich natürlich auch die Freigabe unter einer BSD-artigen Lizenz, der LGPL oder unter den CC-Lizenzen, die „by“ enthalten. Credits wären natürlich schön, wenn der Code größtenteils unverändert übernommen wird. |
Wer den Code unter anderen Lizenzen verwenden will, kann mich einfach fragen, ich sehe da keine Hindernisse. Ich bin fast täglich im IRC (irc.euirc.net#lost). | Wer den Code unter anderen Lizenzen verwenden will, kann mich einfach fragen, ich sehe da keine Hindernisse. Ich bin fast täglich im IRC (irc.euirc.net#lost). | ||