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.
Und was ist daran "untransparent" sich den Wert vom Betriebssystem zu holen? Oder geht es speziel um den AC97??
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.
Man kann den Wert der Soundkarte aber auch so auslesen, ansosnten hilft dir vieleicht das Stichwort "giveio"...
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.
Unter Linux kannst du mal in dev nach dsp schauen. Das ist deine Soundkarte. Bei mir gibts da zB dspctl - vermutlich steuer Register... lg
Hallo Wenn das geht ? Suche auch schon lange für Vb.Net Mikro oder Linie In Wert direkt auslesen. Link nicht gefunden! Gruß
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
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ß
vergessen Aufnahme und Wiedergabe ist kein Problem.
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?
Sollte aber in Echtzeit sein.(1/10 sec schadet nicht) Ähnlich der .zip Beitrag "Re: Register der Soundkarte (z.B. AC97) auslesen" Gruß
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); }' |
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.
Wenn das VU-meter das kann, dann muß es gehen ,aber wie.
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.
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..
> 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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.