Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
/*
** 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);
    }
}
Beispiel #4
0
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;
}
Beispiel #5
0
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 ();
}
Beispiel #6
0
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;
}
Beispiel #7
0
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;
}
Beispiel #8
0
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);
}
Beispiel #9
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 */
    }
}
Beispiel #10
0
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;
}