// close void loop_brief_close() { // this makes sure that we're all cool no matter how the user decides to exit mission_campaign_mission_over(); // free the bitmap if (Loop_brief_bitmap >= 0){ bm_release(Loop_brief_bitmap); } Loop_brief_bitmap = -1; // destroy the window Loop_brief_window.destroy(); if (Loop_anim.num_frames > 0) { generic_anim_unload(&Loop_anim); } // stop voice if(Loop_sound != -1){ audiostream_stop(Loop_sound, 1, 0); audiostream_close_file(Loop_sound, 1); Loop_sound = -1; } fsspeech_stop(); // stop music common_music_close(); }
// stop playback of the red alert voice void red_alert_voice_stop() { if ( !Red_alert_voice_started ) return; if (Red_alert_voice < 0) { fsspeech_stop(); } else { audiostream_stop(Red_alert_voice, 1, 0); // stream is automatically rewound } }
/** * Doesn't actually stop playing ANIs any more, just stops audio */ void cmd_brief_stop_anim() { Voice_good_to_go = 0; if (Cmd_brief_last_voice >= 0) { audiostream_stop(Cmd_brief_last_voice, 1, 0); // stream is automatically rewound Cmd_brief_last_voice = -1; } if (Cmd_brief_last_stage >= 0) { fsspeech_stop(); Cmd_brief_last_stage = -1; } }
// pause a single audio stream, indentified by handle i. void audiostream_pause(int i) { if ( i == -1 ) return; Assert( i >= 0 && i < MAX_AUDIO_STREAMS ); if ( Audio_streams[i].status == ASF_FREE ) return; if ( audiostream_is_playing(i) == TRUE ) { audiostream_stop(i, 0, 1); } }
// plays the voice file associated with a training message. Automatically streams the file // from disk if it's over 100k, otherwise plays it as a normal file in memory. Returns -1 // if it didn't play, otherwise index of voice int message_play_training_voice(int index) { int len; CFILE *fp; if (index < 0) { if (Training_voice >= 0) { if (Training_voice_type) { audiostream_close_file(Training_voice_handle, 0); } else { snd_stop(Training_voice_handle); } } Training_voice = -1; return -1; } if (Message_waves[index].num < 0) { fp = cfopen(Message_waves[index].name, "rb"); if (!fp) return -1; len = cfilelength(fp); cfclose(fp); if (len > 100000) { if ((Training_voice < 0) || !Training_voice_type || (Training_voice != index)) { if (Training_voice >= 0) { if (Training_voice_type) { if (Training_voice == index) audiostream_stop(Training_voice_handle, 1, 0); else audiostream_close_file(Training_voice_handle, 0); } else { snd_stop(Training_voice_handle); } } if (stricmp(Message_waves[index].name, NOX("none.wav"))) { Training_voice_handle = audiostream_open(Message_waves[index].name, ASF_VOICE); if (Training_voice_handle < 0) { nprintf(("Warning", "Unable to load voice file %s\n", Message_waves[index].name)); // Warning(LOCATION, "Unable to load voice file %s\n", Message_waves[index].name); } } } // Training_voice should be valid and loaded now Training_voice_type = 1; if (Training_voice_handle >= 0) audiostream_play(Training_voice_handle, Master_voice_volume, 0); Training_voice = index; return Training_voice; } else { game_snd tmp_gs; memset(&tmp_gs, 0, sizeof(game_snd)); strcpy(tmp_gs.filename, Message_waves[index].name); Message_waves[index].num = snd_load(&tmp_gs, 0); if (Message_waves[index].num < 0) { nprintf(("Warning", "Cannot load message wave: %s. Will not play\n", Message_waves[index].name)); return -1; } } } if (Training_voice >= 0) { if (Training_voice_type) { audiostream_close_file(Training_voice_handle, 0); } else { snd_stop(Training_voice_handle); } } Training_voice = index; if (Message_waves[index].num >= 0) Training_voice_handle = snd_play_raw(Message_waves[index].num, 0.0f); else Training_voice_handle = -1; Training_voice_type = 0; return Training_voice; }
void cmd_brief_button_pressed(int n) { switch (n) { case CMD_BRIEF_BUTTON_HELP: launch_context_help(); gamesnd_play_iface(SND_HELP_PRESSED); break; case CMD_BRIEF_BUTTON_OPTIONS: gamesnd_play_iface(SND_SWITCH_SCREENS); gameseq_post_event(GS_EVENT_OPTIONS_MENU); break; case CMD_BRIEF_BUTTON_FIRST_STAGE: if (common_num_cutscenes_valid(MOVIE_PRE_CMD_BRIEF)) { audiostream_stop(Cmd_brief_last_voice); common_maybe_play_cutscene(MOVIE_PRE_CMD_BRIEF, true, SCORE_BRIEFING); cmd_brief_new_stage(0); } else if (Cur_stage) { cmd_brief_new_stage(0); gamesnd_play_iface(SND_BRIEF_STAGE_CHG); } else { gamesnd_play_iface(SND_GENERAL_FAIL); } break; case CMD_BRIEF_BUTTON_PREV_STAGE: if (!Cur_stage && common_num_cutscenes_valid(MOVIE_PRE_CMD_BRIEF)) { audiostream_stop(Cmd_brief_last_voice); common_maybe_play_cutscene(MOVIE_PRE_CMD_BRIEF, true, SCORE_BRIEFING); cmd_brief_new_stage(0); } else if (Cur_stage) { cmd_brief_new_stage(Cur_stage - 1); gamesnd_play_iface(SND_BRIEF_STAGE_CHG); } else { gamesnd_play_iface(SND_GENERAL_FAIL); } break; case CMD_BRIEF_BUTTON_NEXT_STAGE: if (Cur_stage < Cur_cmd_brief->num_stages - 1) { cmd_brief_new_stage(Cur_stage + 1); gamesnd_play_iface(SND_BRIEF_STAGE_CHG); } else { gamesnd_play_iface(SND_GENERAL_FAIL); } break; case CMD_BRIEF_BUTTON_LAST_STAGE: if (Cur_stage < Cur_cmd_brief->num_stages - 1) { cmd_brief_new_stage(Cur_cmd_brief->num_stages - 1); gamesnd_play_iface(SND_BRIEF_STAGE_CHG); } else { gamesnd_play_iface(SND_GENERAL_FAIL); } break; case CMD_BRIEF_BUTTON_ACCEPT: cmd_brief_exit(); gamesnd_play_iface(SND_COMMIT_PRESSED); break; case CMD_BRIEF_BUTTON_PAUSE: gamesnd_play_iface(SND_USER_SELECT); fsspeech_pause(Player->auto_advance != 0); Player->auto_advance ^= 1; break; case CMD_BRIEF_BUTTON_SCROLL_UP: Top_cmd_brief_text_line--; if ( Top_cmd_brief_text_line < 0 ) { Top_cmd_brief_text_line = 0; gamesnd_play_iface(SND_GENERAL_FAIL); } else { gamesnd_play_iface(SND_SCROLL); } break; case CMD_BRIEF_BUTTON_SCROLL_DOWN: Top_cmd_brief_text_line++; if ( (Num_brief_text_lines[0] - Top_cmd_brief_text_line) < Max_cmdbrief_Lines) { Top_cmd_brief_text_line--; gamesnd_play_iface(SND_GENERAL_FAIL); } else { gamesnd_play_iface(SND_SCROLL); } break; } }
/** * Start playback of the voice for a particular briefing stage * @param stage_num Particular briefing stage */ void cmd_brief_voice_play(int stage_num) { int voice = -1; int stage = -1; if (!Voice_good_to_go) { Voice_started_time = 0; return; } if (!Voice_started_time) { Voice_started_time = timer_get_milliseconds(); Voice_ended_time = 0; } if (!Briefing_voice_enabled){ return; } if (Cur_stage >= 0 && Cur_stage < Cur_cmd_brief->num_stages){ voice = Cur_cmd_brief->stage[stage_num].wave; stage = stage_num; } // do we need to play simulated speech? if (voice < 0 && fsspeech_play_from(FSSPEECH_FROM_BRIEFING)) { // are we still on the same stage? if (Cmd_brief_last_stage == stage) { return; // no changes, nothing to do. } // if previous stage is still playing, stop it first. if (Cmd_brief_last_stage >= 0) { fsspeech_stop(); Cmd_brief_last_stage = -1; } // ok, new text needs speaking Cmd_brief_last_stage = stage; if (stage >= 0) { fsspeech_play(FSSPEECH_FROM_BRIEFING, Cur_cmd_brief->stage[stage_num].text.c_str()); } } else { // are we still on same voice that is currently playing/played? if (Cmd_brief_last_voice == voice) { return; // no changes, nothing to do. } // if previous wave is still playing, stop it first. if (Cmd_brief_last_voice >= 0) { audiostream_stop(Cmd_brief_last_voice, 1, 0); // stream is automatically rewound Cmd_brief_last_voice = -1; } // ok, new wave needs playing, so we can start playing it now (and it becomes the current wave) Cmd_brief_last_voice = voice; if (voice >= 0) { audiostream_play(voice, Master_voice_volume, 0); } } }