150 likes | 297 Views
VO2 Laden und Initialisieren der Sounds. Wir wollen Sounds in unsere Applikation laden Menü erweitern um den Menüpunkt Sound mit dem Identifier ID_ULTRIS_SOUND Akzellerator hinzufügen Akzelleratortabelle erweitern. Sounds sollen später in einem Array gespeichert werden
E N D
Wir wollen Sounds in unsere Applikation laden • Menü erweitern • um den Menüpunkt Sound • mit dem Identifier ID_ULTRIS_SOUND • Akzellerator hinzufügen • Akzelleratortabelle erweitern
Sounds sollen später in einem Array gespeichert werden • Für den Zugriff auf diesen Array werden Konstanten angelegt const int sound_start = 0; const int sound_dreh = 1; const int sound_move = 2; const int sound_down = 3; const int sound_row1 = 4; const int sound_row2 = 5; const int sound_ende = 6; const int sound_win = 7; const int anzahl_sounds = 8;
char *soundfiles[anzahl_sounds] = { “ul_start.wav“,“ul_dreh.wav“, "ul_move.wav", "ul_down.wav", "ul_row1.wav", "ul_row2.wav", "ul_ende.wav", "ul_win.wav" }; • Das Programm benötigt auch die Namen der Sounds
Die Klasse CSoundManager • Wird in den Microsoft-Datein Dsutil.h und Dsutil.cpp bereitgestellt • Dient zur Organisation von Sounds class CSoundManager { public: HRESULT Initialize(…); HRESULT Create(…); };
Die Klasse CSound • Wird in den Microsoft-Datein Dsutil.h und Dsutil.cpp bereitgestellt • Repräsentiert einen konkreten Sound class CSound { public: HRESULT Play(…); HRESULT Stop(); HRESULT Reset(); BOOL IsSoundPlaying(); };
class sounds { private: CSoundManager smgr; CSound *snd[anzahl_sounds];//Array mit Zeigern //auf die //erforderlichen //Sounds public: int on;//Ein- Ausschalter sounds();//Konstruktor int init(HWND wnd); void play (int snr); ~sounds(); //Destruktor }; • Eine Klasse sounds wird angelegt.
Konstruktor • Im Konstruktor werden alle Zeiger im Array snd mit 0 initialisiert, um einen konsistenten Initialzustand zu erhalten • Jeder Sound wird eingeschalten sounds::sounds() { int i; for (i=0; i<anzahl_sounds; i++) snd[i] = 0; //Zeiger mit 0 initialisiert on = 1; //Sound eingeschaltet }
Die Init-Funktion • Auch Sounds werden einem Fenster zugeordnet, desshalb wird für die Initialisierung ein Fenster als Parameter übergeben. Es handelt sich um das Hauptfenster (ultris_window) int sounds::init(HWND wnd) { HRESULT ret; int i; ret=smgr.Initialize(wnd, DSSCL_PRIORITY, 2, 22050, 16); if (ret<0) return ret; for (i=0;i<anzahl_sounds;i++) { ret=smgr.Create(snd+i, soundfiles[i]); if (ret<0) return ret; } return S_OK; }
smgr.Initialize(wnd, DSSCL_PRIORITY, 2, 22050, 16); • wnd: Das Fenster mit dem der Sound verknüpft wird • DSSCL_PRIORITY: Kooperation der Applikation bei konkurierenden Zugriff auf Soundkarte mit anderen Applikationen wird festgelegt • 2: zwei Primärkanäle (Stereo-Sound) • 22050: Abtastfrequenz von 22,05 kHz • 16: Abtastung (16 Bits pro Sample)
Der Destruktor • Die Funktion Create des Soundmanagers allokiert den benötigten Speicher für die Sounds. Der Destruktor gibt diesen Speicher der Klasse wieder frei sounds::~sounds() { for (int i=0;i<anzahl_sounds; i++) { if(snd[i]) delete snd[i];//Speicher wird freigegeben } }
Die Play-Funktion Void sounds::play(int i) { if(!on) //Prüfen ob Sound ausgeschaltet ist return; if(snd[i]->IsSoundPlaying()) //Prüfen ob Sound bereits //abgespielt wird { snd[i]->Stop(); snd[i]->Reset(); } snd[i]->Play(0,0); }
Es wird eine Instanz der Klasse sounds mit dem Namen ultris_sounds wird angelegt • Um ultris_sounds in die Ablikation einzubetten muss • das Objekt bei Applikationsstart initialisiert werden • der Sound muss bei dem Menüpunkt Sound oder F5 ein- bzw ausgeschalten werden • Der Checkmark des Menüpunktes muss konsistent mit dem Ein-/Ausschalter gehalten werden
int APIENTRY WinMain(…) { … ultris_menu = GetMenu(ultris_window); if (ultris_sounds.init(ultris_window) < 0) { MessageBox(ultris_window, “Fehler beim Initialisieren der sounds“, “Ultris Fehlermeldung“, MB_OK | MB_ICONERROR | MB_SETFORGROUND); return 0; } CheckMenuItem(ultris_menu, ID_ULTRIS_SOUND, ultris_sounds.on ? MF_CHECKED:MF_UNCHECKED); … while (TRUE) { … } }
LRESULT CALLBACK ultris_windowhandler(…) { switch (msg) { case WM_COMMAND: switch(LWORD (wParam)) {… case ID_ULTRIS_SOUND: ultris_sounds.on = !ultris_sounds.on; CheckMenuItem(ultris_menu, ID_ULTRIS_SOUND, ultris_sounds.on ? MF_CHECKED:MF_UNCHECKED); return 0; case IDM_TEST: static int testno=0; ultris_sounds.play(testno % anzahl_sounds); testno++; return 0; } break; … } }