Changeset 217
- Timestamp:
- 05/22/06 14:54:50 (16 years ago)
- Files:
-
- branches/libfreebob-2.0/src/libstreaming/AmdtpPort.h (modified) (5 diffs)
- branches/libfreebob-2.0/src/libstreaming/AmdtpPortInfo.h (modified) (2 diffs)
- branches/libfreebob-2.0/src/libstreaming/AmdtpStreamProcessor.cpp (modified) (3 diffs)
- branches/libfreebob-2.0/src/libstreaming/AmdtpStreamProcessor.h (modified) (3 diffs)
- branches/libfreebob-2.0/src/libstreaming/Port.cpp (modified) (4 diffs)
- branches/libfreebob-2.0/src/libstreaming/Port.h (modified) (7 diffs)
- branches/libfreebob-2.0/tests/streaming/test-isohandling.cpp (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/libfreebob-2.0/src/libstreaming/AmdtpPort.h
r207 r217 48 48 enum E_DataType datatype, 49 49 enum E_BufferType buffertype, 50 int buffsize,50 unsigned int buffsize, 51 51 int position, 52 52 int location, 53 intformat,53 enum E_Formats format, 54 54 int type) 55 55 : AudioPort(name, datatype, buffertype, buffsize), … … 60 60 enum E_DataType datatype, 61 61 enum E_BufferType buffertype, 62 int buffsize,62 unsigned int buffsize, 63 63 void *externalbuffer, 64 64 int position, 65 65 int location, 66 intformat,66 enum E_Formats format, 67 67 int type) 68 68 : AudioPort(name, datatype, buffertype, buffsize, externalbuffer), … … 70 70 {}; 71 71 72 virtual ~AmdtpAudioPort() ;72 virtual ~AmdtpAudioPort() {}; 73 73 74 74 protected: … … 84 84 85 85 AmdtpMidiPort(std::string name, 86 int buffsize,86 unsigned int buffsize, 87 87 int position, 88 88 int location, 89 intformat,89 enum E_Formats format, 90 90 int type) 91 91 : MidiPort(name, buffsize), … … 93 93 {}; 94 94 95 virtual ~AmdtpMidiPort() ;95 virtual ~AmdtpMidiPort() {}; 96 96 97 97 protected: branches/libfreebob-2.0/src/libstreaming/AmdtpPortInfo.h
r207 r217 37 37 38 38 public: 39 enum E_Formats { 40 E_MBLA, 41 E_Midi, 42 E_SPDIF, 43 }; 44 enum E_Types { 39 45 40 AmdtpPortInfo(std::string name, int position, int location, int format, int type) 46 }; 47 48 AmdtpPortInfo(std::string name, int position, int location, enum E_Formats format, int type) 41 49 : m_name(name), m_position(position), m_location(location), m_format(format), m_type(type) 42 50 {}; 43 51 virtual ~AmdtpPortInfo() {}; 44 52 53 45 54 std::string getName() {return m_name;}; 46 55 int getLocation() {return m_location;}; 47 int getPos tition(){return m_position;};48 intgetFormat() {return m_format;};56 int getPosition() {return m_position;}; 57 enum E_Formats getFormat() {return m_format;}; 49 58 int getType() {return m_type;}; 50 59 … … 54 63 int m_position; 55 64 int m_location; 56 intm_format;65 enum E_Formats m_format; 57 66 int m_type; 58 67 branches/libfreebob-2.0/src/libstreaming/AmdtpStreamProcessor.cpp
r212 r217 28 28 29 29 #include "AmdtpStreamProcessor.h" 30 #include "Port.h" 31 #include "AmdtpPort.h" 32 33 #include <netinet/in.h> 30 34 #include <assert.h> 31 35 … … 269 273 unsigned int nevents=((length / sizeof (quadlet_t)) - 2)/packet->dbs; 270 274 271 int write_size=nevents*sizeof(quadlet_t)*m_dimension;275 unsigned int write_size=nevents*sizeof(quadlet_t)*m_dimension; 272 276 // add the data payload to the ringbuffer 273 277 … … 338 342 // TODO: implement 339 343 340 int read_size=m_period*sizeof(quadlet_t)*m_dimension;344 unsigned int read_size=m_period*sizeof(quadlet_t)*m_dimension; 341 345 char *dummybuffer=(char *)calloc(sizeof(quadlet_t),m_period*m_dimension); 342 346 if (freebob_ringbuffer_read(m_event_buffer,(char *)(dummybuffer),read_size) < read_size) { 343 347 debugWarning("Could not read from event buffer\n"); 344 348 } 349 350 receiveBlock(dummybuffer, m_period, 0, 0); 351 345 352 free(dummybuffer); 346 353 347 354 355 348 356 return 0; 349 357 } 350 358 359 /* 360 * write received events to the stream ringbuffers. 361 */ 362 363 int AmdtpReceiveStreamProcessor::receiveBlock(char *data, 364 unsigned int nevents, unsigned int offset, unsigned int dbc) 365 { 366 int problem=0; 367 368 for ( PortVectorIterator it = m_PeriodPorts.begin(); 369 it != m_PeriodPorts.end(); 370 ++it ) 371 { 372 373 //FIXME: make this into a static_cast when not DEBUG? 374 375 AmdtpPortInfo *pinfo=dynamic_cast<AmdtpPortInfo *>(*it); 376 assert(pinfo); // this should not fail!! 377 378 switch(pinfo->getFormat()) { 379 case AmdtpPortInfo::E_MBLA: 380 if(decodeMBLAEventsToPort(static_cast<AmdtpAudioPort *>(*it), (quadlet_t *)data, offset, nevents, dbc)) { 381 debugWarning("Could not decode packet MBLA to port %s",(*it)->getName().c_str()); 382 problem=1; 383 } 384 break; 385 case AmdtpPortInfo::E_SPDIF: // still unimplemented 386 break; 387 /* for this processor, midi is a packet based port 388 case AmdtpPortInfo::E_Midi: 389 break;*/ 390 default: // ignore 391 break; 392 } 393 } 394 return problem; 395 396 } 397 398 int AmdtpReceiveStreamProcessor::decodeMBLAEventsToPort(AmdtpAudioPort *p, quadlet_t *data, 399 unsigned int offset, unsigned int nevents, unsigned int dbc) 400 { 401 unsigned int j=0; 402 403 quadlet_t *target_event; 404 405 target_event=(quadlet_t *)(data + p->getPosition()); 406 407 switch(p->getDataType()) { 408 default: 409 case Port::E_Int24: 410 { 411 quadlet_t *buffer=(quadlet_t *)(p->getBufferAddress()); 412 413 assert(nevents + offset <= p->getBufferSize()); 414 415 buffer+=offset; 416 417 for(j = 0; j < nevents; j += 1) { // decode max nsamples 418 *(buffer)=(ntohl((*target_event) ) & 0x00FFFFFF); 419 buffer++; 420 target_event+=m_dimension; 421 } 422 } 423 break; 424 case Port::E_Float: 425 { 426 const float multiplier = 1.0f / (float)(0x7FFFFF); 427 float *buffer=(float *)(p->getBufferAddress()); 428 429 assert(nevents + offset <= p->getBufferSize()); 430 431 buffer+=offset; 432 433 for(j = 0; j < nevents; j += 1) { // decode max nsamples 434 435 unsigned int v = ntohl(*target_event) & 0x00FFFFFF; 436 // sign-extend highest bit of 24-bit int 437 int tmp = (int)(v << 8) / 256; 438 439 *buffer = tmp * multiplier; 440 441 buffer++; 442 target_event+=m_dimension; 443 } 444 } 445 break; 446 } 447 448 return 0; 449 } 351 450 352 451 } // end of namespace FreebobStreaming branches/libfreebob-2.0/src/libstreaming/AmdtpStreamProcessor.h
r207 r217 41 41 namespace FreebobStreaming { 42 42 43 class Port; 44 class AmdtpAudioPort; 45 class AmdtpMidiPort; 46 43 47 class AmdtpTransmitStreamProcessor 44 48 : public TransmitStreamProcessor … … 63 67 64 68 protected: 69 65 70 struct iec61883_cip m_cip_status; 66 71 … … 97 102 protected: 98 103 104 int receiveBlock(char *data, unsigned int nevents, unsigned int offset, unsigned int dbc); 105 int decodeMBLAEventsToPort(AmdtpAudioPort *, quadlet_t *data, unsigned int offset, unsigned int nevents, unsigned int dbc); 106 99 107 freebob_ringbuffer_t * m_event_buffer; 100 108 char* m_cluster_buffer; branches/libfreebob-2.0/src/libstreaming/Port.cpp
r210 r217 39 39 IMPL_DEBUG_MODULE( ControlPort, ControlPort, DEBUG_LEVEL_NORMAL ); 40 40 41 Port::Port(std::string name, enum E_BufferType type, int buffsize)41 Port::Port(std::string name, enum E_BufferType type, unsigned int buffsize, enum E_DataType datatype) 42 42 : m_Name(name), 43 43 m_BufferType(type), 44 44 m_enabled(true), 45 45 m_buffersize(buffsize), 46 m_datatype(datatype), 46 47 m_buffer(0), 47 48 m_buffer_attached(false) … … 51 52 } 52 53 53 Port::Port(std::string name, enum E_BufferType type, int buffsize, void* externalbuffer) 54 Port::Port(std::string name, enum E_BufferType type, unsigned int buffsize, 55 enum E_DataType datatype, void* externalbuffer) 54 56 : m_Name(name), 55 57 m_BufferType(type), 56 58 m_enabled(true), 57 59 m_buffersize(buffsize), 60 m_datatype(datatype), 58 61 m_buffer(externalbuffer), 59 62 m_buffer_attached(true) … … 126 129 } 127 130 128 unsigned int AudioPort::getEventSize() {129 switch (m_ DataType) {131 unsigned int Port::getEventSize() { 132 switch (m_datatype) { 130 133 case E_Float: 131 134 return sizeof(float); 132 135 case E_Int24: // 24 bit 2's complement, packed in a 32bit integer (LSB's) 133 136 return sizeof(uint32_t); 134 default:135 return 0;136 }137 }138 139 unsigned int MidiPort::getEventSize() {140 switch (m_DataType) {141 137 case E_Byte: 142 138 return sizeof(char); … … 146 142 } 147 143 148 unsigned int ControlPort::getEventSize() {149 switch (m_DataType) {150 case E_Default:151 return sizeof(uint32_t);152 default:153 return 0;154 }155 144 } 156 157 }branches/libfreebob-2.0/src/libstreaming/Port.h
r206 r217 45 45 }; 46 46 47 Port(std::string name, enum E_BufferType type, int buffsize); 48 Port(std::string name, enum E_BufferType type, int buffsize, void *externalbuffer); 47 enum E_DataType { 48 E_Float, 49 E_Int24, 50 E_Byte, 51 E_Default, 52 }; 53 54 Port(std::string name, enum E_BufferType type, unsigned int buffsize, enum E_DataType datatype); 55 Port(std::string name, enum E_BufferType type, unsigned int buffsize, 56 enum E_DataType datatype, void *externalbuffer); 49 57 50 58 virtual ~Port() … … 61 69 62 70 // returns the size in bytes of the events in the port buffer 63 virtual unsigned int getEventSize() = 0; 71 unsigned int getEventSize(); 72 73 enum E_DataType getDataType() {return m_datatype;}; 64 74 65 75 // NOT THREAD SAFE! … … 72 82 int detachBuffer(); 73 83 74 int getBufferSize() {return m_buffersize;};84 unsigned int getBufferSize() {return m_buffersize;}; 75 85 void *getBuffer() {return m_buffer;}; 86 87 void setBufferOffset(unsigned int n); 88 // FIXME: this is not really OO, but for performance??? 89 void *getBufferAddress() {return m_buffer;}; 76 90 77 91 protected: … … 81 95 82 96 bool m_enabled; 83 int m_buffersize; 97 unsigned int m_buffersize; 98 99 enum E_DataType m_datatype; 100 84 101 void *m_buffer; 85 102 bool m_buffer_attached; … … 98 115 99 116 public: 100 enum E_DataType {101 E_Float,102 E_Int24103 };104 117 105 AudioPort(std::string name, int buffsize) 106 : Port(name, E_PeriodBuffered, buffsize), 107 m_DataType(E_Int24) 118 AudioPort(std::string name, unsigned int buffsize) 119 : Port(name, E_PeriodBuffered, buffsize, E_Int24) 108 120 {}; 109 121 110 AudioPort(std::string name, enum E_BufferType type, int buffsize) 111 : Port(name, type, buffsize), 112 m_DataType(E_Int24) 122 AudioPort(std::string name, enum E_BufferType type, unsigned int buffsize) 123 : Port(name, type, buffsize, E_Int24) 113 124 {}; 114 AudioPort(std::string name, enum E_BufferType type, int buffsize, void *externalbuffer) 115 : Port(name, type, buffsize, externalbuffer), 116 m_DataType(E_Int24) 125 AudioPort(std::string name, enum E_BufferType type, unsigned int buffsize, void *externalbuffer) 126 : Port(name, type, buffsize, E_Int24, externalbuffer) 117 127 {}; 118 128 119 129 AudioPort(std::string name, enum E_DataType datatype, 120 enum E_BufferType type, int buffsize) 121 : Port(name, type, buffsize), 122 m_DataType(datatype) 130 enum E_BufferType type, unsigned int buffsize) 131 : Port(name, type, buffsize, datatype) 123 132 {}; 124 133 AudioPort(std::string name, enum E_DataType datatype, 125 enum E_BufferType type, int buffsize, void *externalbuffer) 126 : Port(name, type, buffsize, externalbuffer), 127 m_DataType(datatype) 134 enum E_BufferType type, unsigned int buffsize, void *externalbuffer) 135 : Port(name, type, buffsize, datatype, externalbuffer) 128 136 {}; 129 137 130 virtual ~AudioPort() ;138 virtual ~AudioPort() {}; 131 139 132 enum E_DataType getType() {return m_DataType;};133 unsigned int getEventSize();134 140 135 141 protected: … … 143 149 144 150 public: 145 enum E_DataType {146 E_Byte147 };148 151 149 MidiPort(std::string name, int buffsize) 150 : Port(name, E_PacketBuffered, buffsize), 151 m_DataType(E_Byte) 152 MidiPort(std::string name, unsigned int buffsize) 153 : Port(name, E_PacketBuffered, buffsize, E_Byte) 152 154 {}; 153 virtual ~MidiPort() ;155 virtual ~MidiPort() {}; 154 156 155 enum E_DataType getType() {return m_DataType;};156 unsigned int getEventSize();157 157 158 158 protected: … … 166 166 167 167 public: 168 enum E_DataType {169 E_Default170 };171 168 172 ControlPort(std::string name, int buffsize) 173 : Port(name, E_PeriodBuffered, buffsize), 174 m_DataType(E_Default) 169 ControlPort(std::string name, unsigned int buffsize) 170 : Port(name, E_PeriodBuffered, buffsize, E_Int24) 175 171 {}; 176 virtual ~ControlPort() ;172 virtual ~ControlPort() {}; 177 173 178 enum E_DataType getType() {return m_DataType;};179 unsigned int getEventSize();180 174 181 175 protected: 182 enum E_DataType m_DataType;183 176 184 177 DECLARE_DEBUG_MODULE; branches/libfreebob-2.0/tests/streaming/test-isohandling.cpp
r212 r217 29 29 #include "debugmodule/debugmodule.h" 30 30 31 #include <netinet/in.h> 32 31 33 #include "IsoHandler.h" 32 34 #include "IsoStream.h" … … 36 38 #include "StreamRunner.h" 37 39 #include "FreebobPosixThread.h" 40 #include "AmdtpPort.h" 38 41 39 42 using namespace FreebobStreaming; 43 40 44 41 45 int run; … … 146 150 printf("----------------------\n"); 147 151 152 AmdtpAudioPort *p1=new AmdtpAudioPort( 153 std::string("Test port 1"), 154 AmdtpAudioPort::E_Int24, 155 AmdtpAudioPort::E_PeriodBuffered, 156 512, 157 1, 158 0, 159 AmdtpPortInfo::E_MBLA, 160 0 161 ); 162 if (!p1) { 163 printf("Could not create port 1\n"); 164 return -1; 165 } 166 167 printf("----------------------\n"); 168 169 if (spr2->addPort(p1)) { 170 printf("Could not register port with receive stream processor\n"); 171 return -1; 172 } 173 148 174 // now create the runner that does the actual streaming 149 175 StreamRunner *runner = new StreamRunner(isomanager,procMan); … … 175 201 printf("--------------------------------------------\n"); 176 202 procMan->dumpInfo(); 203 printf("--------------------------------------------\n"); 204 hexDumpQuadlets((quadlet_t*)(p1->getBufferAddress()),10); 177 205 printf("============================================\n"); 178 206 printf("\n"); … … 188 216 isomanager->stopHandlers(); 189 217 218 spr->deletePort(p1); 219 190 220 // isomanager->unregisterStream(spt); 191 221 isomanager->unregisterStream(spr); … … 198 228 delete thread; 199 229 delete runner; 230 231 delete p1; 232 200 233 delete procMan; 201 234 delete isomanager;