bass.dll Event für Track zu Ende erzeugen

  • VB.NET

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

    bass.dll Event für Track zu Ende erzeugen

    Guten Abend allerseits,

    ich hab mir für mein Projekt die bass.dll und natürlich auch die bass.net.dll runtergeladen, um mein Windows Media Player Control damit zu ersetzen. DIe DLL hat mehr Funktionsumfang und ist auch schneller in der Ausführung (jedenfalls fühlt sich das für mich so an).

    Nun suche ich aber vergebens ein Event wie das MediaEnded des Windows Media Player Controls. Im Internet hab ich zwar eine Lösung gefunden, diese funktioniert aber nicht. Hier der Code:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports Un4seen.Bass
    3. Public Delegate Sub onEnding(ByVal handle As Integer, ByVal channel As Integer, ByVal data As Integer, ByVal user As Integer)
    4. Public Class Form1
    5. Public Sub onEnding(ByVal handle As Integer, ByVal channel As Integer, ByVal data As Integer, ByVal user As Integer)
    6. MessageBox.Show("Lied zu Ende")
    7. End Sub
    8. Private Sub Abspielen()
    9. Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, formMain.Handle)
    10. Dim chan As Integer
    11. Dim streamLänge As Integer
    12. chan = Bass.BASS_StreamCreateFile("C:\Test\Lied.mp3", 0, 0, BASSFlag.BASS_DEFAULT)
    13. streamLänge = Bass.BASS_ChannelGetLength(chan) - 1
    14. Bass.BASS_ChannelSetSync(chan, BASSSync.BASS_SYNC_END, streamLänge, New SYNCPROC(AddressOf onEnding), CType(1, IntPtr))
    15. Bass.BASS_ChannelPlay(chan, False)
    16. End Sub
    17. End Class


    Leider wird in Zeile 18 das onEnding rot unterstrichen, obwohl es in IntelliSense als Vorschlag angezeigt wird, und ich weiss nicht warum. Von dieser Public Delegate Sub onEnding und dem AddressOf hab ich ehrlich gesagt keine Ahnung was das macht und wie das funktioniert...

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

    Ich mach dir gleich ein Beispiel, muss nochmal kurz in die Doku schauen. Aber du machst schon etwas ganz falsch.
    Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, formMain.Handle)

    Wird nur einmal gecallt. Pack das in die Form.Shown Event-Sub, sollte aber nicht das Problem sein.
    So bin fertig. Denn viel Spaß mit der BASS Bibliothek, Hammerteil nutze ich schon lange, deutlich mächter als das popelige WMP Control.

    VB.NET-Quellcode

    1. Imports Un4seen.Bass
    2. Public Class Form1
    3. Private SyncTrackEnd As SYNCPROC
    4. Private StreamHandle As Integer
    5. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. If Not Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_CPSPEAKERS, Handle) Then
    7. Debug.WriteLine("FEHLER BASS_Init")
    8. End If
    9. Using ofd As New OpenFileDialog
    10. ofd.Multiselect = False
    11. ofd.Filter = "MP3 Dateien (*.mp3)|*.mp3"
    12. If ofd.ShowDialog = DialogResult.OK Then
    13. PlayFile(ofd.FileName)
    14. End If
    15. End Using
    16. End Sub
    17. Private Sub PlayFile(filename As String)
    18. If StreamHandle <> 0 AndAlso Bass.BASS_ChannelIsActive(StreamHandle) <> BASSActive.BASS_ACTIVE_STOPPED Then
    19. Bass.BASS_ChannelStop(StreamHandle)
    20. StreamHandle = 0
    21. End If
    22. StreamHandle = Bass.BASS_StreamCreateFile(filename, 0, 0, BASSFlag.BASS_SAMPLE_FLOAT Or BASSFlag.BASS_STREAM_AUTOFREE)
    23. If StreamHandle <> 0 Then
    24. Bass.BASS_ChannelPlay(StreamHandle, False)
    25. SyncTrackEnd = New SYNCPROC(AddressOf OnTrackEnd)
    26. Bass.BASS_ChannelSetSync(StreamHandle, BASSSync.BASS_SYNC_END, 0, SyncTrackEnd, IntPtr.Zero)
    27. End If
    28. End Sub
    29. Private Sub OnTrackEnd(syncHandle As Integer, channel As Integer, data As Integer, user As IntPtr)
    30. MessageBox.Show("FEDDICH!")
    31. End Sub
    32. End Class

    Hi

    @kafffee: Wenn Du über einen Ersatz des MediaPlayer-Controls nachdenkst und Du auf Drittkomponenten verzichten möchtest, dann kann ich Dir die APIs und COM-Interfaces der Windows Media Foundation empfehlen. Mit mindestens 4 COM-Interfaces (da gibt es noch ein paar mehr) und 3 MF-APIs kannst Du schon einen einfachen Player für Audio- und Video-Dateien/Streams erstellen. Folgende Events werden gefeuert: docs.microsoft.com/en-us/windo…ine-mf_media_engine_event
    Du kannst Dir ja mal die COM-Interfaces IMFMediaEngine/IMFMediaEngineEx anschauen. Da geht schon einiges mit.
    Mfg -Franky-

    -Franky- schrieb:

    Da geht schon einiges mit.


    Allerdings ist das für C++ , in .NET sicher auch nur mit einem Drittanbieter-Helferchen machbar, oder man implementiert das mit einem riesen Zeitaufwand selbst. Die BASS kostet für den privaten Gebrauch und auch wenn man Freeware verteilt nix, selbst wenn man sein Programm verkaufen will kostet eine Lizenz nicht wirklich viel. Hammer Library und faire Konditionen. Und vor allem EasyToUse.

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

    Hi

    Das geht in .Net genau so einfach wie in C++ und es werden keine weiteren Drittkomponenten benötigt. Zugegeben, etwas Programmieraufwand ist es schon. Dafür hab ich die Freiheit das ganze (Klasse/Control) so zu gestalten wie ich es brauche. Natürlich geht es mit der Bass.dll einfacher. Man sollte aber auch andere Alternativen kennen.
    Mfg -Franky-
    @Takafusa

    CSCORE nutzt ebenfalls Teile der Media Foundation. Allerdings nicht die von mir angesprochenen Interfaces. Ohne es mir genau angeschaut zu haben, denke ich das für den/einen Player der Code zum Einsatz kommt, der auch in der MS-Doku zur Media Foundation Schritt für Schritt gezeigt wird.

    Vllt ist es eine Glaubensfrage. Ich bin halt kein Fan von fertigen Drittkomponenten. Wenn ich es selbst programmieren kann, dann mach ich es auch. Bei mir kommt es aber auch nicht drauf an irgendwas schnell fertig zu bekommen. Für die, die damit Beruflich zu tun haben und damit ihr Geld verdienen, ist das natürlich eine andere Sache.
    Mfg -Franky-
    Ich sehe das ähnlich, aber ich habe nicht die Zeit alles selbst zu machen. Ich mach zwar Geld durch Programmierung, aber das ist nicht mein Beruf. Mache solche Sachen in meiner Freizeit, als Hobby. Habe vor einer Weile mit Spieleprogrammierng angefangen, dafür nehme ich keine fertige Engine wie Unity oder so, das mache ich alles selbst. Gerade portiere ich meine DX11 Engine nach DX12.