OSCpacket.cpp
上传用户:lijia5631
上传日期:2008-11-10
资源大小:1214k
文件大小:4k
源码类别:

视频捕捉/采集

开发平台:

MultiPlatform

  1. /**
  2.   * HandVu - a library for computer vision-based hand gesture
  3.   * recognition.
  4.   * Copyright (C) 2004 Mathias Kolsch, matz@cs.ucsb.edu
  5.   *
  6.   * This program is free software; you can redistribute it and/or
  7.   * modify it under the terms of the GNU General Public License
  8.   * as published by the Free Software Foundation; either version 2
  9.   * of the License, or (at your option) any later version.
  10.   *
  11.   * This program is distributed in the hope that it will be useful,
  12.   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.   * GNU General Public License for more details.
  15.   *
  16.   * You should have received a copy of the GNU General Public License
  17.   * along with this program; if not, write to the Free Software
  18.   * Foundation, Inc., 59 Temple Place - Suite 330, 
  19.   * Boston, MA  02111-1307, USA.
  20.   *
  21.   * $Id: OSCpacket.cpp,v 1.2 2005/01/18 23:57:42 matz Exp $
  22. **/
  23. // OSCpacket.cpp: constructs OSC packets
  24. //
  25. #include "Common.h"
  26. #include "OSCpacket.h"
  27. #ifdef WIN32
  28. #include <winsock2.h>
  29. #else
  30. #include <netinet/in.h>
  31. #endif
  32. #ifdef USE_MFC
  33. #ifdef _DEBUG
  34. #define new DEBUG_NEW
  35. #undef THIS_FILE
  36. static char THIS_FILE[] = __FILE__;
  37. #endif // _DEBUG
  38. #endif // USE_MFC
  39. /////////////////////////////////////////////////////////////////////////////
  40. // OSCpacket
  41. OSCpacket::OSCpacket()
  42.   : m_packet_ready(false)
  43. {
  44.   ASSERT(sizeof(char)==1);
  45.   ASSERT(sizeof(int)==4);
  46.   ASSERT(sizeof(float)==4);
  47. }
  48. void OSCpacket::Clear()
  49. {
  50.   m_address = "";
  51.   m_typetags.clear();
  52.   m_values.clear();
  53.   m_packet_ready = false;
  54. }
  55. void OSCpacket::SetAddress(const string& address)
  56. {
  57.   m_address = address;
  58.   CheckAddress();
  59.   m_packet_ready = false;
  60. }
  61. void OSCpacket::AddInt(int val)
  62. {
  63.   char buf[4];
  64.   *((unsigned int*) buf) = htonl(val);
  65.   m_values.push_back(buf[0]);
  66.   m_values.push_back(buf[1]);
  67.   m_values.push_back(buf[2]);
  68.   m_values.push_back(buf[3]);
  69.   m_typetags.push_back('i');
  70.   m_packet_ready = false;
  71. }
  72. void OSCpacket::AddFloat(float val)
  73. {
  74.   char buf[4];
  75.   *((unsigned int*) buf) = htonl(*((int*)&val));
  76.   m_values.push_back(buf[0]);
  77.   m_values.push_back(buf[1]);
  78.   m_values.push_back(buf[2]);
  79.   m_values.push_back(buf[3]);
  80.   m_typetags.push_back('f');
  81.   m_packet_ready = false;
  82. }
  83. void PadBytes(Bytes& bytes) 
  84. {
  85.   int gap = (int)bytes.size()%4;
  86.   if (gap) {
  87.     for (int i=4-gap; i!=0; i--) {
  88.       bytes.push_back(0);
  89.     }
  90.   }
  91. }
  92. void OSCpacket::AddString(const string& val)
  93. {
  94.   for (int i=0; i<(int)val.size(); i++) {
  95.     m_values.push_back(val[i]);
  96.   }
  97.   m_values.push_back('');
  98.   PadBytes(m_values);
  99.   m_typetags.push_back('s');
  100.   m_packet_ready = false;
  101. }
  102. const char* OSCpacket::GetBytes() const
  103. {
  104.   if (!m_packet_ready) {
  105.     ((OSCpacket*) this)->CreatePacket();
  106.   }
  107.   return &m_packet[0];
  108. }
  109. int OSCpacket::GetSize() const
  110. {
  111.   if (!m_packet_ready) {
  112.     ((OSCpacket*) this)->CreatePacket();
  113.   }
  114.   return (int) m_packet.size();
  115. }
  116. void OSCpacket::CreatePacket()
  117. {
  118.   ASSERT(!m_packet_ready);
  119.   m_packet.clear();
  120.   // add address and pad
  121.   CheckAddress();
  122.   m_packet.insert(m_packet.end(), m_address.begin(), m_address.end());
  123.   PadBytes(m_packet);
  124.   // add typetags and pad
  125.   m_packet.push_back(',');  // typetag separator
  126.   m_packet.insert(m_packet.end(), m_typetags.begin(), m_typetags.end());
  127.   PadBytes(m_packet);
  128.   // add values and pad
  129.   m_packet.insert(m_packet.end(), m_values.begin(), m_values.end());
  130.   PadBytes(m_packet);
  131.   m_packet_ready = true;
  132. }
  133. void OSCpacket::CheckAddress()
  134. {
  135.   if (m_address.size()<1) throw HVException("OSC address must not be empty");
  136.   if (m_address[0]!='/') throw HVException("OSC address must start with '/'");
  137.   for (int i=0; i<(int)m_address.size(); i++) {
  138.     if (m_address[i]==',') {
  139.       throw HVException("OSC address can not contain ',' for now");
  140.     }
  141.   }
  142. }