Microphone Live Playback

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

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

    Ich habe etwas umgearbeitet und trotzdem geht das mike leider nicht aus.

    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. Dim PushToTalk As Integer = 0
    8. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    9. End Sub
    10. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    11. Try
    12. If PushToTalk = 0 Then
    13. PushToTalk = 1
    14. Else
    15. PushToTalk = 0
    16. End If
    17. If PushToTalk = 1 Then
    18. Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_SPEAKERS, IntPtr.Zero, Nothing)
    19. Bass.BASS_RecordInit(-1)
    20. MicroRecordingProc = New RECORDPROC(AddressOf MicroRecordingCallback)
    21. MicroOutput = Bass.BASS_StreamCreate(44100, 1, BASSFlag.BASS_DEFAULT, BASSStreamProc.STREAMPROC_PUSH)
    22. MicroInput = Bass.BASS_RecordStart(44100, 1, BASSFlag.BASS_STREAM_DECODE, MicroRecordingProc, IntPtr.Zero)
    23. BassEnc.BASS_Encode_Start(MicroInput, "D:\micro_record.wav", BASSEncode.BASS_ENCODE_PCM Or BASSEncode.BASS_ENCODE_AUTOFREE, Nothing, Nothing)
    24. End If
    25. Bass.BASS_StreamPutData(MicroOutput, 0, 0)
    26. Bass.BASS_ChannelPlay(MicroOutput, False)
    27. BassEnc.BASS_Encode_Stop(MicroInput)
    28. Bass.BASS_ChannelStop(MicroOutput)
    29. Bass.BASS_StreamFree(MicroOutput)
    30. BassEnc.FreeMe()
    31. Bass.BASS_Free()
    32. If PushToTalk = 0 Then
    33. End If
    34. Catch ex As Exception
    35. End Try
    36. End Sub
    37. Public Function MicroRecordingCallback(ByVal handle As Integer, ByVal buffer As IntPtr, ByVal length As Integer, ByVal user As IntPtr) As Boolean
    38. Bass.BASS_StreamPutData(MicroOutput, buffer, length)
    39. Bass.BASS_ChannelPlay(MicroOutput, False)
    40. Return True
    41. End Function
    42. Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
    43. Try
    44. BassEnc.BASS_Encode_Stop(MicroInput)
    45. Bass.BASS_ChannelStop(MicroOutput)
    46. Bass.BASS_StreamFree(MicroOutput)
    47. BassEnc.FreeMe()
    48. Bass.BASS_Free()
    49. Catch ex As Exception
    50. End Try
    51. End Sub
    52. End Class
    Schön das du etwas gemacht hast, nur leider hast du komplett meinen Beitrag ignoriert.
    Also hier nochmal bitte lesen: TryCatch ist ein heißes Eisen

    Die Try-Catch Blöcke weg und dann schauen ob eine Fehlermeldung kommt.
    Vorher kann hier keiner helfen weil wir sonst nur raten würden.


    /EDIT//Um das nur eben noch Beizufügen, bei mir funktioniert dein Code ohne Probleme. Mein Mic wird Live wiedergegeben und aufgenommen.
    Und halt gestoppt bei Button-Click. Ändert nichts daran das es bei dir zu einem Fehler kommen könnte aber wir diesen nicht sehen wegen deiner Try-Catch Blöcke.
    Grüße , xChRoNiKx

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

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

    @Marvinware Auch hast du viel zu viele Zeilen veschoben. Du initialisierst jedesmal neu, entlädst die Bass wieder, merkste was? Das ist doch tinnef.

    Wenn irgendwann nichts mehr gehen sollte starte den Rechner neu dann hast du zu viel gefummelt, hatte mal vergessen die DLL freizugeben, dann gabst Probleme, nur ein neustart half da. Mit dem PushToTalk hättest du erwähnen können. In dem Code ist eine Zeile, die schreibt die Daten in den Stream, nun ein wenig pseudocode, so sollte es dann auch gehen. Vortei istl, du hast nicht beim jedem PushToTalk ein neue Datei, bzw. wird die nicht bei jedem Push überschrieben. Soll denn überhaupt auch aufgezeichnet werden?

    VB.NET-Quellcode

    1. if pushtptalk then
    2. PushTheDataIntoTheStream(mikrosamples)
    3. end if


    Auch wenn du eh nicht wirklich das machst was man dir empfiehlt, sage ich dir, schau in die Doku da ist wirklich alls dokumentiert.

    Hauptseite
    bass.radio42.com/help/

    Die Funktion die die Daten in den Stream schreibt.
    bass.radio42.com/help/html/46b…515-bf9f-c1e9c8a40933.htm
    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 3 mal editiert, zuletzt von „NoIde“ ()

    Ich Probiere mal den Code mal aus

    VB.NET-Quellcode

    1. ​Private _dupCallback As DSPPROC
    2. ...
    3. ' create stream on device 1
    4. Bass.BASS_SetDevice(1)
    5. Dim orig As Integer = Bass.BASS_StreamCreateFile("test.mp3", 0, 0, BASSFlag.BASS_SAMPLE_LOOP)
    6. Bass.BASS_ChannelPlay(orig, False)
    7. ...
    8. ' create a clone on device 2
    9. Dim info As BASS_CHANNELINFO = Bass.BASS_ChannelGetInfo(stream)
    10. Bass.BASS_SetDevice(2)
    11. Dim clone As Integer = Bass.BASS_StreamCreatePush(info.freq, info.chans, info.flags, IntPtr.Zero)
    12. ' pause source stream to synchonise buffer contents
    13. Bass.BASS_ChannelPause(stream)
    14. Dim c As Integer = Bass.BASS_ChannelGetData(stream, IntPtr.Zero, CInt(BASSData.BASS_DATA_AVAILABLE))
    15. Dim buf(c) As Byte
    16. Bass.BASS_ChannelGetData(stream, buf, c)
    17. Bass.BASS_StreamPutData(clone, buf, c)
    18. ' set DSP to copy new data from source stream
    19. _dupCallback = New DSPPROC(DupDSP)
    20. Bass.BASS_ChannelSetDSP(orig, _dupCallback, New IntPtr(clone), 0)
    21. Bass.BASS_ChannelPlay(orig, False) ' resume source
    22. Bass.BASS_ChannelPlay(clone, False) ' play clone
    23. ...
    24. Private Sub DupDSP(handle As Integer, channel As Integer,
    25. buffer As IntPtr, length As Integer, user As IntPtr)
    26. Bass.BASS_StreamPutData(user.ToInt32(), buffer, length)
    27. End Sub
    Ok,

    anscheinend willst du nicht verstehen, oder du willst mich/alle hier hart trollen.
    Da ist doch nichts verändert am Code. Immer noch die Try-Catch Blöcke drin.

    Desweiteren funktioniert dein Code aus Post 19: Microphone Live Playback
    super bei mir. Und genau deshalb, weil er bei mir geht und bei dir nicht ist es 40000%ig nötig das du die Try-Catch Dinger weg machst. Und aus dem Grund das sie absolut sinnlos sind so.

    Also nochmal lesen bitte: TryCatch ist ein heißes Eisen

    Schreib ich undeutlich? Chinesisch? Oder wo ist das Problem?

    EDIT//Ok nu hat er seinen Post bearbeitet. Und auf einmal ist dort ein völlig anderer Code. Er hatte den gleichen Code wie aus dem Beitrag davor gepostet,
    dieser stammt aus dem Link von NoIde aus der Doku.

    Grüße , xChRoNiKx

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

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

    Bei mir Funktioniert auch das Mike nur ich kann es nicht ausschallten und Dan wider starten. Die Try Catch Sache habe ich weil ich ständig Fehler beim beenden bekomme. Ziele 28 bekommt ein Fehler so wie ziele 35 und 62

    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. Dim PushToTalk As Integer = 0
    8. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    9. End Sub
    10. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    11. If PushToTalk = 0 Then
    12. PushToTalk = 1
    13. Else
    14. PushToTalk = 0
    15. End If
    16. If PushToTalk = 1 Then
    17. Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_SPEAKERS, IntPtr.Zero, Nothing)
    18. Bass.BASS_RecordInit(-1)
    19. MicroRecordingProc = New RECORDPROC(AddressOf MicroRecordingCallback)
    20. MicroOutput = Bass.BASS_StreamCreate(44100, 1, BASSFlag.BASS_DEFAULT, BASSStreamProc.STREAMPROC_PUSH)
    21. MicroInput = Bass.BASS_RecordStart(44100, 1, BASSFlag.BASS_STREAM_DECODE, MicroRecordingProc, IntPtr.Zero)
    22. BassEnc.BASS_Encode_Start(MicroInput, "D:\micro_record.wav", BASSEncode.BASS_ENCODE_PCM Or BASSEncode.BASS_ENCODE_AUTOFREE, Nothing, Nothing)
    23. End If
    24. If PushToTalk = 0 Then
    25. Bass.BASS_StreamPutData(MicroOutput, 0, 0)
    26. Bass.BASS_ChannelPlay(MicroOutput, False)
    27. BassEnc.BASS_Encode_Stop(MicroInput)
    28. Bass.BASS_ChannelStop(MicroOutput)
    29. Bass.BASS_StreamFree(MicroOutput)
    30. BassEnc.FreeMe()
    31. Bass.BASS_Free()
    32. End If
    33. End Sub
    34. Public Function MicroRecordingCallback(ByVal handle As Integer, ByVal buffer As IntPtr, ByVal length As Integer, ByVal user As IntPtr) As Boolean
    35. Bass.BASS_StreamPutData(MicroOutput, buffer, length)
    36. Bass.BASS_ChannelPlay(MicroOutput, False)
    37. Return True
    38. End Function
    39. Private Sub DupDSP(handle As Integer, channel As Integer,
    40. buffer As IntPtr, length As Integer, user As IntPtr)
    41. Bass.BASS_StreamPutData(user.ToInt32(), buffer, length)
    42. End Sub
    43. Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
    44. BassEnc.BASS_Encode_Stop(MicroInput)
    45. Bass.BASS_ChannelStop(MicroOutput)
    46. Bass.BASS_StreamFree(MicroOutput)
    47. BassEnc.FreeMe()
    48. Bass.BASS_Free()
    49. End Sub
    50. End Class
    So habe den einen Fehler gefunden. Es klappt jetzt ohne Probleme die Aufnahme anzuzeigen und zu beenden ihn Echtzeit habe nur noch ein fehler gefunden. Das Mike wiederholt sich also es doppelt wie kann ich das beenden?

    VB.NET-Quellcode

    1. If PushToTalk = 0 Then
    2. PushToTalk = 1
    3. Else
    4. PushToTalk = 0
    5. End If
    6. If PushToTalk = 1 Then
    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. End If
    13. If PushToTalk = 0 Then
    14. Bass.BASS_ChannelStop(MicroOutput)
    15. Bass.BASS_StreamFree(MicroOutput)
    16. BassEnc.FreeMe()
    17. Bass.BASS_Free()
    18. End If

    Marvinware schrieb:

    Das Mike wiederholt sich also es doppelt wie kann ich das beenden?


    Definiere was da meinst.
    Meinst du das man sich selber hört während der "Aufnahme"?
    Das wolltest du doch ein "Live Playback".

    Schau dir doch einfach auch mal die Doku an Mensch. Was bringt dir das wenn ich/wir dir jetzt sage was du weg machen musst wenn du es nicht verstehst?
    Du hast da in dem bissl Schnipsel Code ein paar Methoden die du in der Doku eingeben kannst dann liest du es dir durch und weißt welche Zeile weg muss.

    Bitte bitte bitte bitte ein wenig Eigeninitiative und Lernbereitschaft.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Also noch einmal zum verständiniss. Das Microfon wird abgehöhrt, die Daten kommen mit der CallBack-Funktion MicroRecordingCallback rein. Darin werden 2 Funktionen gecallt, eine die den Puffer aus dem Mirkofon in den Stream schreibt, welchen du aufnimmst/höhrst, die andere nur um den stream abzuspielen, muss dort zwar nicht, so ist aber sichergestellt das er dann läuft. So, jetzt das PushToTalk. Da du nur wenn PushtoTalk aktiv ist, das Mikro höhren wilst, schreibt du nur dann die Daten die reinkommen in den Stream.
    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
    OK ich muss alao die werte des Callbacks ändern. Wie gesagt ich bin Neuling mit der bass.Net. Ja er Doppelt die Aufnahme bei Wiederholen ausführen des Codes. Wie kann ich es so hinbekommen das er es nur einmal macht. Das Beenden des Callback geht ohne Probleme.

    Marvinware schrieb:

    Wie gesagt ich bin Neuling mit der bass.Net

    Da sagt keiner was dagegen, allerdings kann man sich auch anstellen und alles ignorieren oder man liest sich einfach mal die Links durch, z.b. auch die Doku da steht doch alles drin.
    Die Bass.Net hat so eine gute Doku da schmerzt es mir wenn sich jemand die nicht anschaut.

    NoIde hat dich da ja nu auch wieder auf ne Spur gebracht. Mein Tipp ganz ehrlich ließ die Doku die man dir dort bereitstellt zu den Funktionen die du so nutzt und dann sollte dir das klar werden.

    Ich kann halt immer noch nichts mit "doppelt die aufnahme" anfangen. Mag sein das ich evtl. da schwer von begriff bin aber was heißt das genau?
    Man hört sich in der Aufnahme 2x?3x? Man hört sich während des Live Playbacks 2x?3x?
    Sollte ja alles daran liegen wie du selbst merkst wenn man öfter auf den Button drückt.
    Also musst du halt unterbinden das dein Code mehrmals ausgeführt wird bevor die Aufnahme beendet wird.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Dann stelle deine Anfrage im Marktplatz bereich und gebe eine Gegenleistung.
    Warum sollten wir etwas umsonst tun für dich umsonst etwas Programmieren wenn es dir nicht ums lernen geht wie es scheint.
    Denn in der Doku sind allerhand gute Beispiele für die Verwendung.
    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“ ()

    Also noch einmal, ein letztes mal. Von @Eddy 's Source habe ich jetzt erstmal die Aufzeichnung(schreiben in Datei) rausgenommen, einen Button hinzugefügt und einen Boolean, beim Mousedown des Buttons ist der Boolean wahr, beim MouseUp ist er unwahr. BASS_ChannelPlay habe ich ins ins Form.Load verschoben.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports Un4seen.Bass
    2. Public Class Form1
    3. Private MicroRecordingProc As RECORDPROC
    4. Private MicroInput, MicroOutput As Integer
    5. Private Pushed As Boolean = False
    6. Private Sub Form1_Load(sender As Object, e As 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. Bass.BASS_ChannelPlay(MicroOutput, True)
    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. Return True
    17. End Function
    18. Private Sub Button1_MouseDown(sender As Object, e As MouseEventArgs) Handles Button1.MouseDown
    19. Pushed = True
    20. End Sub
    21. Private Sub Button1_MouseUp(sender As Object, e As MouseEventArgs) Handles Button1.MouseUp
    22. Pushed = False
    23. End Sub
    24. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    25. Bass.BASS_ChannelStop(MicroInput)
    26. Bass.BASS_StreamFree(MicroInput)
    27. Bass.BASS_ChannelStop(MicroOutput)
    28. Bass.BASS_StreamFree(MicroOutput)
    29. Bass.BASS_Free()
    30. End Sub
    31. End Class


    Das Mikrofon wird die ganze Zeit abgehorcht, ob man dass nun abspielt oder nicht tut nichts zur Sache. Das was vom Mikrofon abgegriffen wird, kommt in der Callbackfunktion MicroRecordingCallback rein, via Parameter.

    Schau dir die Parameter dieser Funktion an, die Bass ruft diese Funktion automatisch immer wieder auf.

    -handle -> das Handle des RECORDPROCS, hier MicroRecordingProc , hier jetzt unwichtig, da wir nur 1 RECORDPROC verwenden, wichtig bei mehreren.
    -buffer -> ein Zeiger auf den buffer der die aufgezeichneten Sampledaten enthält
    -length -> die grösse des buffers
    -user -> ein Parameter den du frei wählen kannst, siehe BASS_RecordStart, der letzte parameter, was du hier reingibst, kommt immer im Callback im user-parameter rein, das ist hier auch nicht relevant.

    Diese eine Zeile schreibt den buffer der rein kommt, in den Stream den du höhrst.

    VB.NET-Quellcode

    1. Bass.BASS_StreamPutData(MicroOutput, buffer, length)


    Du musst nun nur in der Funktion MicroRecordingCallback arbeiten, alles andere ist C&P fertig. Nimm meinen Code, änder das in MicroRecordingCallback so ab, das die Funktion BASS_StreamPutData nur aufgerufen wird, wenn pushed wahr ist. Sind also nur 2 Zeilen hinzuzufügen, mehr nicht. (if ... then und end if)

    Wenn du das richtig gemacht hast, wirst du feststellen, das nach einigen malen pushen ein knacken, oder verzerrungen im Ton sind, habe ich gerade festgestellt, dachte erst ein Pushstream(MicroOutput, ist ja ein Pushstream siehe BASS_StreamCreate, letzter Parameter) verhält sich wie ein Mixerstream, aber dem ist nicht so(Sorry). Liegt vermutlich an einer nicht-syncronität, stellt aber kein Problem dar, kann man lösen indem man einfach einen Byte, Short, Integer oder Single Array mit der Länge(parameter lenght hat die Länge inne) des buffers für BASS_StreamPutData nutzt. Alle indicies müssen 0 sein, sind sie auch default, wenn man den Array erstellt, kurz gesagt eigene Sample-Daten mit Stille(nichts höhrbares) erstellen und nutzen. Siehe überladungen von BASS_StreamPutData:
    bass.radio42.com/help/html/ded…f07-fa20-1aa8335fd31b.htm

    Wenn du den Code nun so geändert hast, wie ich sagte, also erstmal nur wenn pushed wahr ist, den buffer in den Stream schreibst, diesen Postest, mach ich dir das mit dem Array. Wenn du den Code nicht um diese 2 Zeilen erweitern kannst, ist das echt ein fall für den Marktplatz. Habe mich jetzt zwar wiedermal wiederhohlt, werde ich aber nicht noch einmal, wenn du es nicht schaffst bin ich dann raus aus diesem Thread.
    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 4 mal editiert, zuletzt von „NoIde“ ()