Link

From Mumble Wiki
Revision as of 13:49, 12 February 2009 by DD0T (talk | contribs) (Linking a game to Mumble: Text was discomforting imho)
Jump to: navigation, search

Linking a game to Mumble

If you can change the sourcecode of the game you want to add positional audio support to you can save yourself the trouble of creating your own plugin by using the facilities supplied by the link plugin.

Note: Please don't forget to add your game to the list of link plugin supported games.

Initialization

Somewhere in your game initalization, add these lines of code:

struct LinkedMem {
#ifdef WIN32
	UINT32	uiVersion;
	DWORD	uiTick;
#else
	uint32_t uiVersion;
	uint32_t uiTick;
#endif
	float	fPosition[3];
	float	fFront[3];
	float	fTop[3];
	wchar_t	name[256];
};

LinkedMem *lm = NULL;

#ifdef WIN32
static HANDLE hMapObject = NULL;
void initMumble() {
	hMapObject = OpenFileMappingW(FILE_MAP_ALL_ACCESS, FALSE, L"MumbleLink");
	if (hMapObject == NULL)
		return;

	lm = (LinkedMem *) MapViewOfFile(hMapObject, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(LinkedMem));
	if (lm == NULL) {
		CloseHandle(hMapObject);
		hMapObject = NULL;
		return;
	}
	wcscpy_s(lm->name, 256, L"MyGameName");
}
#else
static int shmfd = -1;
void initMumble() {
  char memname[256];
  snprintf(memname, 256, "/MumbleLink.%d", getuid());

  shmfd = shm_open(memname, O_RDWR, S_IRUSR | S_IWUSR);

  if(shmfd < 0) {
    return;
  }

  lm = (LinkedMem *) (mmap(NULL, sizeof(struct LinkedMem), PROT_READ | PROT_WRITE, MAP_SHARED, shmfd,0));

  if (lm == (void *) (-1)) {
	lm = NULL;
  }
}
#endif

Then, for each frame, do the following:


#ifndef WIN32
static const int32_t GetTickCount() {
	struct timeval tv;
	gettimeofday(&tv,NULL);

	return tv.tv_usec / 1000 + tv.tv_sec * 1000;
}
#endif

void updateMumble() {
	if (! lm)
		return;

	// Fill lm->fPosition, fTop and fFront

	lm->uiVersion = 1;
	lm->uiTick = GetTickCount();
}

fPosition should be the player position in 3D space. fTop and fFront should be the orientation. The coordinate system is a left-handed one, and the units are in meters.

Mumble fetches these values 50 times a second, so please update them every frame.