2009-07-28 11 views
4

Ich möchte drei Dinge tun:Verwalteter Zugriff auf Mikrofoneingang und Systemlautstärke

Zugriff auf Daten vom Mikrofon. Wirklich alles, was ich wissen möchte, ist die Gesamtlautstärke des von dem Gerät wahrgenommenen Geräusches.

Stellen Sie die Mikrofonverstärkung ein.

Legen Sie die Systemlautstärke fest.

Alle meine Windows-Erfahrung ist C#/WPF, also würde ich gerne verwaltet bleiben. Ich brauche keine außergewöhnlich hohe Leistung oder Echtzeitverarbeitung oder so etwas.

Ich habe mich umgesehen und es sieht so aus, als wäre SlimDX ein guter Wrapper dafür, aber selbst da bin ich nicht sicher, wo ich anfangen soll.

Sicher kann es nicht so schwer sein?

+1

Sicher kann es. :) – MusiGenesis

Antwort

6

Hier ist ein Link, der zeigt, wie der Audio-Mixer von C# in Windows zuzugreifen:

http://www.codeguru.com/csharp/csharp/cs_graphics/sound/article.php/c10931

So können Sie die Mikrofonverstärkung und die Systemlautstärke eingestellt. Der erste Teil ist allerdings etwas komplizierter. Im Grunde genommen müssen Sie mit der Aufzeichnung der Eingabe beginnen (mit DirectSound oder der waveInXXXX-API [mein persönlicher Favorit]). Wenn jeder Puffer mit Audio gefüllt wird, können Sie das Root Mean Square für den Puffer berechnen und daraus das Volumen schätzen.

bearbeiten: Hier ist ein Link zu einem Projekt (die ich erfolgreich eingesetzt und geändert haben, so dass ich weiß, es funktioniert), das zeigt, wie Audio-Aufnahme der waveInXXXX API:

http://www.codeproject.com/KB/audio-video/cswavrec.aspx?df=90&fid=16677&mpp=25&noise=3&sort=Position&view=Quick&select=3005817

Edit 2: und da ich es leid bin, Links zu veröffentlichen, hier ist eine Formel für die Berechnung der Root Mean Square eines Audio-Puffer (der Typ hier ist float [], aber es kann leicht geändert werden, um kurz [] zu handhaben, was Sie normalerweise von waveInXXXX erhalten würden):

+0

Danke für die informative Antwort. Dieses Sample stürzt jedoch ab, sobald ich den "Start" -Knopf drücke. –

+0

Welcher? Der erste oder der zweite? – MusiGenesis

+0

Warum ist der Float-Array-Parameter ref? sollte der Wert nicht ausreichen? –

4

Leider können Sie Daten aus verwaltetem Code nicht zuverlässig lesen (oder rendern), wenn Sie keine ernsthafte Latenz (in der Größenordnung von 0,5 Sekunden) benötigen. Das Problem besteht darin, dass die CLR den Prozess ohne Warnung für 250 Millisekunden unterbrechen kann. Normalerweise spielt dies keine Rolle, aber wenn Sie versuchen, eine isochrone Verarbeitung durchzuführen, kann dies ein bedeutendes Problem sein.

+0

Ich schrieb eine C# -App, die P/WaveIn * aufruft und einen Spektrographen (was ich dachte) in Echtzeit gerendert hat. Es schien keine Latenzprobleme dieser Größenordnung zu geben. War ich nur froh, dass ich nicht auf dieses Problem stieß? – MusiGenesis

+3

Möglicherweise haben Sie nicht genug Speicher oder einen GC-Zyklus ausgelöst. Es hängt auch davon ab, auf welchem ​​Betriebssystem Sie laufen. Unter Vista haben die Wave-APIs eine Latenz von etwa 100 Millisekunden, was sie widerstandsfähiger gegen Störungen macht. Auf XP und Win7 laufen sie mit etwa 30ms Latenz, was eher zu Störungen führt. –

+1

Ich benutze Vista. Danke, das ist eine gute Sache zu wissen. Mein Software-Synthesizer funktioniert nicht in Echtzeit, aber ich habe erwogen, eine Version zu schreiben, die das tut. Diese Art von Latenz würde dies fast unmöglich machen (ich gehe davon aus, dass die Latenzen auch für waveOut * gelten), da mein Klangerzeugungsprozess bereits relativ teuer ist. – MusiGenesis

3

Sie können NAudio verwenden, um Audio von dem Mikrofon in verwaltetem C# zu erfassen. Sehen Sie sich die Demo-Projekte an, um Beispiele dafür zu erhalten. Wie Larry oben erwähnt, erwarten Sie keine große Latenz. NAudio hat auch Wrapper für die Mixer-APIs verwaltet, mit denen Sie die Mikrofonlautstärke einstellen können, obwohl es schwierig sein kann, programmgesteuert die richtige Steuerung zu erhalten.

Verwandte Themen