// include dsound, dmusic #include <dsound.h> #include <dmksctrl.h> #include <dmusici.h> #include <dmusicc.h> #include <dmusicf.h> // direct music globalsI DirectMusicPerformance *dm_perf = NULL; IDirectMusicLoader *dm_loader = NULL; IDirectMusicSegment *dm_segment = NULL; IDirectMusicSegmentState *dm_segstate = NULL;
int Game_Init(void *parms = NULL, int num_parms = 0) { // this is called once after the initial window is created and // before the main event loop is entered, do all your initialization // here // set up directmusic if (FAILED(CoInitialize(NULL))) { // Terminate the application. return(0); } // end if // create the performance dm_perf = CreatePerformance(); if (dm_perf == NULL) { return(0);// Failure -- performance not created } // end if // initialize the performance if (FAILED(dm_perf->Init(NULL, NULL, main_window_handle))) { return(0);// Failure -- performance not initialized } // end if // add the port to the performance if (FAILED(dm_perf->AddPort(NULL))) { return(0);// Failure -- port not initialized } // end if // create the loader to load object(s) such as midi file dm_loader = CreateLoader(); if (dm_loader == NULL) { return(0);// Failure -- loader not created } // end if // release the old segment if (dm_segment) { dm_segment->Release(); dm_segment = NULL; } // end if // load the segment if (dm_loader) { dm_segment = LoadMIDISegment(dm_loader,L"BATTLE.MID"); } // end if // start the song if (dm_segment) { dm_perf->PlaySegment(dm_segment, 0, 0, &dm_segstate); } // end if // return success or failure or your own return code here return(1); } // end Game_Init /////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////// IDirectMusicPerformance* CreatePerformance(void) { // this function creates the performance IDirectMusicPerformance* pPerf; if (FAILED(CoCreateInstance(CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC, IID_IDirectMusicPerformance, (void**)&pPerf))) { // return null pPerf = NULL; } // end if return pPerf; } // end CreatePerformance //////////////////////////////////////////////////////////// IDirectMusicLoader* CreateLoader(void) { // this function creates the loader IDirectMusicLoader* pLoader; if (FAILED(CoCreateInstance( CLSID_DirectMusicLoader, NULL, CLSCTX_INPROC, IID_IDirectMusicLoader, (void**)&pLoader))) { pLoader = NULL; } // end if return pLoader; } // end CreateLoader /////////////////////////////////////////////////////////// IDirectMusicSegment* LoadMIDISegment(IDirectMusicLoader* pLoader, WCHAR *wszMidiFileName ) { // this function loads a midi segment off disk DMUS_OBJECTDESC ObjDesc; HRESULT hr; IDirectMusicSegment* pSegment = NULL; // get current working directory char szDir[_MAX_PATH]; WCHAR wszDir[_MAX_PATH]; if(_getcwd( szDir, _MAX_PATH ) == NULL) { return NULL; } // end if // convert to wide characters MULTI_TO_WIDE(wszDir, szDir); // set the search directory hr = pLoader->SetSearchDirectory(GUID_DirectMusicAllTypes,wszDir, FALSE); if (FAILED(hr)) { return NULL; } // end if // setup object description ZeroMemory(&ObjDesc, sizeof(DMUS_OBJECTDESC)); ObjDesc.dwSize = sizeof(DMUS_OBJECTDESC); ObjDesc.guidClass = CLSID_DirectMusicSegment; wcscpy(ObjDesc.wszFileName, wszMidiFileName ); ObjDesc.dwValidData = DMUS_OBJ_CLASS | DMUS_OBJ_FILENAME; // load the object and query it for the IDirectMusicSegment interface // This is done in a single call to IDirectMusicLoader::GetObject // note that loading the object also initializes the tracks and does // everything else necessary to get the MIDI data ready for playback. hr = pLoader->GetObject(&ObjDesc,IID_IDirectMusicSegment, (void**) &pSegment); if (FAILED(hr)) return(0); // ensure that the segment plays as a standard MIDI file // you now need to set a parameter on the band track // Use the IDirectMusicSegment::SetParam method and let // DirectMusic find the trackby passing -1 (or 0xFFFFFFFF) in the dwGroupBits method parameter. hr = pSegment->SetParam(GUID_StandardMIDIFile,-1, 0, 0, (void*)dm_perf); if (FAILED(hr)) return(0); // This step is necessary because DirectMusic handles program changes and // bank selects differently for standard MIDI files than it does for MIDI // content authored specifically for DirectMusic. // The GUID_StandardMIDIFile parameter must be set before the instruments are downloaded. // The next step is to download the instruments. // This is necessary even for playing a simple MIDI file // because the default software synthesizer needs the DLS data // for the General MIDI instrument set // If you skip this step, the MIDI file will play silently. // Again, you call SetParam on the segment, this time specifying the GUID_Download parameter: hr = pSegment->SetParam(GUID_Download, -1, 0, 0, (void*)dm_perf); if (FAILED(hr)) return(0); // return the pointer return pSegment; } // end LoadSegment