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