Upload
tulia
View
25
Download
0
Embed Size (px)
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
Citation preview
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
•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;
• 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"};
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();
};
• 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
};
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
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)
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;…
}}