DirectX SDK |
This tutorial pertains only to applications written in C++. See DirectMusic Visual Basic Tutorials.
Closing down DirectMusic is a matter of clearing the loader cache, stopping the performance, releasing all the objects that have been created, and finally dereferencing COM (remember, every call to CoInitialize must have a matching call to CoUninitialize).
The following function performs the necessary cleanup in Donuts.cpp:
void CleanUpDMusic() { if (gpLoader) { gpLoader->ClearCache(GUID_DirectMusicAllTypes); gpLoader->Release(); } if (gpComposer) { gpComposer->Release(); } if (gpIntroTemplate) { gpIntroTemplate->Release(); } if (gpGameTemplate) { gpGameTemplate->Release(); } for (short n = 0; n < NUM_STYLES; n++) { if (gapShieldBand[n]) { gapShieldBand[n]->Unload(gpPerformance); gapShieldBand[n]->Release(); } if (gapDefaultBand[n]) { gapDefaultBand[n]->Unload(gpPerformance); gapDefaultBand[n]->Release(); } if (gapShieldSegment[n]) { gapShieldSegment[n]->Release(); } if (gapDefaultSegment[n]) { gapDefaultSegment[n]->Release(); } if (gapStyle[n]) { gapStyle[n]->Release(); } for (short m = 0; m < NUM_CHORDMAP; m++) { if (gapChordMap[n][m]) { gapChordMap[n][m]->Release(); } } for (m = 0; m < NUM_MOTIFS; m++) { if (gapMotif[n][m]) { gapMotif[n][m]->Release(); } } } if (gpPerformance) { gpPerformance->Stop( NULL, NULL, 0, 0 ); gpPerformance->CloseDown(); gpPerformance->Release(); } for (n = 0; n < NUM_SEGMENTS; n++) { if (gapSegment[n]) { gapSegment[n]->Release(); } } if (gpDirectMusic) { gpDirectMusic->Release(); } CoUninitialize(); }