VO2 Laden und Initialisieren der Sounds

15
VO2 Laden und Initialisieren der Sounds

description

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 - PowerPoint PPT Presentation

Transcript of VO2 Laden und Initialisieren der Sounds

Page 1: VO2 Laden und Initialisieren der Sounds

VO2 Laden und Initialisieren der Sounds

Page 2: 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

ID Modifizierer Taste Typ

ID_ULTRIS_SOUND Keine VK_F5 VIRTKEY

IDM_TEST Ctrl T VIRTKEY

Page 3: VO2 Laden und Initialisieren der Sounds

•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;

Page 4: VO2 Laden und Initialisieren der Sounds

• Das Programm benötigt auch die Namen der Sounds

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"};

Page 5: VO2 Laden und Initialisieren 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(…);

};

Page 6: VO2 Laden und Initialisieren der Sounds

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();

};

Page 7: VO2 Laden und Initialisieren der Sounds

• Eine Klasse sounds wird angelegt.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

};

Page 8: VO2 Laden und Initialisieren der Sounds

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

}

Page 9: VO2 Laden und Initialisieren der Sounds

Die Init-Funktion

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;}

•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)

Page 10: VO2 Laden und Initialisieren der Sounds

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)

Page 11: VO2 Laden und Initialisieren der Sounds

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

}

}

Page 12: VO2 Laden und Initialisieren der Sounds

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);

}

Page 13: VO2 Laden und Initialisieren der Sounds

• 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

Page 14: VO2 Laden und Initialisieren der Sounds

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)

{…}

}

Page 15: VO2 Laden und Initialisieren der Sounds

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;…

}}