Microphone Live Playback

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 34 Antworten in diesem Thema. Der letzte Beitrag () ist von NoIde.

    Microphone Live Playback

    Moin Leute :)

    Ich arbeite grade zurzeit an einen Soundrecorder und Versuche eine Liveaufnahme des Microphones zu machen. Leider Funktioniert mein Quellcode nicht. Vielleicht kommt ihr ja weiter. Danke im Voraus.

    VB.NET-Quellcode

    1. Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal Command As String, ByVal ReturnString As String, ByVal ReturnLength As Integer, ByVal Callback As Integer) As Integer
    2. Dim returnstring As String
    3. returnstring = New String("", 196)
    4. Call mciSendString("open new Type waveaudio Alias recsound", returnstring, 196, callback)
    5. Call mciSendString("set capture time format ms bitspersample 16 channels 2 samplespersec 32000", returnstring, 2048, 0)
    6. Call mciSendString("play recsound", returnstring, 196, callback)

    MFG Marvin :)

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @Eddy und natürlich auch @alle anderen, die das hier lesen.
    Hat jemand evtl. ein Beispiel wie ich das Problem (Mikrofon live ausgeben) mit der Bass.dll umsetzen kann bzw. einen Link, der 100% funktioniert. (Muss nicht kompletter Code sein, aber eine erklärung was, wieso und warum wäre nützlich)
    Mit der Bass.dll hab ich bislang nur Codes gefunden, welche (bei mir) nur eine Soundquelle (Hauptlautstärke) aufnehmen können. (Hab ich auch schon erfolgreich umsetzen können).
    Aber ein Mikrofon aufnehmen (ein USB-Mikrofon) habe ich leider noch nicht hinbekommen
    Und mit CSCore von @thefiloe bekomm ich eine Latenz von 1 Sekunde, was mir dann doch zu viel ist, zumal ich weiß, dass es mit einer andren Lib (ziemlich sicher eben die bass.dll) auch viel kleinere Latenzen gibt. Vielleicht geht dies jedoch auch mit CSCore?
    Vielleicht habe ich aber auch falsch gesucht. :)Wenn ihr mehr Infos braucht, bitte Bescheid sagen, ich wollt jetzt keinen Roman schreiben :
    Wie immer wäre ich über jede Hilfe dankbar.
    LG und schönen Abend Pat Rick
    Hi,

    so gut wie die Bass.dll bzw. die BassNet.dll dokumentiert ist, auch Beispielen(auch in den Downloads) sind dort zu finden, da kann ich nicht glauben das ma da nichts findet. Aber Egal, hier ein minimales Beispiel zum abspielen des Mikrofons und gleichzeitige Aufnahme. Ihe braucht natuerlich einen Verweiss auf die BassNet.dll, dazu braucht ihr die bassenc.dll und die bass.dll im debug/release-ordner, eine Kopie der bassnet sollte automatisch hinzugefuegt werden. Dazu noch ein wenig Code und feddich. Achtet bei den Funktionen Bass.BASS_Init und Bass.BASS_RecordInit mal auf die -1. Damit werden jeweils die Gereate ausgewaehlt, -1 bedeutet das StandartWiedergabeGeraet, wie auch StandartAufnahmeGeraet. Das aufzunehmende Microfon sollte also das Standartaufnahmegeraet sein. Die Aufnahme(bzw. das schreiben des Sounds in die Datei) wird mit der Funktion BassEnc.BASS_Encode_Start[b][/b] gestartet.

    Die bassenc.dll wird nur benoetigt, wenn aufgezeichnet werden soll.

    Wie man saemtliche Devices enumeriert und auswaehlt, bleibt euch ueberlassen, ist aber Trivial und in der Doku nahezu C&P-Ready zu finden.

    VB.NET-Quellcode

    1. Imports Un4seen.Bass
    2. Imports Un4seen.Bass.AddOn.Enc
    3. Public Class Form1
    4. Private MicroRecordingProc As RECORDPROC
    5. Private MicroInput, MicroOutput As Integer
    6. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    7. Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_SPEAKERS, IntPtr.Zero, Nothing)
    8. Bass.BASS_RecordInit(-1)
    9. MicroRecordingProc = New RECORDPROC(AddressOf MicroRecordingCallback)
    10. MicroOutput = Bass.BASS_StreamCreate(44100, 1, BASSFlag.BASS_DEFAULT, BASSStreamProc.STREAMPROC_PUSH)
    11. MicroInput = Bass.BASS_RecordStart(44100, 1, BASSFlag.BASS_STREAM_DECODE, MicroRecordingProc, IntPtr.Zero)
    12. BassEnc.BASS_Encode_Start(MicroInput, "D:\micro_record.wav", BASSEncode.BASS_ENCODE_PCM Or BASSEncode.BASS_ENCODE_AUTOFREE, Nothing, Nothing)
    13. End Sub
    14. Public Function MicroRecordingCallback(ByVal handle As Integer, ByVal buffer As IntPtr, ByVal length As Integer, ByVal user As IntPtr) As Boolean
    15. Bass.BASS_StreamPutData(MicroOutput, buffer, length)
    16. Bass.BASS_ChannelPlay(MicroOutput, False)
    17. Return True
    18. End Function
    19. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    20. BassEnc.BASS_Encode_Stop(MicroInput)
    21. Bass.BASS_ChannelStop(MicroOutput)
    22. Bass.BASS_StreamFree(MicroOutput)
    23. BassEnc.FreeMe()
    24. Bass.BASS_Free()
    25. End Sub
    26. End Class

    And i think to myself... what a wonderfuL World!

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Eddy“ ()

    Pat Rick schrieb:

    Und mit CSCore von @thefiloe bekomm ich eine Latenz von 1 Sekunde,

    Wohl kaum. Bei 10-50 ms bist du locker dabei.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Sorry war nicht böse gemeint, aber da ich kein Profi bin, und nur nebenbei an einem Projekt arbeite habe ich es mit CSCore leider nicht geschafft. Ich habe das Rekorder Sample von github (Von Loopback auf Mikrofon umgestellt im Code) verwendet. Vielleicht habe ich damals etwas übersehen, ist auch schon ca. ein halbes Jahr her, dass ich es mit CSCore probiert habe. Ich bin wahrscheinlich zu dumm dafür. (Habe mir den c# code auch online übersetzen lassen müssen). Deswegen bin ich hier auch immer dankbar, wenn es Beispiele mit Erklärungen gibt. Hier haben mir schon viele geholfen, ohne dass sie es wissen :)
    LG Pat Rick
    So nach langer Zeit und viel Probieren stehe ich nun wieder an. Ich habe den Code von @Eddy aus Post 6 verwendet, um zu verstehen wie das Mikrofon durchschleifen funktioniert.
    Ich habe mir jetzt zum Test ein Projekt mit 2 Buttons, 4 Comboboxen und 2 Trackbars erstellt.
    Ich kann:Ein Mikrofon auswählen (Combobox3) und es dann via Soundkarte (Intern sowie extern über USB, ausgewählt durch Combobox1) abspielen. Button 1 aktiviert das Mik (Button wird rot, Laustärke wird auf 1 gesetzt) die Trackbar1 steuert die Lautstärke, wenn Button1 grau ist , dann wurde die Latstärke unabhängig der Trackbar auf 0 gesetzt
    Ich kann das ganze Auch mit Combobox4, Combobox2, Button2 und Trackbar2 machen. Gleiches Prinzip.
    Nun möchte ich aber mit Combobox4 das Loopback der Soundkarte (Combobox1) ansprechen und über eine andere Soundkarte (ausgewählt über Combobox2) abspielen. Leider schaffe ich es nicht mit der internen Soundkarte die externe nochmals abzuhören. Hier mein/ Eddys bisheriger Code:

    VB.NET-Quellcode

    1. ​Imports Un4seen.Bass
    2. Imports Un4seen.BassAsio
    3. Imports Un4seen.BassWasapi
    4. Public Class Form1
    5. Private aMicroRecordingProc As RECORDPROC
    6. Private bMicroRecordingProc As RECORDPROC
    7. Private aMicroInput, aMicroOutput As Integer
    8. Private bMicroInput, bMicroOutput As Integer
    9. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    10. Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_SPEAKERS, IntPtr.Zero, Nothing)
    11. Bass.BASS_RecordInit(-1)
    12. ladeaudiogeräte()
    13. End Sub
    14. Private Sub ladeaudiogeräte()
    15. Dim n As Integer = 0
    16. Dim info As New BASS_DEVICEINFO()
    17. While (Bass.BASS_GetDeviceInfo(n, info))
    18. ComboBox1.Items.Add(n & "- [DIRECTSOUND] " & info.name)
    19. ComboBox2.Items.Add(n & "- [DIRECTSOUND] " & info.name)
    20. ComboBox3.Items.Add(n & "- [DIRECTSOUND] " & info.name)
    21. ComboBox4.Items.Add(n & "- [DIRECTSOUND] " & info.name)
    22. n += 1
    23. End While
    24. Dim xinfo As New BASS_WASAPI_DEVICEINFO
    25. While (BassWasapi.BASS_WASAPI_GetDeviceInfo(n, xinfo))
    26. If xinfo.IsLoopback = True Then
    27. ComboBox1.Items.Add(n & "- [WASAPI--LOOPBACK] " & xinfo.name)
    28. ComboBox2.Items.Add(n & "- [WASAPI--LOOPBACK] " & xinfo.name)
    29. ComboBox3.Items.Add(n & "- [WASAPI--LOOPBACK] " & xinfo.name)
    30. ComboBox4.Items.Add(n & "- [WASAPI--LOOPBACK] " & xinfo.name)
    31. ElseIf xinfo.SupportsRecording Then
    32. ComboBox1.Items.Add(n & "- [WASAPI--RECORD] " & xinfo.name)
    33. ComboBox2.Items.Add(n & "- [WASAPI--RECORD] " & xinfo.name)
    34. ComboBox3.Items.Add(n & "- [WASAPI--RECORD] " & xinfo.name)
    35. ComboBox4.Items.Add(n & "- [WASAPI--RECORD] " & xinfo.name)
    36. Else
    37. ComboBox1.Items.Add(n & "- [WASAPI--LISTENING] " & xinfo.name)
    38. ComboBox2.Items.Add(n & "- [WASAPI--LISTENING] " & xinfo.name)
    39. ComboBox3.Items.Add(n & "- [WASAPI--LISTENING] " & xinfo.name)
    40. ComboBox4.Items.Add(n & "- [WASAPI--LISTENING] " & xinfo.name)
    41. End If
    42. n += 1
    43. End While
    44. Dim yinfo As New BASS_ASIO_DEVICEINFO
    45. While (BassAsio.BASS_ASIO_GetDeviceInfo(n, yinfo))
    46. ComboBox1.Items.Add(n & "- [ASIO] " & yinfo.name)
    47. ComboBox2.Items.Add(n & "- [ASIO] " & yinfo.name)
    48. ComboBox3.Items.Add(n & "- [ASIO] " & yinfo.name)
    49. ComboBox4.Items.Add(n & "- [ASIO] " & yinfo.name)
    50. n += 1
    51. End While
    52. End Sub
    53. Public Function aMicroRecordingCallback(ByVal handle As Integer, ByVal buffer As IntPtr, ByVal length As Integer, ByVal user As IntPtr) As Boolean
    54. Bass.BASS_StreamPutData(aMicroOutput, buffer, length)
    55. Bass.BASS_ChannelPlay(aMicroOutput, False)
    56. Return True
    57. End Function
    58. Public Function bMicroRecordingCallback(ByVal handle As Integer, ByVal buffer As IntPtr, ByVal length As Integer, ByVal user As IntPtr) As Boolean
    59. Bass.BASS_StreamPutData(bMicroOutput, buffer, length)
    60. Bass.BASS_ChannelPlay(bMicroOutput, False)
    61. Return True
    62. End Function
    63. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    64. If Not Button1.BackColor = Color.Red Then
    65. Button1.BackColor = Color.Red
    66. Bass.BASS_ChannelSetAttribute(aMicroOutput, BASSAttribute.BASS_ATTRIB_VOL, TrackBar1.Value / 100)
    67. Else
    68. Button1.BackColor = DefaultBackColor
    69. Bass.BASS_ChannelSetAttribute(aMicroOutput, BASSAttribute.BASS_ATTRIB_VOL, 0)
    70. End If
    71. End Sub
    72. Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
    73. aMicroRecordingProc = New RECORDPROC(AddressOf aMicroRecordingCallback)
    74. aMicroOutput = Bass.BASS_StreamCreate(44100, 1, BASSFlag.BASS_DEFAULT, BASSStreamProc.STREAMPROC_PUSH)
    75. aMicroInput = BassWasapi.BASS_WASAPI_SetDevice(ComboBox1.Items(ComboBox1.SelectedIndex).ToString.Split("-")(0))
    76. aMicroInput = Bass.BASS_RecordStart(44100, 1, BASSFlag.BASS_STREAM_DECODE, aMicroRecordingProc, IntPtr.Zero)
    77. Bass.BASS_ChannelSetAttribute(aMicroOutput, BASSAttribute.BASS_ATTRIB_VOL, 0)
    78. End Sub
    79. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    80. If Not Button2.BackColor = Color.Red Then
    81. Button2.BackColor = Color.Red
    82. Bass.BASS_ChannelSetAttribute(bMicroOutput, BASSAttribute.BASS_ATTRIB_VOL, TrackBar2.Value / 100)
    83. Else
    84. Button2.BackColor = DefaultBackColor
    85. Bass.BASS_ChannelSetAttribute(bMicroOutput, BASSAttribute.BASS_ATTRIB_VOL, 0)
    86. End If
    87. End Sub
    88. Private Sub TrackBar1_Scroll(sender As Object, e As EventArgs) Handles TrackBar1.Scroll
    89. If Button1.BackColor = Color.Red Then
    90. Bass.BASS_ChannelSetAttribute(aMicroOutput, BASSAttribute.BASS_ATTRIB_VOL, TrackBar1.Value / 100)
    91. Else
    92. End If
    93. End Sub
    94. Private Sub TrackBar2_Scroll(sender As Object, e As EventArgs) Handles TrackBar2.Scroll
    95. If Button2.BackColor = Color.Red Then
    96. Bass.BASS_ChannelSetAttribute(bMicroOutput, BASSAttribute.BASS_ATTRIB_VOL, TrackBar2.Value / 100)
    97. Else
    98. End If
    99. End Sub
    100. Private Sub ComboBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox2.SelectedIndexChanged
    101. bMicroRecordingProc = New RECORDPROC(AddressOf bMicroRecordingCallback)
    102. bMicroOutput = Bass.BASS_StreamCreate(44100, 1, BASSFlag.BASS_DEFAULT, BASSStreamProc.STREAMPROC_PUSH)
    103. bMicroInput = BassWasapi.BASS_WASAPI_SetDevice(ComboBox2.Items(ComboBox2.SelectedIndex).ToString.Split("-")(0))
    104. bMicroInput = Bass.BASS_RecordStart(44100, 1, BASSFlag.BASS_STREAM_DECODE, bMicroRecordingProc, IntPtr.Zero)
    105. Bass.BASS_ChannelSetAttribute(bMicroOutput, BASSAttribute.BASS_ATTRIB_VOL, 0)
    106. End Sub
    107. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    108. Bass.BASS_ChannelStop(aMicroOutput)
    109. Bass.BASS_StreamFree(aMicroOutput)
    110. Bass.BASS_ChannelStop(bMicroOutput)
    111. Bass.BASS_StreamFree(bMicroOutput)
    112. Bass.BASS_Free()
    113. End Sub
    114. End Class

    Vielleicht kann mir ja jemand von euch weiterhelfen und mich in die richtige Spur lenken. Vielen Dank schon im Voraus, Pat Rick
    Hab nur den Code überflogen, aber was ich schon mal sehe ist, dass du nur das Standart-Aufnahme, wie auch Standart-Ausgabe Device initialisierst, du musst alle initialisieren die du nutzen willst.

    VB.NET-Quellcode

    1. '-1 ist immer das Standart-Device
    2. Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_SPEAKERS, IntPtr.Zero, Nothing)
    3. Bass.BASS_RecordInit(-1)

    Auch musst du dann das device festlegen, das geht mit BASS_SetDevice bzw. BASS_WASAPI_SetDevice.
    bass.radio42.com/help/html/9c6…19d-4484-4e7832500c6a.htm
    bass.radio42.com/help/html/e6b…07b-4b44-6d30ffd7c3cc.htm

    Vllt. schaust du auch mal hier rein, das könnte dir auch weiterhelfen.
    Soundaufnahme, Systemsound, Mikrofon etc...
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

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

    So na dann: 1 Woche ist nun vergangen, ich konnte einiges neues erkennen, aber der Durchbruch ist noch nicht gelungen: Ich habe nun alle gefundenen Devices initialisiert.

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. ladeaudiogeräte()
    3. For i As Integer = 0 To n - 1
    4. Bass.BASS_Init(i, 44100, BASSInit.BASS_DEVICE_SPEAKERS, IntPtr.Zero, Nothing)
    5. Bass.BASS_RecordInit(i)
    6. Next
    7. End Sub

    Und auch das Output und Input Device wird festgelegt.
    Input bzw. Output Kanal A

    VB.NET-Quellcode

    1. Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
    2. aMicroRecordingProc = New RECORDPROC(AddressOf aMicroRecordingCallback)
    3. aMicroOutput = Bass.BASS_SetDevice(ComboBox3.Items(ComboBox3.SelectedIndex).ToString.Split("-")(0))
    4. aMicroOutput = Bass.BASS_StreamCreate(44100, 1, BASSFlag.BASS_DEFAULT, BASSStreamProc.STREAMPROC_PUSH)
    5. aMicroInput = BassWasapi.BASS_WASAPI_SetDevice(ComboBox1.Items(ComboBox1.SelectedIndex).ToString.Split("-")(0))
    6. aMicroInput = Bass.BASS_RecordStart(44100, 1, BASSFlag.BASS_STREAM_DECODE, aMicroRecordingProc, IntPtr.Zero)
    7. Bass.BASS_ChannelSetAttribute(aMicroOutput, BASSAttribute.BASS_ATTRIB_VOL, 0)
    8. End Sub

    Leider höre ich nun gar keinen Ton mehr bzw kann gar keinen aufnehmen. Wenn ich im Form Load die For-Loop Schleife entferne und den Integer i entsprechend dann wieder durch -1 ersetze, dann funktioniert wieder alles.
    Hier nun nochmals der aktuell komplette Code:
    Programmcode aktuell

    VB.NET-Quellcode

    1. Imports Un4seen.Bass
    2. Imports Un4seen.BassAsio
    3. Imports Un4seen.BassWasapi
    4. Public Class Form1
    5. Private aMicroRecordingProc As RECORDPROC
    6. Private bMicroRecordingProc As RECORDPROC
    7. Private aMicroInput, aMicroOutput As Integer
    8. Private bMicroInput, bMicroOutput As Integer
    9. Dim n As Integer = 0
    10. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    11. ladeaudiogeräte()
    12. For i As Integer = 0 To n - 1
    13. Bass.BASS_Init(i, 44100, BASSInit.BASS_DEVICE_SPEAKERS, IntPtr.Zero, Nothing)
    14. Bass.BASS_RecordInit(i)
    15. Next
    16. End Sub
    17. Private Sub ladeaudiogeräte()
    18. Dim n As Integer = 0
    19. Dim info As New BASS_DEVICEINFO()
    20. While (Bass.BASS_GetDeviceInfo(n, info))
    21. ComboBox1.Items.Add(n & "- [DIRECTSOUND] " & info.name)
    22. ComboBox2.Items.Add(n & "- [DIRECTSOUND] " & info.name)
    23. ComboBox3.Items.Add(n & "- [DIRECTSOUND] " & info.name)
    24. ComboBox4.Items.Add(n & "- [DIRECTSOUND] " & info.name)
    25. n += 1
    26. End While
    27. Dim xinfo As New BASS_WASAPI_DEVICEINFO
    28. While (BassWasapi.BASS_WASAPI_GetDeviceInfo(n, xinfo))
    29. If xinfo.IsLoopback = True Then
    30. ComboBox1.Items.Add(n & "- [WASAPI--LOOPBACK] " & xinfo.name)
    31. ComboBox2.Items.Add(n & "- [WASAPI--LOOPBACK] " & xinfo.name)
    32. ComboBox3.Items.Add(n & "- [WASAPI--LOOPBACK] " & xinfo.name)
    33. ComboBox4.Items.Add(n & "- [WASAPI--LOOPBACK] " & xinfo.name)
    34. ElseIf xinfo.SupportsRecording Then
    35. ComboBox1.Items.Add(n & "- [WASAPI--RECORD] " & xinfo.name)
    36. ComboBox2.Items.Add(n & "- [WASAPI--RECORD] " & xinfo.name)
    37. ComboBox3.Items.Add(n & "- [WASAPI--RECORD] " & xinfo.name)
    38. ComboBox4.Items.Add(n & "- [WASAPI--RECORD] " & xinfo.name)
    39. Else
    40. ComboBox1.Items.Add(n & "- [WASAPI--LISTENING] " & xinfo.name)
    41. ComboBox2.Items.Add(n & "- [WASAPI--LISTENING] " & xinfo.name)
    42. ComboBox3.Items.Add(n & "- [WASAPI--LISTENING] " & xinfo.name)
    43. ComboBox4.Items.Add(n & "- [WASAPI--LISTENING] " & xinfo.name)
    44. End If
    45. n += 1
    46. End While
    47. Dim yinfo As New BASS_ASIO_DEVICEINFO
    48. While (BassAsio.BASS_ASIO_GetDeviceInfo(n, yinfo))
    49. ComboBox1.Items.Add(n & "- [ASIO] " & yinfo.name)
    50. ComboBox2.Items.Add(n & "- [ASIO] " & yinfo.name)
    51. ComboBox3.Items.Add(n & "- [ASIO] " & yinfo.name)
    52. ComboBox4.Items.Add(n & "- [ASIO] " & yinfo.name)
    53. n += 1
    54. End While
    55. End Sub
    56. Public Function aMicroRecordingCallback(ByVal handle As Integer, ByVal buffer As IntPtr, ByVal length As Integer, ByVal user As IntPtr) As Boolean
    57. Bass.BASS_StreamPutData(aMicroOutput, buffer, length)
    58. Bass.BASS_ChannelPlay(aMicroOutput, False)
    59. Return True
    60. End Function
    61. Public Function bMicroRecordingCallback(ByVal handle As Integer, ByVal buffer As IntPtr, ByVal length As Integer, ByVal user As IntPtr) As Boolean
    62. Bass.BASS_StreamPutData(bMicroOutput, buffer, length)
    63. Bass.BASS_ChannelPlay(bMicroOutput, False)
    64. Return True
    65. End Function
    66. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    67. If Not Button1.BackColor = Color.Red Then
    68. Button1.BackColor = Color.Red
    69. Bass.BASS_ChannelSetAttribute(aMicroOutput, BASSAttribute.BASS_ATTRIB_VOL, TrackBar1.Value / 100)
    70. Else
    71. Button1.BackColor = DefaultBackColor
    72. Bass.BASS_ChannelSetAttribute(aMicroOutput, BASSAttribute.BASS_ATTRIB_VOL, 0)
    73. End If
    74. End Sub
    75. Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
    76. aMicroRecordingProc = New RECORDPROC(AddressOf aMicroRecordingCallback)
    77. aMicroOutput = Bass.BASS_SetDevice(ComboBox3.Items(ComboBox3.SelectedIndex).ToString.Split("-")(0))
    78. aMicroOutput = Bass.BASS_StreamCreate(44100, 1, BASSFlag.BASS_DEFAULT, BASSStreamProc.STREAMPROC_PUSH)
    79. aMicroInput = BassWasapi.BASS_WASAPI_SetDevice(ComboBox1.Items(ComboBox1.SelectedIndex).ToString.Split("-")(0))
    80. aMicroInput = Bass.BASS_RecordStart(44100, 1, BASSFlag.BASS_STREAM_DECODE, aMicroRecordingProc, IntPtr.Zero)
    81. Bass.BASS_ChannelSetAttribute(aMicroOutput, BASSAttribute.BASS_ATTRIB_VOL, 0)
    82. End Sub
    83. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    84. If Not Button2.BackColor = Color.Red Then
    85. Button2.BackColor = Color.Red
    86. Bass.BASS_ChannelSetAttribute(bMicroOutput, BASSAttribute.BASS_ATTRIB_VOL, TrackBar2.Value / 100)
    87. Else
    88. Button2.BackColor = DefaultBackColor
    89. Bass.BASS_ChannelSetAttribute(bMicroOutput, BASSAttribute.BASS_ATTRIB_VOL, 0)
    90. End If
    91. End Sub
    92. Private Sub TrackBar1_Scroll(sender As Object, e As EventArgs) Handles TrackBar1.Scroll
    93. If Button1.BackColor = Color.Red Then
    94. Bass.BASS_ChannelSetAttribute(aMicroOutput, BASSAttribute.BASS_ATTRIB_VOL, TrackBar1.Value / 100)
    95. Else
    96. End If
    97. End Sub
    98. Private Sub TrackBar2_Scroll(sender As Object, e As EventArgs) Handles TrackBar2.Scroll
    99. If Button2.BackColor = Color.Red Then
    100. Bass.BASS_ChannelSetAttribute(bMicroOutput, BASSAttribute.BASS_ATTRIB_VOL, TrackBar2.Value / 100)
    101. Else
    102. End If
    103. End Sub
    104. Private Sub ComboBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox2.SelectedIndexChanged
    105. bMicroRecordingProc = New RECORDPROC(AddressOf bMicroRecordingCallback)
    106. bMicroOutput = Bass.BASS_SetDevice(ComboBox4.Items(ComboBox4.SelectedIndex).ToString.Split("-")(0))
    107. bMicroOutput = Bass.BASS_StreamCreate(44100, 1, BASSFlag.BASS_DEFAULT, BASSStreamProc.STREAMPROC_PUSH)
    108. bMicroInput = BassWasapi.BASS_WASAPI_SetDevice(ComboBox2.Items(ComboBox2.SelectedIndex).ToString.Split("-")(0))
    109. bMicroInput = Bass.BASS_RecordStart(44100, 1, BASSFlag.BASS_STREAM_DECODE, bMicroRecordingProc, IntPtr.Zero)
    110. Bass.BASS_ChannelSetAttribute(bMicroOutput, BASSAttribute.BASS_ATTRIB_VOL, 0)
    111. End Sub
    112. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    113. Bass.BASS_ChannelStop(aMicroOutput)
    114. Bass.BASS_StreamFree(aMicroOutput)
    115. Bass.BASS_ChannelStop(bMicroOutput)
    116. Bass.BASS_StreamFree(bMicroOutput)
    117. Bass.BASS_Free()
    118. End Sub
    119. End Class

    Der Link von Nolde hilft mir insofern weiter, dass ich weiß wie ich den Loopback aufnehmen kann. Vielleicht kann mir ja mal jemand erklären welcher Aufruf für das durchschleifen bzw. das Abspielen des Streams verantwortlich ist.
    Ich glaub aber, dass es mit dem initialisieren noch hakt. Muss Ich die WASAPI-Devices mit BassWASAPI_Init auch initialisieren? Vielleicht sieht ja noch jemand einen Fehler von mir, ich bin über jede Hilfe dankbar.
    Danke berreits im Vorraus, Pat Rick.
    Häng am besten mal deine Projektmappe an, ohne exe und dlls. Dann werde ich mal für dich debuggen.

    Edit:
    Habe mir noch einmal den Source angeschaut, viel mir beim erstem mal garnicht auf(Wohl die Uhrzeit schuld).

    VB.NET-Quellcode

    1. bMicroOutput = Bass.BASS_SetDevice(ComboBox4.Items(ComboBox4.SelectedIndex).ToString.Split("-")(0))
    2. bMicroOutput = Bass.BASS_StreamCreate(44100, 1, BASSFlag.BASS_DEFAULT, BASSStreamProc.STREAMPROC_PUSH)
    3. bMicroInput = BassWasapi.BASS_WASAPI_SetDevice(ComboBox2.Items(ComboBox2.SelectedIndex).ToString.Split("-")(0))
    4. bMicroInput = Bass.BASS_RecordStart(44100, 1, BASSFlag.BASS_STREAM_DECODE, bMicroRecordingProc, IntPtr.Zero)

    Fällt dir nicht etwas auf?
    BASS_SetDevice z.B. gibt dir einen Boolean zurück(Wert je nachdem ob geglückt oder nicht), du kloppst das in einen Integer, also mach mal schleunigst Option Strict On. Genau so wie mit BASS_WASAPI_SetDevice. Direkt danach weist du andere Werte aus Funktionen zu, also sind diese beiden zuweisungen überflüssig. Nicht falsch verstehen, die Functionen callen musst du trotzdem bei wechselnden Devices, ob du den zurückkommenden Wert nutzt ist nicht relevant, wobei besser ist es, so weist du im Programm, aha ging nicht. Desselbe auch mit aMicroInput/aMicroOutput.

    Pat Rick schrieb:

    Vielleicht kann mir ja mal jemand erklären welcher Aufruf für das durchschleifen bzw. das Abspielen des Streams verantwortlich ist.


    Ich erkläre minimal @Eddy 's Code

    Initialisierung des RecordProcs, als "Adresse" die Function MicroRecordingCallback.
    MicroRecordingProc = New RECORDPROC(AddressOf MicroRecordingCallback)

    MicroOutput ist der Stream welcher ausgegeben wird, dieser wird hier erzeugt. MicroOutput hat unser Handle für diesen Stream
    MicroOutput = Bass.BASS_StreamCreate(44100, 1, BASSFlag.BASS_DEFAULT, BASSStreamProc.STREAMPROC_PUSH)

    Die Aufnahme starten, MicroInput hat unser Handle des AufnahmeStreams
    MicroInput = Bass.BASS_RecordStart(44100, 1, BASSFlag.BASS_STREAM_DECODE, MicroRecordingProc, IntPtr.Zero)

    Die Callbackfunction(RecordProc[MicroRecordingCallback]) wird danach kontinuirlich von der BASS gecallt, und wir schreiben die Daten(in der Function) in den Ausgabestream mit BASS_StreamPutData.

    Was jetzt die Auswahl der Geräte angeht, alle Geräte die du abhorchen oder zur ausgabe nutzen willst, musst du initialisieren. Mit Bass_SetDevice legst du das Ausgabedevice fest, mit Bass_RecordSetDevice das Aufnahmedevice. Also wenn ein Stream auf Soundkarte XYZ ausgegeben werden soll dann Bass_SetDevice(Deviceindex) und dann den Stream abspielen, so verhält es sich auch mit Bass_RecordSetDevice, erst diese Function callen, danach Bass_RecordStart.

    Was die Initialisierung via Wasapi angeht, ich weiss jetzt nicht ob du an den Sound eines Ausgabedevices via DirectSound dran kommst(mit der Bass.dll), da du aber den Sound eines Ausgabedevices auch über ein anderes ausgeben willst, musst du recherchieren, ob du überhaupt die BassWasapi.dll brauchst. Vllt. hat @Eddy noch Info für uns.

    Beiträge zusammengefügt. ~Trade
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

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

    Hatte Zeit ein Beispiel zu machen. Zu sehen ist, wie du die Devices abhorchst und auch auf einem beliebigen Device den abgehorchten Sound ausgibst.

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Imports Un4seen.Bass
    3. Imports Un4seen.BassWasapi
    4. Public Class FormMain
    5. Private OutputDevices As New List(Of Device)
    6. Private InputDevices As New List(Of Device)
    7. Private WasapiProc As WASAPIPROC
    8. Private PushStream As Integer = 0
    9. Private Sub FormMain_Shown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown
    10. Bass.LoadMe()
    11. BassWasapi.LoadMe()
    12. WasapiProc = New WASAPIPROC(AddressOf WasapiProcs)
    13. For i As Integer = 0 To BassWasapi.BASS_WASAPI_GetDeviceCount() - 1
    14. Dim info As New BASS_WASAPI_DEVICEINFO
    15. If BassWasapi.BASS_WASAPI_GetDeviceInfo(i, info) Then
    16. If info.IsEnabled AndAlso info.IsInput Then
    17. If BassWasapi.BASS_WASAPI_Init(i, info.mixfreq, info.mixchans, BASSWASAPIInit.BASS_WASAPI_SHARED, info.minperiod, info.minperiod, WasapiProc, Nothing) Then
    18. InputDevices.Add(New Device(i, info.name))
    19. End If
    20. End If
    21. End If
    22. Next
    23. ComboBoxInputs.DropDownStyle = ComboBoxStyle.DropDownList
    24. ComboBoxInputs.DataSource = InputDevices
    25. ComboBoxInputs.DisplayMember = "Name"
    26. For i = 1 To Bass.BASS_GetDeviceCount - 1
    27. If Bass.BASS_Init(i, 44100, BASSInit.BASS_DEVICE_SPEAKERS, Nothing) Then
    28. Dim info As New BASS_DEVICEINFO
    29. If Bass.BASS_GetDeviceInfo(i, info) Then
    30. OutputDevices.Add(New Device(i, info.name))
    31. End If
    32. End If
    33. Next
    34. ComboBoxOutputs.DropDownStyle = ComboBoxStyle.DropDownList
    35. ComboBoxOutputs.DataSource = OutputDevices
    36. ComboBoxOutputs.DisplayMember = "Name"
    37. End Sub
    38. Private Function WasapiProcs(ByVal buffer As IntPtr, ByVal length As Integer, ByVal user As IntPtr) As Integer
    39. If Bass.BASS_ChannelIsActive(PushStream) <> BASSActive.BASS_ACTIVE_STOPPED Then
    40. Dim buffer2() As Byte = New Byte(length) {}
    41. Marshal.Copy(buffer, buffer2, 0, length)
    42. Bass.BASS_StreamPutData(PushStream, buffer2, length)
    43. End If
    44. Return 1
    45. End Function
    46. Private Sub FormMain_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    47. BassWasapi.BASS_WASAPI_Stop(True)
    48. Bass.BASS_ChannelStop(PushStream)
    49. Bass.BASS_StreamFree(PushStream)
    50. PushStream = 0
    51. BassWasapi.FreeMe()
    52. Bass.BASS_Free()
    53. End Sub
    54. Private Sub ComboBoxInputs_ComboBoxInputsChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBoxInputs.SelectedIndexChanged
    55. Starting()
    56. End Sub
    57. Private Sub ComboBoxOutputs_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBoxOutputs.SelectedIndexChanged
    58. Starting()
    59. End Sub
    60. Private Sub Starting()
    61. If ComboBoxOutputs.Items.Count = 0 OrElse ComboBoxInputs.Items.Count = 0 Then
    62. Return
    63. End If
    64. Dim inDevice As Device = DirectCast(ComboBoxInputs.SelectedItem, Device)
    65. Dim outDevice As Device = DirectCast(ComboBoxOutputs.SelectedItem, Device)
    66. BassWasapi.BASS_WASAPI_Stop(True)
    67. Bass.BASS_ChannelStop(PushStream)
    68. Bass.BASS_StreamFree(PushStream)
    69. PushStream = 0
    70. If inDevice.Name.Equals(outDevice.Name) Then
    71. BackColor = Color.Red
    72. Return
    73. Else
    74. BackColor = SystemColors.Control
    75. End If
    76. Bass.BASS_SetDevice(outDevice.DeviceIndex)
    77. BassWasapi.BASS_WASAPI_SetDevice(inDevice.DeviceIndex)
    78. BassWasapi.BASS_WASAPI_Start()
    79. Dim info As New BASS_WASAPI_DEVICEINFO
    80. BassWasapi.BASS_WASAPI_GetDeviceInfo(inDevice.DeviceIndex, info)
    81. PushStream = Bass.BASS_StreamCreatePush(info.mixfreq, info.mixchans, BASSFlag.BASS_SAMPLE_FLOAT, Nothing)
    82. Bass.BASS_ChannelPlay(PushStream, True)
    83. End Sub
    84. End Class
    85. Public Class Device
    86. Public DeviceIndex As Integer
    87. Public Property Name As String
    88. Public Sub New(ByVal deviceIndex As Integer, ByVal name As String)
    89. Me.DeviceIndex = deviceIndex
    90. Me.Name = name
    91. End Sub
    92. End Class
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

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

    <p>Gibt es ne M&ouml;glichkeit das une Bass DLL zu machen. Die Bass DLL ist gut aber darf nicht &Ouml;ffentlich benutzt werden wen maan keine lizenz hat und ich habe keine lust &uuml;ber 300 &euro; zu Zahle damit ich meine software ohne bass.Net Banner nutzen kann.</p>
    Solange du kein Geld für die Software nimmst ist das laut Lizenz OK. Auf der Seite der Bass.dll steht doch
    BASS is free for non-commercial use. If you are a non-commercial entity (eg. an individual) and you are not making any money from your product (through sales, advertising, etc), then you can use BASS in it for free. Otherwise, one of the following licences will be required.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    Ich melde mich mal wieder. Ich habe mich entschlossen die BassNet API zu nutzen. Ich habe auch ein Model Gekauft. Ich habe mich für den ersten Code entschieden der auch Funktioniert. Ist es möglich mit ne Button das Liveplayback abzubrechen und mit ein anderen Button es wieder zu starten. Den Quellcode habe ich hier, MFG

    VB.NET-Quellcode

    1. ​Imports Un4seen.Bass
    2. Imports Un4seen.Bass.AddOn.Enc
    3. Public Class Form1
    4. Private MicroRecordingProc As RECORDPROC
    5. Private MicroInput, MicroOutput As Integer
    6. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    7. Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_SPEAKERS, IntPtr.Zero, Nothing)
    8. Bass.BASS_RecordInit(-1)
    9. MicroRecordingProc = New RECORDPROC(AddressOf MicroRecordingCallback)
    10. MicroOutput = Bass.BASS_StreamCreate(44100, 1, BASSFlag.BASS_DEFAULT, BASSStreamProc.STREAMPROC_PUSH)
    11. MicroInput = Bass.BASS_RecordStart(44100, 1, BASSFlag.BASS_STREAM_DECODE, MicroRecordingProc, IntPtr.Zero)
    12. BassEnc.BASS_Encode_Start(MicroInput, "D:\micro_record.wav", BASSEncode.BASS_ENCODE_PCM Or BASSEncode.BASS_ENCODE_AUTOFREE, Nothing, Nothing)
    13. End Sub
    14. Public Function MicroRecordingCallback(ByVal handle As Integer, ByVal buffer As IntPtr, ByVal length As Integer, ByVal user As IntPtr) As Boolean
    15. Bass.BASS_StreamPutData(MicroOutput, buffer, length)
    16. Bass.BASS_ChannelPlay(MicroOutput, False)
    17. Return True
    18. End Function
    19. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    20. BassEnc.BASS_Encode_Stop(MicroInput)
    21. Bass.BASS_ChannelStop(MicroOutput)
    22. Bass.BASS_StreamFree(MicroOutput)
    23. BassEnc.FreeMe()
    24. Bass.BASS_Free()
    25. End Sub
    26. End Class
    Es sollte funktionieren, wenn du die Zeilen 12-15 in dein Button.Click Event zum starten verschiebst und die Zeilen 25-27 in dein Button.Click Event zum stoppen.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    So ich habe jetzt den code umgesetzt. Das Probleme ist wen ich auf Button 2 Clicke Beendet er das Mike nicht. Wie kriege ich es hin. Es soll so ein Pusch to Talk sein.

    VB.NET-Quellcode

    1. ​Imports System.ComponentModel
    2. Imports Un4seen.Bass
    3. Imports Un4seen.Bass.AddOn.Enc
    4. Public Class Form1
    5. Private MicroRecordingProc As RECORDPROC
    6. Private MicroInput, MicroOutput As Integer
    7. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    8. End Sub
    9. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    10. Try
    11. Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_SPEAKERS, IntPtr.Zero, Nothing)
    12. Bass.BASS_RecordInit(-1)
    13. MicroRecordingProc = New RECORDPROC(AddressOf MicroRecordingCallback)
    14. MicroOutput = Bass.BASS_StreamCreate(44100, 1, BASSFlag.BASS_DEFAULT, BASSStreamProc.STREAMPROC_PUSH)
    15. MicroInput = Bass.BASS_RecordStart(44100, 1, BASSFlag.BASS_STREAM_DECODE, MicroRecordingProc, IntPtr.Zero)
    16. BassEnc.BASS_Encode_Start(MicroInput, "D:\micro_record.wav", BASSEncode.BASS_ENCODE_PCM Or BASSEncode.BASS_ENCODE_AUTOFREE, Nothing, Nothing)
    17. Catch ex As Exception
    18. End Try
    19. End Sub
    20. Public Function MicroRecordingCallback(ByVal handle As Integer, ByVal buffer As IntPtr, ByVal length As Integer, ByVal user As IntPtr) As Boolean
    21. Bass.BASS_StreamPutData(MicroOutput, buffer, length)
    22. Bass.BASS_ChannelPlay(MicroOutput, False)
    23. Return True
    24. End Function
    25. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    26. Try
    27. BassEnc.BASS_Encode_Stop(MicroInput)
    28. Bass.BASS_ChannelStop(MicroOutput)
    29. Bass.BASS_StreamFree(MicroOutput)
    30. BassEnc.FreeMe()
    31. Bass.BASS_Free()
    32. Catch ex As Exception
    33. End Try
    34. End Sub
    35. Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
    36. Try
    37. BassEnc.BASS_Encode_Stop(MicroInput)
    38. Bass.BASS_ChannelStop(MicroOutput)
    39. Bass.BASS_StreamFree(MicroOutput)
    40. BassEnc.FreeMe()
    41. Bass.BASS_Free()
    42. Catch ex As Exception
    43. End Try
    44. End Sub
    45. End Class
    Was sollen die Try-Catch Blöcke dort? Wenn Fehler kommt ignorieren? Warum? Lass die weg und schau ob nen Fehler kommt.
    Damit machst du es dir nur viel schwieriger Fehler zu finden und vor allem zu Debuggen, die IDE kann dir die Fehler viel besser ausgeben als deine
    komischen Try-Catch Blöcke.

    hier mal lesen: TryCatch ist ein heißes Eisen

    //EDIT// nur mal noch am Rande, es sei jetzt mal dahin gestellt ob hier irgendwo ein Fehler bei der Benutzung vorliegt weil etwas falsches
    aufgerufen wird oder sonstiges. Nur bevor man hier Effektiv helfen kann sollte der Code wenigsten so sein das wenn er Fehler enthält die IDE diese
    auch meldet. Es bringt hier nichts die Fehler zu schlucken, und dann zu raten.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

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