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

