@@ -210,7 +210,20 @@ namespace FreenectDriver
210210 class Driver : public oni ::driver::DriverBase, private Freenect::Freenect
211211 {
212212 private:
213- std::map<OniDeviceInfo, oni::driver::DeviceBase*> devices;
213+ typedef std::map<OniDeviceInfo, oni::driver::DeviceBase*> OniDeviceMap;
214+ OniDeviceMap devices;
215+
216+ static std::string devid_to_uri (int id) {
217+ return " freenect://" + to_string (id);
218+ }
219+
220+ static int uri_to_devid (const std::string uri) {
221+ int id;
222+ std::istringstream is (uri);
223+ is.seekg (strlen (" freenect://" ));
224+ is >> id;
225+ return id;
226+ }
214227
215228 public:
216229 Driver (OniDriverServices* pDriverServices) : DriverBase(pDriverServices)
@@ -230,8 +243,8 @@ namespace FreenectDriver
230243 DriverBase::initialize (connectedCallback, disconnectedCallback, deviceStateChangedCallback, pCookie);
231244 for (int i = 0 ; i < Freenect::deviceCount (); i++)
232245 {
233- std::string uri = " freenect:// " + to_string (i);
234-
246+ std::string uri = devid_to_uri (i);
247+
235248 WriteMessage (" Found device " + uri);
236249
237250 OniDeviceInfo info;
@@ -247,7 +260,7 @@ namespace FreenectDriver
247260
248261 oni::driver::DeviceBase* deviceOpen (const char * uri, const char * mode = NULL )
249262 {
250- for (std::map<OniDeviceInfo, oni::driver::DeviceBase*> ::iterator iter = devices.begin (); iter != devices.end (); iter++)
263+ for (OniDeviceMap ::iterator iter = devices.begin (); iter != devices.end (); iter++)
251264 {
252265 if (strcmp (iter->first .uri , uri) == 0 ) // found
253266 {
@@ -258,11 +271,7 @@ namespace FreenectDriver
258271 else
259272 {
260273 WriteMessage (" Opening device " + std::string (uri));
261-
262- unsigned int id;
263- std::istringstream is (iter->first .uri );
264- is.seekg (strlen (" freenect://" ));
265- is >> id;
274+ int id = uri_to_devid (iter->first .uri );
266275 Device* device = &createDevice<Device>(id);
267276 iter->second = device;
268277 return device;
@@ -276,24 +285,16 @@ namespace FreenectDriver
276285
277286 void deviceClose (oni::driver::DeviceBase* pDevice)
278287 {
279- for (std::map<OniDeviceInfo, oni::driver::DeviceBase*>:: iterator iter = devices.begin (); iter != devices.end ();)
288+ for (OniDeviceMap:: iterator iter = devices.begin (); iter != devices.end (); iter++ )
280289 {
281290 if (iter->second == pDevice)
282291 {
283292 WriteMessage (" Closing device " + std::string (iter->first .uri ));
284-
285- unsigned int id;
286- std::istringstream is (std::string (iter->first .uri ));
287- is.seekg (strlen (" freenect://" ));
288- is >> id;
289- devices.erase (iter++);
293+ int id = uri_to_devid (iter->first .uri );
294+ devices.erase (iter);
290295 deleteDevice (id);
291296 return ;
292297 }
293- else
294- {
295- iter++;
296- }
297298 }
298299
299300 LogError (" Could not close unrecognized device" );
@@ -310,8 +311,14 @@ namespace FreenectDriver
310311
311312 void shutdown ()
312313 {
313- for (std::map<OniDeviceInfo, oni::driver::DeviceBase*>::iterator iter = devices.begin (); iter != devices.end (); iter++)
314- deviceClose (iter->second );
314+ for (OniDeviceMap::iterator iter = devices.begin (); iter != devices.end (); iter++)
315+ {
316+ WriteMessage (" Closing device " + std::string (iter->first .uri ));
317+ int id = uri_to_devid (iter->first .uri );
318+ deleteDevice (id);
319+ }
320+
321+ devices.clear ();
315322 }
316323
317324
0 commit comments