Donnerstag, 15. Januar 2009

WAV-Sounds mit VFP abspielen / Playing WAV-sounds with VFP

Vor einiger Zeit hatte ich mir einen kleinen TeaTimer gebaut, damit mein schwarzer Tee nicht dauernd 10 bis 20 Minuten zieht.

Das Ganze passte auch prima, solange ich die Timer-Form im Auge behielt. Dummerweise schaue ich während der Arbeit mit Foxpro aber auf mein Codefenster und so passierte es recht häufig, dass ich doch wieder einen 20 Minuten Tee da stehen hatte.

Lange Rede kurzer Sinn, es musste etwas 'ohrenfälligeres' her, denn auch das Flackern des Timers bei abgelaufener Zeit half nicht wirklich.

Nachdem also der Entschluss zum Abspielen einer WAV-Datei gefallen war, musste ich feststellen, dass mir das Beispiel in den Solution Samples nicht auf Anhieb die Informationen preisgab, die mich interessierten. Irgendwo im Web fand ich dann ein Stück Mustercode zum Aufrufen der MCI API-DLL, welches ich als Grundlage für den u.a. Beispielcode verwendet habe. Seitdem funktionieren auch meine 3 und 4 Minuten Tees... ;-)

Die notwendige API befindet sich im Windows-System32 Verzeichnis und heisst WinMM.dll. Sie beinhaltet das Media Control Interface aus dem letztlich nur die Funktion PlaySound deklariert werden muss.

Die u.a. Funktion PlayWAV kann mit oder ohne Parameter aufgerufen werden. Wird der Name einer WAV-Datei übergeben, so wird versucht, diese abzuspielen. Andernfalls wird eine Standarddatei aus dem Windows Media Verzeichnis abgespielt. Die möglichen Werte des zweiten Parameters können dem u.a. DEFINE-Block entnommen werden.

?PlayWAV()

FUNCTION PlayWAV

    LPARAMETERS vWavFile as String, vFlags as Integer

    LOCAL llReturn as Boolean
    llReturn = .T.

    * // -----------------------------------------------------------
    * // vWavFile = (optional)                                      
    * //             Pfad und Dateiname der abzuspielen WAV-Datei  
    * //                                                          
    * // vFlag    = (optional)                                      
    * //            gezielte Abspielvariante gem. u.a. DEFINEs      
    * // -----------------------------------------------------------

    #DEFINE SND_SYNC         0x00000000    && synchron abspielen (default)                  
    #DEFINE SND_ASYNC        0x00000001    && asynchron abspielen                          
    #DEFINE SND_NODEFAULT    0x00000002    && silence (!default) wenn WAV nicht gefunden  
    #DEFINE SND_MEMORY       0x00000004    && zeigt auf eine im RAM befindliche Datei      
    #DEFINE SND_LOOP         0x00000008    && solange abspielen bis neue WAV übergeben wird
    #DEFINE SND_NOSTOP       0x00000010    && derzeit ablaufende Sounds nicht unterbrechen  
    #DEFINE SND_NOWAIT       0x00002000    && nicht warten wenn der Treiber 'busy' ist      
    #DEFINE SND_ALIAS        0x00010000    && Name ist ein registrierter ALIAS              
    #DEFINE SND_ALIAS_ID     0x00110000    && Alias ist eine vordefinierte ID              
    #DEFINE SND_FILENAME     0x00020000    && Name ist ein Dateiname                      
    #DEFINE SND_RESOURCE     0x00040004    && Name ist eine Ressource oder Atom          
    #DEFINE SND_PURGE        0x00000040    && entferne zum Abspielen nicht-statische Tasks  
    #DEFINE SND_APPLICATION  0x00000080    && Suche nach assoziierter Applikation          

    * // WinMM.dll -> MCI API-DLL -> MCI = Media Control Interface  
    TRY
        DECLARE INTEGER PlaySound IN WinMM.dll AS PLAYSOUNDOVERAPI ;
                STRING @ pszSound, INTEGER HMODULE_hmod, LONG DWORD_fdwSound

        m.vWavFile    = IIF( ;
                          VARTYPE(m.vWavFile) <> [C] OR !FILE(m.vWavFile), ;
                          ADDBS(GETENV([windir])) + [media\tada.wav], ;
                          m.vWavFile ;
                         )
        m.vFlags    = IIF( ;
                          VARTYPE(m.vFlags)=[N], ;
                          m.vFlags, ;
                          SND_ASYNC+SND_FILENAME ;
                         )
        PLAYSOUNDOVERAPI(m.vWavFile,0,m.vFlags)
    CATCH
        * // API Aufruf schlug fehl, also nix mit TADA              
        llReturn = .F.
    ENDTRY

    RETURN llReturn

ENDFUNC

1 Kommentar:

  1. Geht auch schnelle und einfacher !

    *-----------------------------------*
    SET BELL TO ("d:\MySound\my.wav")
    ?? CHR(7)
    SET BELL TO
    *-----------------------------------*

    Gruss Micha

    AntwortenLöschen