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.
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.
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.
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.
@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.
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ß
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?
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:
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
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?
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ß
> 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.
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.
> 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.
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ß
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.
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.
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.
> 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.
@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ß
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 ............ [...]
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
als Einstiegspunkt.
Wenn du dann die Initialisierung soweit nachprogrammiert hast, schauen
wir weiter zum PCM-Init, und wie du dann an deine Daten kommst.
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 ...