annotate external/oscpack/osc/OscPrintReceivedElements.cpp @ 653:755c401da7a7

Simple integration test between CARFAC and SAI. The interface between the two classes is pretty clunky because of the way CARFACOutput stores things. We should work on this, probably by rotating the outer two dimensions of CARFACOutput (i.e. store outputs in containers with sizes n_ears x n_samples x n_channels instead of n_samples x n_ears x n_channels).
author ronw@google.com
date Wed, 26 Jun 2013 23:35:47 +0000
parents 0284d2152e17
children
rev   line source
tomwalters@509 1 /*
tomwalters@509 2 oscpack -- Open Sound Control packet manipulation library
tomwalters@509 3 http://www.audiomulch.com/~rossb/oscpack
tomwalters@509 4
tomwalters@509 5 Copyright (c) 2004-2005 Ross Bencina <rossb@audiomulch.com>
tomwalters@509 6
tomwalters@509 7 Permission is hereby granted, free of charge, to any person obtaining
tomwalters@509 8 a copy of this software and associated documentation files
tomwalters@509 9 (the "Software"), to deal in the Software without restriction,
tomwalters@509 10 including without limitation the rights to use, copy, modify, merge,
tomwalters@509 11 publish, distribute, sublicense, and/or sell copies of the Software,
tomwalters@509 12 and to permit persons to whom the Software is furnished to do so,
tomwalters@509 13 subject to the following conditions:
tomwalters@509 14
tomwalters@509 15 The above copyright notice and this permission notice shall be
tomwalters@509 16 included in all copies or substantial portions of the Software.
tomwalters@509 17
tomwalters@509 18 Any person wishing to distribute modifications to the Software is
tomwalters@509 19 requested to send the modifications to the original developer so that
tomwalters@509 20 they can be incorporated into the canonical version.
tomwalters@509 21
tomwalters@509 22 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
tomwalters@509 23 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
tomwalters@509 24 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
tomwalters@509 25 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
tomwalters@509 26 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
tomwalters@509 27 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
tomwalters@509 28 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
tomwalters@509 29 */
tomwalters@509 30 #include "OscPrintReceivedElements.h"
tomwalters@509 31
tomwalters@509 32 #include <iostream>
tomwalters@509 33 #include <iomanip>
tomwalters@509 34 #include <ctime>
tomwalters@509 35
tomwalters@509 36
tomwalters@509 37 namespace osc{
tomwalters@509 38
tomwalters@509 39
tomwalters@509 40 std::ostream& operator<<( std::ostream & os,
tomwalters@509 41 const ReceivedMessageArgument& arg )
tomwalters@509 42 {
tomwalters@509 43 switch( arg.TypeTag() ){
tomwalters@509 44 case TRUE_TYPE_TAG:
tomwalters@509 45 os << "bool:true";
tomwalters@509 46 break;
tomwalters@509 47
tomwalters@509 48 case FALSE_TYPE_TAG:
tomwalters@509 49 os << "bool:false";
tomwalters@509 50 break;
tomwalters@509 51
tomwalters@509 52 case NIL_TYPE_TAG:
tomwalters@509 53 os << "(Nil)";
tomwalters@509 54 break;
tomwalters@509 55
tomwalters@509 56 case INFINITUM_TYPE_TAG:
tomwalters@509 57 os << "(Infinitum)";
tomwalters@509 58 break;
tomwalters@509 59
tomwalters@509 60 case INT32_TYPE_TAG:
tomwalters@509 61 os << "int32:" << arg.AsInt32Unchecked();
tomwalters@509 62 break;
tomwalters@509 63
tomwalters@509 64 case FLOAT_TYPE_TAG:
tomwalters@509 65 os << "float32:" << arg.AsFloatUnchecked();
tomwalters@509 66 break;
tomwalters@509 67
tomwalters@509 68 case CHAR_TYPE_TAG:
tomwalters@509 69 {
tomwalters@509 70 char s[2] = {0};
tomwalters@509 71 s[0] = arg.AsCharUnchecked();
tomwalters@509 72 os << "char:'" << s << "'";
tomwalters@509 73 }
tomwalters@509 74 break;
tomwalters@509 75
tomwalters@509 76 case RGBA_COLOR_TYPE_TAG:
tomwalters@509 77 {
tomwalters@509 78 uint32 color = arg.AsRgbaColorUnchecked();
tomwalters@509 79
tomwalters@509 80 os << "RGBA:0x"
tomwalters@509 81 << std::hex << std::setfill('0')
tomwalters@509 82 << std::setw(2) << (int)((color>>24) & 0xFF)
tomwalters@509 83 << std::setw(2) << (int)((color>>16) & 0xFF)
tomwalters@509 84 << std::setw(2) << (int)((color>>8) & 0xFF)
tomwalters@509 85 << std::setw(2) << (int)(color & 0xFF)
tomwalters@509 86 << std::setfill(' ');
tomwalters@509 87 os.unsetf(std::ios::basefield);
tomwalters@509 88 }
tomwalters@509 89 break;
tomwalters@509 90
tomwalters@509 91 case MIDI_MESSAGE_TYPE_TAG:
tomwalters@509 92 {
tomwalters@509 93 uint32 m = arg.AsMidiMessageUnchecked();
tomwalters@509 94 os << "midi (port, status, data1, data2):<<"
tomwalters@509 95 << std::hex << std::setfill('0')
tomwalters@509 96 << "0x" << std::setw(2) << (int)((m>>24) & 0xFF)
tomwalters@509 97 << " 0x" << std::setw(2) << (int)((m>>16) & 0xFF)
tomwalters@509 98 << " 0x" << std::setw(2) << (int)((m>>8) & 0xFF)
tomwalters@509 99 << " 0x" << std::setw(2) << (int)(m & 0xFF)
tomwalters@509 100 << std::setfill(' ') << ">>";
tomwalters@509 101 os.unsetf(std::ios::basefield);
tomwalters@509 102 }
tomwalters@509 103 break;
tomwalters@509 104
tomwalters@509 105 case INT64_TYPE_TAG:
tomwalters@509 106 os << "int64:" << arg.AsInt64Unchecked();
tomwalters@509 107 break;
tomwalters@509 108
tomwalters@509 109 case TIME_TAG_TYPE_TAG:
tomwalters@509 110 {
tomwalters@509 111 os << "OSC-timetag:" << arg.AsTimeTagUnchecked();
tomwalters@509 112
tomwalters@509 113 std::time_t t =
tomwalters@509 114 (unsigned long)( arg.AsTimeTagUnchecked() >> 32 );
tomwalters@509 115
tomwalters@509 116 // strip trailing newline from string returned by ctime
tomwalters@509 117 const char *timeString = std::ctime( &t );
tomwalters@509 118 size_t len = strlen( timeString );
tomwalters@509 119 char *s = new char[ len + 1 ];
tomwalters@509 120 strcpy( s, timeString );
tomwalters@509 121 if( len )
tomwalters@509 122 s[ len - 1 ] = '\0';
tomwalters@509 123
tomwalters@509 124 os << " " << s;
tomwalters@509 125 }
tomwalters@509 126 break;
tomwalters@509 127
tomwalters@509 128 case DOUBLE_TYPE_TAG:
tomwalters@509 129 os << "double:" << arg.AsDoubleUnchecked();
tomwalters@509 130 break;
tomwalters@509 131
tomwalters@509 132 case STRING_TYPE_TAG:
tomwalters@509 133 os << "OSC-string:`" << arg.AsStringUnchecked() << "'";
tomwalters@509 134 break;
tomwalters@509 135
tomwalters@509 136 case SYMBOL_TYPE_TAG:
tomwalters@509 137 os << "OSC-string (symbol):`" << arg.AsSymbolUnchecked() << "'";
tomwalters@509 138 break;
tomwalters@509 139
tomwalters@509 140 case BLOB_TYPE_TAG:
tomwalters@509 141 {
tomwalters@509 142 unsigned long size;
tomwalters@509 143 const void *data;
tomwalters@509 144 arg.AsBlobUnchecked( data, size );
tomwalters@509 145 os << "OSC-blob:<<" << std::hex << std::setfill('0');
tomwalters@509 146 unsigned char *p = (unsigned char*)data;
tomwalters@509 147 for( unsigned long i = 0; i < size; ++i ){
tomwalters@509 148 os << "0x" << std::setw(2) << int(p[i]);
tomwalters@509 149 if( i != size-1 )
tomwalters@509 150 os << ' ';
tomwalters@509 151 }
tomwalters@509 152 os.unsetf(std::ios::basefield);
tomwalters@509 153 os << ">>" << std::setfill(' ');
tomwalters@509 154 }
tomwalters@509 155 break;
tomwalters@509 156
tomwalters@509 157 default:
tomwalters@509 158 os << "unknown";
tomwalters@509 159 }
tomwalters@509 160
tomwalters@509 161 return os;
tomwalters@509 162 }
tomwalters@509 163
tomwalters@509 164
tomwalters@509 165 std::ostream& operator<<( std::ostream & os, const ReceivedMessage& m )
tomwalters@509 166 {
tomwalters@509 167
tomwalters@509 168 os << "[" << m.AddressPattern();
tomwalters@509 169 bool first = true;
tomwalters@509 170
tomwalters@509 171 for( ReceivedMessage::const_iterator i = m.ArgumentsBegin();
tomwalters@509 172 i != m.ArgumentsEnd(); ++i ){
tomwalters@509 173 if( first ){
tomwalters@509 174 os << " ";
tomwalters@509 175 first = false;
tomwalters@509 176 }else{
tomwalters@509 177 os << ", ";
tomwalters@509 178 }
tomwalters@509 179
tomwalters@509 180 os << *i;
tomwalters@509 181 }
tomwalters@509 182
tomwalters@509 183 os << "]";
tomwalters@509 184
tomwalters@509 185 return os;
tomwalters@509 186 }
tomwalters@509 187
tomwalters@509 188
tomwalters@509 189 std::ostream& operator<<( std::ostream & os, const ReceivedBundle& b )
tomwalters@509 190 {
tomwalters@509 191 static int indent = 0;
tomwalters@509 192
tomwalters@509 193 for( int j=0; j < indent; ++j )
tomwalters@509 194 os << " ";
tomwalters@509 195 os << "{ ( ";
tomwalters@509 196 if( b.TimeTag() == 1 )
tomwalters@509 197 os << "immediate";
tomwalters@509 198 else
tomwalters@509 199 os << b.TimeTag();
tomwalters@509 200 os << " )\n";
tomwalters@509 201
tomwalters@509 202 ++indent;
tomwalters@509 203
tomwalters@509 204 for( ReceivedBundle::const_iterator i = b.ElementsBegin();
tomwalters@509 205 i != b.ElementsEnd(); ++i ){
tomwalters@509 206 if( i->IsBundle() ){
tomwalters@509 207 ReceivedBundle b(*i);
tomwalters@509 208 os << b << "\n";
tomwalters@509 209 }else{
tomwalters@509 210 ReceivedMessage m(*i);
tomwalters@509 211 for( int j=0; j < indent; ++j )
tomwalters@509 212 os << " ";
tomwalters@509 213 os << m << "\n";
tomwalters@509 214 }
tomwalters@509 215 }
tomwalters@509 216
tomwalters@509 217 --indent;
tomwalters@509 218
tomwalters@509 219 for( int j=0; j < indent; ++j )
tomwalters@509 220 os << " ";
tomwalters@509 221 os << "}";
tomwalters@509 222
tomwalters@509 223 return os;
tomwalters@509 224 }
tomwalters@509 225
tomwalters@509 226
tomwalters@509 227 std::ostream& operator<<( std::ostream & os, const ReceivedPacket& p )
tomwalters@509 228 {
tomwalters@509 229 if( p.IsBundle() ){
tomwalters@509 230 ReceivedBundle b(p);
tomwalters@509 231 os << b << "\n";
tomwalters@509 232 }else{
tomwalters@509 233 ReceivedMessage m(p);
tomwalters@509 234 os << m << "\n";
tomwalters@509 235 }
tomwalters@509 236
tomwalters@509 237 return os;
tomwalters@509 238 }
tomwalters@509 239
tomwalters@509 240 } // namespace osc