/** * Read a tune sequence from the sound database and start playing it */ void SoundHandler::playMusic(int16 tune) { sound_pt seqPtr; // Sequence data from file uint16 size; // Size of sequence data if (_vm->_config.musicFl) { _vm->getGameStatus().song = tune; seqPtr = _vm->_file->getSound(tune, &size); playMIDI(seqPtr, size); free(seqPtr); } }
int ONScripter::playSound(const char *filename, int format, bool loop_flag, int channel) { if ( !audio_open_flag ) return SOUND_NONE; long length = script_h.cBR->getFileLength( filename ); if (length == 0) return SOUND_NONE; unsigned char *buffer; if (format & SOUND_MUSIC && length == music_buffer_length && music_buffer ){ buffer = music_buffer; } else{ buffer = new(std::nothrow) unsigned char[length]; if (buffer == NULL){ fprintf( stderr, "failed to load [%s] because file size [%lu] is too large.\n", filename, length); return SOUND_NONE; } script_h.cBR->getFile( filename, buffer ); } if (format & SOUND_MUSIC){ music_info = Mix_LoadMUS_RW( SDL_RWFromMem( buffer, length ) ); Mix_VolumeMusic( music_volume ); Mix_HookMusicFinished( musicFinishCallback ); if ( Mix_PlayMusic( music_info, music_play_loop_flag?-1:0 ) == 0 ){ music_buffer = buffer; music_buffer_length = length; return SOUND_MUSIC; } } if (format & SOUND_CHUNK){ Mix_Chunk *chunk = Mix_LoadWAV_RW(SDL_RWFromMem(buffer, length), 1); if (playWave(chunk, format, loop_flag, channel) == 0){ delete[] buffer; return SOUND_CHUNK; } } /* check WMA */ if ( buffer[0] == 0x30 && buffer[1] == 0x26 && buffer[2] == 0xb2 && buffer[3] == 0x75 ){ delete[] buffer; return SOUND_OTHER; } if (format & SOUND_MIDI){ FILE *fp; if ( (fp = fopen(TMP_MUSIC_FILE, "wb")) == NULL){ fprintf(stderr, "can't open temporaly MIDI file %s\n", TMP_MUSIC_FILE); } else{ fwrite(buffer, 1, length, fp); fclose( fp ); ext_music_play_once_flag = !loop_flag; if (playMIDI(loop_flag) == 0){ delete[] buffer; return SOUND_MIDI; } } } delete[] buffer; return SOUND_OTHER; }
void ONScripter::flushEventSub( SDL_Event &event ) { if ( event.type == ONS_MUSIC_EVENT ){ if ( music_play_loop_flag || (cd_play_loop_flag && !cdaudio_flag ) ){ stopBGM( true ); if (music_file_name) playSound(music_file_name, SOUND_MUSIC, true); else playCDAudio(); } else{ stopBGM( false ); } } else if ((event.type == ONS_BGMFADE_EVENT) && (event.user.code == BGM_FADEOUT)){ Uint32 cur_fade_duration = mp3fadeout_duration_internal; if (skip_mode & (SKIP_NORMAL | SKIP_TO_EOP) || ctrl_pressed_status) { cur_fade_duration = 0; Mix_VolumeMusic( 0 ); } Uint32 tmp = SDL_GetTicks() - mp3fade_start; if ( tmp < cur_fade_duration ) { tmp = cur_fade_duration - tmp; tmp *= music_volume; tmp /= cur_fade_duration; Mix_VolumeMusic( tmp * MIX_MAX_VOLUME / 100 ); } else { char *ext = NULL; if (music_file_name) ext = strrchr(music_file_name, '.'); if (ext && (strcmp(ext+1, "OGG") && strcmp(ext+1, "ogg"))){ // set break event to return to script processing when playing music other than ogg SDL_RemoveTimer( break_id ); break_id = NULL; SDL_Event event; event.type = ONS_BREAK_EVENT; SDL_PushEvent( &event ); } stopBGM( false ); } } else if ((event.type == ONS_BGMFADE_EVENT) && (event.user.code == BGM_FADEIN)){ Uint32 cur_fade_duration = mp3fadein_duration_internal; if (skip_mode & (SKIP_NORMAL | SKIP_TO_EOP) || ctrl_pressed_status) { cur_fade_duration = 0; Mix_VolumeMusic( music_volume * MIX_MAX_VOLUME / 100 ); } Uint32 tmp = SDL_GetTicks() - mp3fade_start; if ( tmp < cur_fade_duration ) { tmp *= music_volume; tmp /= cur_fade_duration; Mix_VolumeMusic( tmp * MIX_MAX_VOLUME / 100 ); } else { if (timer_bgmfade_id) SDL_RemoveTimer( timer_bgmfade_id ); timer_bgmfade_id = NULL; mp3fadeout_duration_internal = 0; char *ext = NULL; if (music_file_name) ext = strrchr(music_file_name, '.'); if (ext && (strcmp(ext+1, "OGG") && strcmp(ext+1, "ogg"))){ // set break event to return to script processing when playing music other than ogg SDL_RemoveTimer( break_id ); break_id = NULL; SDL_Event event; event.type = ONS_BREAK_EVENT; SDL_PushEvent( &event ); } } } else if ( event.type == ONS_CDAUDIO_EVENT ){ if ( cd_play_loop_flag ){ stopBGM( true ); playCDAudio(); } else{ stopBGM( false ); } } else if ( event.type == ONS_MIDI_EVENT ){ ext_music_play_once_flag = !midi_play_loop_flag; Mix_FreeMusic( midi_info ); playMIDI(midi_play_loop_flag); } else if ( event.type == ONS_CHUNK_EVENT ){ // for processing btntim2 and automode correctly if ( wave_sample[event.user.code] ){ Mix_FreeChunk( wave_sample[event.user.code] ); wave_sample[event.user.code] = NULL; if (event.user.code == MIX_LOOPBGM_CHANNEL0 && loop_bgm_name[1] && wave_sample[MIX_LOOPBGM_CHANNEL1]) Mix_PlayChannel(MIX_LOOPBGM_CHANNEL1, wave_sample[MIX_LOOPBGM_CHANNEL1], -1); } } }
void PonscripterLabel::flushEventSub(SDL_Event &event) { if (event.type == ONS_SOUND_EVENT) { if (music_play_loop_flag) { stopBGM(true); if (music_file_name) playSound(music_file_name, SOUND_OGG_STREAMING | SOUND_MP3, true); } else { stopBGM(false); } } // The event handler for the mp3 fadeout event itself. Simply sets the volume of the mp3 being played lower and lower until it's 0, // and until the requisite mp3 fadeout time has passed. Recommend for integration. [Seung Park, 20060621] else if (event.type == ONS_FADE_EVENT) { if (skip_flag || draw_one_page_flag || ctrl_pressed_status || skip_to_wait) { mp3fadeout_duration = 0; if (mp3_sample) SMPEG_setvolume(mp3_sample, 0); } Uint32 tmp = SDL_GetTicks() - mp3fadeout_start; if (tmp < mp3fadeout_duration) { tmp = mp3fadeout_duration - tmp; tmp *= music_volume; tmp /= mp3fadeout_duration; if (mp3_sample) SMPEG_setvolume(mp3_sample, tmp); } else { SDL_RemoveTimer(timer_mp3fadeout_id); timer_mp3fadeout_id = 0; event_mode &= ~WAIT_TIMER_MODE; stopBGM(false); advancePhase(); } } else if (event.type == ONS_MIDI_EVENT) { #ifdef MACOSX if (!Mix_PlayingMusic()) { ext_music_play_once_flag = !midi_play_loop_flag; Mix_FreeMusic(midi_info); playMIDI(midi_play_loop_flag); } #else ext_music_play_once_flag = !midi_play_loop_flag; Mix_FreeMusic(midi_info); playMIDI(midi_play_loop_flag); #endif } else if (event.type == ONS_MUSIC_EVENT) { ext_music_play_once_flag = !music_play_loop_flag; Mix_FreeMusic(music_info); playExternalMusic(music_play_loop_flag); } else if (event.type == ONS_WAVE_EVENT) { // for processing btntim2 and automode correctly if (wave_sample[event.user.code]) { Mix_FreeChunk(wave_sample[event.user.code]); wave_sample[event.user.code] = NULL; if (event.user.code == MIX_LOOPBGM_CHANNEL0 && loop_bgm_name[1] && wave_sample[MIX_LOOPBGM_CHANNEL1]) Mix_PlayChannel(MIX_LOOPBGM_CHANNEL1, wave_sample[MIX_LOOPBGM_CHANNEL1], -1); } } }