Microfon Ansteuerung

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von MarkusGMuc.

    Microfon Ansteuerung

    Ich möchte Programmgesteuert das Micro auf den Audioausgang legen und auch die Lautstärke des Micros steuern können.
    Meine Recherchen im Netz führten bisher zu keinem brauchbaren Ergebnis.

    Ideal innerhalb dieser Sub :

    Friend Sub SetMicro(Volume As Integer) 'Volume 0 bis 100
    .
    .
    .
    End Sub


    Meine Programierumgebung : VS Express 2013, Importiert : CSCore Library sowie Naudio Library


    Danke schon einmal für die Antworten.
    @MarkusGMuc Willkommen im Forum. :thumbup:
    Zunächst würde ich das Mikrofon auf den Audioeingang legen.
    Um die Lautstärke einzer Kanäle zu regeln gugst Du z.B. hier,
    oder hier
    oder hier (musst Du nach VB.NET übertragen).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @MarkusGMuc Dann solltest Du mal das komplette Problem ordentlich beschreiben. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also Das Programm nutzt die AudioMeterInformation Klasse der CSCore.dll um ein PeakMeter zu betreiben.

    Es werden 3 WaveOut Klassen von der Naudio.dll genutzt auf denen mittels AudioFileReader (Ebenfalls von der Naudio) Teile oder ganze Mp3 - Dateien abgespielt werden. Von allen drei wird individuell die Volume über die Reader-Volume Eigenschaft gesteuert.

    Dies sind alle anderen Audio-Elemente der Software die hier wichtig sind.

    Ich möchte nun zusätzlich das Micro auf den Ausgang schalten und nur die Lautstärke ds Mikros variieren.

    @MarkusGMuc D.H., Du sollst in ein fertiges Programm einen weiteren Kanal implementieren.
    Dann musst Du verstehen, wie die anderen Kanäle funktionieren.
    Richtig helfen kann Dir nur jemand, der mit diesen DLLs Erfahrungen gesammelt hat. Ich nicht.
    Am besten, Du machst Dir ein kleines Testprojekt mit den gegebenen DLLs und spielst ein wenig mit den Kanälen, Prozeduren und Parametern.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich weiß, man sollte sich auf eine Anwendung konzentrieren. Naudio hatte ich zuerst implementiert zum Abspielen der Mp3. Aber es schlug fehl mit dieser Anwendung ein Peak-Meter für den Audio-Ausgang zu erstellen. Mit CScore lief dies Problemlos, aber der Versuch die gesamte Audio-Verarbeitung auf CScore zu portieren ging ebenfalls schief. Deswegen der Dualismus.

    Aber du kannst mir gerne passend Codes zuschicken zur Ansteuerung. 3 Unabhängige Kanäle denen man die mp3 Datei sowie Startzeit und Lautstärke mitteilt und von denen man die aktuelle Position auslesen kann um nach erreichen der Ende Zeit sie zu stoppen. Abgesehen vom individuellen Zugriff auf die Lautstärke zur Laufzeit...

    Und wie heißt nochmal der Satz ... never change a running system .... oder so ;)
    Edit :
    Mein Versuch mit CScore das Mikro zuzufügen :

    VB.NET-Quellcode

    1. Private capture As WasapiCapture
    2. Private soundOut = New WasapiOut
    3. Public Sub InitializeMicro()
    4. capture = New WasapiCapture()
    5. capture.Device = MMDeviceEnumerator.DefaultAudioEndpoint(DataFlow.Capture, Role.Multimedia)
    6. capture.Initialize()
    7. Dim source = New SoundInSource(capture)
    8. capture.Start()
    9. soundOut.Initialize(source)
    10. soundOut.Play()
    11. End Sub

    Ich bekomme eine Peak Anzeige im Windows Mixer, allerdings keinen Sound auf die Lautsprecher ... was mache ich falsch ?
    Außerdem wie steuere ich die Lautstärke ?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MarkusGMuc“ ()

    Ich frag mich ehrlich ... warum machen die lib - Programmierer so viel Geheimnisse darum ?
    Eine Ordentliche Dokumentation der Lib Fehlanzeige.
    Soll ein jeder der damit arbeiten möchte erst teure Kurse belegen ?
    Das ist meine Erachtens nicht der Zweck von Free und OpenSource

    Leute ehrlich ..... in so einem fall fällt mir fast nur noch der Götz ein ....

    X(
    Setz die FillWithZeros Eigenschaft der SoundInSource auf true.

    MarkusGMuc schrieb:

    Eine Ordentliche Dokumentation der Lib Fehlanzeige.
    Soll ein jeder der damit arbeiten möchte erst teure Kurse belegen ?
    Das ist meine Erachtens nicht der Zweck von Free und OpenSource

    Übrigens ... ich kann deinen Unmut durchaus nachvollziehen.
    Deine Aussage finde ich jedoch selbst sehr undankbar und überzogen.
    Kurse gibts überhaupt nicht. Ich habe mit diesen Bibliotheken noch keinen einzigen Cent verdient. Dafür steckt Jahre lange Arbeit in solchen Bibliotheken.
    Finde erstmal jemanden der jahrelang an etwas arbeitet und dies der ganzen Welt komplett unentgeltlich zur Verfügung stellt.
    Und als Allein-Autor von solchen Arbeiten eine vollumfängliche Doku zu schreiben ist nunmal auch kein Klacks.
    Sämtliche Public-Komponenten der Lib (außer die obsoleten ID3 Sachen), sind mit XML-Kommentaren versehen. Die fallen im Vergleich zu sehr vielen anderen Projekten auch nicht dünn aus.
    Wenn du einmal eine solche Quantität an Komponenten dokumentieren musstest, weißt du was das heißt. Das alleine sind Stunden über Stunden mühsamste Arbeit. Erneut ... in der Freizeit, unentgeltlich!
    Zudem wurde gerade CSCore auch schon sehr oft für den meist schnellen (in letzter Zeit nicht ganz so schnell ... aber im Durchschnitt immer noch sehr schnellen) Support gelobt.
    Mehr ist als Einzelperson neben Beruf etc. nicht möglich. Wenn du mehr möchtest, brauchst du jemanden der das beruflich macht. Da kannst du dir einen Berater bestellen(die Stunde > 100€) und Lizenzgebühren abdrücken.
    Bis dahin ... keiner zwingt dich diese Bibliotheken zu verwenden. Schreib sie selbst, kauf eine ... mach was du möchtest.
    Diese Undankbarkeit ist meines Erachtens nach nicht der Zweck von "Free und OpenSource".


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „thefiloe“ ()

    H U R R A !!!
    Es ist mit Naudio geschafft ... einzige Vorrausetzung der Hersteller hat dem Namen des Mikrofons einen Namen gegeben der "Mikro" oder "Micro" enthält.

    Code wegen Fehler entfernt

    Das Modul benötigt Cscore.dll und Naudio.dll

    Die AudioPeak Funktion gibt den Aktuellen OutputPeak wieder. Die Kanalnummer wird mittels Wert RL übergeben. Die Gültigkeit dieses Wertes wird allerdings nicht geprüft.
    Vor Beginn der Nutzung der Lautstärkeregelung muss erst InitializeMicro aufgerufen werden um die entspr. Geräte auszuwählen.
    Mit SetMicro wird nun die Lautstärke von 0 bis 100 angesteuert. Hierzu wird der Eingang angesteuert. Der Ausgang des Mikrofons bleibt davon unberührt. Bei der Benutzung muss dieser manuell angepasst werden.

    Ich hoffe dass dieser Eintrag vielen meiner Leidensgenossen hilft.

    Ich erkläre meinen, hier im Thread veröffentlichten Code als OpenSource, jeder darf diesen benutzen abändern und verbessern sowie für seine kommerziellen und nichtkommerziellen Projekte unter der Beachtung der Nutzungsbestimmungen der zugrunde liegenden Bibliotheken benutzen.
    Ich würde mich freuen wenn Abänderungen hier geposted würden.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MarkusGMuc“ ()

    Erste Änderungen, jetzt können die Namen aller aktiven Geräte in einer Collection abgefragt werden.
    Der Init Anweisung muss jetzt einer dieser Namen übergeben werden. Nur wenn das Gerät immer noch aktive ist wird dieses Gesetzt.
    <edit> Hier nun der Fehlerfreie Code :

    VB.NET-Quellcode

    1. Imports CSCore.CoreAudioAPI
    2. Imports NAudio.Wave
    3. Imports NAudio
    4. Imports NAudio.Mixer
    5. Imports System.Runtime.InteropServices
    6. Module Volume
    7. Private audioMeter As AudioMeterInformation
    8. Public Function AudioPeak(LR As Integer) As Integer
    9. If audioMeter Is Nothing Then
    10. audioMeter = AudioMeterInformation.FromDevice(MMDeviceEnumerator.DefaultAudioEndpoint(DataFlow.Render, Role.Multimedia))
    11. End If
    12. AudioPeak = Int(audioMeter.Item(LR) * 100)
    13. End Function
    14. Public lwaveIn As WaveIn
    15. Public mixerLine As MixerLine
    16. Public Sub InitializeMicro(DeviceID As String)
    17. If lwaveIn IsNot Nothing Then
    18. SetMicro(0)
    19. Mute(True)
    20. End If
    21. mixerLine = Nothing
    22. lwaveIn = New WaveIn()
    23. If DeviceID >= WaveIn.DeviceCount Then Exit Sub
    24. lwaveIn.DeviceNumber = Val(DeviceID)
    25. With lwaveIn
    26. .WaveFormat = New WaveFormat(8000, 1)
    27. mixerLine = .GetMixerLine
    28. End With
    29. Mute(False)
    30. End Sub
    31. Private Sub Mute(Value As Boolean)
    32. If mixerLine.IsDisconnected = True Then Exit Sub
    33. For Each MixEntry As MixerControl In mixerLine.Controls
    34. If MixEntry.ControlType = MixerControlType.Mute Then
    35. Dim mute As BooleanMixerControl
    36. mute = MixEntry
    37. mute.Value = Value
    38. End If
    39. Next
    40. End Sub
    41. Public Structure WavDev
    42. Public DeviceName As String
    43. Public DeviceID As String
    44. End Structure
    45. Public Function GetDevices() As Collection
    46. Dim Coll As New Collection
    47. Dim a As WavDev
    48. For ctd = 0 To WaveIn.DeviceCount - 1
    49. a.DeviceName = WaveIn.GetCapabilities(ctd).ProductName
    50. a.DeviceID = ctd
    51. Coll.Add(a)
    52. Next
    53. GetDevices = Coll
    54. End Function
    55. Public Sub SetMicro(Volume As Integer)
    56. Dim MicroVolume As UnsignedMixerControl
    57. Dim Vol As Integer
    58. If mixerLine.IsDisconnected = True Then Exit Sub
    59. For Each MixEntry As MixerControl In mixerLine.Controls
    60. If MixEntry.ControlType = MixerControlType.Volume Then
    61. MicroVolume = MixEntry
    62. Vol = (MicroVolume.MaxValue * Volume / 100)
    63. MicroVolume.Value = Vol
    64. End If
    65. Next
    66. End Sub
    67. Public Sub Destroy()
    68. SetMicro(0)
    69. Mute(True)
    70. mixerLine = Nothing
    71. lwaveIn.Dispose()
    72. End Sub


    Zur bisherigen Beschreibung folgende Änderung :
    Vor Beginn der Nutzung der Lautstärkeregelung muss erst InitializeMicro aufgerufen werden, der Routine ist die DeviceID zu Übergeben, um die entspr. Geräte auszuwählen. Diese kann aus der Auflistung GetDevices entnommen werden. Jeder Eintrag dieser Auflistung besteht aus dem Name des Gerätes sowie dessen DeviceID.
    Mit SetMicro wird nun die Lautstärke von 0 bis 100 angesteuert. Hierzu wird der Eingang angesteuert. Der Ausgang des Mikrofons bleibt davon unberührt. Bei der Benutzung muss dieser manuell angepasst werden.
    Mit der Destroy Routine wird die Ansteuerung zum Schluss entladen.

    Kurze Anmerkung: Wenn WaveIn nur innerhalb der InitMicro Sub Deklariert wird, führt dies zu massiven Performance Einbrüchen.

    Achtung dieser Code funktioniert nur für Mikro/LineIn welche im System ebenfalls als Ausgabegerät definiert sind.


    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „MarkusGMuc“ ()

    Zum Auslesen der aktuellen Lautstärke (0...100) muss folgende Funktion angefügt werden :

    VB.NET-Quellcode

    1. Public Function Get_MicroVolume() As Integer
    2. Dim MicroVolume As UnsignedMixerControl
    3. Dim Vol As Integer
    4. Get_MicroVolume = 0
    5. If mixerLine.IsDisconnected = True Then Exit Function
    6. For Each MixEntry As MixerControl In mixerLine.Controls
    7. If MixEntry.ControlType = MixerControlType.Volume Then
    8. MicroVolume = MixEntry
    9. Vol = MicroVolume.Value
    10. Get_MicroVolume = Vol * 100 / MicroVolume.MaxValue
    11. End If
    12. Next
    13. End Function