// returns -1 on failure, channel number on success int PlaySoundEx(int val1, int channel) { if (debug_flags & DBG_NOSFX) return -1; ScriptAudioClip *aclip = GetAudioClipForOldStyleNumber(game, false, val1); if (aclip && !is_audiotype_allowed_to_play((AudioFileType)aclip->fileType)) return -1; // if sound is off, ignore it if ((channel < SCHAN_NORMAL) || (channel >= MAX_SOUND_CHANNELS)) quit("!PlaySoundEx: invalid channel specified, must be 3-7"); // if an ambient sound is playing on this channel, abort it StopAmbientSound(channel); if (val1 < 0) { stop_and_destroy_channel (channel); return -1; } // if skipping a cutscene, don't try and play the sound if (play.fast_forward) return -1; // that sound is already in memory, play it if (!psp_audio_multithreaded) { if ((last_sound_played[channel] == val1) && (channels[channel] != NULL)) { debug_script_log("Playing sound %d on channel %d; cached", val1, channel); channels[channel]->restart(); channels[channel]->set_volume (play.sound_volume); return channel; } } // free the old sound stop_and_destroy_channel (channel); debug_script_log("Playing sound %d on channel %d", val1, channel); last_sound_played[channel] = val1; SOUNDCLIP *soundfx = aclip ? load_sound_and_play(aclip, false) : NULL; if (soundfx == NULL) { debug_script_warn("Sound sample load failure: cannot load sound %d", val1); debug_script_log("FAILED to load sound %d", val1); return -1; } channels[channel] = soundfx; channels[channel]->priority = 10; channels[channel]->set_volume (play.sound_volume); return channel; }
void PlayMP3File (const char *filename) { if (strlen(filename) >= PLAYMP3FILE_MAX_FILENAME_LEN) quit("!PlayMP3File: filename too long"); debug_script_log("PlayMP3File %s", filename); AssetPath asset_name("", filename); int useChan = prepare_for_new_music (); bool doLoop = (play.music_repeat > 0); if ((channels[useChan] = my_load_static_ogg(asset_name, 150, doLoop)) != NULL) { channels[useChan]->play(); current_music_type = MUS_OGG; play.cur_music_number = 1000; // save the filename (if it's not what we were supplied with) if (filename != &play.playmp3file_name[0]) strcpy (play.playmp3file_name, filename); } else if ((channels[useChan] = my_load_static_mp3(asset_name, 150, doLoop)) != NULL) { channels[useChan]->play(); current_music_type = MUS_MP3; play.cur_music_number = 1000; // save the filename (if it's not what we were supplied with) if (filename != &play.playmp3file_name[0]) strcpy (play.playmp3file_name, filename); } else debug_script_warn ("PlayMP3File: file '%s' not found or cannot play", filename); post_new_music_check(useChan); update_music_volume(); }
void SeekMIDIPosition (int position) { if (play.silent_midi) midi_seek (position); if (current_music_type == MUS_MIDI) { midi_seek(position); debug_script_log("Seek MIDI position to %d", position); } }
void SeekMP3PosMillis (int posn) { if (current_music_type) { debug_script_log("Seek MP3/OGG to %d ms", posn); if (crossFading && channels[crossFading]) channels[crossFading]->seek (posn); else if (channels[SCHAN_MUSIC]) channels[SCHAN_MUSIC]->seek (posn); } }
void Button_SetPushedGraphic(GUIButton *guil, int slotn) { debug_script_log("GUI %d Button %d pushed set to slot %d", guil->guin, guil->objn, slotn); if (guil->ispushed) guil->usepic = slotn; guil->pushedpic = slotn; guis_need_update = 1; FindAndRemoveButtonAnimation(guil->guin, guil->objn); }
void Button_SetMouseOverGraphic(GUIButton *guil, int slotn) { debug_script_log("GUI %d Button %d mouseover set to slot %d", guil->guin, guil->objn, slotn); if ((guil->isover != 0) && (guil->ispushed == 0)) guil->usepic = slotn; guil->overpic = slotn; guis_need_update = 1; FindAndRemoveButtonAnimation(guil->guin, guil->objn); }
void PlayAmbientSound (int channel, int sndnum, int vol, int x, int y) { // the channel parameter is to allow multiple ambient sounds in future if ((channel < 1) || (channel == SCHAN_SPEECH) || (channel >= MAX_SOUND_CHANNELS)) quit("!PlayAmbientSound: invalid channel number"); if ((vol < 1) || (vol > 255)) quit("!PlayAmbientSound: volume must be 1 to 255"); ScriptAudioClip *aclip = GetAudioClipForOldStyleNumber(game, false, sndnum); if (aclip && !is_audiotype_allowed_to_play((AudioFileType)aclip->fileType)) return; // only play the sound if it's not already playing if ((ambient[channel].channel < 1) || (channels[ambient[channel].channel] == NULL) || (channels[ambient[channel].channel]->done == 1) || (ambient[channel].num != sndnum)) { StopAmbientSound(channel); // in case a normal non-ambient sound was playing, stop it too stop_and_destroy_channel(channel); SOUNDCLIP *asound = aclip ? load_sound_and_play(aclip, true) : NULL; if (asound == NULL) { debug_script_warn ("Cannot load ambient sound %d", sndnum); debug_script_log("FAILED to load ambient sound %d", sndnum); return; } debug_script_log("Playing ambient sound %d on channel %d", sndnum, channel); ambient[channel].channel = channel; channels[channel] = asound; channels[channel]->priority = 15; // ambient sound higher priority than normal sfx } // calculate the maximum distance away the player can be, using X // only (since X centred is still more-or-less total Y) ambient[channel].maxdist = ((x > thisroom.width / 2) ? x : (thisroom.width - x)) - AMBIENCE_FULL_DIST; ambient[channel].num = sndnum; ambient[channel].x = x; ambient[channel].y = y; ambient[channel].vol = vol; update_ambient_sound_vol(); }
int PlayMusicQueued(int musnum) { // Just get the queue size if (musnum < 0) return play.music_queue_size; if ((IsMusicPlaying() == 0) && (play.music_queue_size == 0)) { newmusic(musnum); return 0; } if (play.music_queue_size >= MAX_QUEUED_MUSIC) { debug_script_log("Too many queued music, cannot add %d", musnum); return 0; } if ((play.music_queue_size > 0) && (play.music_queue[play.music_queue_size - 1] >= QUEUED_MUSIC_REPEAT)) { quit("!PlayMusicQueued: cannot queue music after a repeating tune has been queued"); } if (play.music_repeat) { debug_script_log("Queuing music %d to loop", musnum); musnum += QUEUED_MUSIC_REPEAT; } else { debug_script_log("Queuing music %d", musnum); } play.music_queue[play.music_queue_size] = musnum; play.music_queue_size++; if (play.music_queue_size == 1) { clear_music_cache(); cachedQueuedMusic = load_music_from_disk(musnum, (play.music_repeat > 0)); } return play.music_queue_size; }
void Button_SetNormalGraphic(GUIButton *guil, int slotn) { debug_script_log("GUI %d Button %d normal set to slot %d", guil->guin, guil->objn, slotn); // normal pic - update if mouse is not over, or if there's no overpic if (((guil->isover == 0) || (guil->overpic < 1)) && (guil->ispushed == 0)) guil->usepic = slotn; guil->pic = slotn; // update the clickable area to the same size as the graphic guil->wid = spritewidth[slotn]; guil->hit = spriteheight[slotn]; guis_need_update = 1; FindAndRemoveButtonAnimation(guil->guin, guil->objn); }
void SeekMODPattern(int patnum) { if (current_music_type == MUS_MOD && channels[SCHAN_MUSIC]) { channels[SCHAN_MUSIC]->seek (patnum); debug_script_log("Seek MOD/XM to pattern %d", patnum); } }
void EnableHotspot(int hsnum) { if ((hsnum<1) | (hsnum>=MAX_HOTSPOTS)) quit("!EnableHotspot: invalid hotspot specified"); croom->hotspot_enabled[hsnum]=1; debug_script_log("Hotspot %d re-enabled", hsnum); }