int snd_record_refill(short *buffer) { unsigned int oldmask; oldmask = irq_getmask(); irq_setmask(0); if(record_level >= RECORD_BUFQ_SIZE) { irq_setmask(oldmask); printf("SND: record bufq overflow\n"); return 0; } record_queue[record_produce] = buffer; record_produce = (record_produce + 1) & RECORD_BUFQ_MASK; record_level++; if(record_overrun) { record_overrun = 0; record_start(buffer); } irq_setmask(oldmask); return 1; }
void snd_isr_dmaw() { asm volatile( /* Invalidate Level-1 data cache */ "wcsr DCC, r0\n" "nop\n" ); if(record_level == 0) { printf("SND: stray DMAW irq\n"); return; } /* NB. the callback can give us buffers by calling snd_record_refill() */ record_callback(record_queue[record_consume], record_user); record_consume = (record_consume + 1) & RECORD_BUFQ_MASK; record_level--; irq_ack(IRQ_AC97DMAW); if(record_level > 0) record_start(record_queue[record_consume]); else record_overrun = 1; }
/* ** Name: record_play_or_record ** Desc: */ void record_play_or_record(record_t *record, char *filename) { record_play(record, filename); if (!record->file) { record_start(record, filename); } }
void snd_record_start(snd_callback callback, unsigned int nsamples, void *user) { if(snd_record_active()) { printf("SND: snd_record_start called while already recording\n"); return; } record_callback = callback; record_user = user; record_nbytes = nsamples*4; if(record_level > 0) record_start(record_queue[record_consume]); else record_overrun = 1; }
void main_loop (void) { clear_all_buttons (); if (botcfg.state == STATE_RECORDING) { fprintf (stdout, "RECORDING\n"); if (record_start () != 0) { fprintf (stderr, "Error setting up record buffer\n"); botcfg.state = STATE_EXITING; } wait_for_snes_powerup (); } else if (botcfg.state == STATE_PLAYBACK) { fprintf (stdout, "PLAYBACK\n"); if (playback_start () != 0) { fprintf (stderr, "Error setting up playback buffer\n"); botcfg.state = STATE_EXITING; } wait_for_snes_powerup (); } interrupt_enable(); if (botcfg.state == STATE_PLAYBACK || botcfg.state == STATE_RECORDING) wait_for_first_latch (); while (botcfg.state != STATE_EXITING) { if (botcfg.state != STATE_PLAYBACK && botcfg.state != STATE_MACRO) { read_joystick_inputs(); } if (!snes_is_on()) { fprintf (stdout, "SNES poweroff detected\n"); botcfg.state = STATE_EXITING; } } //Always attempt a save before exiting record_save (); }
static rtems_status_code submit_record(struct snd_buffer *buf) { bsp_interrupt_vector_disable(MM_IRQ_AC97DMAW); if (record_level == RECORD_Q_SIZE) { bsp_interrupt_vector_enable(MM_IRQ_AC97DMAW); return RTEMS_UNSATISFIED; } record_q[record_produce] = buf; record_produce = (record_produce + 1) & RECORD_Q_MASK; record_level++; if (record_level == 1) record_start(buf); bsp_interrupt_vector_enable(MM_IRQ_AC97DMAW); return RTEMS_SUCCESSFUL; }
static int parse_entry(struct mod_metadata *md, const char *cval, struct elf_file *ef, const char *kldname) { struct mod_depend mdp; struct mod_version mdv; Elf_Off data = (Elf_Off)md->md_data; int error = 0; record_start(); switch (md->md_type) { case MDT_DEPEND: if (!dflag) break; check(EF_SEG_READ(ef, data, sizeof(mdp), &mdp)); printf(" depends on %s.%d (%d,%d)\n", cval, mdp.md_ver_preferred, mdp.md_ver_minimum, mdp.md_ver_maximum); break; case MDT_VERSION: check(EF_SEG_READ(ef, data, sizeof(mdv), &mdv)); if (dflag) { printf(" interface %s.%d\n", cval, mdv.mv_version); } else { record_int(MDT_VERSION); record_string(cval); record_int(mdv.mv_version); record_string(kldname); } break; case MDT_MODULE: if (dflag) { printf(" module %s\n", cval); } else { record_int(MDT_MODULE); record_string(cval); record_string(kldname); } break; default: warnx("unknown metadata record %d in file %s", md->md_type, kldname); } if (!error) record_end(); return error; }
static rtems_isr pcmrecord_handler(rtems_vector_number n) { lm32_interrupt_ack(1 << MM_IRQ_AC97DMAW); __asm__ volatile( /* Invalidate Level-1 data cache */ "wcsr DCC, r0\n" "nop\n" ); rtems_message_queue_send(record_q_done, &record_q[record_consume], sizeof(void *)); record_consume = (record_consume + 1) & RECORD_Q_MASK; record_level--; if(record_level > 0) record_start(record_q[record_consume]); else MM_WRITE(MM_AC97_UCTL, 0); }
void snd_isr_dmaw() { asm volatile( /* Invalidate Level-1 data cache */ "wcsr DCC, r0\n" "nop\n" ); /* NB. the callback can give us buffers by calling snd_record_refill() */ record_callback(record_queue[record_consume], record_user); record_consume = (record_consume + 1) & RECORD_BUFQ_MASK; record_level--; if(record_level > 0) record_start(record_queue[record_consume]); else { printf("SND: recording overrun\n"); record_overrun = 1; CSR_AC97_UCTL = AC97_SCTL_EN; /* Ack interrupt anyway */ } }
void snd_isr_dmaw() { flush_cpu_dcache(); if(record_level == 0) { printf("SND: stray DMAW irq\n"); return; } /* NB. the callback can give us buffers by calling snd_record_refill() */ record_callback(record_queue[record_consume], record_user); record_consume = (record_consume + 1) & RECORD_BUFQ_MASK; record_level--; irq_ack(IRQ_AC97DMAW); if(record_level > 0) record_start(record_queue[record_consume]); else record_overrun = 1; }