Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

VB5: MCI send string mit mp3 - Lautstärkeregler?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 18.05.2007, 12:10    Titel: VB5: MCI send string mit mp3 - Lautstärkeregler? Antworten mit Zitat

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:
Code:

Private Sub Command1_Click()
On Error GoTo err
MP3_Play sFilename, "MyAlias"

err:
End Sub

Private Sub Command2_Click()
On Error Resume Next
MP3_Stop "MyAlias"
End Sub

Private Sub Command3_Click()
With CommonDialog1
.Filter = "mp3 Dateien *.mp3|*.mp3"

.ShowOpen
sFilename = .filename
End With
Label1.Caption = sFilename
MP3_Stop "MyAlias"
MP3_Play sFilename, "MyAlias"
Exit Sub
err: MsgBox "Wiedergabe nicht möglich", vbCritical, "Fehler"
End Sub


Private Sub Command4_Click()
frmAbout.Show
End Sub

Private Sub Form_Load()
On Error Resume Next
If Command$ <> "" Then
    ' Annahme: Es wurde eine Datei angegeben,
    ' die ausgelesen und in einer TextBox angezeigt
    ' werden soll
   
    Dim sInhalt As String

    ' Evtl. vorhandene Anführungszeichen entfernen
   
    sFilename = Replace(Command$, Chr$(34), "")
    On Error GoTo 0

End If

On Error GoTo err
MP3_Play sFilename, "MyAlias"
Label1.Caption = sFilename

err:
End Sub


Private Sub Form_Unload(Cancel As Integer)
MP3_Stop "MyAlias"
End Sub



sowie

Code:

' Modul MP3-Play and Stop via API
Option Explicit

' zunächst die benötigte API-Deklaration
Private Declare Function mciSendString Lib "winmm.dll" _
  Alias "mciSendStringA" (ByVal lpszCommand As String, _
  ByVal lpszReturnString As String, _
  ByVal cchReturnLength As Long, _
  ByVal hwndCallback As Long) As Long

Private Declare Function GetShortPathName Lib "kernel32" _
  Alias "GetShortPathNameA" (ByVal lpszLongPath As String, _
  ByVal lpszShortPath As String, _
  ByVal cchBuffer As Long) As Long
' MP3-Datei abspielen
Public Function MP3_Play(ByVal sFile As String, _
  ByVal sAlias As String) As Boolean
 
  Dim bResult As Boolean

  ' Dateinamen in DOS 8.3 Format, da z.B. Sonderzeichen
  ' wie Leerzeichen Probleme machen
  Dim sBuffer As String
  Dim lResult As Long
 
  sBuffer = Space$(255)
  lResult = GetShortPathName(sFile, sBuffer, Len(sBuffer))
 
  If lResult <> 0 Then
    sFile = Left$(sBuffer, InStr(sBuffer, vbNullChar) - 1)
   
    ' MCI öffnen
    lResult = mciSendString("open " & sFile & _
      " type MPEGVideo alias " & sAlias, 0, 0, 0)
   
    If lResult = 0 Then
      ' MP3 abspielen
      If mciSendString("play " & sAlias & _
        " from 0", 0, 0, 0) = 0 Then
        bResult = True
      End If
    End If
  End If
 
  MP3_Play = bResult
End Function


' Wiedergabe stoppen und MCI schließen
Public Sub MP3_Stop(ByVal sAlias As String)
  mciSendString "stop " & sAlias, 0, 0, 0
  mciSendString "close " & sAlias, 0, 0, 0
End Sub

_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 18.05.2007, 13:02    Titel: Antworten mit Zitat

ich hab mci bisher kaum benutzt, aber mir ist auch kein Lautstärke-Regler bekannt traurig und den systemmixer sollte man auch nicht dazu missbrauchen... Ich rate dir daher zur BASS.DLL, die ist noch nicht mal 100 kb groß und kann sehr viel mehr als das veraltete mci.
entwickler-webseite: www.un4seen.com - im download-paket sind viele VB-beispiele enthalten.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 18.05.2007, 18:03    Titel: Antworten mit Zitat

Schön. Aber braucht das dann Laufzeitdateien? Das ist bei der MCI ein Vorteil, das geht nur mit den normalen standard-Laufzeitdateien (OK der CommonDialog ist ja drin der macht da auch mal Probleme, leider - so speziell ist der ja auch nicht).
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 18.05.2007, 18:10    Titel: Antworten mit Zitat

wenn du bass.dll verwendest, brauchst du nur Bass.dll und alle VisualBasic-Runtimes - aber die braucht ja sowieso jedes Visual Basic-Programm. und wie gesagt, bass.dll ist sehr klein!
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 19.05.2007, 23:04    Titel: Antworten mit Zitat

Habe es nun mit mci geschafft lächeln Ebenfalls einen Balken für die Position, nur dass dieser bei jedem unterschiedlich langen Lied immer bis zum Schluss geht muss ich noch machen.
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 19.05.2007, 23:11    Titel: Antworten mit Zitat

die lösung würde mich interessieren, für mein DS4QB, die midi-routinen da sind nämlich MCI, weil ich da nicht das BASSMIDI plugin verwenden wollte.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 20.05.2007, 12:17    Titel: Antworten mit Zitat

Also in das Modul mit den ganzen MCI-Deklarationen habe ich eingefügt:
Code:
' Lautstärke setzen
Public Sub mciSetVol(ByVal strAlias As String, ByVal nVolume As Long)
  On Error Resume Next
  If nVolume < 0 Or nVolume > 2000 Then Exit Sub
  mciSendString "setaudio " & strAlias & " volume to " & CStr(nVolume * 10), 0, 0, 0
End Sub

' Aktuelle Position ermitteln
Public Function mciCurPos(ByVal strAlias As String) As Long
  Dim sBuffer As String * 255
 
  On Error Resume Next
  mciSendString "status " & strAlias & " position", sBuffer, Len(sBuffer), 0
  mciCurPos = Val(sBuffer)
End Function
' Gesamtspielzeit ermitteln
Public Function mciGetLength(ByVal strAlias As String) As Long
  Dim sBuffer As String * 255

  On Error Resume Next
  mciSendString "status " & strAlias & " length", sBuffer, Len(sBuffer), 0
  mciGetLength = Val(sBuffer)
End Function


Die Funktionen sind - wie die Funktionen zum Abspielen usw. oben leicht aufzurufen.
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 20.05.2007, 12:31    Titel: Antworten mit Zitat

dankesehr lächeln das kann ich gut gebrauchen für meinen midi-player... grinsen
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 20.05.2007, 12:42    Titel: Antworten mit Zitat

SUper! lächeln Bitteschön
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 21.05.2007, 19:42    Titel: Antworten mit Zitat

Hi,
habt ihr das mal ausprobiert?
1. Da mciSendString "setaudio "... nur mit mp3-Dateien funktionieren soll?
2. und '... & CStr(nVolume * 10)' nur mit Werten 0 bis 1000 arbeiten soll?
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 23.05.2007, 10:41    Titel: Antworten mit Zitat

grinsen Das geht nur mit mp3? lächeln Ui ui... habe ich mit MIDI gar nicht ausprobiert, ich brauche es nur für mp3... Habe zwar eine Version wo keinen Filter im Öffnen-Dialog vorkommt, dort habe ich aber keinen Regler eingebaut. Was der alles öffnet, habe es zum Spass mal mit einem Foto probiert und es geht! lächeln
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 03.06.2007, 00:15    Titel: Antworten mit Zitat

Habe da noch was: wollte die Gesamtspielzeit ermittteln:
Code:

' Gesamtspielzeit ermitteln
Public Function mciGetLength(ByVal strAlias As String) As Long
  Dim sBuffer As String * 255

  On Error Resume Next
  mciSendString "status " & strAlias & " length", sBuffer, Len(sBuffer), 0
  mciGetLength = Val(sBuffer)
End Function

und habe alles mögliche, wirklich alles erdenkliche, mit multipliieren und teilen etc. versucht um den Wert dem Slider zuzuweisen (slider2.max = ...);
wieso geht das nie?
"Falscher Eigenschaftenwert".

Das hier geht ja auch:
Code:
 Private Sub Timer1_Timer()
On Error Resume Next
Slider2.Value = mciCurPos("MyAlias") / 1000
End Sub


Danke!
[/code]
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 09.07.2007, 23:39    Titel: Antworten mit Zitat

..weiss dazu niemand was? (ist schon länger her aber da kennt sicher jemand die Funktion)?
Ich bekomme von mciGetLentgh 0 zurückgeliefert (habe ich mit einer MessageBox ausgetestet).

Danke
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 13.07.2007, 12:27    Titel: Antworten mit Zitat

Hi,
hast du mal versucht das Zeitformat vorher auf Millisekunden einzustellen?
Code:
' Zeitformat auf Millisekunden einstellen
  mciSendString "set " & strAlias & " time format milliseconds", 0, 0, 0

_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 14.07.2007, 14:00    Titel: Antworten mit Zitat

Code:
' Gesamtspielzeit ermitteln
Public Function mciGetLength(ByVal strAlias As String) As Long

' Zeitformat auf Millisekunden einstellen
  mciSendString "set " & strAlias & " time format milliseconds", 0, 0, 0
  Dim sBuffer As String * 255

  On Error Resume Next
  mciSendString "status " & strAlias & " length", sBuffer, Len(sBuffer), 0
  mciGetLength = Val(sBuffer)
End Function


sowie der Aufruf

Code:
Private Sub Command3_Click()
Dim Laenge As String
With CommonDialog1
.Filter = "mp3 Dateien *.mp3|*.mp3"

.ShowOpen
sFilename = .filename
End With
Label1.Caption = sFilename
MP3_Stop "MyAlias"
Laenge = mciGetLength("MyAlias")
MsgBox Laenge
MP3_Play sFilename, "MyAlias"
Exit Sub
err: MsgBox "Wiedergabe nicht möglich", vbCritical, "Fehler"
End Sub 


geben wiederum 0 in der MesssageBox aus
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 14.07.2007, 22:30    Titel: Antworten mit Zitat

Ich kann dir nicht genau sagen wo der Fehler in deinem VB-Listing liegt.
Möglich du solltest das Timeformat direkt nach dem laden der Datei setzen?
Könnte auch sein, dass 'laenge' als String den Funktionswert (als long) nicht übernimmt?

In FB geht es aber einwandfrei:
Code:
#include once "windows.bi"
#include once "win/mmsystem.bi"

Function FB_MCI(Byval FB_MCICOMMAND As String, Byval f_Alias As String, Byval wert As Integer = 0) As Integer
  Dim temp As String *MAX_PATH
  f_Alias = Ucase(f_Alias)
  Select Case Lcase(Trim(FB_MCICOMMAND))
  Case "play","on","an"
    mciSendString("play " & f_Alias &" from " & 0, NULL, 0, 0)
  Case "close","off","aus"
    mciSendString("close " & f_Alias, NULL, 0, 0)
  Case "stop"
    mciSendString("stop " & f_Alias, NULL, 0, 0)
  Case "length","len"
    mciSendString("status " & f_Alias & " length", temp, MAX_PATH,0)
    FB_MCI = Val(temp)
  Case "position","pos"
    mciSendString("status " & f_Alias & " position", temp, MAX_PATH, 0)
    FB_MCI = Val(temp)
  Case "volume","vol" 'geht nur mit mp3-Dateien
    mciSendString ("setaudio " & f_Alias & " volume to " & Str(wert), NULL, 0, 0)
  Case "wielaut" 'geht nur mit mp3-Dateien
    mciSendString("status " & f_Alias & " volume", temp, MAX_PATH, 0)
    FB_MCI = Val(temp)
  End Select
End Function

Function FB_MCI_open(Byval FILENAME As String, Byval f_Alias As String) As Integer
  f_Alias = Ucase(f_Alias)
  FB_MCI ("close",f_Alias)
  FB_MCI_open = mciSendString("open " & Chr(34) & FILENAME & Chr(34) & " alias " & f_Alias, NULL, 0, 0)
  mciSendString ("set " & f_Alias & " time format milliseconds", NULL, 0, 0)
End Function

Dim As Integer t, i
FB_MCI_open "papst.mp3", "volta"
t = FB_MCI ("LEN","volta")
FB_MCI "an","volta"
Print "Abspieldauer: " & t & "ms"
For i = 0 To 1000 step 10
  FB_MCI "vol","volta", i
  Print FB_MCI ("wielaut", "volta");
  Sleep t/100
Next
FB_MCI "aus","volta"
End

Ich werde mal versuchen die Lautstärkereglung einzubauen. grinsen

EDIT/
funktioniert, aber nur mit mp3 und Lautstärkewerten von 0 bis 1000.
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 15.07.2007, 12:41    Titel: Antworten mit Zitat

Ups sorry, den Lautstärkeregler habe ich schon einige Zeit lächeln Ganz vergessen hier zu erwähnen; das mit der Länge is schon eigenartig, und auch essentiell für den "Balken", ansonsten läuft auch der so schön, und ein Player ohne diesen ist ja nicht soo toll :s

der Funktionswert, mal versuchen ob man das umwandeln muss, ist noch eine Idee...

EDIT: Habe nun weiter versucht, logisch habe dann MsgBox str$(Laenge) eingefügt um die Zahl umzuwandeln (kompliziert, zuerst String in Zahl und dann zurück) jedoch brachte auch dies einfach das Ergebnis 0! Set Timeformat habe ich an die verschiedensten Stellen eingesetzt und probiert, brachte nichts. Die Musik spielt nach der MessageBox mit dem 0 jeweils fröhlich los und der Balken wandert (einfach mit der festen Länge, ist ein Lied länger stürzt es ab).
Übrigens habe zum Position wählen einen 2. Slider einfügen müssen da der erste sich jeweils selber gesetzt hat und somit dauernd eine kleine Stelle wiederholt wurde (wie diedas sonst wohl machen?) aber ist nicht so schlimm, mit dem 2. Silder in einem separaten Fenster welches sich öffnen lässt geht es gut.
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 15.07.2007, 18:23    Titel: Antworten mit Zitat

Hmm,
ist doch sonst nichts kompliziertes dran was falsch laufen könnte.
Versuchs mal mit:
Code:
...
Dim sBuffer As String * 255
sBuffer = Space$(255)
...
oder prüf mal ob len(sBuffer)=255 ??

.. sonst fällt mir dazu auch nichts mehr ein? mit den Augen rollen
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 15.07.2007, 19:38    Titel: Antworten mit Zitat

Brachte auch keinen Unterschied.
Ja ich glaube ich spinn', vorallem die aktuelle Position wird nach dem genau gleichen Verfahren (einfach mit position statt length) abgerufen und das funktioniert, mehrmals pro Sekunde, bestens!!
Code:
 ' Aktuelle Position ermitteln
Public Function mciCurPos(ByVal strAlias As String) As Long
  Dim sBuffer As String * 255
 
  On Error Resume Next
  mciSendString "status " & strAlias & " position", sBuffer, Len(sBuffer), 0
  mciCurPos = Val(sBuffer)
End Function

EDIT: HAAALT Halt, ich Depp mit dem Kopf durch die Mauer wollen Kein Wunder; hast Du gesehen der Stop-Aufruf vor dem mciGetLength? Der war es; ist absichtlich da, doch er störte die Funktion; habe nun nach dem Play-Befehl GetLength eingefügt und schon bekomme ich eine Zahl in der MsgBox!!
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz