示例#1
0
int32_t apple_joypad_connect(const char* name, struct apple_pad_connection* connection)
{
   int32_t slot = find_empty_slot();

   if (slot >= 0 && slot < MAX_PLAYERS)
   {
      unsigned i;
      joypad_slot_t* s = (joypad_slot_t*)&slots[slot];
      s->used = true;

      static const struct
      {
         const char* name;
         struct apple_pad_interface* iface;
      } pad_map[] = 
      {
         { "Nintendo RVL-CNT-01",         &apple_pad_wii },
         { "PLAYSTATION(R)3 Controller",  &apple_pad_ps3 },
         { 0, 0}
      };

      for (i = 0; name && pad_map[i].name; i++)
         if (strstr(name, pad_map[i].name))
         {
            s->iface = pad_map[i].iface;
            s->data = s->iface->connect(connection, slot);
         }
   }

   return slot;
}
示例#2
0
Rfile ropen(char *name, int mode)
/* Open a file on ram-disk */
{
Temp_file *tpf;
int flags;

if ((flags = flags_for_mode(mode)) < Success)
	return(NULL);

if ((tpf = find_named(name)) != NULL)
	{
	if (tpf->flags & TF_OPEN)
		{
		rerr = Err_in_use;
		return(NULL);
		}
	tpf->filep = 0;
	tpf->flags = flags;
	tpf->omode = mode;
	return(tpf);
	}
if ((flags&TF_READ))
	{
	rerr = Err_no_file;
	return(NULL);
	}
if ((tpf = find_empty_slot()) != NULL)
	{
	strncpy(tpf->name, name, TFNAME_SIZE-1);
	tpf->flags = flags;
	tpf->omode = mode;
	}
return(tpf);
}
示例#3
0
int accept_new_connection(int sockfd, int client_socks[], int max_clients)
{
	int first_empty_client=0;
	int rejected_client_fd;
#define NOMORE_SLOTS "No client slot available\n"

	first_empty_client=find_empty_slot(client_socks, max_clients);
	if(first_empty_client<0) {
		fprintf(stderr, NOMORE_SLOTS);
		rejected_client_fd=accept(sockfd, NULL, NULL);
		write(rejected_client_fd, NOMORE_SLOTS, strlen(NOMORE_SLOTS));
		close(rejected_client_fd);
		return -1;
	} else {
		client_socks[first_empty_client]=accept(sockfd, NULL, NULL);

		if(client_socks[first_empty_client]<0) {
			perror("accept");
			return -1;
		} else {
			/* Set as nonblocking and return the slot used */
			fcntl(client_socks[first_empty_client], F_SETFL, O_NONBLOCK);
			return first_empty_client;
		}
	}
}
示例#4
0
/*
 * Add a new user
 */
void add_user(user_chat_box_t *users, char *buf, int server_fd)
{
	/***** Insert YOUR code *******/
	
	/* 
	 * Check if user limit reached.
	 *
	 * If limit is okay, add user, set up non-blocking pipes and
	 * notify on server shell
	 *
	 * NOTE: You may want to remove any newline characters from the name string 
	 * before adding it. This will help in future name-based search.
	 */
	int i;
	pid_t pid;
	char* user_name = extract_name(ADD_USER, buf);
	char msg[MSG_SIZE];
	char arg1[MSG_SIZE];
	char arg2[MSG_SIZE];
	if (find_user_index(users, user_name) != -1){
		printf("%s already exists.\n", user_name);
		return;
	}
	else
	{
		if ((i = find_empty_slot(users)) == -1)
		{
			printf("Users are full.\n");
			return;
		}
		else
		{
			sprintf(msg, "Adding %s...\n", user_name);
			users[i].status = SLOT_FULL;
			strcpy(users[i].name, user_name);
			pipe(users[i].ptoc);
			pipe(users[i].ctop);
			fcntl(users[i].ptoc[0],F_SETFL, O_NONBLOCK);
			fcntl(users[i].ctop[0],F_SETFL, O_NONBLOCK);
			if (write(server_fd, msg, strlen(msg) + 1) < 0)
				perror("Writing to server shell");
		}
	}
	//Fork a child process to execute added user's Xterm
	if ((users[i].pid = fork()) < 0)
		perror("Add_user fork error");
	else if (users[i].pid == 0)
	{
		sprintf(arg1, "%d", users[i].ptoc[0]);
		sprintf(arg2, "%d", users[i].ctop[1]);
		execl(XTERM_PATH, XTERM, "+hold", "-e", "./shell", arg1, arg2, user_name, (char *)0);
	} 
	return;
}
示例#5
0
int32_t apple_joypad_connect_gcapi(void)
{
   int32_t slot = find_empty_slot();

   if (slot >= 0 && slot < MAX_PLAYERS)
   {
      joypad_slot_t* s = (joypad_slot_t*)&slots[slot];
      s->used = true;
      s->is_gcapi = true;
   }

   return slot;
}
示例#6
0
文件: world.c 项目: chan18/C-RPG
int add_slot(Object * obj, char *mode, char *new_slot)
{
	char (*slots)[SHORT_STRLEN];
	if (!strcmp(mode, "debug"))
		slots = obj->debug_slots;
	else if (!strcmp(mode, "skill"))
		slots = obj->skill_slots;
	else if (!strcmp(mode, "item"))
		slots = obj->item_slots;
	else
		return 0;
	int empty_i = find_empty_slot(obj, mode);
	if (empty_i == -1)
		return 0;
	strcpy(slots[empty_i], new_slot);
	return 1;
}
示例#7
0
Rfile rcreate(char *name,int mode)
/* Create a file on ram-disk. */
{
Temp_file *tpf;
int flags;

if ((flags = flags_for_mode(mode)) < Success)
	return(NULL);
if ((tpf = find_named(name)) != NULL)
	if (rdelete(name) < Success)
		return(NULL);
if ((tpf  = find_empty_slot()) == NULL)
	return(NULL);
strncpy(tpf->name, name, TFNAME_SIZE-1);
tpf->flags = flags;
tpf->omode = mode;
return(tpf);
}
示例#8
0
文件: uvc.c 项目: whtc123/libuvc
channel_t channel_create(int cnt,int elem_size){

	channel *c=NULL;
	int idx=0;
	channel_pool *pool=get_chan_pool();
	idx=find_empty_slot(pool);
	if(idx<0){
		return -1;
	}
	c=malloc(sizeof(channel) +(elem_size*cnt));
	memset(c,0,sizeof(channel));
	c->size=elem_size;
	c->cnt=cnt;
	c->id = idx;
	queue_init(&c->readq);
	queue_init(&c->writq);
	
	channel_pool_put(pool,idx,c);
	return idx;
}
int tc_filter(frame_list_t *ptr_, char *options){
	vframe_list_t *		ptr = (vframe_list_t *)ptr_;
	int 			frame_slot = 0;
	static 			vob_t *vob=NULL;
	static int		slots[TC_FRAME_THREADS_MAX];

  if(ptr->tag & TC_FILTER_GET_CONFIG) {

	optstr_filter_desc (options, MOD_NAME, MOD_CAP, MOD_VERSION, "Julien Tierny", "VRYMO", "1");
    optstr_param (options, "font", "Valid PSF font file (provided with the `aart` package)", "%s", "default8x9.psf");
	optstr_param (options, "pallete", "Valid pallete file (provided with the `aart` package)", "%s", "colors.pal");
	optstr_param(options, "threads", "Use multiple-threaded routine for picture rendering", "%d", "0", "1", "oo");

	/* Boolean parameter */
	optstr_param(options, "buffer", "Use `aart` internal buffer for output", "", "-1");

	return 0;
  }

  //----------------------------------
  //
  // filter init
  //
  //----------------------------------


  if(ptr->tag & TC_FILTER_INIT) {

    if((vob = tc_get_vob())==NULL)
		return(-1);

	/* aart sanity check */
	if (tc_test_program("aart") !=0 )
		return -1;

	/* Now, let's handle the options ... */
	if((parameters = tc_malloc (sizeof(parameter_struct))) == NULL){
		tc_log_error(MOD_NAME, "Out of memory !!!");
		return -1;
	}

	/* Filter default options */
	if (verbose & TC_DEBUG)
		tc_log_info(MOD_NAME, "Preparing default options.");
	strncpy(parameters->aart_font, "default8x9.psf", strlen("default8x9.psf"));
	if (verbose & TC_DEBUG)
		tc_log_info(MOD_NAME, "Default options correctly formated.");
	strncpy(parameters->aart_pallete, "colors.pal", strlen("colors.pal"));
	parameters->aart_threads 		= 1;
	parameters->aart_buffer 		= -1;
	parameters->tcvhandle			= 0;

	if (options){
		/* Get filter options via transcode core */
		if (verbose & TC_DEBUG)
			tc_log_info(MOD_NAME, "Merging options from transcode.");
		optstr_get(options, "font",			"%s",		parameters->aart_font);
		clean_parameter(parameters->aart_font);
		optstr_get(options, "pallete",		"%s",		parameters->aart_pallete);
		clean_parameter(parameters->aart_pallete);
		optstr_get(options, "threads",   	"%d",		&parameters->aart_threads);

		if (optstr_lookup(options, "buffer") != NULL)
			parameters->aart_buffer=1;
		if (optstr_lookup(options, "help") != NULL)
			help_optstr();
		if (verbose & TC_DEBUG)
			tc_log_info(MOD_NAME, "Options correctly merged.");
	}

	if (vob->im_v_codec == CODEC_YUV){
		if (!(parameters->tcvhandle = tcv_init())) {
			tc_log_error(MOD_NAME, "Error at image conversion initialization.");
			return(-1);
		}
	}

	/* Init thread slots (multithread support)*/
	init_slots(slots);

	if(verbose)
		tc_log_info(MOD_NAME, "%s %s", MOD_VERSION, MOD_CAP);

    return(0);
  }

  //----------------------------------
  //
  // filter close
  //
  //----------------------------------


  if(ptr->tag & TC_FILTER_CLOSE) {

  	/*
	 * TODO :
	 * Provide a `aart` kill routine in case of cancel.
	 * For the moment, transcode waits for the `aart`
	 * process to finish before exiting.
	 */

	tcv_free(parameters->tcvhandle);

	/* Let's free the parameter structure */
	free(parameters);
	parameters = NULL;

    return(0);
  }

  //----------------------------------
  //
  // filter frame routine
  //
  //----------------------------------

	if(ptr->tag & TC_POST_M_PROCESS && ptr->tag & TC_VIDEO && !(ptr->attributes & TC_FRAME_IS_SKIPPED)) {

		frame_slot = find_empty_slot(ptr->id, slots);
		switch(vob->im_v_codec){
			case CODEC_RGB:
				return aart_render(ptr->video_buf, ptr->v_width, ptr->v_height, frame_slot, parameters->aart_font, parameters->aart_pallete, parameters->aart_threads, parameters->aart_buffer);
				break;

			case CODEC_YUV:

				if (!tcv_convert(parameters->tcvhandle, ptr->video_buf, ptr->video_buf, ptr->v_width, ptr->v_height, IMG_YUV_DEFAULT, IMG_RGB24)){
					tc_log_error(MOD_NAME, "cannot convert YUV stream to RGB format !");
					return -1;
				}

				if (aart_render(ptr->video_buf, ptr->v_width, ptr->v_height, frame_slot, parameters->aart_font, parameters->aart_pallete, parameters->aart_threads, parameters->aart_buffer) == -1){return -1;}
				if (!tcv_convert(parameters->tcvhandle, ptr->video_buf, ptr->video_buf, ptr->v_width, ptr->v_height, IMG_RGB24, IMG_YUV_DEFAULT)){
					tc_log_error(MOD_NAME, "cannot convert RGB stream to YUV format !");
					return -1;
				}
				break;

			default:
				tc_log_error(MOD_NAME, "Internal video codec is not supported.");
				return -1;
		}
		free_slot(ptr->id, slots);
	}
	return(0);
}