Das mit tbMusic:
rocess() hab ich schon gesehen, hab nur gedacht es gäbe eine Funktion zum abprüfen, also das was eigentlich GetState() machen sollte. Wenn dem aber nicht so ist, dann füge ich sie hiermit selber ein ;D
Dazu wird einfach folgende inline-Funktion in die tbMusic.h eingefüt.
|
Quellcode
|
1
|
inline BOOL IsPlaying() {return m_bPlaying;}
|
Und wenn wir schon mal dabei sind auch eine Unload(), denn Programmierer sind die faulsten Menschen auf der Welt und jedesmal den Pointer freizugeben um ihn dann nächste Zeile wieder zu belegen sind mindestens 2 Zeilen zuviel
. Also kommt in die Header noch die Deklaration von Unload:
|
Quellcode
|
1
|
tbResult Unload(); // Alles freigeben und zurücksetzen
|
Die Definition kommt dann in die tbMusic.cpp
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
// Alles freigeben und zurücksetzen
tbResult tbMusic::Unload()
{
// Wiedergabe stoppen
if(IsPlaying()) Stop();
// Alle Schnittstellen freigeben
TB_SAFE_RELEASE(m_pMediaControl);
TB_SAFE_RELEASE(m_pMediaSeeking);
TB_SAFE_RELEASE(m_pBasicAudio);
TB_SAFE_RELEASE(m_pGraph);
// Alles zurücksetzen
ZeroMemory(this, sizeof(tbMusic));
return TB_OK;
}
|
und kann dann auch aus dem Destruktor aufgerufen werden
|
Quellcode
|
1
2
3
4
5
|
// Destruktor der tbMusic-Klasse
tbMusic::~tbMusic()
{
Unload();
}
|
Um sich die besagten 2 überflüssigen Zeilen dann zu sparen muss die Unload natürlich auch in der Init() aufgerufen werden
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
|
tbResult tbMusic::Init(char* pcFilename)
{
// Alles zurücksetzen
Unload();
HRESULT hResult;
LONGLONG llDuration;
WCHAR awcFilename[256];
// Graph erstellen
...
|
Damit m_bPlaying auch wirklich den aktuellen Status besitzt muss die Variable in Process auch berücksichtigt werden und auf FALSE gesetzt werden, wenn das Stück zuende ist.
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
// Verarbeitet die Musik
tbResult tbMusic::Process()
{
if(m_bPlaying)
{
if(GetCurrentPosition() >= (int)(m_dwDuration))
{
if(m_bLooping)
{
// Wenn Looping eingeschaltet ist und die Musik zu
// Ende ist, dann spielen wir sie erneut ab.
return Play(TRUE);
}
else
{
// Ansonsten wird nicht mehr gespielt
m_bPlaying = FALSE;
return TB_OK;
}
}
}
return TB_OK;
}
|
So das wärs, damit kann man in der Render-Methode z.B. mit
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
tbResult CIntro::Move(float fTime)
{
m_pMusic->Process();
if(!m_pMusic->IsPlaying())
{
if(m_pMusic->Init(GetRandomMusicFile()))
{
// Fehler!
TB_ERROR("Fehler beim Laden der Musik!", TB_ERROR);
}
m_pMusic->Play(FALSE);
}
return TB_OK;
}
|
immer überprüfen, ob der Sound noch spielt. Wenn nicht, kann man hier per Zufallsgenerator einen anderen aus einer Liste aussuchen und abspielen. So kommt auch ein bischen Abwechsung in den Hintergrund.
:jumpy: :dance: :jumpy: