Difference between revisions of "Link"

From Mumble Wiki
Jump to: navigation, search
Line 9: Line 9:
 
<pre>
 
<pre>
 
struct LinkedMem {
 
struct LinkedMem {
DWORD dwVersion;
+
#ifdef WIN32
 +
UINT32 uiVersion;
 
DWORD dwTick;
 
DWORD dwTick;
 +
#else
 +
uint32_t uiVersion;
 +
uint64_t ui64Tick;
 +
#endif
 
float fPosition[3];
 
float fPosition[3];
 
float fFront[3];
 
float fFront[3];
Line 17: Line 22:
 
};
 
};
  
static HANDLE hMapObject = NULL;
 
 
LinkedMem *lm = NULL;
 
LinkedMem *lm = NULL;
  
 +
#ifdef WIN32
 +
static HANDLE hMapObject = NULL;
 
void initMumble() {
 
void initMumble() {
 
hMapObject = OpenFileMappingW(FILE_MAP_ALL_ACCESS, FALSE, L"MumbleLink");
 
hMapObject = OpenFileMappingW(FILE_MAP_ALL_ACCESS, FALSE, L"MumbleLink");
Line 33: Line 39:
 
wcscpy_s(lm->name, 256, L"MyGameName");
 
wcscpy_s(lm->name, 256, L"MyGameName");
 
}
 
}
 +
#else
 +
static int shmfd = -1;
 +
void initMumble() {
 +
  shmfd = shm_open("/MumbleLink", 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
 +
 
</pre>
 
</pre>
  
Line 41: Line 64:
 
if (! lm)
 
if (! lm)
 
return;
 
return;
lm->dwVersion = 1;
+
 
 +
// Fill lm->fPosition, fTop and fFront
 +
 
 +
lm->uiVersion = 1;
 +
#ifdef WIN32
 
lm->dwTick = GetTickCount();
 
lm->dwTick = GetTickCount();
// Fill lm->fPosition, fTop and fFront
+
#else
 +
lm->ui64Tick = clock();
 +
#endif
 
}
 
}
 
</pre>
 
</pre>

Revision as of 13:37, 4 April 2008

Linking a game to Mumble

The "best" way to link a game to mumble is to write your own plugin. However, that may be a lot of work, so we have an alternative method.

Initialization

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

struct LinkedMem {
#ifdef WIN32
	UINT32	uiVersion;
	DWORD	dwTick;
#else
	uint32_t uiVersion;
	uint64_t ui64Tick;
#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() {
  shmfd = shm_open("/MumbleLink", 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:

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

	// Fill lm->fPosition, fTop and fFront

	lm->uiVersion = 1;
#ifdef WIN32
	lm->dwTick = GetTickCount();
#else
	lm->ui64Tick = clock();
#endif
}

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.