⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdl_sysjoystick.c

📁 网络MPEG4IP流媒体开发源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
static void HIDTopLevelElementHandler (const void * value, void * parameter){	CFTypeRef refCF = 0;	if (CFGetTypeID (value) != CFDictionaryGetTypeID ())		return;	refCF = CFDictionaryGetValue (value, CFSTR(kIOHIDElementUsagePageKey));	if (!CFNumberGetValue (refCF, kCFNumberLongType, &((recDevice *) parameter)->usagePage))		SDL_SetError ("CFNumberGetValue error retrieving pDevice->usagePage.");	refCF = CFDictionaryGetValue (value, CFSTR(kIOHIDElementUsageKey));	if (!CFNumberGetValue (refCF, kCFNumberLongType, &((recDevice *) parameter)->usage))		SDL_SetError ("CFNumberGetValue error retrieving pDevice->usage.");}/* extracts device info from CF dictionary records in IO registry */static void HIDGetDeviceInfo (io_object_t hidDevice, CFMutableDictionaryRef hidProperties, recDevice *pDevice){	CFMutableDictionaryRef usbProperties = 0;	io_registry_entry_t parent1, parent2;		/* Mac OS X currently is not mirroring all USB properties to HID page so need to look at USB device page also	 * get dictionary for usb properties: step up two levels and get CF dictionary for USB properties	 */	if ((KERN_SUCCESS == IORegistryEntryGetParentEntry (hidDevice, kIOServicePlane, &parent1)) &&		(KERN_SUCCESS == IORegistryEntryGetParentEntry (parent1, kIOServicePlane, &parent2)) &&		(KERN_SUCCESS == IORegistryEntryCreateCFProperties (parent2, &usbProperties, kCFAllocatorDefault, kNilOptions)))	{		if (usbProperties)		{			CFTypeRef refCF = 0;			/* get device info			 * try hid dictionary first, if fail then go to usb dictionary			 */									/* get product name */			refCF = CFDictionaryGetValue (hidProperties, CFSTR(kIOHIDProductKey));			if (!refCF)				refCF = CFDictionaryGetValue (usbProperties, CFSTR("USB Product Name"));			if (refCF)			{				if (!CFStringGetCString (refCF, pDevice->product, 256, CFStringGetSystemEncoding ()))					SDL_SetError ("CFStringGetCString error retrieving pDevice->product.");			}						/* get usage page and usage */			refCF = CFDictionaryGetValue (hidProperties, CFSTR(kIOHIDPrimaryUsagePageKey));			if (refCF)			{				if (!CFNumberGetValue (refCF, kCFNumberLongType, &pDevice->usagePage))					SDL_SetError ("CFNumberGetValue error retrieving pDevice->usagePage.");				refCF = CFDictionaryGetValue (hidProperties, CFSTR(kIOHIDPrimaryUsageKey));				if (refCF)					if (!CFNumberGetValue (refCF, kCFNumberLongType, &pDevice->usage))						SDL_SetError ("CFNumberGetValue error retrieving pDevice->usage.");			}			if (NULL == refCF) /* get top level element HID usage page or usage */			{				/* use top level element instead */				CFTypeRef refCFTopElement = 0;				refCFTopElement = CFDictionaryGetValue (hidProperties, CFSTR(kIOHIDElementKey));				{					/* refCFTopElement points to an array of element dictionaries */					CFRange range = {0, CFArrayGetCount (refCFTopElement)};					CFArrayApplyFunction (refCFTopElement, range, HIDTopLevelElementHandler, pDevice);				}			}			CFRelease (usbProperties);		}		else			SDL_SetError ("IORegistryEntryCreateCFProperties failed to create usbProperties.");		if (kIOReturnSuccess != IOObjectRelease (parent2))			SDL_SetError ("IOObjectRelease error with parent2.");		if (kIOReturnSuccess != IOObjectRelease (parent1))			SDL_SetError ("IOObjectRelease error with parent1.");	}}static recDevice *HIDBuildDevice (io_object_t hidDevice){	recDevice *pDevice = (recDevice *) NewPtrClear (sizeof (recDevice));	if (pDevice)	{		/* get dictionary for HID properties */		CFMutableDictionaryRef hidProperties = 0;		kern_return_t result = IORegistryEntryCreateCFProperties (hidDevice, &hidProperties, kCFAllocatorDefault, kNilOptions);		if ((result == KERN_SUCCESS) && hidProperties)		{			/* create device interface */			result = HIDCreateOpenDeviceInterface (hidDevice, pDevice);			if (kIOReturnSuccess == result)			{				HIDGetDeviceInfo (hidDevice, hidProperties, pDevice); /* hidDevice used to find parents in registry tree */				HIDGetCollectionElements (hidProperties, pDevice);			}			else			{				DisposePtr((Ptr)pDevice);				pDevice = NULL;			}			CFRelease (hidProperties);		}		else		{			DisposePtr((Ptr)pDevice);			pDevice = NULL;		}	}	return pDevice;}/* disposes of the element list associated with a device and the memory associated with the list */static void HIDDisposeElementList (recElement **elementList){	recElement *pElement = *elementList;	while (pElement)	{		recElement *pElementNext = pElement->pNext;		DisposePtr ((Ptr) pElement);		pElement = pElementNext;	}	*elementList = NULL;}/* disposes of a single device, closing and releaseing interface, freeing memory fro device and elements, setting device pointer to NULL * all your device no longer belong to us... (i.e., you do not 'own' the device anymore) */static recDevice *HIDDisposeDevice (recDevice **ppDevice){	kern_return_t result = KERN_SUCCESS;	recDevice *pDeviceNext = NULL;	if (*ppDevice)	{		// save next device prior to disposing of this device		pDeviceNext = (*ppDevice)->pNext;				/* free element lists */		HIDDisposeElementList (&(*ppDevice)->firstAxis);		HIDDisposeElementList (&(*ppDevice)->firstButton);		HIDDisposeElementList (&(*ppDevice)->firstHat);				result = HIDCloseReleaseInterface (*ppDevice); /* function sanity checks interface value (now application does not own device) */		if (kIOReturnSuccess != result)			HIDReportErrorNum ("HIDCloseReleaseInterface failed when trying to dipose device.", result);		DisposePtr ((Ptr)*ppDevice);		*ppDevice = NULL;	}	return pDeviceNext;}/* Function to scan the system for joysticks. * Joystick 0 should be the system default joystick. * This function should return the number of available joysticks, or -1 * on an unrecoverable fatal error. */int SDL_SYS_JoystickInit(void){	IOReturn result = kIOReturnSuccess;	mach_port_t masterPort = NULL;	io_iterator_t hidObjectIterator = NULL;	CFMutableDictionaryRef hidMatchDictionary = NULL;	recDevice *device, *lastDevice;	io_object_t ioHIDDeviceObject = NULL;		SDL_numjoysticks = 0;		if (NULL != gpDeviceList)	{		SDL_SetError("Joystick: Device list already inited.");		return -1;	}		result = IOMasterPort (bootstrap_port, &masterPort);	if (kIOReturnSuccess != result)	{		SDL_SetError("Joystick: IOMasterPort error with bootstrap_port.");		return -1;	}	/* Set up a matching dictionary to search I/O Registry by class name for all HID class devices. */	hidMatchDictionary = IOServiceMatching (kIOHIDDeviceKey);	if ((hidMatchDictionary != NULL))	{		/* Add key for device type (joystick, in this case) to refine the matching dictionary. */				/* NOTE: we now perform this filtering later		UInt32 usagePage = kHIDPage_GenericDesktop;		UInt32 usage = kHIDUsage_GD_Joystick;		CFNumberRef refUsage = NULL, refUsagePage = NULL;		refUsage = CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &usage);		CFDictionarySetValue (hidMatchDictionary, CFSTR (kIOHIDPrimaryUsageKey), refUsage);		refUsagePage = CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &usagePage);		CFDictionarySetValue (hidMatchDictionary, CFSTR (kIOHIDPrimaryUsagePageKey), refUsagePage);		*/	}	else	{		SDL_SetError("Joystick: Failed to get HID CFMutableDictionaryRef via IOServiceMatching.");		return -1;	}		/*/ Now search I/O Registry for matching devices. */	result = IOServiceGetMatchingServices (masterPort, hidMatchDictionary, &hidObjectIterator);	/* Check for errors */	if (kIOReturnSuccess != result)	{		SDL_SetError("Joystick: Couldn't create a HID object iterator.");		return -1;	}	if (NULL == hidObjectIterator) /* there are no joysticks */	{		gpDeviceList = NULL;		SDL_numjoysticks = 0;		return 0;	}	/* IOServiceGetMatchingServices consumes a reference to the dictionary, so we don't need to release the dictionary ref. */	/* build flat linked list of devices from device iterator */	gpDeviceList = lastDevice = NULL;		while ((ioHIDDeviceObject = IOIteratorNext (hidObjectIterator)))	{		/* build a device record */		device = HIDBuildDevice (ioHIDDeviceObject);		if (!device)			continue;		/* dump device object, it is no longer needed */		result = IOObjectRelease (ioHIDDeviceObject);//		if (KERN_SUCCESS != result)//			HIDReportErrorNum ("IOObjectRelease error with ioHIDDeviceObject.", result);		/* Filter device list to non-keyboard/mouse stuff */ 		if ( device->usagePage == kHIDPage_GenericDesktop &&		     (device->usage == kHIDUsage_GD_Keyboard ||		      device->usage == kHIDUsage_GD_Mouse)) {            			/* release memory for the device */			HIDDisposeDevice (&device);			DisposePtr((Ptr)device);			continue;		}				/* Add device to the end of the list */		if (lastDevice)			lastDevice->pNext = device;		else			gpDeviceList = device;		lastDevice = device;	}	result = IOObjectRelease (hidObjectIterator); /* release the iterator */	/* Count the total number of devices we found */	device = gpDeviceList;	while (device)	{		SDL_numjoysticks++;		device = device->pNext;	}		return SDL_numjoysticks;}/* Function to get the device-dependent name of a joystick */const char *SDL_SYS_JoystickName(int index){	recDevice *device = gpDeviceList;		for (; index > 0; index--)		device = device->pNext;	return device->product;}/* Function to open a joystick for use. * The joystick to open is specified by the index field of the joystick. * This should fill the nbuttons and naxes fields of the joystick structure. * It returns 0, or -1 if there is an error. */int SDL_SYS_JoystickOpen(SDL_Joystick *joystick){	recDevice *device = gpDeviceList;	int index;		for (index = joystick->index; index > 0; index--)		device = device->pNext;	joystick->hwdata = device;	joystick->name = device->product;	joystick->naxes = device->axes;	joystick->nhats = device->hats;	joystick->nballs = 0;	joystick->nbuttons = device->buttons;	return 0;}/* Function to update the state of a joystick - called as a device poll. * This function shouldn't update the joystick structure directly, * but instead should call SDL_PrivateJoystick*() to deliver events * and update joystick device state. */void SDL_SYS_JoystickUpdate(SDL_Joystick *joystick){	recDevice *device = joystick->hwdata;	recElement *element;	SInt32 value;	int i;		element = device->firstAxis;	i = 0;	while (element)	{		value = HIDScaledCalibratedValue(device, element, -32768, 32767);		if ( value != joystick->axes[i] )			SDL_PrivateJoystickAxis(joystick, i, value);		element = element->pNext;		++i;	}		element = device->firstButton;	i = 0;	while (element)	{		value = HIDGetElementValue(device, element);		if ( value != joystick->buttons[i] )			SDL_PrivateJoystickButton(joystick, i, value);		element = element->pNext;		++i;	}		element = device->firstHat;	i = 0;	while (element)	{		Uint8 pos = 0;		value = HIDGetElementValue(device, element);		switch(value)		{			case 0:				pos = SDL_HAT_CENTERED;				break;			case 1:				pos = SDL_HAT_UP;				break;			case 2:				pos = SDL_HAT_RIGHTUP;				break;			case 3:				pos = SDL_HAT_RIGHT;				break;			case 4:				pos = SDL_HAT_RIGHTDOWN;				break;			case 5:				pos = SDL_HAT_DOWN;				break;			case 6:				pos = SDL_HAT_LEFTDOWN;				break;			case 7:				pos = SDL_HAT_LEFT;				break;			case 8:				pos = SDL_HAT_LEFTUP;				break;		}		if ( pos != joystick->hats[i] )			SDL_PrivateJoystickHat(joystick, i, pos);		element = element->pNext;		++i;	}		return;}/* Function to close a joystick after use */void SDL_SYS_JoystickClose(SDL_Joystick *joystick){	/* Should we do anything here? */	return;}/* Function to perform any system-specific joystick related cleanup */void SDL_SYS_JoystickQuit(void){	while (NULL != gpDeviceList)		gpDeviceList = HIDDisposeDevice (&gpDeviceList);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -