From Mumble Wiki
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.


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

struct LinkedMem {
#ifdef WIN32
	UINT32	uiVersion;
	DWORD	uiTick;
	uint32_t uiVersion;
	uint32_t uiTick;
	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)

	lm = (LinkedMem *) MapViewOfFile(hMapObject, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(LinkedMem));
	if (lm == NULL) {
		hMapObject = NULL;
	wcscpy_s(lm->name, 256, L"MyGameName");
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) {

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

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

Then, for each frame, do the following:

#ifndef WIN32
static const int32_t GetTickCount() {
	struct timeval tv;

	return tv.tv_usec / 1000 + tv.tv_sec * 1000;

void updateMumble() {
	if (! lm)

	// 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.