Forum: PC-Programmierung Register der Soundkarte (z.B. AC97) auslesen


von Nils Kannengiesser (Gast)


Lesenswert?

Hallo,

ich suche eine Möglichkeit bei einer Soundkarte z.B. AC97, welche auf 
quasi jedem Board enthalten ist, die Register direkt auszulesen, um 
herauszufinden welche Spannung z.B. an LineIN anliegt.

Dabei soll ich - ganz wichtig - keine Treiber oder soetwas verwenden, 
sondern quasi den AC97 direkt ansteuern z.B. in Form eines Kernelmoduls 
für Linux also mit Assembler oder C oder DOS oder theoretisch auch 
Windows - hauptsache verständlich und transparent.

Ziel des Ganzen soll es sein einen Treiber zu schreiben, der die RAW 
Werte der anliegenden Spannung liefert, umso eine Art Oszilloskop 
"nachzubauen" und dabei möglichst transparent zu bleiben, damit 
Studierende dies Schritt für Schritt nachvollziehen können (daher darf 
ich auch keinen Treiber verwenden, weil man nicht wissen kann, was da 
passiert).

Das dies möglicherweise ungenau ist (nur bis 1-2 V) und wohl aufgrund 
des Kondensators bei Soundkarteneingängen keine Gleichspannung zu messen 
ist, sei zunächst irrelevant.

Leider habe ich bisher nur sehr wenige Informationen gefunden, wie das 
mit C gehen könnte. Hat jemand da vielleicht ein paar Tipps für mich?

Besten Dank.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Und was ist daran "untransparent" sich den Wert vom Betriebssystem zu 
holen? Oder geht es speziel um den AC97??

von John-eric K. (mockup)


Lesenswert?

Tja das Problem ist aber, das Windows(ab 2000) zB die direkten Hardware 
Zugriffe blockt! Unter Delphi gibt es die ZLPORTIO. Das ist eine 
Bibliotek bei der du die Adresse eingibst und auf Diese dann 
lesen/schreiben kannst.
Habe das benutzt, weil wir an unserer Uni einen Versuch in 
Mikroprozessortechnik mit einen an den AT-Bus (vor ISA noch) angehängten 
AD-Wandler hatten. Damit konnte ich sehr gut diesen Ansprechen.
Habe das unter WinXP programmiert und konnte so irgendwelche Register 
auf meinem System auslesen zum Testen.
Auf dem Win98 System wo diese Zusatz Platine eingebaut war, lief es 
auch.
Die anderen hatten glaube ich in c# mit cin und cout gearbeitet.
Was aber unter 2000/XP nicht mehr ging, weshalb die das nicht testen 
konnten.

Prof war auch begeistert.
Hatte noch keiner Probiert.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Man kann den Wert der Soundkarte aber auch so auslesen, ansosnten hilft 
dir vieleicht das Stichwort "giveio"...

von Peter (Gast)


Lesenswert?

ich glaube kaum das es überhaupt über Register geht. Das ganze wird ja 
über DMA übertragen. Man sagt also der Soundkarte nur das man die Daten 
an dieser speicher stelle braucht, den rest macht die Hardware.

Wenn es jedesmal über Port laufen würde, währe as viel zu langsam.

von Michael X. (Firma: vyuxc) (der-michl)


Lesenswert?

Sicher geht das. Du suchst mit einem PCI-Tool den Configuration Space 
des Audioteils . Dort stehen die Adressen deiner Register. Die 
Registerbeschreibung gibts im Datenblatt deiner Southbridge. Unter Dos 
könntest du jetzt mit -debug da drin rumpokeln.

von Peter (Gast)


Lesenswert?

@Michael X.
Klar stehen dort Register, aber glaube nicht das es da ein Register gibt 
welches den Aktuellen Pegel enthählt. Die Register sind zum Konfiguieren 
der Hardware da.

von ich (Gast)


Lesenswert?

Unter Linux kannst du mal in dev nach dsp schauen. Das ist deine 
Soundkarte.

Bei mir gibts da zB dspctl - vermutlich steuer Register...

lg

von Juppi J. (juppii)


Angehängte Dateien:

Lesenswert?

Hallo
Wenn das geht ?
Suche auch schon lange für Vb.Net
Mikro oder Linie In Wert direkt auslesen.
Link nicht gefunden!

Gruß

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

http://www.un4seen.com/ ist wohl ne DLL für Widergabe und Recording auch 
für VB.NET...
Hier ist ne Tutorial
http://www.michaelgaedtke.de/SubMenu_Messen/BASS-Tutorial-II.htm
Sieht nach Delphi aus, sollte sich in VB.net aber auch ansprechen 
lassen.
Für java gibt es mein ich ne entsprechende API
C++: http://www.buha.info/board/showthread.php?t=51641
Noch ne API: http://www.fmod.org/
Oder Windows API:
WaveIn:
 http://www.google.de/search?q=waveInOpen
 http://msdn.microsoft.com/en-us/library/aa452431.aspx

von Juppi J. (juppii)


Lesenswert?

hallo

Suche und teste und probiere schon über 1 Jahr.

Brauche ein lauffähigen Codeschnipsel in VB.net der mir mindestens einen 
8Bit Wert auf den Schirm bringt.

Alle bis jetzt gefundenen Teile hatten Fehler und ich konnte sie nicht 
zum laufen bringen.

Gruß

von Juppi J. (juppii)


Lesenswert?

vergessen

Aufnahme und Wiedergabe ist kein Problem.

von Εrnst B. (ernst)


Lesenswert?

Juppi J. wrote:

> Aufnahme und Wiedergabe ist kein Problem.

d.H. du musst nur noch aus dem Aufgenommenen ein (zufälliges) Sample 
auswählen, und das auf dem Bildschirm darstellen?
Oder den Mittelwert bilden?
Oder einfach das erste Sample nehmen?

von juppi J. (Gast)


Lesenswert?

Sollte aber in Echtzeit sein.(1/10 sec schadet nicht)

Ähnlich der .zip

Beitrag "Re: Register der Soundkarte (z.B. AC97) auslesen"

Gruß

von Εrnst B. (ernst)


Lesenswert?

Sorry, .ZIPs, die am Ende auch noch VB.net Code enthalten, schau ich mir 
nicht an, würde eh nicht verstehen was drinnen ist.

Aber vielleicht hilft dir ein bischen Linux-Quelltext weiter:
Liest von der Soundkarte Werte ein, nimmt jedes 8. Sample, teilt dieses 
von den 16Bit auf die gewünschten 8Bit runter, und zeigt es am 
Bildschirm an:
1
cat /dev/dsp | hexdump -d -v | awk '{ print int(0.5+$2/256.0); }'

von juppi J. (Gast)


Lesenswert?

Die .zip

ist ein VU-Meter als exe, wenn es VB.Net wäre hätte ich schon alles.
Es gibt noch mehr dieser Art.

Habe die irgendwoher aus dem Netz.

Ist wirklich gut.

MfG

von Εrnst B. (ernst)


Lesenswert?

Und wo ist jetzt genau dein Problem, das mit .NET selber zu machen? Wie 
weit bist du selber gekommen?

Schau dir auf MSDN mal die Doku zu "CaptureDevice", "Capture", 
"CaptureBuffer" an (In der Managed DirectX - Sektion)

Schaut relativ einfach aus, CaptureBuffer ist automatisch ein 
Ringbuffer, und hat eine "Read"-Methode, mit der du dir Teile des 
Buffer-Inhalts als Array auslesen kannst.
Und aus einem Array eine Zahl auszulesen und am Bildschirm darzustellen, 
kann ja auch nicht das Problem sein, oder?

von juppi J. (Gast)


Lesenswert?

Richtig

Schwer kann es nicht sein, aber wieso gibt es keine Codeschnipsel
die auch laufen und es wird relativ oft gesucht.

Für mich ist es nicht lebenswichtig, deswegen kümmere ich mich alle 
Wochen/Monate mal darum.
Ich habe auch schon daran gedacht.. wenn ich 1/10 sec aufnehme,
muß dies doch in einen Buffer, der dann ausgelesen wird.

ein kleiner Cod fehlt eben.

Buffer auslesen-> alles andere ist einfach.

Ich möchte nicht mehr große Programme schreiben.
Mache z.Z  Modellbahnsteuerung--Hardware und Software welche auf einen 
Touchscreen laufen soll.
16 Blöcke
16 Abfragen
8 Weichen

Frei Programmierbar für den Anwender.

Teste zur zeit aber nur 8 Ausgaben 8 Abfragen.

Max 7 Züge  ,es fahren aber z.Z nur Max. 4

geht auch, der Touch fällt ab und zu leider aus.

Gruß

von Rolf Magnus (Gast)


Lesenswert?

> Ziel des Ganzen soll es sein einen Treiber zu schreiben, der die RAW
> Werte der anliegenden Spannung liefert,

Was verstehst du denn unter "RAW-Werte", und was glaubst du, was der 
normale Soundtreiber an diesen Werten noch ändert?

> und dabei möglichst transparent zu bleiben, damit Studierende dies
> Schritt für Schritt nachvollziehen können (daher darf ich auch keinen
> Treiber verwenden, weil man nicht wissen kann, was da passiert).

Nun gut, du kannst dir auf kernel.org oder über das Package-System 
deiner Distro einfach die Kernel-Quellen runterladen. Da ist auch der 
Quellcode des Soundtreibers dabei. Den kannst du dir anschauen und dann 
nachbauen. Warum das dann "transparenter" sein soll als der 
Original-Treiber, weiß ich allerdings nicht.

von Nils Kannengiesser (Gast)


Lesenswert?

Hallo zusammen,

zunächst einmal herzlichen Dank für die ganzen Hilfen.

Als RAW Werte meinte ich den unveränderten Wert des Pegels der z.B. an 
Line-IN anliegt. Eine 16-Bit Soundkarte sollte über den A/D Wandler ja 
einen 16-Bit Wert erzeugen, der dem aktuellen Pegel entspricht. Genau 
diesen Wert möchte ich haben, so dass man quasi eine Art Oszilloskop 
damit nachbauen kann.

Hier stellt sich mir jetzt die Frage, wie dies geht, ohne das ich 
irgendwie Treiber verwenden muss und der genaue Ablauf damit 
undurchsichtig wird.

Universell wird es dann natürlich nicht gehen, aber z.B. im Fall des 
AC97 - gibt es da ein Register, wo dieser Wert ausgelesen werden kann?

Ich stelle mir das derzeit so vor, dass es ja eigentlich einfach eine 
Speicherstelle sein muss und ich nur die Adresse brauche. Oder komme ich 
nicht darum herum diverse Controller ansprechen zu müssen, um den Wert 
in den Hauptspeicher zu mappen?

Nochmal - ich möchte einfach nur den 16 Bit Wert des A/D Wandlers bei 
Soundkarten vom Typ AC97.

Ich vermute mal, dass es eventuell irgendwie über das 
Digital-Link-Interface gehen könnte, aber komme momentan nicht wirklich 
weiter.
http://download.intel.com/support/motherboards/desktop/sb/ac97_r23.pdf

Habe auch schon überlegt, ob vielleicht im OSS wo Informationen dazu zu 
finden sind (http://www.opensound.com/pguide/oss.pdf), aber bin bisher 
nicht fündig geworden.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Als RAW Werte meinte ich den unveränderten Wert des Pegels
> der z.B. an Line-IN anliegt. Eine 16-Bit Soundkarte sollte
> über den A/D Wandler ja einen 16-Bit Wert erzeugen, der dem
> aktuellen Pegel entspricht.

Üblich ist eine AC-Kopplung von Soundkarteneingängen, d.h. die 
Unterdrückung des Gleichspannungsanteiles durch einen Serienkondensator.

von juppi (Gast)


Lesenswert?

Nils Kannengiesser (Gast)

Genau das suche ich auch.

Habe nichts bis jetzt gefunden.

Wobei es englischsprachig das meiste gibt, was mir wenig nützt.

Bin jetzt soweit einmal experimentell zu versuchen,
ein VU-Meter zu starten und den Bildschirm oder das Fenster grafisch 
auszulesen.
Rein Programmtechnisch sollte es in VB.net gehen.

Gruß

von Εrnst B. (ernst)


Lesenswert?

Sorry, das mit dem "einfach mal auf das Register zugreifen" ging noch 
unter DOS (sowie den graphischen DOS-Aufsätzen)

Seitdem es Windows NT (+Nachfolger XP, Vista, 7...) gibt und seitdem es 
PCI gibt ist das alles nicht mehr so einfach.

Vorschlag 1:
Schnapp dir einen ALTEN PC vom Flohmarkt, installier DOS, pack eine 
ISA-SoundBlaster 16 rein, und greif frei Schnauze auf die Register zu.
Hat noch einen Vorteil: die SB16 ist noch halbwegs bastelfreundlich, 
vielleicht kriegst du das die AC-Kopplung leicht gebrückt.
SB16 ist sehr gut dokumentiert, weil damals jeder Programmierer den 
direkten Register-Friemel-Weg gegangen ist (gehen musste!)


Vorschlag 2:
Nimm einen aktuellen PC, und greif über die vorgesehenen Treiber und 
Schnittstellen auf die Soundkarte zu. Dann ist es auch egal ob AC97 oder 
nicht.

zum Thema Register:
Der AC97-Soundchip bei mir am Mainboard hat 512 Register und 4 KB 
memory mapped Buffer. Die Adressen der Register werden vom Bios 
vergeben, und könnten bei jedem mal booten woanders liegen.
Der Linux-Treiber dafür hat >10.000 Zeilen Code.

Im Vergleich: bei der SB16 reichen 7 (in Worten: "Sieben") Register um 
auf den DSP zuzugreifen (die anderen Register waren für den 
FM-Synthesizer und den CD-Rom-Port) und deine Aufgabe ist mit vielleicht 
100-200 Zeilen C-Code erschlagen.

von Nils Kannengiesser (Gast)


Lesenswert?

Naja, das mit den Ports unter Windows2000/XP soll nicht so das Problem 
sein - dafür habe ich bereits Möglichkeiten direkt auf die Hardware 
zuzugreifen bzw. alle Adressen für meine EXE freizuschalten.

Es ist eben nur die Frage, ob es eine Möglichkeit gibt auf das Register 
des AC97/LineIN bzw. auf die evtl. in den Hauptspeicher gemappten 
Adressen zuzugreifen oder ob es wirklich sehr kompliziert ist und 
zeitaufwendig ist. In den Dokumentation des AC97 habe ich bisher keinen 
Hinweis auf solch eine Adresse gefunden bzw. nur innerhalb des 
Controllers.

Bei mir handelt es sich jetzt mehr um ein kleines Projekt an der Uni und 
ich soll eben herausfinden, ob man zur heutigen Zeit noch relativ 
einfach auf die notwendigen Register (speziell AC97) zugreifen kann oder 
ob es ohne Treiber mit erheblichem Zeitaufwand verbunden bzw. eben nicht 
praktikabel ist.

von juppi (Gast)


Angehängte Dateien:

Lesenswert?

Wenn das VU-meter das kann,
dann muß es gehen ,aber wie.

von Michael X. (Firma: vyuxc) (der-michl)


Lesenswert?

Nils Kannengiesser schrieb:

> Ich stelle mir das derzeit so vor, dass es ja eigentlich einfach eine
> Speicherstelle sein muss und ich nur die Adresse brauche.
Du, das hab ich dir schon oben getippt. Den Adressoffset findest du im 
Datenblatt der Southbridge, die Adresse im PCI-Config-space. Das ganze 
ist Hardwareabhängig, kein Thema. Du wirst nicht um das Lesen der 
Datenblätter herumkommen.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Läubi .. schrieb:
> http://www.un4seen.com/ ist wohl ne DLL für Widergabe und Recording auch
> für VB.NET...
> Hier ist ne Tutorial
> http://www.michaelgaedtke.de/SubMenu_Messen/BASS-Tutorial-II.htm
> Sieht nach Delphi aus, sollte sich in VB.net aber auch ansprechen
> lassen.
> Für java gibt es mein ich ne entsprechende API
> C++: http://www.buha.info/board/showthread.php?t=51641
> Noch ne API: http://www.fmod.org/
> Oder Windows API:
> WaveIn:
>  http://www.google.de/search?q=waveInOpen
>  http://msdn.microsoft.com/en-us/library/aa452431.aspx
Hast du meine Links den mal verfolgt/Ausprobiert?
Da braucht man nix mit Register etc...
Wenns garnicht will: WAV file mit belibigem Audioprogramm aufzeichen und 
dann die Samples von dort lesen..

von Karl H. (kbuchegg)


Lesenswert?

> umso eine Art Oszilloskop
> "nachzubauen" und dabei möglichst transparent zu bleiben, damit
> Studierende dies Schritt für Schritt nachvollziehen können

Ich halte das ganze Vorgehen für ziemlich irreal.
Die Begriffe "Ich möchte direkt ans Register ran" und "es soll möglichst 
transparent sein" schließen sich ein einem modernen BS weitgehend aus. 
Denn genau das muss ein modernes BS ja verhindern, dass sich jemand 
unter Umgehung des BS an irgendwelchen Hardware-Registern zu schaffen 
macht.

Und transparent ist das ganze mit modernen Architekturen schon gar 
nicht. Die Zeiten an denen man eine fixe Hardware Adresse einfach 
abfragte, sind schon lange vorbei. Um das Register zu finden, muss man 
sauber durch die dokumentierten Konfigurationsfunktionalitäten 
durchgehen, ansonsten ist das alles sinnlos. Beim nächsten Rechner ist 
dann alles ganz wo anders zu finden.
Genau dieses ignorieren von Konfigurationsinfo hat unter DOS und den 
ersten Windows Versionen immer wieder zu Problemen geführt, weil 
vermeintlich clevere Programmierer wieder mal nur für 'ihre' Hardware 
programmiert haben und jegliche Konventionen ignoriert haben. So nach 
dem Muster: "solange mein BS nicht meckert, lese und schreibe ich in den 
Speicher wie ich lustig bin." DOS konnte sich nicht wehren und damit war 
das dann vermeintlich 'legitimiert'. Bis dann erst mal eine etwas 
umfangreichere Kundenbasis existierte, und das ganze Kartenhaus in sich 
zusammenbrach und mehr als genug Probleme im Support machte. Erst dann 
haben diese 'Hacker' begriffen, dass das Vorbeischummeln am BS nicht 
clever sondern dämlich ist. Unzählige Arbeitsstunden und eine Menge Geld 
ist dadurch vernichtet worden, dass man solche 'unerwünschten 
Interaktionen' zwischen Programmen suchen und beseitigen musste. Es ist 
super, wenn eine ISR unter DOS mal schnell eine Ausgabe direkt in den 
VGA Speicher macht. Geht wahnsinnig schnell! Wenn du allerdings ein CAD 
Programm schreibst und die Videokarte in einem anderen Modus betreibst, 
und dann dieselbe ISR dir den Videospeicher versaut und unmotiviert ein 
paar Pixel am Schirm auftauchen, dann wirst du nur noch sauer. Sauer 
wirst du auch, wenn du eine Druckausgabe programmierst und irgendeine 
andere ISR funkt dazwischen und muss partout auf dem LPT Port ein paar 
Bytes direkt rausknallen .... etc. etc.

von juppi (Gast)


Lesenswert?

@Läubi .. (laeubi
22.04.2009 20:48


Ich habe mich versucht da durchzukämpfen,leider für mich vergebens.
Kannte einen Teil davon schon.
Muß natürlich sagen das es für mich nicht so lebenswichtig ist.
Möchte nicht Wochen investieren um es dann doch nicht zu Nutzen.

Deswegen greife ich das Thema sporadisch auf.


>Wenns garnicht will: WAV file mit belibigem Audioprogramm aufzeichen und
>dann die Samples von dort lesen..


Brauche Echtzeit, 50mS Verzögerung geht auch.
...man könnte vielleicht ca 10-20mS aufnehmen , dann Pegel auslesen.

Gruß

von Nils Kannengießer (Gast)


Lesenswert?

Hallo zusammen,

ich habe mir jetzt die Hardwareinformationen und Adressen meiner 
Soundkarte besorgt (SiSoft Sandra). Wo kann ich denn jetzt am Besten die 
Informationen zu den Werten bekommen? DELL ist hier der Hersteller, aber 
ich vermute mal, wenn ich den Support damit belaste, dass man mir kaum 
helfen kann. SoundMAX scheint hingegen ein Gerät von 
http://www.analog.com zu sein. Das zugehörige Datenblatt finde ich 
bisher aber nicht so wirklich. Weiß jemand Rat, wo ich weitere 
Beschreibungen dazu finden kann/könnte?  --- Danke, Nils

Geräteinformation
Gerätetyp : Audio Multimediagerät
Gerätenummer : Bus 0, Gerät 1F, Funktion 5
Windowsgerätename : SoundMAX Integrated Digital Audio
OEM Gerätename : Intel 82801DB/DBL AC'97 Audio Controller (ICH4/ICH4-L 
A1)
OEM Hardware Nr. : VEN_8086, DEV_24C5, REV_01
Gerätename : Dell 82801DB/DBL AC'97 Audio Controller (ICH4/ICH4-L A1)
Produkt Nr. : VEN_1028, DEV_0126, REV_01
Revision : A2

Hardwareressourcen
E/A Bereich : 0000D800
E/A Bereich : 0000DC40
Speicherbereich : FFA00400
Speicherbereich : FFA00000

Bus 0, Gerät 1F, Funktion 5
00 - 0F : 86 80 C5 24 07 00 90 02 01 00 01 04 00 00 00 00
10 - 1F : 01 D8 00 00 41 DC 00 00 00 04 A0 FF 00 00 A0 FF
20 - 2F : 00 00 00 00 00 00 00 00 00 00 00 00 28 10 26 01
30 - 3F : 00 00 00 00 50 00 00 00 00 00 00 00 11 02 00 00
40 - 4F : 09 01 00 00 00 00 00 ............  [...]

von Εrnst B. (ernst)


Lesenswert?

Na, dann fröhlich ans Werk. Deinem Betriebssystem hast du schon 
beigebracht, dass das Sounddevice ab jetzt tabu ist?
Nein? Also: Erster Schritt, Treiber deinstallieren/deaktivieren, der 
pfuscht dir sonst nur ins Handwerk.

Jetzt etwas Beispielcode durchlesen:
im Linux-sourcecode bietet sich da natürlich die Datei 
"sound/pci/intel8x0.c" an, dort vielleicht die Funktion
1
static int snd_intel8x0_ich_chip_init(struct intel8x0 *chip, int probing)
als Einstiegspunkt.

Wenn du dann die Initialisierung soweit nachprogrammiert hast, schauen 
wir weiter zum PCM-Init, und wie du dann an deine Daten kommst.

von Nils Kannengießer (Gast)


Lesenswert?

Sie meinen diese Daten (von oben)?

00 - 0F : 86 80 C5 24 07 00 90 02 01 00 01 04 00 00 00 00
[...]

... die kann ich bereits mit dem jetztigen Programm auslesen:

U:\>TA_sound
Wert x=86
Wert x=80
Wert x=c5
Wert x=24
[...]

Für mich stellt sich jetzt nur die Frage, an welcher der Adressen ich 
den Wert für Line-IN finden könnte oder wird dieser durch die Soundkarte 
nicht kontinuierlich dort abgelegt? Momentan suche ich jetzt ein 
Datenblatt was mir die Fülle an Hex-Werten dort erläutern kann, 
scheitere aber momentan daran, dass ich nicht weiß, welches Gerät von 
Analog.com es genau ist ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.