Aktuelle CD Track dauer ermitteln mit mciSendString

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

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Aktuelle CD Track dauer ermitteln mit mciSendString

    Hallo Leute :)

    Ich arbeite zurzeit an einen kleinen CD Player. Bin eigentlich schon fast Fertig, mir fehlt nur die Aktuelle Dauer des Tracks. Ich komme da nicht weiter weiß einer von euch wie ich das Probleme lösen kann?

    VB.NET-Quellcode

    1. retVal = mciSendString("set cd time format milliseconds", vbNullString, 0, 0)
    2. retVal = mciSendString("status cd position track " & currentTrack, buf2, 128, 0)


    Hier zeigt er die Track Länge an

    VB.NET-Quellcode

    1. retVal = mciSendString("set cd time format milliseconds", vbNullString, 0, 0)
    2. retVal = mciSendString("status cd length " , buf2, 128, 0)


    MFG Marvin :)

    *Topic verschoben*

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

    @Marvinware Wie hast Du mciSendString() deklariert?
    Wie ist buf2 deklariert und instanziiert?
    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!

    VB.NET-Quellcode

    1. Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Integer, ByVal hwndCallback As Integer) As Integer
    2. Dim buf2 As String = Space(128)
    3. Dim retVal As Integer


    So habe ich es Deklariert @RodFromGermany
    @Marvinware Das ist ne alte VB6-Deklaration.
    Mach das ganze mal in VB.NET: pinvoke.net/default.aspx/winmm.mcisendstring
    ======
    @Marvinware Woher hast Du denn die Befehlsbeschreibung?
    Von PInvoke hab ich die Beispiele zum Öffnen und Schließen des CD-Laders probiert, das funktioniert.
    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!

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

    @Marvinware Ich sehe hier keine Quelle, die ich ebenfalls anzapfen könnte.

    RodFromGermany schrieb:

    Woher hast Du denn die Befehlsbeschreibung?
    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!
    @Rfg: msdn.microsoft.com/en-us/library/ms707311.aspx

    mci-commands kann man als string oder als message absetzen - hier also ist jeweils die string-artige Dokumentation zu wählen.

    ich hab auch mal einen mciPlayer gebastelt, aber keine cds damit abgespielt.
    So vom gugge in Doku würde ich*s auch so versuchen wie der TE

    VB.NET-Quellcode

    1. retVal = mciSendString("status cd position track " & currentTrack, buf2, 128, 0)
    entweder currentTrack ist falsch, oder das Kommando funzt einfach nicht, oder funzt nicht mit dem TimeFormat - k.A.

    Inwiefern ist denn falsch, was dabei herauskommt?
    Danke.

    ErfinderDesRades schrieb:

    Inwiefern ist denn falsch, was dabei herauskommt?
    Es kommt ein Leerstring zurück.
    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!
    Alo er zeigt an wo die CD ssich grade befindet also wie viele Sekunden die CD ist. Hier ist mal der Komplet Quellcode.

    VB.NET-Quellcode

    1. ​Public Class Form1
    2. Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Integer, ByVal hwndCallback As Integer) As Integer
    3. Dim cdDrive As String = "D:\" '<- This is your CD Drive
    4. Dim retVal As Integer
    5. Dim buf As String = Space(128)
    6. Dim buf2 As String = Space(128)
    7. Dim trackCount As Integer
    8. Dim currentTrack As Integer
    9. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    10. cdDrive = Chr(34) & cdDrive & Chr(34) 'Puts "" Areound the CD Drive "D:\"
    11. retVal = mciSendString("open " & cdDrive & " type cdaudio alias cd wait shareable", vbNullString, 0, 0)
    12. retVal = mciSendString("set cd time format tmsf", vbNullString, 0, 0) 'This will set it so the tracks are recognized as 1 2 3 4...
    13. retVal = mciSendString("status cd number of tracks", buf, 128, 0) 'Get Num. Of Tracks
    14. retVal = mciSendString("status cd current track", buf2, 128, 0) 'Get Current Track
    15. trackCount = CInt(Val(buf)) 'This Will Get the Number Of Tracks (Convert it Into 1 2 3 4...)
    16. currentTrack = CInt(Val(buf2)) 'This Will get the Current Track (Convert it Into 1 2 3 4...)
    17. Label1.Text = currentTrack & "/" & trackCount
    18. NumericUpDown1.Maximum = trackCount + 1
    19. End Sub
    20. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    21. retVal = mciSendString("status cd current track", buf2, 128, 0) 'This will get the current Track
    22. currentTrack = CInt(Val(buf2)) 'Converts it into 1 2 3 4...
    23. Label1.Text = currentTrack & "/" & trackCount
    24. NumericUpDown1.Value = currentTrack
    25. End Sub
    26. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    27. retVal = mciSendString("play cd", vbNullString, 0, 0) 'Plays the CD
    28. End Sub
    29. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    30. retVal = mciSendString("stop cd", vbNullString, 0, 0) 'Stops the CD
    31. End Sub
    32. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    33. retVal = mciSendString("pause cd", vbNullString, 0, 0) 'Pauses the CD
    34. End Sub
    35. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    36. retVal = mciSendString("resume cd", vbNullString, 0, 0) 'And resumes the CD
    37. End Sub
    38. Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
    39. Form1_Load(Nothing, Nothing) 'does whatever is under the form1_load action
    40. End Sub
    41. Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
    42. If NumericUpDown1.Value = 0 Then
    43. NumericUpDown1.Value = trackCount
    44. End If
    45. If NumericUpDown1.Value = NumericUpDown1.Maximum Then
    46. NumericUpDown1.Value = 1
    47. End If
    48. retVal = mciSendString("set cd time format tmsf", vbNullString, 0, 0) 'Sets it into 1 2 3 4...
    49. retVal = mciSendString("seek cd to " & NumericUpDown1.Value, vbNullString, 0, 0) 'Seeks CD to track number inputed.
    50. retVal = mciSendString("play cd", vbNullString, 0, 0) 'And Plays CD From Selected track. All Dun :D
    51. End Sub
    52. End Class
    ich sehe da überhaupt nicht den Code aus post#1.

    Marvinware schrieb:

    Quellcode

    1. "status cd position track " & currentTrack


    Das kommt natürlich schoma vor, dass Code nicht funktioniert, einfach weil er nicht da ist...



    Ma so nebenbei: Willst du nicht iwann mal anfangen, .Net zu programmieren?
    Bislang sieht dein Code eher wie vb6 aus.

    vb.Net ist vb6 in jeder Hinsicht haushoch überlegen, v.a., wenn man eh mit VisualStudio.Net arbeitet.


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

    @Marvinware Der beste Befehl, den ich hier je im Forum gesehen habe:

    VB.NET-Quellcode

    1. Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
    2. Form1_Load(Nothing, Nothing) 'does whatever is under the form1_load action
    3. End Sub
    Die Frage hast Du noch nicht beantwortet:
    Woher hast Su die Befehlsstrings?
    ==============================
    OK.
    @Marvinware
    Mit der Information aus Post #9 und der Information vom @ErfinderDesRades funktioniert alles.
    :thumbsup:
    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!

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