/* * start_next_sample * * Play a sample that has been delayed until the previous sound effect has * finished. This is necessary for two samples in The Lurking Horror that * immediately follow other samples. * */ static void start_next_sample (void) { if (next_sample != 0) start_sample (next_sample, next_volume, 0, 0); next_sample = 0; next_volume = 0; }/* start_next_sample */
void GlkInterface::start_next_sample() { if (next_sample != 0) start_sample(next_sample, next_volume, 0, 0); next_sample = 0; next_volume = 0; }
/* * 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 */
static void adc_start_sample(int chan) { set_chan_list(chan, 1); set_avg_mode(chan, NO_AVG_MODE, SAMPLE_NUM_1); set_sample_mux(chan, g_chan_mux[chan]); set_detect_mux(g_chan_mux[chan]); set_idle_mux(g_chan_mux[chan]); // for revb enable_sample_engine(); start_sample(); adc_sample_time = 0; }
int get_adc_sample(int chan) { int count; int value = -1; int sum; set_chan_list(chan, 1); set_avg_mode(chan, NO_AVG_MODE, SAMPLE_NUM_8); set_sample_mux(chan, g_chan_mux[chan]); set_detect_mux(g_chan_mux[chan]); set_idle_mux(g_chan_mux[chan]); // for revb enable_sample_engine(); start_sample(); // Read any CBUS register to delay one clock // cycle after starting the sampling engine // The bus is really fast and we may miss that it started { count = READ_CBUS_REG(ISA_TIMERE); } count = 0; while (delta_busy() || sample_busy() || avg_busy()){ if (++count > 10000){ printf("ADC busy error.\n"); goto adc_sample_end; } } stop_sample(); sum = 0; count = 0; value = get_fifo_sample(); while (get_fifo_cnt()){ value = get_fifo_sample() & 0x3ff; if ((value != 0x1fe) && (value != 0x1ff)){ sum += value & 0x3ff; count++; } } value = (count) ? (sum / count) : (-1); adc_sample_end: #if AML_ADC_SAMPLE_DEBUG printf("ch%d = %d, count=%d\n", chan, value, count); #endif //AML_ADC_SAMPLE_DEBUG disable_sample_engine(); set_sc_phase(); return value; }
int get_adc_sample(int chan) { int count; int value; int sum; if (!gp_saradc) return -1; spin_lock(&gp_saradc->lock); set_chan_list(chan, 1); set_avg_mode(chan, NO_AVG_MODE, SAMPLE_NUM_8); set_sample_mux(chan, chan_mux[chan]); set_detect_mux(chan_mux[chan]); set_idle_mux(chan_mux[chan]); // for revb enable_sample_engine(); start_sample(); // Read any CBUS register to delay one clock cycle after starting the sampling engine // The bus is really fast and we may miss that it started { count = get_reg(ISA_TIMERE); } count = 0; while (delta_busy() || sample_busy() || avg_busy()) { if (++count > 10000) { printk(KERN_ERR "ADC busy error.\n"); goto end; } } stop_sample(); sum = 0; count = 0; value = get_fifo_sample(); while (get_fifo_cnt()) { value = get_fifo_sample() & 0x3ff; if ((value != 0x1fe) && (value != 0x1ff)) { sum += value & 0x3ff; count++; } } value = (count) ? (sum / count) : (-1); end: //printk("ch%d = %d, count=%d\n", chan, value, count); disable_sample_engine(); spin_unlock(&gp_saradc->lock); return value; }