MCI send string mit mp3 - Lautstärkeregler?

  • VB6

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von c.m.obrecht.

    MCI send string mit mp3 - Lautstärkeregler?

    Ich versuchte heute den ganzen Tag einen Lautstärkeregler einzubauen. Ich setzte dazu einen VScroll ein und fügte Code beim Change-Ereignis ein, die Funktionen wurden auf dem Form oder im separaten Modul mit den MCI-Funktionen eingefügt. Habe sämtliche (!) bei Google auffindbaren (jedenfalls mit meinen Suchbegriffen) Beispiele probiert aber ich schaffte es nicht. Wie könnte ich den Code um einen Lautstärkeregler (und toll wäre einen Balken, der die Position anzeigt und verschoben werden kann zum spulen, wie beim WMP) ergänzen?
    Vielen Dank!
    Habe bisher folgenden Code:

    Visual Basic-Quellcode

    1. Private Sub Command1_Click()
    2. On Error GoTo err
    3. MP3_Play sFilename, "MyAlias"
    4. err:
    5. End Sub
    6. Private Sub Command2_Click()
    7. On Error Resume Next
    8. MP3_Stop "MyAlias"
    9. End Sub
    10. Private Sub Command3_Click()
    11. With CommonDialog1
    12. .Filter = "mp3 Dateien *.mp3|*.mp3"
    13. .ShowOpen
    14. sFilename = .filename
    15. End With
    16. Label1.Caption = sFilename
    17. MP3_Stop "MyAlias"
    18. MP3_Play sFilename, "MyAlias"
    19. Exit Sub
    20. err: MsgBox "Wiedergabe nicht möglich", vbCritical, "Fehler"
    21. End Sub
    22. Private Sub Command4_Click()
    23. frmAbout.Show
    24. End Sub
    25. Private Sub Form_Load()
    26. On Error Resume Next
    27. If Command$ <> "" Then
    28. ' Annahme: Es wurde eine Datei angegeben,
    29. ' die ausgelesen und in einer TextBox angezeigt
    30. ' werden soll
    31. Dim sInhalt As String
    32. ' Evtl. vorhandene Anführungszeichen entfernen
    33. sFilename = Replace(Command$, Chr$(34), "")
    34. On Error GoTo 0
    35. End If
    36. On Error GoTo err
    37. MP3_Play sFilename, "MyAlias"
    38. Label1.Caption = sFilename
    39. err:
    40. End Sub
    41. Private Sub Form_Unload(Cancel As Integer)
    42. MP3_Stop "MyAlias"
    43. End Sub

    sowie

    Visual Basic-Quellcode

    1. ' Modul MP3-Play and Stop via API
    2. Option Explicit
    3. ' zunächst die benötigte API-Deklaration
    4. Private Declare Function mciSendString Lib "winmm.dll" _
    5. Alias "mciSendStringA" (ByVal lpszCommand As String, _
    6. ByVal lpszReturnString As String, _
    7. ByVal cchReturnLength As Long, _
    8. ByVal hwndCallback As Long) As Long
    9. Private Declare Function GetShortPathName Lib "kernel32" _
    10. Alias "GetShortPathNameA" (ByVal lpszLongPath As String, _
    11. ByVal lpszShortPath As String, _
    12. ByVal cchBuffer As Long) As Long
    13. ' MP3-Datei abspielen
    14. Public Function MP3_Play(ByVal sFile As String, _
    15. ByVal sAlias As String) As Boolean
    16. Dim bResult As Boolean
    17. ' Dateinamen in DOS 8.3 Format, da z.B. Sonderzeichen
    18. ' wie Leerzeichen Probleme machen
    19. Dim sBuffer As String
    20. Dim lResult As Long
    21. sBuffer = Space$(255)
    22. lResult = GetShortPathName(sFile, sBuffer, Len(sBuffer))
    23. If lResult <> 0 Then
    24. sFile = Left$(sBuffer, InStr(sBuffer, vbNullChar) - 1)
    25. ' MCI öffnen
    26. lResult = mciSendString("open " & sFile & _
    27. " type MPEGVideo alias " & sAlias, 0, 0, 0)
    28. If lResult = 0 Then
    29. ' MP3 abspielen
    30. If mciSendString("play " & sAlias & _
    31. " from 0", 0, 0, 0) = 0 Then
    32. bResult = True
    33. End If
    34. End If
    35. End If
    36. MP3_Play = bResult
    37. End Function
    38. ' Wiedergabe stoppen und MCI schließen
    39. Public Sub MP3_Stop(ByVal sAlias As String)
    40. mciSendString "stop " & sAlias, 0, 0, 0
    41. mciSendString "close " & sAlias, 0, 0, 0
    42. End Sub

    Visual Basic-Quellcode

    1. ' Lautstärke setzen
    2. Public Sub mciSetVol(ByVal strAlias As String, ByVal nVolume As Long)
    3. On Error Resume Next
    4. If nVolume < 0 Or nVolume > 2000 Then Exit Sub
    5. mciSendString "setaudio " & strAlias & " volume to " & CStr(nVolume * 10), 0, 0, 0
    6. End Sub
    7. ' Aktuelle Position ermitteln
    8. Public Function mciCurPos(ByVal strAlias As String) As Long
    9. Dim sBuffer As String * 255
    10. On Error Resume Next
    11. mciSendString "status " & strAlias & " position", sBuffer, Len(sBuffer), 0
    12. mciCurPos = Val(sBuffer)
    13. End Function
    14. ' Gesamtspielzeit ermitteln
    15. Public Function mciGetLength(ByVal strAlias As String) As Long
    16. Dim sBuffer As String * 255
    17. On Error Resume Next
    18. mciSendString "status " & strAlias & " length", sBuffer, Len(sBuffer), 0
    19. mciGetLength = Val(sBuffer)
    20. End Function


    Bei dem Playbefehl kannst du die Position mit angeben.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Vielen vielen Dank!

    Habe das mit dem Lautstärkeregler hingekriegt; und einen Balken der läuft auch, nun habe ich 2 Probleme noch:
    - wollte

    Visual Basic-Quellcode

    1. slider2.max = mciGetLength("MyAlias")

    einsetzen, wie ich bei mciCurPos erfolgreich den Balken in Bewegung bringe; dass der Balken auch unabhängig bei jedem Lied bis zum Schluss läuft. Aber da kommt immer "ungültiger Eigenschaftswert"; habe auch schon mit umwandeln in integer usw versucht.

    2. wie kann ich die Position verändern, bei Bewegung des Balkens?

    Danke :)
    Ich selbst rechne soetwas immer in Promille um, also den Maxwert auf 1000 und intern dann die entsprechende Position errechnen. Mal Dateigröße durch 1000 quasi.

    Zu 2. Sieh dir mal den Playbefehl genauer an, da steht etwas von from 0 ...
    Gruß
    Peterfido

    Keine Unterstützung per PN!

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

    Ach so, also dass der Max-Wert dann auf Dateigrösse/1000 gesetzt wird; gibt es sonst zu grosse Zahlen? So etwas ähnliches habe ich probiert aber werde ich nochmals tun, vielleicht habe ich auch nur 100 genommen.

    Das habe ich gesehen; ich versuchte einen modifizierten Play-Befehl einzubauen welcher aufgerufen wird wenn der Slider bewegt wird, und den Wert des Sliders übergibt als Startwert; aber bin nicht sicher ob ich das richtig gemacht habe, jedenfalls startete das Lied ganz von Neuem ?(
    Das ist meine Promillesetzfunktion:

    Visual Basic-Quellcode

    1. Public Sub SetProzent(ByVal Prozent As Integer)
    2. Dim p As Long
    3. Dim Laenge As Long
    4. Laenge = mciGetLength(chan) / 1000
    5. If Laenge > 0 And Prozent >= 0 And Prozent <= 1000 Then
    6. p = Laenge * Prozent
    7. mciPlay chan, p
    8. NeuesLied = False
    9. End If
    10. End Sub


    Und das mein mciPlay Sub:

    Visual Basic-Quellcode

    1. Public Sub mciPlay(ByVal strAlias As String, Optional nFromPos As Long = 0)
    2. On Error Resume Next
    3. mciSendString "play " & strAlias & " from " & CStr(nFromPos), 0, 0, 0
    4. mciSendString "put " & strAlias & " destination", 0, 0, 0
    5. End Sub
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Super, das Position-Setzen funktioniert nun. Zuerst hatte ich einen "Zirkelbezug" erstellt da der Slider ja selbständig bewegt wird :D Nun geht es aber, nur die Länge ist noch immer fest (ist für diese Funktion natürlich wichtig); die GetLength - Funktion hatte ich nicht hinbekommen; was muss ich als Prozentzahl übergeben, wo soll die herkommen? Habe verschiedenes versucht, doch egal was ich dem Slider als MAX-Wert im Code gebe, es kommt immer "ungültiger Eigenschaftswert".