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