|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
noop
Anmeldungsdatum: 04.05.2005 Beiträge: 259
|
Verfasst am: 12.06.2005, 13:09 Titel: SOUND/PLAY |
|
|
Funzen die Befehle gar nicht oder stehen sie nur noch nicht in der Befehlsreferenz drinnen? |
|
Nach oben |
|
|
Mecki Igel
Anmeldungsdatum: 10.09.2004 Beiträge: 985 Wohnort: Niederbayern
|
|
Nach oben |
|
|
Devilkevin aka Kerstin
Anmeldungsdatum: 11.11.2004 Beiträge: 2532 Wohnort: nähe Mannheim
|
Verfasst am: 12.06.2005, 13:29 Titel: |
|
|
WAV's abspielen !?
Wie, geht das über nen einfachen Befehl oder mus man ne Routine schreiben ? _________________ www.piratenpartei.de |
|
Nach oben |
|
|
noop
Anmeldungsdatum: 04.05.2005 Beiträge: 259
|
Verfasst am: 12.06.2005, 13:35 Titel: |
|
|
Ja, würd mich sehr interessieren. Ich krieg nur über PRINT CHR$(7) einen Ton raus. |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
noop
Anmeldungsdatum: 04.05.2005 Beiträge: 259
|
Verfasst am: 12.06.2005, 15:27 Titel: |
|
|
Das hab ich jetzt gefunden. Ich hab aber keinen Peil was ich da wo und wie verändern muss.
Code: |
Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" _
(lpszName As Any, ByVal hModule As Long, ByVal dwFlags As Long) As Long
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" _
(ByVal lpModuleName As String) As Long
Private Const SND_ALIAS = &H10000 ' der angegebene Name muss ein Eintrag aus der
' WIn.ini unter [Sounds] sein
Private Const SND_ALIAS_ID = &H110000 ' der angegebene Name muss ein Key aus der
' Win.ini unter [Sounds] sein
Private Const SND_APPLICATION = &H80 ' der angegebene Name ist ein Ereignissound
Private Const SND_ASYNC = &H1 ' Stoppt die Wiedergabe aller Sounddateien, um diese abzuspielen
Private Const SND_FILENAME = &H20000 ' der angegebene Name ist ein Pfad zu einer
' Wave-Datei
Private Const SND_LOOP = &H8 ' wiederholt unendlich oft die Wiedergabe
Private Const SND_MEMORY = &H4 ' der angegebene Name ist ein Byte Array mit den
' Wave-Datei-Daten
Private Const SND_NODEFAULT = &H2 ' spielt keinen Standardsound ab wenn die
' angegebene Datei nicht gefunden wird
Private Const SND_NOSTOP = &H10 ' stoppt keine momentan laufenden Sounds
Private Const SND_NOWAIT = &H2000 ' wartet nicht auf das Beenden des laufenden Sounds
' um dann den angegebenen Sound abzuspielen
Private Const SND_PURGE = &H40 ' stoppt die unendliche Wiedergabe der Sounds, die mit
' SND_LOOP eingeleitet wurde
Private Const SND_RESOURCE = &H40004 ' der angegebene Name ist der Name einer
' Ressource in der sich die Wave-Datei befindet, hierfür muss hModule das
' Modul-Handle der Anwendung bekommen, die die Ressource besitzt
Private Const SND_SYNC = &H0 ' die Funktion kehrt erst nach Beenden der Wiedergabe
' des Sounds zurück
' Tata direkt aus der Datei abspielen, ohne auf Beenden des Sounds zu warten
Private Sub Command1_Click()
Dim Retval As Long
' spielt den Sound ab und bricht den Vorgang ab, wenn diese Funktion erneut
' aufgerufen wird, bevor der Sound komplett abgespielt wurde
Retval = PlaySound(ByVal "c:\windows\media\tada.wav", 0&, SND_ASYNC Or _
SND_FILENAME Or SND_NODEFAULT)
End Sub
' Tata aus einer Variable abspielen
Private Sub Command2_Click()
Dim Retval As Long, FFile As Long, MemWav() As Byte
' öffnen der Datei und übertragen in MemWav
FFile = FreeFile
Open "c:\windows\media\tada.wav" For Binary As FFile
ReDim MemWav(LOF(FFile))
Get FFile, , MemWav()
Close FFile
' abspielen von Tata aus dem Speicher und auf Beenden des Sounds warten
Retval = PlaySound(MemWav(0), 0&, SND_MEMORY Or SND_NODEFAULT)
End Sub
' Tata aus der Ressource abspielen (funktioniert nicht in der IDE)
Private Sub Command3_Click()
Dim Retval As Long, hModule As Long
' Modulhandle der Anwendung ermitteln
hModule = GetModuleHandle(App.EXEName)
' Sound abspielen, aber bei erneutem Aufruf den momentan laufenden Sound
' nicht abbrechen
Retval = PlaySound(ByVal "Tata", hModule, SND_RESOURCE Or SND_NOSTOP Or _
SND_ASYNC Or SND_NODEFAULT)
If Retval = 0 Then
MsgBox "Das Programm wird in der IDE ausgeführt oder die Ressource mit _
dem Titel ""Tata"" wurde nicht gefunden.", vbInformation, "Achtung"
End If
End Sub
' Tata anhand des systemweiten Alias Strings abspielen falls vorhanden (Tata ist in
' der Regel der Sound der erklingt wenn Windows beendet wird.)
Private Sub Command4_Click()
Dim Retval As Long
' spielt den Sound ab und bricht den Vorgang ab, wenn diese Funktion erneut
' aufgerufen wird, bevor der Sound komplett abgespielt wurde
Retval = PlaySound(ByVal "SystemExit", 0&, SND_ASYNC Or SND_APPLICATION Or SND_NODEFAULT)
End Sub
|
|
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
Mecki Igel
Anmeldungsdatum: 10.09.2004 Beiträge: 985 Wohnort: Niederbayern
|
|
Nach oben |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 12.06.2005, 18:46 Titel: |
|
|
Feuerwerk ist ja schon mal ein Anfang, aber wann gibts die Party?
Sind die diversen Sound-Libs nicht wesentlich einfacher zu handlen, als Win-API-Sound?
Ich hab noch wenig erfahrung, aber alle BI's zu Sound-Libs haben den einen oder anderen Befehl wie "PlayWav" o.ä. Nur in der WinMM (Windows Multi Media) habe ich einen solchen Befehl noch nicht gesehen... vermutlich wegen der kurzen Zeit, in der ich mich mit den BI's auseinandergesetzt habe... _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
noop
Anmeldungsdatum: 04.05.2005 Beiträge: 259
|
Verfasst am: 13.06.2005, 16:04 Titel: |
|
|
So ich check's voll net
Code: |
' 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
' WAVE-File abspielen
Public Function WAVE_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
If mciSendString("open " & sFile & _
" type WaveAudio alias " & sAlias, 0, 0, 0) = 0 Then
' WAVE abspielen
mciSendString "play " & sAlias & " from 0", 0, 0, 0
End If
End If
WAVE_Play = bResult
End Function
' Wiedergabe stoppen und MCI schließen
Public Sub WAVE_Stop(ByVal sAlias As String)
mciSendString "stop " & sAlias, 0, 0, 0
mciSendString "close " & sAlias, 0, 0, 0
End Sub
|
Erstemal dachte ich mir, dass ich Private Declare zu Declare umwandel.
hat er auch angenommen. Aber die ganzen if frgaen. Da weiß ich nicht was ich wie umwandeln muss. |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 13.06.2005, 16:25 Titel: |
|
|
Hallo.
Mit dem DECLARE hast du das schon vollkommen richtig gemacht. Die IF-Fragen an sich sind auch in Ordnung, aber dabei solltest du beachten, dass man in VB das &-Zeichen verwendet, um Variablen zu koppeln.
Aus b$ = "Testzahl: " & wasanderes$ wird in FreeBasic b$ = "Testzahl: "+wasanderes$. Bei Zahlen sind da noch ein paar andere Kleinigkeiten zu beachten.
Aus deinem Code würde also
Code: | Function WAVEPlay(ByVal sFile As String, ByVal sAlias As String) As Integer
Dim bResult As Integer
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, CHR$(0)) - 1)
If mciSendString("open " + sFile + " type WaveAudio alias " + sAlias, 0, 0, 0) = 0 Then
mciSendString "play " + sAlias + " from 0", 0, 0, 0
End If
End If
WAVEPlay = bResult
End Function
Sub WAVEStop(ByVal sAlias As String)
mciSendString "stop " + sAlias, 0, 0, 0
mciSendString "close " + sAlias, 0, 0, 0
End Sub |
Ich hab jetzt einfach den von dir geposteten Code übernommen und überarbeitet. Vielleicht hast du da schon Fehler drin gehabt, aber wenn dein Code der richtige VB-Code war, dann sollte's jetzt so gehen. Natürlich oben die DECLAREs nicht vergessen.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
noop
Anmeldungsdatum: 04.05.2005 Beiträge: 259
|
Verfasst am: 16.06.2005, 18:18 Titel: |
|
|
danke. Ja der code war eigentlich nur von der website kopiert.
Ich hab ihn extra nicht verändert damit ich nichts falsch verändere. |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
noop
Anmeldungsdatum: 04.05.2005 Beiträge: 259
|
Verfasst am: 16.06.2005, 18:45 Titel: |
|
|
Weiß noch nicht. Werd es morgen posten. War krank und durft nicht an den PC bis heute. |
|
Nach oben |
|
|
noop
Anmeldungsdatum: 04.05.2005 Beiträge: 259
|
Verfasst am: 17.06.2005, 19:42 Titel: |
|
|
Code: |
' benötigte API-Deklaration
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
Declare Function GetShortPathName Lib "kernel32" _
Alias "GetShortPathNameA" (ByVal lpszLongPath As String, _
ByVal lpszShortPath As String, _
ByVal cchBuffer As Long) As Long
' WAVE-File abspielen
Function WAVEPlay(ByVal sFile As String, ByVal sAlias As String) As Integer
Dim bResult As Integer
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, CHR$(0)) - 1)
If mciSendString("open " + sFile + " type WaveAudio alias " + sAlias, 0, 0, 0) = 0 Then
mciSendString "play " + sAlias + " from 0", 0, 0, 0
End If
End If
WAVEPlay = bResult
End Function
Sub WAVEStop(ByVal sAlias As String)
mciSendString "stop " + sAlias, 0, 0, 0
mciSendString "close " + sAlias, 0, 0, 0
End Sub
|
Funktioniert, bloß wie spiel ich jetzt ein Lied ab? Normal sind da doch Anweisungen wie OPEN FILE$ FOR BINARY. hier ja nicht irgendwie. |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
noop
Anmeldungsdatum: 04.05.2005 Beiträge: 259
|
Verfasst am: 17.06.2005, 20:27 Titel: |
|
|
Und was heißt das für mich? Wie kann ich jetzt eine wav abspielen?
Muss ich das irgendwie an die Unction übergeben? und wenn wie? |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 17.06.2005, 20:36 Titel: |
|
|
Hallo.
Ich hab den Code noch mal ein wenig vereinfacht; er funktioniert und sollte leicht verständlich sein.
Code: | 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
Declare Function GetShortPathName Lib "kernel32" _
Alias "GetShortPathNameA" (ByVal lpszLongPath As String, _
ByVal lpszShortPath As String, _
ByVal cchBuffer As Long) As Long
Function WAVEPlay(sFile As String, sAlias As String) As Integer
Dim sBuffer As String
Dim lResult As Long
Dim sf AS STRING
sf = Space$(255)
sBuffer = Space$(255)
sf = sFile
lResult = GetShortPathName(sf, sBuffer, Len(sBuffer))
If lResult <> 0 Then
sBuffer = RTRIM$(sBuffer)
Print "Spiele Sound: "; sBuffer
If mciSendString("open " + sBuffer + " type WaveAudio alias " + sAlias, 0, 0, 0) = 0 Then
mciSendString "play " + sAlias + " from 0", 0, 0, 0
WAVEPlay = -1
Exit Function
End If
End If
WAVEPlay = 0
End Function
Sub WAVEStop(sAlias As String)
mciSendString "stop " + sAlias, 0, 0, 0
mciSendString "close " + sAlias, 0, 0, 0
End Sub
'Dieser FreeBasic Code spielt einen WAV Sound ganz einfach über die WinAPI ab.
'Jeder Sound bekommt eine individuelle Kennung zugeordnet. Über diese Kennung, im Beispiel
'»fbsound« kann das Abspielen des Sounds auch unterbrochen werden. Dazu dient die Sub
'WAVEStop, der diese Kennung als Argument übergeben wird.
'Viel Spaß mit dem Code! Sebastian Steiner, sebastian_steiner[ätt]gmx.de
Dim resultat As Integer
resultat = WAVEPlay("c:\freebas\freebasic\test.wav","soundnr1")
If resultat = -1 Then
Print "Abspielen erfolgreich!"
Else
Print "Fehler!"
End If
SLEEP
END |
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
noop
Anmeldungsdatum: 04.05.2005 Beiträge: 259
|
Verfasst am: 17.06.2005, 20:52 Titel: |
|
|
Danke. Das sieht schon leichter aus. |
|
Nach oben |
|
|
|
|
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.
|
|