void os_start_sample (int number, int volume, int repeats, zword eos) { /* INCOMPLETE */ sigset_t sigchld_mask; struct sigaction sa; os_prepare_sample(number); if (! sound_buffer) return; os_stop_sample(0); sigemptyset(&sigchld_mask); sigaddset(&sigchld_mask, SIGCHLD); sigprocmask(SIG_BLOCK, &sigchld_mask, NULL); child_pid = fork(); if (child_pid < 0) { /* error in fork */ perror("fork"); return; } else if (child_pid == 0) { /* child */ sigprocmask(SIG_UNBLOCK, &sigchld_mask, NULL); play_sound(volume, repeats); } else { /* parent */ sa.sa_handler = sigchld_handler; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sigaction(SIGCHLD, &sa, NULL); sigprocmask(SIG_UNBLOCK, &sigchld_mask, NULL); } }/* os_start_sample */
/* * z_sound_effect, load / play / stop / discard a sound effect. * * zargs[0] = number of bleep (1 or 2) or sample * zargs[1] = operation to perform (samples only) * zargs[2] = repeats and volume (play sample only) * zargs[3] = end-of-sound routine (play sample only, optional) * * Note: Volumes range from 1 to 8, volume 255 is the default volume. * Repeats are stored in the high byte, 255 is infinite loop. * */ void z_sound_effect (void) { zword number = zargs[0]; zword effect = zargs[1]; zword volume = zargs[2]; /* By default play sound 1 at volume 8 */ if (zargc < 1) number = 1; if (zargc < 2) effect = EFFECT_PLAY; if (zargc < 3) volume = 8; if (number >= 3 || number == 0) { locked = TRUE; if (story_id == LURKING_HORROR && (number == 9 || number == 16)) { if (effect == EFFECT_PLAY) { next_sample = number; next_volume = volume; locked = FALSE; if (!playing) start_next_sample (); } else locked = FALSE; return; } playing = FALSE; switch (effect) { case EFFECT_PREPARE: os_prepare_sample (number); break; case EFFECT_PLAY: start_sample (number, lo (volume), hi (volume), (zargc == 4) ? zargs[3] : 0); break; case EFFECT_STOP: os_stop_sample (); break; case EFFECT_FINISH_WITH: os_finish_with_sample (); break; } locked = FALSE; } else os_beep (number); }/* z_sound_effect */
void os_reset_screen (void) { os_stop_sample(0); os_set_text_style(0); os_display_string((zchar *) "[Hit any key to exit.]"); os_read_key(0, FALSE); }/* os_reset_screen */
void os_reset_screen (void) { os_stop_sample(0); os_set_text_style(0); print_string("[Hit any key to exit.]\n"); os_read_key(0, FALSE); scrollok(stdscr, TRUE); scroll(stdscr); refresh(); endwin(); }/* os_reset_screen */