int digi_win32_play_midi_song( char * filename, int loop ) { if (firstplay) { hmp_reset(); firstplay = 0; } digi_win32_stop_midi_song(); if (filename == NULL) return 0; if ((cur_hmp = hmp_open(filename))) { /* * FIXME: to be implemented as soon as we have some kind or checksum function - replacement for ugly hack in hmp.c for descent.hmp * if (***filesize check*** && ***CRC32 or MD5 check***) * (((*cur_hmp).trks)[1]).data[6] = 0x6C; */ if (hmp_play(cur_hmp,loop) != 0) return 0; // error digi_win32_midi_song_playing = 1; digi_win32_set_midi_volume(GameCfg.MusicVolume); return 1; } return 0; }
void digi_mixer_play_midi_song(char * filename, char * melodic_bank, char * drum_bank, int loop ) { if (!digi_initialised) return; if (GameArg.SndNoMusic) return; mix_set_music_volume(midi_volume); oplmus_play(filename, melodic_bank, drum_bank, loop); #if 0 jukebox_load(); // update jukebox state // quick hack to check if filename begins with "game" -- MD2211 if (jukebox_is_loaded() && strstr(filename, "game") == filename) { // use jukebox jukebox_play(loop); } else { // standard song playback #ifdef _WIN32 if (!GameArg.SndExternalMusic) { if ((hmp = hmp_open(filename))) { hmp_play(hmp,loop); digi_midi_song_playing = 1; digi_set_midi_volume(midi_volume); } } else #endif mix_play_music(filename, loop); } #endif }
void hmp2mid(char *hmp_name, unsigned char **midbuf, unsigned int *midlen) { int mi, i; short ms, time_div = 0xC0; hmp_file *hmp=NULL; hmp = hmp_open(hmp_name); if (hmp == NULL) return; *midlen = 0; time_div = hmp->tempo*1.6; // write MIDI-header *midbuf = (unsigned char *) d_realloc(*midbuf, *midlen + 4); memcpy(&(*midbuf)[*midlen], "MThd", 4); *midlen += 4; mi = MIDIINT(6); *midbuf = (unsigned char *) d_realloc(*midbuf, *midlen + sizeof(mi)); memcpy(&(*midbuf)[*midlen], &mi, sizeof(mi)); *midlen += sizeof(mi); ms = MIDISHORT(1); *midbuf = (unsigned char *) d_realloc(*midbuf, *midlen + sizeof(ms)); memcpy(&(*midbuf)[*midlen], &ms, sizeof(ms)); *midlen += sizeof(ms); ms = MIDISHORT(hmp->num_trks); *midbuf = (unsigned char *) d_realloc(*midbuf, *midlen + sizeof(ms)); memcpy(&(*midbuf)[*midlen], &ms, sizeof(ms)); *midlen += sizeof(ms); ms = MIDISHORT(time_div); *midbuf = (unsigned char *) d_realloc(*midbuf, *midlen + sizeof(ms)); memcpy(&(*midbuf)[*midlen], &ms, sizeof(ms)); *midlen += sizeof(ms); *midbuf = (unsigned char *) d_realloc(*midbuf, *midlen + sizeof(tempo)); memcpy(&(*midbuf)[*midlen], &tempo, sizeof(tempo)); *midlen += sizeof(tempo); // tracks for (i = 1; i < hmp->num_trks; i++) { int midtrklenpos = 0; *midbuf = (unsigned char *) d_realloc(*midbuf, *midlen + 4); memcpy(&(*midbuf)[*midlen], "MTrk", 4); *midlen += 4; midtrklenpos = *midlen; mi = 0; *midbuf = (unsigned char *) d_realloc(*midbuf, *midlen + sizeof(mi)); *midlen += sizeof(mi); mi = hmptrk2mid(hmp->trks[i].data, hmp->trks[i].len, midbuf, midlen); mi = MIDIINT(mi); memcpy(&(*midbuf)[midtrklenpos], &mi, 4); } hmp_close(hmp); }
int DigiPlayMidiSong (char *pszSong, char *melodic_bank, char *drum_bank, int loop, int bD1Song) { int bCustom; #if 0 if (!gameStates.sound.digi.bInitialized) return 0; #endif LogErr ("DigiPlayMidiSong (%s)\n", pszSong); DigiStopCurrentSong (); if (!(pszSong && *pszSong)) return 0; if (midiVolume < 1) return 0; bCustom = ((strstr (pszSong, ".mp3") != NULL) || (strstr (pszSong, ".ogg") != NULL)); if (!(bCustom || (hmp = hmp_open (pszSong, bD1Song)))) return 0; #if USE_SDL_MIXER if (gameOpts->sound.bUseSDLMixer) { char fnSong [FILENAME_LEN], *pfnSong; if (bCustom) pfnSong = pszSong; else { sprintf (fnSong, "%s/d2x-temp.mid", gameFolders.szHomeDir); if (!hmp_to_midi (hmp, fnSong)) { LogErr ("SDL_mixer failed to load %s\n(%s)\n", fnSong, Mix_GetError ()); return 0; } pfnSong = fnSong; } if (!(mixMusic = Mix_LoadMUS (pfnSong))) { LogErr ("SDL_mixer failed to load %s\n(%s)\n", fnSong, Mix_GetError ()); return 0; } if (-1 == Mix_PlayMusic (mixMusic, loop ? -1 : 1)) { LogErr ("SDL_mixer cannot play %s\n(%s)\n", pszSong, Mix_GetError ()); return 0; } LogErr ("SDL_mixer playing %s\n", pszSong); bDigiMidiSongPlaying = 1; DigiSetMidiVolume (midiVolume); return 1; } #endif #if defined (_WIN32) if (bCustom) { LogErr ("Cannot play %s - enable SDL_mixer\n", pszSong); return 0; } hmp_play (hmp, loop); bDigiMidiSongPlaying = 1; DigiSetMidiVolume (midiVolume); #endif return 1; }
void digi_play_midi_song( char * filename, char * melodic_bank, char * drum_bank, int loop ) { if (!digi_initialised) return; digi_stop_current_song(); //added on 5/20/99 by Victor Rachels to fix crash/etc if(filename == NULL) return; if(midi_volume < 1) return; //end this section addition - VR if ((hmp = hmp_open(filename))) { hmp_play(hmp); digi_midi_song_playing = 1; digi_set_midi_volume(midi_volume); } else printf("hmp_open failed\n"); }
void digi_audio_play_midi_song( char * filename, char * melodic_bank, char * drum_bank, int loop ) { #ifdef _WIN32 if (GameArg.SndNoMusic) return; digi_stop_current_song(); if (filename == NULL) return; if ((hmp = hmp_open(filename))) { hmp_play(hmp,loop); digi_midi_song_playing = 1; digi_set_midi_volume(midi_volume); } #endif }
void DigiPlayMidiSong(char *filename, char *melodic_bank, char *drum_bank, int loop, int bD1Song) { #if 0 if (!gameStates.sound.digi.bInitialized) return; #endif DigiStopCurrentSong(); if (filename == NULL) return; if (midi_volume < 1) return; if (hmp = hmp_open (filename, bD1Song)) { #if USE_SDL_MIXER if (gameOpts->sound.bUseSDLMixer) { char fnMusic [FILENAME_LEN]; sprintf (fnMusic, "%s%sd2x-temp.mid", gameFolders.szDataDir, *gameFolders.szDataDir ? "/" : ""); if (hmp_to_midi (hmp, fnMusic) && (mixMusic = Mix_LoadMUS (fnMusic))) { if (Mix_PlayMusic (mixMusic, loop ? -1 : 1) != -1) { digi_midi_song_playing = 1; DigiSetMidiVolume (midi_volume); } } } #endif #if defined (_WIN32) # if USE_SDL_MIXER else # endif { hmp_play(hmp, loop); digi_midi_song_playing = 1; DigiSetMidiVolume(midi_volume); } #endif } }
int mus_thread(void *thread_arg) { struct hmp_file *hf; hmpopl *h; char buf[32]; snd = oplsnd_init(); if (oplsnd_open(snd)) { fprintf(stderr, "mus: %s\n", oplsnd_errmsg(snd)); return 0; } for (;;) { while (!mus_switch || !mus_filename) SDL_Delay(1); mus_switch = 0; if (!(h = hmpopl_new())) { fprintf(stderr, "create hmpopl failed\n"); continue; } if (loadbankfile(h, mus_melodic_file, 0)) { fprintf(stderr, "load bnk %s failed\n", mus_melodic_file); continue; } if (loadbankfile(h, mus_drum_file, 1)) { fprintf(stderr, "load bnk %s failed\n", mus_drum_file); continue; } int song_size; void *song_data; if (strlen(mus_filename) < sizeof(buf)) { strcpy(buf, mus_filename); buf[strlen(buf) - 1] = 'q'; song_data = (void *)loadfile(buf, &song_size); } else song_data = NULL; if (!song_data && !(song_data = (void *)loadfile(mus_filename, &song_size))) { fprintf(stderr, "open %s failed\n", mus_filename); continue; } if (!(hf = hmp_open(song_data, song_size, 0xa009))) { fprintf(stderr, "read %s failed\n", mus_filename); continue; } free(song_data); hmpopl_set_write_callback(h, writereg, NULL); hmpopl_start(h); hmpopl_set_write_callback(h, writereg, NULL); hmpopl_start(h); int rc; do { hmp_event ev; hmp_reset_tracks(hf); hmpopl_reset(h); while (!(rc = hmp_get_event(hf, &ev)) && !mus_switch) { if (ev.datalen) continue; if ((ev.msg[0] & 0xf0) == 0xb0 && ev.msg[1] == 7) { int vol = ev.msg[2]; vol = (vol * 127) >> 7; vol = (vol * 127) >> 7; ev.msg[2] = vol; } if (ev.delta) { if (snd) oplsnd_generate_samples(snd, (oplsnd_getfreq(snd) / 120) * ev.delta); } hmpopl_play_midi(h, ev.msg[0] >> 4, ev.msg[0] & 0x0f, ev.msg[1], ev.msg[2]); } } while (!mus_switch && mus_loop); hmpopl_done(h); hmp_close(hf); } return 0; }
int DigiPlayMidiSong (char *pszSong, char *melodic_bank, char *drum_bank, int bLoop, int bD1Song) { int bCustom; #if 0 if (!gameStates.sound.digi.bInitialized) return 0; #endif PrintLog ("DigiPlayMidiSong (%s)\n", pszSong); DigiStopCurrentSong (); if (!(pszSong && *pszSong)) return 0; if (midiVolume < 1) return 0; bCustom = ((strstr (pszSong, ".mp3") != NULL) || (strstr (pszSong, ".ogg") != NULL)); if (!(bCustom || (hmp = hmp_open (pszSong, bD1Song)))) return 0; #if USE_SDL_MIXER if (gameOpts->sound.bUseSDLMixer) { char fnSong [FILENAME_LEN], *pfnSong; if (bCustom) { pfnSong = pszSong; if (strstr (pszSong, ".mp3") && !gameData.songs.user.bMP3) { DigiExit (); gameData.songs.user.bMP3 = 1; DigiInit (1); } } else { if (!strstr (pszSong, ".mp3") && gameData.songs.user.bMP3) { DigiExit (); gameData.songs.user.bMP3 = 0; DigiInit (1); } sprintf (fnSong, "%s/d2x-temp.mid", *gameFolders.szTempDir ? gameFolders.szTempDir : gameFolders.szHomeDir); if (!hmp_to_midi (hmp, fnSong)) { PrintLog ("SDL_mixer failed to load %s\n(%s)\n", fnSong, Mix_GetError ()); return 0; } pfnSong = fnSong; } if (!(mixMusic = Mix_LoadMUS (pfnSong))) { PrintLog ("SDL_mixer failed to load %s\n(%s)\n", fnSong, Mix_GetError ()); return 0; } if (-1 == Mix_FadeInMusicPos (mixMusic, bLoop ? -1 : 1, gameData.songs.tPos ? 1000 : 1500, (double) gameData.songs.tPos / 1000.0)) { PrintLog ("SDL_mixer cannot play %s\n(%s)\n", pszSong, Mix_GetError ()); gameData.songs.tPos = 0; return 0; } PrintLog ("SDL_mixer playing %s\n", pszSong); if (gameData.songs.tPos) gameData.songs.tPos = 0; else gameData.songs.tStart = SDL_GetTicks (); gameData.songs.bPlaying = 1; DigiSetMidiVolume (midiVolume); return 1; } #endif #if defined (_WIN32) if (bCustom) { PrintLog ("Cannot play %s - enable SDL_mixer\n", pszSong); return 0; } hmp_play (hmp, bLoop); gameData.songs.bPlaying = 1; DigiSetMidiVolume (midiVolume); #endif return 1; }
int CMidi::PlaySong (char* pszSong, char* melodicBank, char* drumBank, int bLoop, int bD1Song) { #if (defined (_WIN32) || USE_SDL_MIXER) int bCustom; PrintLog ("DigiPlayMidiSong (%s)\n", pszSong); audio.StopCurrentSong (); if (!(pszSong && *pszSong)) return 0; if (m_nVolume < 1) return 0; bCustom = ((strstr (pszSong, ".mp3") != NULL) || (strstr (pszSong, ".ogg") != NULL)); if (bCustom) { if (audio.Format () != AUDIO_S16LSB) { audio.Shutdown (); audio.Setup (1, AUDIO_S16LSB); } } else if (!(m_hmp = hmp_open (pszSong, bD1Song))) return 0; # if USE_SDL_MIXER if (gameOpts->sound.bUseSDLMixer) { char fnSong [FILENAME_LEN], *pfnSong; if (bCustom) { pfnSong = pszSong; if (strstr (pszSong, ".mp3") && !songManager.MP3 ()) { audio.Shutdown (); songManager.SetMP3 (1); audio.Setup (1); } } else { if (!strstr (pszSong, ".mp3") && songManager.MP3 ()) { audio.Shutdown (); songManager.SetMP3 (0); audio.Setup (1); } #if defined (_WIN32) sprintf (fnSong, "%s/d2x-temp.mid", *gameFolders.szCacheDir ? gameFolders.szCacheDir : gameFolders.szHomeDir); #else sprintf (fnSong, "%s/d2x-temp.mid", *gameFolders.szCacheDir ? gameFolders.szCacheDir : gameFolders.szHomeDir); #endif if (!hmp_to_midi (m_hmp, fnSong)) { PrintLog ("SDL_mixer failed to load %s\n(%s)\n", fnSong, Mix_GetError ()); return 0; } pfnSong = fnSong; } if (!(m_music = Mix_LoadMUS (pfnSong))) { PrintLog ("SDL_mixer failed to load %s\n(%s)\n", fnSong, Mix_GetError ()); return 0; } if (-1 == Mix_FadeInMusicPos (m_music, bLoop ? -1 : 1, songManager.Pos () ? 1000 : 1500, (double) songManager.Pos () / 1000.0)) { PrintLog ("SDL_mixer cannot play %s\n(%s)\n", pszSong, Mix_GetError ()); songManager.SetPos (0); return 0; } PrintLog ("SDL_mixer playing %s\n", pszSong); if (songManager.Pos ()) songManager.SetPos (0); else songManager.SetStart (SDL_GetTicks ()); songManager.SetPlaying (1); SetVolume (m_nVolume); return 1; } # endif # if defined (_WIN32) if (bCustom) { PrintLog ("Cannot play %s - enable SDL_mixer\n", pszSong); return 0; } hmp_play (m_hmp, bLoop); songManager.SetPlaying (1); SetVolume (m_nVolume); # endif #endif return 1; }