Exemple #1
0
void break_loop()
{
	int k=0;
	if(FAIL==has_loop()) return; /* no point doign the function. */
	struct node *p = start;
	struct node *pp = p;
	while(p && pp) { p= p->next; k++; if(p) pp=p->next; if(pp==p) break; }//same code as has loop, but we break!
	// METHOD-1 (INEFFICIENT)
	// we can start fresh. and put all numbers in hash, or mark visited untill we visit again. then we know the end node and we can remove the link.

	// METHOD-2 (FLOYD LOOP DETECTION AND REMOVAL 
	// put counter with slow pointer, and at point of loop, let that value be k.
	// now restart, with 2 pointers, 
	// p at speed 1 at location 0, 
	// p pat speed 1 at location k..
	// the point they meet again is the node. (so, keep another pointer for prev node).
	p = start->next; // p is at 1st node
 
	pp=start; 
	for(int i=0;i<k;i++) pp=pp->next; // pp is now at kth node
	pp = pp->next; // pp is at k+1 node.

	struct node *old=start;
	while(p!=pp) { old = pp; p = p->next; pp=p->next; }  
	
	if(pp=p) old->next = 0; //link removed.
}
int AudioStreamPlaybackOGGVorbis::mix(int16_t* p_bufer,int p_frames) {

	if (!playing)
		return 0;

	int total=p_frames;
	while (true) {

		int todo = p_frames;

		if (todo==0 || todo<MIN_MIX) {
			break;
		}

		//printf("to mix %i - mix me %i bytes\n",to_mix,to_mix*stream_channels*sizeof(int16_t));

		#ifdef BIG_ENDIAN_ENABLED
		long ret=ov_read(&vf,(char*)p_bufer,todo*stream_channels*sizeof(int16_t), 1, 2, 1, &current_section);
		#else
		long ret=ov_read(&vf,(char*)p_bufer,todo*stream_channels*sizeof(int16_t), 0, 2, 1, &current_section);
		#endif

		if (ret<0) {

			playing = false;
			ERR_EXPLAIN("Error reading OGG Vorbis File: "+file);
			ERR_BREAK(ret<0);
		} else if (ret==0) { // end of song, reload?

			ov_clear(&vf);

			_close_file();

			if (!has_loop()) {

				playing=false;
				repeats=1;
				break;
			}

			f=FileAccess::open(file,FileAccess::READ);

			int errv = ov_open_callbacks(f,&vf,NULL,0,_ov_callbacks);
			if (errv!=0) {
				playing=false;
				break;; // :(
			}

			if (loop_restart_time) {
				bool ok = ov_time_seek(&vf,loop_restart_time)==0;
				if (!ok) {
					playing=false;
					//ERR_EXPLAIN("loop restart time rejected");
					ERR_PRINT("loop restart time rejected")
				}

				frames_mixed=stream_srate*loop_restart_time;
			} else {
Exemple #3
0
char set_level(matrix *p_matrix, summit *v_summit)
{
  int i;
  int i_level = 0;
  matrix MatriceTemp;
  MatriceTemp.i_size = p_matrix->i_size;
  matrix_malloc(&MatriceTemp);

  if(has_loop(p_matrix)){
    printf("Error : set_level. A matrix which have loop cannot be used to calculate levels");
    return 0;
  }
  else{
    //Initialisation
    matrix_copy(p_matrix, &MatriceTemp);
    for(i=0;i<MatriceTemp.i_size;i++){
      v_summit[i].i_level = -1;
    }

    for(i=0;i<MatriceTemp.i_size;i++){			//Les sommets sans precedents sont de NV 0
      if(has_prev(&MatriceTemp, i)){
	v_summit[i].i_level = i_level;
      }
    }

    for(i=0;i<MatriceTemp.i_size;i++){
      if(v_summit[i].i_level == i_level){
	matrix_zero_at_line(&MatriceTemp, i);
      }
    }
    //Fin init

    while(!all_level_checked(p_matrix, v_summit)){
      i_level++;
      for(i=0;i<MatriceTemp.i_size;i++){
	if(has_prev(&MatriceTemp, i)&&(v_summit[i].i_level==-1)){
	  v_summit[i].i_level = i_level;
	}
      }

      for(i=0;i<MatriceTemp.i_size;i++){
	if(v_summit[i].i_level == i_level){
	  matrix_zero_at_line(&MatriceTemp, i);
	}
      }	//Fin for
    }	//Fin while
  }	//Fin si has_loop
  matrix_free(&MatriceTemp);
  return 1;
}
Exemple #4
0
int AudioStreamPlaybackOpus::mix(int16_t* p_bufer,int p_frames) {
	if (!playing)
		return 0;

	int total=p_frames;

	while (true) {

		int todo = p_frames;

		if (todo==0 || todo<MIN_MIX) {
			break;
		}

		int ret=op_read(opus_file,(opus_int16*)p_bufer,todo*stream_channels,&current_section);
		if (ret<0) {
			playing = false;
			ERR_EXPLAIN("Error reading Opus File: "+file);
			ERR_BREAK(ret<0);
		} else if (ret==0) { // end of song, reload?
			op_free(opus_file);

			_close_file();

			f=FileAccess::open(file,FileAccess::READ);

			int errv = 0;
			opus_file = op_open_callbacks(f,&_op_callbacks,NULL,0,&errv);
			if (errv!=0) {
				playing=false;
				break; // :(
			}

			if (!has_loop()) {
				playing=false;
				repeats=1;
				break;
			}

			if (loop_restart_time) {
				bool ok = op_pcm_seek(opus_file, (loop_restart_time*osrate)+pre_skip)==0;
				if (!ok) {
					playing=false;
					ERR_PRINT("loop restart time rejected")
				}

				frames_mixed=(loop_restart_time*osrate)+pre_skip;
			} else {
Exemple #5
0
int main()
{
	Insert_front(10);
	Insert_after(start,1);
	Insert_end(100);
	Insert_front(4);
	Insert_end(400);
	printf("Has Loop = %s\n", (PASS==has_loop())?"Yes":"No");
	print_all();
	start = reverse();
	printf("After Reversal:\n");
	print_all();
	reverse_using_recurrsion(start);
	printf("After Reversal:\n");
	print_all();

	destroy_all();

}
Exemple #6
0
main()
{
	struct list *head=NULL;
	struct list *loop=NULL;
	int loop_len=0;
	list_append(&head,10);
	list_append(&head,20);
	list_append(&head,30);
	list_append(&head,40);
	list_append(&head,50);
	list_append(&head,60);
	list_append(&head,70);
	list_append(&head,80);
	loop= has_loop(&head);
	printf("Loop at %x\n",loop);

	loop_len=get_loop_length(loop);
	printf("Length of the loop=%d\n",loop_len);
	loop=get_merge_point(&head,loop_len);
	printf("Data at merge=%d\n",loop->data);
	print_list(&head);
}
Exemple #7
0
void OrientedPathFollow::_update_transform() {

	if (!path)
		return;

	Ref<Curve3D> c = path->get_curve();
	if (!c.is_valid())
		return;

	int count = c->get_point_count();
	if (count < 2)
		return;

	if (delta_offset == 0) {
		return;
	}

	float offset = get_offset();
	float bl = c->get_baked_length();
	float bi = c->get_bake_interval();
	float o = offset;
	float o_next = offset + bi;

	if (has_loop()) {
		o = Math::fposmod(o, bl);
		o_next = Math::fposmod(o_next, bl);
	} else if (o_next >= bl) {
		o = bl - bi;
		o_next = bl;
	}

	bool cubic = get_cubic_interpolation();
	Vector3 pos = c->interpolate_baked(o, cubic);
	Vector3 forward = c->interpolate_baked(o_next, cubic) - pos;

	if (forward.length_squared() < CMP_EPSILON2)
		forward = Vector3(0, 0, 1);
	else
		forward.normalize();

	Vector3 up = c->interpolate_baked_up_vector(o, true);

	if (o_next < o) {
		Vector3 up1 = c->interpolate_baked_up_vector(o_next, true);
		Vector3 axis = up.cross(up1);

		if (axis.length_squared() < CMP_EPSILON2)
			axis = forward;
		else
			axis.normalize();

		up.rotate(axis, up.angle_to(up1) * 0.5f);
	}

	Transform t = get_transform();
	Vector3 scale = t.basis.get_scale();

	Vector3 sideways = up.cross(forward).normalized();
	up = forward.cross(sideways).normalized();

	t.basis.set(sideways, up, forward);
	t.basis.scale_local(scale);

	t.origin = pos + sideways * get_h_offset() + up * get_v_offset();

	set_transform(t);
}