Programm friert unerklärlich und zufällig ein

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

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von kafffee.

    Neu

    kafffee schrieb:

    Wie bekommst du das Byte() in ein Single() konvertiert?
    Beim Einlesen, sample-weise.
    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!

    Neu

    kafffee schrieb:

    Was meinst du dazu?
    Ich lese Short-Werte und weise diese Single-Array-Elementen zu.
    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!

    Neu

    So, habs zum Laufen bekommen. Ich lass den Code mal für sich sprechen. Wenn ihr noch Fragen habt oder Optimierungsvorschläge bitte posten :)

    Dass er sich bei einem Klick auf den Stopp-Button einfriert das scheint sich durch folgendes Setup auch erledigt zu haben. Wenn nicht könnte man das dann wahrscheinlich auch mit InvokeAsync machen.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Function MyRecording(handle As Integer, buffer As IntPtr, length As Integer, user As IntPtr) As Boolean
    2. Dim cont As Boolean = True
    3. If length > 0 AndAlso buffer <> IntPtr.Zero Then
    4. Dim PufferGroesse As Integer
    5. If BytesWritten + length > RecordedData.Length Then
    6. PufferGroesse = BytesWritten + length - RecordedData.Length
    7. Else
    8. PufferGroesse = length
    9. End If
    10. Marshal.Copy(buffer, RecordedData, BytesWritten, PufferGroesse - 1)
    11. BytesWritten += length
    12. Bass.BASS_StreamPutData(PlayBackChannel, buffer, length)
    13. Dim Prozent As Double = BytesWritten / MaxTrackLaengeInBytes * 100
    14. RecordingXPosWF = WFBreite / 100 * Prozent
    15. RecordingPosition = TimeSpan.FromSeconds(GetPositionInSeconds(RecordingXPosWF))
    16. Services.ServiceContainer.GetService(Of IMainWindowService)?.HoleDispatcher().InvokeAsync(Sub() WF.RenderRecording(buffer, length), DispatcherPriority.SystemIdle)
    17. Services.ServiceContainer.GetService(Of IMainWindowService)?.HoleDispatcher().InvokeAsync(Sub() UpdateWaveForm(Nothing, Nothing), DispatcherPriority.SystemIdle)
    18. If BytesWritten >= MaxTrackLaengeInBytes Then
    19. If RecordedData.Length > MaximaleAufnahmeLaenge Then ReDim Preserve RecordedData(MaximaleAufnahmeLaenge - 1) 'Diese Zeile könnte man evtl. auch weglassen??
    20. cont = False ' stop recording
    21. Services.ServiceContainer.GetService(Of IMainWindowService)?.HoleDispatcher().InvokeAsync(Sub() RecordingStopped(), DispatcherPriority.SystemIdle)
    22. Dim OKVM = New OKDialogViewModel
    23. OKVM.Meldung = "Die maximale Aufnahmelänge ist erreicht worden. Die Aufnahme wurde beendet."
    24. Services.ServiceContainer.GetService(Of IMainWindowService)?.HoleDispatcher().InvokeAsync(Sub() dialogService.ShowModalDialog("", OKVM, Me, True, False, Services.WindowStyle.None, Services.ResizeMode.NoResize, 500, Services.SizeToContent.Height, Services.WindowStartupLocation.CenterOwner, ""), DispatcherPriority.SystemIdle)
    25. End If
    26. End If
    27. Return cont
    28. End Function



    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Sub UpdateWaveForm(sender As Object, e As EventArgs)
    2. Try
    3. Services.ServiceContainer.GetService(Of IMainWindowService)?.HoleDispatcher().Invoke(Sub() WellenFormZeichnen())
    4. Catch
    5. End Try
    6. End Sub


    @RodFromGermany

    Für dich dürfte evtl. auch Zeile 17 interessant sein. Da geb ich die neuen Sampledaten weiter in den Abspielqueue von...:

    VB.NET-Quellcode

    1. ​PlayBackChannel = Bass.BASS_StreamCreatePush(44100, MainModule.NumberOfChannels, BASSFlag.BASS_STREAM_AUTOFREE, Nothing)


    Ist bisschen einfacher wie ich finde.