コード例 #1
0
ファイル: event_user.c プロジェクト: Nwazette/Zappy
bool		event_dispatch(char *name, void *data, double delay)
{
  t_event	*evnt;
  bool		out;

  out = false;
  if (!name || !(evnt = calloc(1, sizeof(*evnt))))
    return (false);
  evnt->name = strdup(name);
  evnt->data = data;
  evnt->delay = delay;
  evnt->st = time_();
  evnt->lt = evnt->st;
  if (delay > 0.0)
    out = set_new_event(evnt);
  else
    {
      out = eventm_dispatch(evnt);
      free(evnt);
    }
  return (out);
}
コード例 #2
0
ファイル: mdxmml_ym2151.c プロジェクト: NexusEast/modizer
int mdx_parse_mml_ym2151_async(void* in_self)
{
    int i;
    long count;
    struct timeval st,et;
    int infinite_loops;
    mdxmml_ym2151_instances* self = (mdxmml_ym2151_instances *)in_self;

    pcm8_clear_buffer_flush_flag();
    gettimeofday(&st, NULL);
    gettimeofday(&et, NULL);

loop:
    if (self->all_track_finished==FLAG_TRUE) {
        return FLAG_FALSE;
    }

    if ( self->fade_out > 0 ) {
        if ( self->fade_out_wait==0 ) {
            self->fade_out_wait = self->fade_out;
        }
        self->fade_out_wait--;
        if ( self->fade_out_wait==0 ) {
            self->master_volume--;
        }
        if ( self->master_volume==0 ) {
            return FLAG_FALSE;
        }
    }
    ym2151_set_master_volume( self->master_volume * self->mdx->fm_volume / 127 );
    pcm8_set_master_volume( self->master_volume * self->mdx->pcm_volume / 127 );

    self->all_track_finished=FLAG_TRUE;
    infinite_loops = 32767; /* large enough */

    for ( i=0 ; i<self->mdx->tracks ; i++ ) {

        if ( self->mdx->track[i].waiting_sync == FLAG_TRUE )
        {
            continue;
        }

        count = self->mdx->track[i].counter;
        if ( count < 0 ) {
            continue;    /* this track has finished */
        }
        self->all_track_finished=FLAG_FALSE;

        self->mdx->track[i].gate--;
        if ( self->mdx->track[i].gate == 0 ) {
            note_off( i );
        }

        if ( i<8 ) {
            ym2151_set_freq_volume( i ); /* do portament, lfo, detune */
        }

        count--;
        while ( count == 0 ) {
            count=set_new_event( i );
        }

        self->mdx->track[i].counter = count;
        if ( infinite_loops > self->mdx->track[i].infinite_loop_times ) {
            infinite_loops = self->mdx->track[i].infinite_loop_times;
        }
    }

    if ( self->mdx->max_infinite_loops > 0 ) {
        if ( infinite_loops >= self->mdx->max_infinite_loops ) {
            self->fade_out = self->mdx->fade_out_speed;
        }
    }

    /* timer count */

    self->mdx->total_count++;
    self->mdx->elapsed_time += 1000*1024*(256 - self->mdx->tempo)/4000;

    /*  st.tv_usec += 1000* 1024*(256 - self->mdx->tempo)/4000;
      while ( st.tv_usec >= 1000*1000 ) {
        st.tv_usec-=1000*1000;
        st.tv_sec++;
      }

      while( timercmp(&st,&et,>) ) {
        do_pcm8();
        et.tv_usec += PCM8_SYSTEM_RATE*1000;
        while ( et.tv_usec >= 1000*1000 ) {
          et.tv_usec-=1000*1000;
          et.tv_sec++;
        }
      }

      if (pcm8_buffer_flush_flag()==FLAG_FALSE) {
        goto loop;
      }*/

    return FLAG_TRUE;
}
コード例 #3
0
ファイル: mdxmml_ym2151.c プロジェクト: NexusEast/modizer
int mdx_get_length( MDX_DATA *orig_mdx, PDX_DATA *orig_pdx ) {
    int i;
    long count;

    struct timeval st;
    int infinite_loops;
    int fade_out_wait;
    int length_ms,master_volume;

    __GETSELF;

    length_ms=0;

    self->mdx = orig_mdx;
    self->pdx = orig_pdx;

    mdx_init_track_work_area_ym2151();

    /* start parsing */

    all_track_finished=FLAG_FALSE;
    fade_out_wait=0;
    master_volume=127;

    gettimeofday(&st, NULL);
    srand((int)st.tv_usec%65536);

    while(all_track_finished==FLAG_FALSE) {

        if ( self->fade_out > 0 ) {
            if ( fade_out_wait==0 ) {
                fade_out_wait = self->fade_out;
            }
            fade_out_wait--;
            if ( fade_out_wait==0 ) {
                master_volume--;
            }
            if ( master_volume==0 ) {
                break;
            }
        }

        all_track_finished=FLAG_TRUE;
        infinite_loops = 32767; /* large enough */
        for ( i=0 ; i<self->mdx->tracks ; i++ ) {

            if ( self->mdx->track[i].waiting_sync == FLAG_TRUE )
            {
                continue;
            }

            count = self->mdx->track[i].counter;
            if ( count < 0 ) {
                continue;    /* this track has finished */
            }
            all_track_finished=FLAG_FALSE;

            self->mdx->track[i].gate--;
            if ( self->mdx->track[i].gate == 0 ) {
                note_off( i );
            }

            if ( i<8 ) {
                ym2151_set_freq_volume( i ); /* do portament, lfo, detune */
            }

            count--;
            while ( count == 0 ) {
                count=set_new_event( i );
            }

            self->mdx->track[i].counter = count;
            if ( infinite_loops > self->mdx->track[i].infinite_loop_times ) {
                infinite_loops = self->mdx->track[i].infinite_loop_times;
            }
        }

        if ( self->mdx->max_infinite_loops > 0 ) {
            if ( infinite_loops >= self->mdx->max_infinite_loops ) {
                self->fade_out = self->mdx->fade_out_speed;
            }
        }

        /* timer count */

        self->mdx->total_count++;
        self->mdx->elapsed_time += 1000*1024*(256 - self->mdx->tempo)/4000;

        st.tv_usec += 1000* 1024*(256 - self->mdx->tempo)/4000;
        length_ms += 1024*(256 - self->mdx->tempo)/4000;
        while ( st.tv_usec >= 1000*1000 ) {
            st.tv_usec-=1000*1000;
            st.tv_sec++;
        }
    }

    return length_ms;
}
コード例 #4
0
ファイル: mdxmml_ym2151.c プロジェクト: NexusEast/modizer
int mdx_parse_mml_ym2151( MDX_DATA *orig_mdx, PDX_DATA *orig_pdx ) {
    int i;
    long count;

    struct timeval st,et;
    int fade_out_wait;
    int master_volume;
    int infinite_loops;

    __GETSELF;

    self->mdx = orig_mdx;
    self->pdx = orig_pdx;

    mdx_init_track_work_area_ym2151();

    self->pcm8_disable=FLAG_TRUE;
    if ( pcm8_open(self->mdx)==0 ) {
        self->pcm8_disable=FLAG_FALSE;
    }

    if (!ym2151_reg_init( self->mdx )) {
        /* failed to initialize opm! */
        pcm8_close();
        return 1;
    }

    /* start parsing */

    all_track_finished=FLAG_FALSE;
    fade_out_wait=0;
    master_volume=127;

    gettimeofday(&st, NULL);
    srand((int)st.tv_usec%65536);
    gettimeofday(&et, NULL);

    while(all_track_finished==FLAG_FALSE) {

        if ( self->fade_out > 0 ) {
            if ( fade_out_wait==0 ) {
                fade_out_wait = self->fade_out;
            }
            fade_out_wait--;
            if ( fade_out_wait==0 ) {
                master_volume--;
            }
            if ( master_volume==0 ) {
                break;
            }
        }
        ym2151_set_master_volume( master_volume * self->mdx->fm_volume / 127 );
        pcm8_set_master_volume( master_volume * self->mdx->pcm_volume / 127 );

        all_track_finished=FLAG_TRUE;
        infinite_loops = 32767; /* large enough */
        for ( i=0 ; i<self->mdx->tracks ; i++ ) {

            if ( self->mdx->track[i].waiting_sync == FLAG_TRUE )
            {
                continue;
            }

            count = self->mdx->track[i].counter;
            if ( count < 0 ) {
                continue;    /* this track has finished */
            }
            all_track_finished=FLAG_FALSE;

            self->mdx->track[i].gate--;
            if ( self->mdx->track[i].gate == 0 ) {
                note_off( i );
            }

            if ( i<8 ) {
                ym2151_set_freq_volume( i ); /* do portament, lfo, detune */
            }

            count--;
            while ( count == 0 ) {
                count=set_new_event( i );
            }

            self->mdx->track[i].counter = count;
            if ( infinite_loops > self->mdx->track[i].infinite_loop_times ) {
                infinite_loops = self->mdx->track[i].infinite_loop_times;
            }
        }

        if ( self->mdx->max_infinite_loops > 0 ) {
            if ( infinite_loops >= self->mdx->max_infinite_loops ) {
                self->fade_out = self->mdx->fade_out_speed;
            }
        }

        /* timer count */

        self->mdx->total_count++;
        self->mdx->elapsed_time += 1000*1024*(256 - self->mdx->tempo)/4000;

        st.tv_usec += 1000* 1024*(256 - self->mdx->tempo)/4000;
        while ( st.tv_usec >= 1000*1000 ) {
            st.tv_usec-=1000*1000;
            st.tv_sec++;
        }

        while( timercmp(&st,&et,>) ) {
            do_pcm8(0);
            et.tv_usec += 1000;//PCM8_SYSTEM_RATE*1000;
            while ( et.tv_usec >= 1000*1000 ) {
                et.tv_usec-=1000*1000;
                et.tv_sec++;
            }
        }
    }
    //for (i=0;i<1000;i++)	do_pcm8(0);
    do_pcm8(1);

    ym2151_all_note_off();
    pcm8_close();
    mdx_ym2151_shutdown();

    return 0;
}
コード例 #5
0
ファイル: mdxmml_ym2151.c プロジェクト: weimingtom/mdxplayer
int
mdx_parse_mml_ym2151_async(songdata *data)
{
  int i;
  long count;
  int infinite_loops;
  __GETSELF(data)

  pcm8_clear_buffer_flush_flag(data);
 loop:
  if (self->all_track_finished==FLAG_TRUE) {
    return FLAG_FALSE;
  }

  if ( self->fade_out > 0 ) {
    if ( self->fade_out_wait==0 ) { self->fade_out_wait = self->fade_out; }
    self->fade_out_wait--;
    if ( self->fade_out_wait==0 ) { self->master_volume--; }
    if ( self->master_volume==0 ) { return FLAG_FALSE; }
  }
  ym2151_set_master_volume( self->master_volume * self->mdx->fm_volume / 127, data );
  pcm8_set_master_volume( self->master_volume * self->mdx->pcm_volume / 127, data );

  self->all_track_finished=FLAG_TRUE;
  infinite_loops = 32767; /* large enough */

  for ( i=0 ; i<self->mdx->tracks ; i++ ) {

    if ( self->mdx->track[i].waiting_sync == FLAG_TRUE )
      { continue; }

    count = self->mdx->track[i].counter;
    if ( count < 0 ) { continue; } /* this track has finished */
    self->all_track_finished=FLAG_FALSE;
    
    self->mdx->track[i].gate--;
    if ( self->mdx->track[i].gate == 0 ) { note_off( i, data ); }
    
    if ( i<8 ) {
      ym2151_set_freq_volume( i, data ); /* do portament, lfo, detune */
    }

    count--;
    while ( count == 0 ) {
      count=set_new_event( i, data );
    }

    self->mdx->track[i].counter = count;
    if ( infinite_loops > self->mdx->track[i].infinite_loop_times ) {
      infinite_loops = self->mdx->track[i].infinite_loop_times;
    }
  }

  if ( self->mdx->max_infinite_loops > 0 ) {
    if ( infinite_loops >= self->mdx->max_infinite_loops ) {
      self->fade_out = self->mdx->fade_out_speed;
    }
  }

  /* timer count */

  self->mdx->total_count++;
  self->mdx->elapsed_time += 1000*1024*(256 - self->mdx->tempo)/4000;

  return FLAG_TRUE;
}
コード例 #6
0
ファイル: mdxmml_ym2151.c プロジェクト: weimingtom/mdxplayer
int
mdx_parse_mml_ym2151( MDX_DATA *orig_mdx, PDX_DATA *orig_pdx, songdata *data )
{
  int i;
  long count;
  int all_track_finished;
  int fade_out_wait;
  int master_volume;
  int infinite_loops;

  __GETSELF(data);

  self->mdx = orig_mdx;
  self->pdx = orig_pdx;

  mdx_init_track_work_area_ym2151(data);

  self->pcm8_disable=FLAG_TRUE;
  if ( pcm8_open(self->mdx, data)==0 ) {
    self->pcm8_disable=FLAG_FALSE;
  }

  if (!ym2151_reg_init( self->mdx, data )) {
    /* failed to initialize opm! */
    return 1;
  }

  /* start parsing */

  all_track_finished=FLAG_FALSE;
  fade_out_wait=0;
  master_volume=127;

  while(all_track_finished==FLAG_FALSE) {

    if ( self->fade_out > 0 ) {
      if ( fade_out_wait==0 ) { fade_out_wait = self->fade_out; }
      fade_out_wait--;
      if ( fade_out_wait==0 ) { master_volume--; }
      if ( master_volume==0 ) { break; }
    }
    ym2151_set_master_volume( master_volume * self->mdx->fm_volume / 127, data );
    pcm8_set_master_volume( master_volume * self->mdx->pcm_volume / 127, data );

    all_track_finished=FLAG_TRUE;
    infinite_loops = 32767; /* large enough */
    for ( i=0 ; i<self->mdx->tracks ; i++ ) {

      if ( self->mdx->track[i].waiting_sync == FLAG_TRUE )
	{ continue; }

      count = self->mdx->track[i].counter;
      if ( count < 0 ) { continue; } /* this track has finished */
      all_track_finished=FLAG_FALSE;

      self->mdx->track[i].gate--;
      if ( self->mdx->track[i].gate == 0 ) { note_off( i, data ); }

      if ( i<8 ) {
	ym2151_set_freq_volume( i, data ); /* do portament, lfo, detune */
      }

      count--;
      while ( count == 0 ) {
	count=set_new_event( i, data );
      }

      self->mdx->track[i].counter = count;
      if ( infinite_loops > self->mdx->track[i].infinite_loop_times ) {
	infinite_loops = self->mdx->track[i].infinite_loop_times;
      }
    }

    if ( self->mdx->max_infinite_loops > 0 ) {
      if ( infinite_loops >= self->mdx->max_infinite_loops ) {
	self->fade_out = self->mdx->fade_out_speed;
      }
    }

    /* timer count */

    self->mdx->total_count++;
    self->mdx->elapsed_time += 1000*1024*(256 - self->mdx->tempo)/4000;

	do_pcm8(NULL,-1, data);
    
	}

  ym2151_all_note_off(data);
  pcm8_close(data);
  ym2151_shutdown(data);

  return 0;
}