PlaySound sträubt sich


  • Administrator

    Nun, ich bin grad am proggen eines kleinen Spiels. Die TextAusgabe wollte ich nun schreibend machen. Ihr kennt das doch sicher aus Filmen oder Kriegsspielen usw. Der Text wird auf eine Art geschrieben. Nun wollte ich pro Buchstabe der geschrieben wird einen Sound ausgeben. ding.wav
    Gesagt getan, hier gesucht ... PlaySound gefunden probiert und dann der Fehler. Ich finde nicht heraus was wie oder wieso der kommt.

    DerFehler:

    SfView.obj : error LNK2019: unresolved external symbol __imp__PlaySoundA@12 referenced in function "public: void __thiscall CSfView::TextRetarding(class ATL::CStringT<char,class StrTraitMFC<char,class ATL::ChTraitsCRT<char> > >,class CDC *,int,int,int)" (?TextRetarding@CSfView@@QAEXV?CStringT@DV?CStringT@DV?StrTraitMFC@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@PAVCDC@@HHH@Z)

    Code:

    #include <Mmsystem.h>
    

    ...

    PlaySound("ding.wav", NULL, SND_FILENAME | SND_ASYNC );
    

    Ohne die PlaySound-Funktion funktioniert mein Programm, es muss also an ihr liegen!
    Danke für die Hilfe im voraus.
    Grüssli



  • winmm.lib dazulinken (in den projektoptionen oder mittels

    #pragma comment(lib, "winmm")
    

  • Administrator

    Ah verdammt ... ich trottel hatte

    #pragma comment(lib, "winmm.lib")
    

    eingegeben.

    Danke ...
    Nun aber trotzdem noch eine Frage. Ich schreibe was über den CDC* pDC Zeiger von OnDraw ins Fenster. Bzw. um genau zu sein schreib ich die einzelnen Buchstaben rein mit einer for Schleife.
    Nun hab ich das PlaySound in die For Schleife gepackt und will den Sound bei jedem Buchstaben hören, doch da tut sich nichts. Erst wenn alles geschrieben worden ist, hör ich den Sound. Mir scheint es, als würde der Sound erst abgespielt werden, wenn OnDraw beendet wurde. Ich probier es nun noch mit einem Thread zu umgehen, aber weiss noch nicht ob das nützt, bzw. ich frage mich ob es da nichts einfacheres gibt als einen Arbeitsthread ...
    Danke für die Antwort.
    Grüssli



  • Du musst den Sound synchron (SND_SYNC) abspielen, dann stoppt dein Programm so lange, bis der Sound zu Ende ist und könnte dann den zweiten Buchstaben zeichnen, den Sound ausgeben und wieder warten, bis der Sound zu Ende ist.

    EDIT: Übrigens inkludiert man windows.h und nicht mmsystem.h, sonst kann es zu Konflikten kommen.


  • Administrator

    Also mit windows.h gibt es bei mir einen Fehler, bzw. um genau zu sein, er erkennt PlaySound nicht 😉 ...
    Danke für die hilfe ... Jetzt nur noch eine Frage, wenn du schon so nett antwortest (wie es bei gewissen anderen Progger Foren nicht der Fall ist, bzw. halt andere User ^^), kann ich die länge der Liedes oder des abgespielten Sounds selbst bestimmen oder muss ich das ausserhalb erledigen?
    Grüssli



  • Bekommst du da einen Linker- oder Compilerfehler? (erkennbar an den Buchstaben vor der Fehlernummer (CXXXX, LNKXXXX))

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_playsound.asp

    Dort findest du nähere Hinweise zur Benutzung der Funktion. Wenn du einen Ton asynchron abspielst, kannst du ihn zum Beispiel durch erneuten Aufruf mit dem Flag SND_PURGE stoppen. Um damit aber genau die Länge deines Sounds zu bestimmen und nebenbei mit dem Programm fortzufahren, ist einiges an Aufwand erforderlich, um das Ganze zu synchronisieren, du solltest es also lieber die Sounds in passender Form gespeichert haben.


  • Administrator

    3 Fehler kommen dann:

    error C2065: 'SND_FILENAME' : undeclared identifier
    error C2065: 'SND_SYNC' : undeclared identifier
    error C3861: 'PlaySound': identifier not found, even with argument-dependent lookup

    aber mit mmsystem.h kommen die nicht 😉
    Als wäre in windows.h die Sache gar nicht definiert ...
    Grüssli



  • Hast du WIN32_LEAN_AND_MEAN definiert? Wenn ja, dann wegmachen 😉





  • Erhard Henkes schrieb:

    http://www.henkessoft.de/C++/MFC/mfc_einsteigerbuch_kapitel1_teil2.htm#PlaySound

    Also, zunächst fügen wir die Zeile #include <mmsystem.h> in die Header-Datei StdAfx.h ein. Seien Sie vorsichtig, damit Sie nichts zerstören

    😕


  • Administrator

    Jo jetzt seid ihr gefragt ^^ ... Ihr seid hier die Experten ... was muss man nun einfügen und wieso steht in der MSDN am einen Ort das man windows.h einfügen muss und an der anderen Stelle mmsystem.h? (find jetzt die Stelle nur mit dem mmsystem nicht mehr, aber es hat eine ^^) ...

    Zudem habe ich kein Win32_Lean_and_Mean definiert 😉 ...

    Aja und in der MSDN steht eigentlich am meisten nur windows.h ... Und da sagt mir einer noch die MSDN wäre gut! ... allerhöchstens ein leichtes Nachschlagewerk, wenn man nich mehr genau weiss wie was funktionierte, aber wenn man was ganz neues wissen will, so ist die MSDN ein Scheiss ... und die Suchfunktion der MSDN ist es auch ^^ ...
    Grüssli ^^



  • Ich hab bei der Benutzung der MSDN jedenfalls noch nie Anlass zur Beschwerde gehabt. Fakt ist jedenfalls, dass in meiner Version der windows.h folgendes steht:

    [cpp]
    #ifndef WIN32_LEAN_AND_MEAN
    #include <cderr.h>
    #include <dde.h>
    #include <ddeml.h>
    #include <dlgs.h>
    #ifndef _MAC
    #include <lzexpand.h>
    #include <mmsystem.h> << hui 🙂
    #include <nb30.h>
    #include <rpc.h>
    #endif
    #include <shellapi.h>
    #ifndef _MAC
    #include <winperf.h>
    #include <winsock.h>
    #endif
    #ifndef NOCRYPT
    #include <wincrypt.h>
    #include <winefs.h>
    #include <winscard.h>
    #endif

    #ifndef NOGDI
    #ifndef _MAC
    #include <winspool.h>
    #ifdef INC_OLE1
    #include <ole.h>
    #else
    #include <ole2.h>
    #endif /* !INC_OLE1 /
    #endif /
    !MAC /
    #include <commdlg.h>
    #endif /
    !NOGDI /
    #endif /
    WIN32_LEAN_AND_MEAN */
    [/cpp]

    und bei mir funktioniert das ohne Probleme, das ist aber wohl speziell in dem Fall eher eine Glaubensfrage, da mmsystem.h anscheinend gegen doppeltes Inkludieren gesichert ist. Bei vielen anderen von windows.h referenzierten Headerdateien kann es aber leicht zu Konflikten führen.


  • Administrator

    Meine sieht meiner Meinung nach gleich aus, wie deine *g*

    #ifndef WIN32_LEAN_AND_MEAN
    #include <cderr.h>
    #include <dde.h>
    #include <ddeml.h>
    #include <dlgs.h>
    #ifndef _MAC
    #include <lzexpand.h>
    #include <mmsystem.h> << öhm ^^
    #include <nb30.h>
    #include <rpc.h>
    #endif
    #include <shellapi.h>
    #ifndef _MAC
    #include <winperf.h>
    #include <winsock.h>
    #endif
    #ifndef NOCRYPT
    #include <wincrypt.h>
    #include <winefs.h>
    #include <winscard.h>
    #endif
    
    #ifndef NOGDI
    #ifndef _MAC
    #include <winspool.h>
    #ifdef INC_OLE1
    #include <ole.h>
    #else
    #include <ole2.h>
    #endif /* !INC_OLE1 */
    #endif /* !MAC */
    #include <commdlg.h>
    #endif /* !NOGDI */
    #endif /* WIN32_LEAN_AND_MEAN */
    

    tjo ... wo ist nun der Fehler? *g*
    Grüssli



  • Sicher, dass nirgendwo im Ganzen projekt LEAN_AND_MEAN definiert wurde? 🙂


  • Administrator

    ups ... aber etwas geht dann doch nicht auf ... deine Datei hat das auch und bei dir gehts ja anscheinend mit ... oder nicht?
    Grüssli


Anmelden zum Antworten