Пример #1
0
static void init(scicos_block *block)
{
  char str[20];
  struct MbxSif * mbx = (struct MbxSif *) malloc(sizeof(struct MbxSif));
  int nch=block->nin;
  par_getstr(str,block->ipar,2,block->ipar[0]);
  strcpy(mbx->mbxName,str);
  par_getstr(str,block->ipar,2+block->ipar[0],block->ipar[1]);

  struct sockaddr_in addr;

  if(!strcmp(str,"0")) {
    mbx->tNode = 0;
    mbx->tPort = 0;
  }
  else {
    inet_aton(str, &addr.sin_addr);
    mbx->tNode = addr.sin_addr.s_addr;
    while ((mbx->tPort = rt_request_port(mbx->tNode)) <= 0
           && mbx->tPort != -EINVAL);
  }

  mbx->mbx = (MBX *) RT_typed_named_mbx_init(mbx->tNode,mbx->tPort,mbx->mbxName,nch*sizeof(double),FIFO_Q);

  if(mbx->mbx == NULL) {
    fprintf(stderr, "Error in getting %s mailbox address\n", mbx->mbxName);
    exit_on_error();
  }

  *block->work=(void *) mbx;
}
Пример #2
0
static void init(scicos_block *block)
{
  FILE * fp;
  double * pData;
  char filename[30];
  int i;
  int npts=block->ipar[0];

  if(npts==0) {
    fprintf(stderr, "Error - Data length is 0!\n");
    exit_on_error();
  }

  pData=(double *) calloc(npts,sizeof(double));

  par_getstr(filename,block->ipar,3,block->ipar[2]);
  fp=fopen(filename,"r");
  if(fp!=NULL){
    block->ipar[1]=0;
    for(i=0;i<npts;i++) {
      if(feof(fp)) break;
      fscanf(fp,"%lf",&(pData[i]));
    }
    fclose(fp);
  }
  else{
    fprintf(stderr, "File %s not found!\n",filename);
    exit_on_error();
  }
  *block->work=(void *) pData;
}
Пример #3
0
static void end(scicos_block *block)
{
  int * ipar = GetIparPtrs(block);

  char ledName[10];
  MBX * mbx = *(block->work);
  RT_named_mbx_delete(0, 0, mbx);
  par_getstr(ledName,ipar,1,ipar[0]);
  printf("Led %s closed\n",ledName);

}
Пример #4
0
static void init(scicos_block *block)
{
  char ledName[20];
  char name[7];
  int nch  = GetNin(block);
  int * ipar = GetIparPtrs(block);
  MBX *mbx;

  par_getstr(ledName,ipar,1,ipar[0]);
  rtRegisterLed(ledName,nch);
  get_a_name(TargetLedMbxID,name);

  mbx = (MBX *) RT_typed_named_mbx_init(0,0,name,MBX_RTAI_LED_SIZE/sizeof(unsigned int)*sizeof(unsigned int),FIFO_Q);
  if(mbx == NULL) {
    fprintf(stderr, "Cannot init mailbox\n");
    exit_on_error();
  }

  *(block->work) = mbx;

}
Пример #5
0
void cmd_play() {
  char *p;
  var_t var;
  int n = 0;
  int calc_time_f = 1;
  char *str, *s;
  double TmpL;

  par_getstr(&var);
  if (prog_error) {
    return;
  }
  if (strncmp("file://", var.v.p.ptr, FILE_PREFIX_LEN) == 0) {
    const char *path = var.v.p.ptr + FILE_PREFIX_LEN;
    if (dev_fexists(path)) {
      dev_audio(path);
    } else {
      err_file_not_found();
    }
    v_free(&var);
    return;
  }

  str = (char *) malloc(var.v.p.length + 1);

  // copy without spaces
  p = (char *) var.v.p.ptr;
  s = str;
  while (*p) {
    if (*p > 32) {
      *s++ = to_upper(*p);
    }
    p++;
  }
  *s = '\0';
  v_free(&var);

  // run
  p = str;
  while (*p) {
    if (dev_events(0) < 0) {
      break;
    }
    if (calc_time_f) {
      period = (4.0 / L) * (60000 / T) * TM;
      duration = M * period;
      calc_time_f = 0;
    }

    switch (*p) {
      // Volume
    case 'V':
      n = 0;
      while (is_digit(*(p + 1))) {
        p++;
        n = (n * 10) + (*p - '0');
      }

      CPLERR((n < 0 || n > 100), "PLAY: V0-100");
      vol = n;
      break;

      // clear queue
    case 'Q':
      dev_clear_sound_queue();
      break;

      // Octaves
    case '<':
      if (O > 0)
        O--;
      break;
    case '>':
      if (O < 6)
        O++;
      break;
    case 'O':
      O = -1;
      if (is_digit(*(p + 1))) {
        p++;
        O = *p - '0';
      }

      CPLERR((O < 0 || O > 6), "PLAY: O0-6");
      break;

      // Time
    case 'L':
      n = 0;
      while (is_digit(*(p + 1))) {
        p++;
        n = (n * 10) + (*p - '0');
      }

      CPLERR((n < 1 || n > 64), "PLAY: L1-64");

      L = n;
      calc_time_f = 1;
      break;

    case 'T':
      n = 0;
      while (is_digit(*(p + 1))) {
        p++;
        n = (n * 10) + (*p - '0');
      }

      CPLERR((n < 45 || n > 255), "PLAY: T32-255");

      T = n;
      calc_time_f = 1;
      break;

    case 'M':
      p++;
      switch (*p) {
      case 'S':
        M = 0.5;
        break;
      case 'N':
        M = 3.0 / 4.0;
        break;
      case 'L':
        M = 1.0;
        break;
      case 'F':
        bg = 0;
        break;
      case 'B':
        bg = 1;
        break;
      default:
        rt_raise("PLAY: M%c UNSUPPORTED", *p);
        v_free(&var);
      }

      calc_time_f = 1;
      break;

      // Pause
    case 'P':
      n = 0;
      while (is_digit(*(p + 1))) {
        p++;
        n = (n * 10) + (*p - '0');
      }

      if (*(p + 1) == '.') {
        p++;
        TM = 1.5;
      } else {
        TM = 1.0;
      }
      CPLERR((n < 1 || n > 64), "PLAY: P1-64");
      period = (4.0 / n) * (60000 / T) * TM;
      dev_sound(0, period, vol, bg);
      calc_time_f = 1;
      break;

      // Play N
    case 'N':
      n = 0;
      while (is_digit(*(p + 1))) {
        p++;
        n = (n * 10) + (*p - '0');
      }

      CPLERR((n < 0 || n > 84), "PLAY: N0-84");

      if (n) {
        // oct = n / 12;
        // pitch = tones[n - oct * 12] * (1 << oct);
        pitch = tones[n];
      }

      if (n == 0)
        dev_sound(0, period, vol, bg);
      else {
        dev_sound(pitch, duration, vol, bg);
        if (duration < period)
          dev_sound(0, period - duration, vol, bg);
      }

      calc_time_f = 1;
      break;

      // Play note
    case 'A':
    case 'B':
    case 'C':
    case 'D':
    case 'E':
    case 'F':
    case 'G':
      switch (*p) {
      case 'A':
        n = 13;
        break;
      case 'B':
        n = 15;
        break;
      case 'C':
        n = 4;
        break;
      case 'D':
        n = 6;
        break;
      case 'E':
        n = 8;
        break;
      case 'F':
        n = 9;
        break;
      case 'G':
        n = 11;
        break;
      }
      if (*(p + 1) == '-' || *(p + 1) == '+' || *(p + 1) == '#') {
        p++;
        if (*p == '-')
          n--;
        else
          n++;
      }
      if (is_digit(*(p + 1))) {
        TmpL = 0;
        while (is_digit(*(p + 1))) {
          p++;
          TmpL = (TmpL * 10) + (*p - '0');
        }

        calc_time_f = 1;
      } else {
        TmpL = L;
      }
      if (*(p + 1) == '.') {
        p++;
        TM = 1.5;
      } else {
        TM = 1.0;
      }
      period = (4.0 / TmpL) * (60000 / T) * TM;
      duration = M * period;

      //                      pitch = tones[n] * (1 << O);
      pitch = tones[(n - 4) + O * 12];
      dev_sound(pitch, duration, vol, bg);
      if (duration < period) {
        dev_sound(0, period - duration, vol, bg);
      }
      break;
    default:
      rt_raise("PLAY: '%c' UNSUPPORTED", *p);
      free(str);
      return;
    }

    // next
    if (*p) {
      p++;
    }
  }

  free(str);
}