Wave-Dateien aus dem Arbeitsspeicher abspielen



  • Hallo,
    ich habe folgendes Problem:
    ich möchte eine Wav-Datei abspielen, nur dass der Inhalt im Speicher vorliegt und eben nicht als Datei.
    Ich verwende zur Zeit den nachfolgenden Code, der soweit gut funktioniert, sofern man die Sounds als Dateien auf der Festplatte vorliegen hat. Ist es irgendwie möglich mit mciSendCommand eine Wave-Datei aus dem Speicher abzuspielen?
    Bei der Funktion PlaySound() kann man das Flag SND_MEMORY setzen, aber diese Funktion wiederum stoppt den bereits spielenden Sound wenn man sie aufruft, was nicht passieren darf.
    Ich hoffe, jemand kann mir da einen Fingerzeig geben.

    DWORD playWAVEFile(HWND hWndNotify,LPSTR lpszWAVEFileName)
    {
     UINT wDeviceID;
     DWORD dwReturn;
     MCI_OPEN_PARMS mciOpenParms;
     MCI_PLAY_PARMS mciPlayParms;
     mciOpenParms.lpstrDeviceType = "waveaudio";
     mciOpenParms.lpstrElementName = lpszWAVEFileName;
     if (dwReturn=mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpenParms))
     {
      return (dwReturn);
     }
     wDeviceID=mciOpenParms.wDeviceID;
    
     mciPlayParms.dwCallback=(DWORD)hWndNotify;
     if (dwReturn=mciSendCommand(wDeviceID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)&mciPlayParms))
     {
      mciSendCommand(wDeviceID,MCI_CLOSE,0,NULL);
      return (dwReturn);
     }
     return (0L);
    }
    
    void PlayWave(String FileName)
    {
     playWAVEFile(Form1->Handle,FileName.c_str());
    }
    


  • Mit PlaySound kannst du eine Wave aus der Ressource oder aus dem Speicher wiedergeben.



  • Luckie schrieb:

    Mit PlaySound kannst du eine Wave aus der Ressource oder aus dem Speicher wiedergeben.

    Ja, aber dann tritt das Problem auf, das ich ja schon erwähnt habe.
    Bereits laufende Sounds werden gestoppt.



  • Hast du dir schon mal die möglichen Flags angeguckt?


  • Mod

    @Nanyuki: SND_NOSTOP gibt es nämlich auch!



  • Ich hätte genauer sagen müssen, was ich eigentlich möchte:
    Ich möchte Sounds vom Speicher aus abspielen, wobei mehrere Sounds (auch der gleiche) gleichzeitig ablaufen können.
    Beim Flag SND_NOSTOP wird der Sound ja nicht abgespielt, wenn schon ein anderer läuft. Ohne das Flag wird der bereits spielende Sound gestoppt. Mit der Funktion, die ich gepostet habe, kann man zwar mehrere Sounds gleichzeitig abspielen lassen, aber nicht dieselbe Datei zweimal zur selben Zeit, und es geht auch nicht vom Speicher aus.

    Es muss doch eine Möglichkeit geben, die all das verbindet?



  • Hallo

    Auf meiner Homepage http://members.inode.at/anton.zechner/az/index.html findest du ein Beispiel namens AudioDemo.
    Wenn du die Klasse WavClass so umbaust das sie statt von einer Datei
    aus dem Speicher etwas aus liest, dann hast du ein fertiges Beispiel.



  • DirectSound


Anmelden zum Antworten