- Timestamp:
- 11/27/07 08:50:48 (14 years ago)
- Files:
-
- branches/ppalmers-streaming/src/dice/dice_avdevice.cpp (modified) (1 diff)
- branches/ppalmers-streaming/src/genericavc/avc_avdevice.cpp (modified) (1 diff)
- branches/ppalmers-streaming/src/libstreaming/amdtp/AmdtpReceiveStreamProcessor.cpp (modified) (1 diff)
- branches/ppalmers-streaming/src/libstreaming/amdtp/AmdtpReceiveStreamProcessor.h (modified) (1 diff)
- branches/ppalmers-streaming/src/libstreaming/amdtp/AmdtpTransmitStreamProcessor.cpp (modified) (1 diff)
- branches/ppalmers-streaming/src/libstreaming/amdtp/AmdtpTransmitStreamProcessor.h (modified) (1 diff)
- branches/ppalmers-streaming/src/libstreaming/generic/IsoStream.h (modified) (1 diff)
- branches/ppalmers-streaming/src/libstreaming/generic/StreamProcessor.cpp (modified) (4 diffs)
- branches/ppalmers-streaming/src/libstreaming/generic/StreamProcessor.h (modified) (2 diffs)
- branches/ppalmers-streaming/src/libstreaming/StreamProcessorManager.cpp (modified) (5 diffs)
- branches/ppalmers-streaming/src/libstreaming/util/IsoHandlerManager.cpp (modified) (2 diffs)
- branches/ppalmers-streaming/src/libstreaming/util/IsoHandlerManager.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/ppalmers-streaming/src/dice/dice_avdevice.cpp
r723 r729 534 534 535 535 // prepare transmit SP's 536 // for (unsigned int i=0;i<m_nb_rx;i++) { 537 for (unsigned int i=0;i<1;i++) { 536 for (unsigned int i=0;i<m_nb_rx;i++) { 538 537 fb_quadlet_t nb_audio; 539 538 fb_quadlet_t nb_midi; branches/ppalmers-streaming/src/genericavc/avc_avdevice.cpp
r720 r729 426 426 Streaming::StreamProcessor *p; 427 427 428 if ( outputPlug->getNrOfChannels() == 0 ) { 429 debugError("Receive plug has no channels\n"); 430 return false; 431 } 428 432 p=new Streaming::AmdtpReceiveStreamProcessor( 429 433 get1394Service().getPort(), branches/ppalmers-streaming/src/libstreaming/amdtp/AmdtpReceiveStreamProcessor.cpp
r722 r729 44 44 AmdtpReceiveStreamProcessor::AmdtpReceiveStreamProcessor(int port, int dimension) 45 45 : StreamProcessor(ePT_Receive , port) 46 , m_dimension( dimension)46 , m_dimension( dimension ) 47 47 {} 48 48 49 unsigned int 50 AmdtpReceiveStreamProcessor::getNominalPacketsNeeded(unsigned int nframes) 51 { 52 unsigned int nominal_frames_per_second = m_manager->getNominalRate(); 53 uint64_t nominal_ticks_per_frame = TICKS_PER_SECOND / nominal_frames_per_second; 54 uint64_t nominal_ticks = nominal_ticks_per_frame * nframes; 55 uint64_t nominal_packets = nominal_ticks / TICKS_PER_CYCLE; 56 return nominal_packets; 57 } 49 58 50 59 unsigned int 51 60 AmdtpReceiveStreamProcessor::getPacketsPerPeriod() 52 61 { 53 return (m_manager->getPeriodSize())/m_syt_interval;62 return getNominalPacketsNeeded(m_manager->getPeriodSize()); 54 63 } 55 64 branches/ppalmers-streaming/src/libstreaming/amdtp/AmdtpReceiveStreamProcessor.h
r722 r729 97 97 {return m_syt_interval;}; 98 98 virtual unsigned int getPacketsPerPeriod(); 99 virtual unsigned int getNominalPacketsNeeded(unsigned int nframes); 99 100 100 101 protected: branches/ppalmers-streaming/src/libstreaming/amdtp/AmdtpTransmitStreamProcessor.cpp
r727 r729 346 346 347 347 unsigned int 348 AmdtpTransmitStreamProcessor::getNominalPacketsNeeded(unsigned int nframes) 349 { 350 unsigned int nominal_frames_per_second = m_manager->getNominalRate(); 351 uint64_t nominal_ticks_per_frame = TICKS_PER_SECOND / nominal_frames_per_second; 352 uint64_t nominal_ticks = nominal_ticks_per_frame * nframes; 353 uint64_t nominal_packets = nominal_ticks / TICKS_PER_CYCLE; 354 return nominal_packets; 355 } 356 357 unsigned int 348 358 AmdtpTransmitStreamProcessor::getPacketsPerPeriod() 349 359 { 350 return ( m_manager->getPeriodSize() ) /m_syt_interval;360 return getNominalPacketsNeeded(m_manager->getPeriodSize()); 351 361 } 352 362 branches/ppalmers-streaming/src/libstreaming/amdtp/AmdtpTransmitStreamProcessor.h
r722 r729 103 103 virtual unsigned int getNominalFramesPerPacket() 104 104 {return m_syt_interval;}; 105 unsigned int getPacketsPerPeriod(); 105 virtual unsigned int getPacketsPerPeriod(); 106 virtual unsigned int getNominalPacketsNeeded(unsigned int nframes); 106 107 107 108 protected: branches/ppalmers-streaming/src/libstreaming/generic/IsoStream.h
r719 r729 73 73 virtual unsigned int getPacketsPerPeriod() {return 1;}; 74 74 virtual unsigned int getMaxPacketSize() {return 1024;}; //FIXME: arbitrary 75 virtual unsigned int getNominalPacketsNeeded(unsigned int nframes) {return 1;}; //FIXME: arbitrary 75 76 76 77 virtual enum raw1394_iso_disposition branches/ppalmers-streaming/src/libstreaming/generic/StreamProcessor.cpp
r727 r729 109 109 // using here (which can also be negative). 110 110 return (int64_t)(((float)until_next) / TICKS_PER_USEC); 111 } 112 113 void 114 StreamProcessor::setSyncDelay(int d) { 115 debugOutput(DEBUG_LEVEL_VERBOSE, "Setting SP %p SyncDelay to %d ticks\n", this, d); 116 m_sync_delay = d; 111 117 } 112 118 … … 536 542 // } 537 543 // } 538 //// force some delay544 // force some delay 539 545 // usleep(125); 540 546 // return RAW1394_ISO_AGAIN; … … 694 700 } else { 695 701 bool result = true; 696 while(nbframes --) {702 while(nbframes++) { 697 703 result &= m_data_buffer->writeDummyFrame(); 698 704 } … … 931 937 { 932 938 float ticks_per_frame; 933 unsigned int ringbuffer_size_frames = m_manager->getNbBuffers() * m_manager->getPeriodSize();939 unsigned int ringbuffer_size_frames = (m_manager->getNbBuffers() + 1) * m_manager->getPeriodSize(); 934 940 935 941 debugOutput(DEBUG_LEVEL_VERBOSE, "Enter from state: %s\n", ePSToString(m_state)); branches/ppalmers-streaming/src/libstreaming/generic/StreamProcessor.h
r727 r729 341 341 * @param d sync delay 342 342 */ 343 void setSyncDelay(int d) {m_sync_delay = d;};343 void setSyncDelay(int d); 344 344 345 345 /** … … 395 395 */ 396 396 virtual unsigned int getNominalFramesPerPacket() = 0; 397 398 /** 399 * @brief get the nominal number of packets needed for a certain amount of frames 400 * @return the nominal number of packet necessary 401 */ 402 virtual unsigned int getNominalPacketsNeeded(unsigned int nframes) = 0; 397 403 398 404 protected: branches/ppalmers-streaming/src/libstreaming/StreamProcessorManager.cpp
r727 r729 40 40 // time to a later time instant also causes the xmit buffer fill to be 41 41 // lower on average. 42 #define FFADO_SIGNAL_DELAY_TICKS 3072 42 #define FFADO_SIGNAL_DELAY_TICKS 3072*4 43 43 44 44 namespace Streaming { … … 159 159 } 160 160 m_isoManager->setVerboseLevel(getDebugLevel()); 161 m_isoManager->setTransmitBufferNbPeriods(getNbBuffers() - 1); 161 162 // try to queue up 75% of the frames in the transmit buffer 163 unsigned int nb_frames = (getNbBuffers() - 1) * getPeriodSize() * 1000 / 2000; 164 m_isoManager->setTransmitBufferNbFrames(nb_frames); 162 165 163 166 if(!m_isoManager->init()) { … … 506 509 aligned &= (diff_between_streams_frames[i] == 0); 507 510 508 // position the stream511 // reposition the stream 509 512 if(!s->shiftStream(diff_between_streams_frames[i])) { 510 513 debugError("Could not shift SP %p %d frames\n", s, diff_between_streams_frames[i]); … … 800 803 // also check if xruns will occur should we transfer() now 801 804 #ifdef DEBUG 802 int waited = -1;805 int waited = 0; 803 806 #endif 804 807 bool ready_for_transfer = false; … … 818 821 xrun_occurred |= (*it)->xrunOccurred(); 819 822 } 820 usleep(125); // MAGIC: one cycle sleep... 821 #ifdef DEBUG 822 waited++; 823 #endif 823 if (!ready_for_transfer) { 824 usleep(125); // MAGIC: one cycle sleep... 825 826 // in order to avoid this in the future, we increase the sync delay of the sync source SP 827 int d = m_SyncSource->getSyncDelay() + TICKS_PER_CYCLE; 828 m_SyncSource->setSyncDelay(d); 829 830 #ifdef DEBUG 831 waited++; 832 #endif 833 } 824 834 } // we are either ready or an xrun occurred 825 835 branches/ppalmers-streaming/src/libstreaming/util/IsoHandlerManager.cpp
r723 r729 41 41 m_State(E_Created), 42 42 m_poll_timeout(100), m_poll_fds(0), m_poll_nfds(0), 43 m_realtime(false), m_priority(0), m_xmit_nb_periods( 1 ) 44 { 45 46 } 43 m_realtime(false), m_priority(0), m_xmit_nb_frames( 20 ) 44 {} 47 45 48 46 IsoHandlerManager::IsoHandlerManager(bool run_rt, unsigned int rt_prio) : 49 47 m_State(E_Created), 50 48 m_poll_timeout(100), m_poll_fds(0), m_poll_nfds(0), 51 m_realtime(run_rt), m_priority(rt_prio), m_xmit_nb_periods( 1 ) 52 { 53 54 } 55 56 IsoHandlerManager::~IsoHandlerManager() 57 { 58 59 } 49 m_realtime(run_rt), m_priority(rt_prio), m_xmit_nb_frames( 20 ) 50 {} 60 51 61 52 bool IsoHandlerManager::init() … … 471 462 // int buffers=irq_interval * 2; 472 463 473 // we should queue up as much as possible474 int buffers = packets_per_period * m_xmit_nb_periods;464 // the SPM specifies how many packets to buffer 465 int buffers = stream->getNominalPacketsNeeded(m_xmit_nb_frames); 475 466 476 467 // create the actual handler branches/ppalmers-streaming/src/libstreaming/util/IsoHandlerManager.h
r722 r729 73 73 IsoHandlerManager(); 74 74 IsoHandlerManager(bool run_rt, unsigned int rt_prio); 75 virtual ~IsoHandlerManager() ;75 virtual ~IsoHandlerManager() {}; 76 76 77 77 void setPollTimeout(int t) {m_poll_timeout=t;}; ///< set the timeout used for poll() 78 78 int getPollTimeout() {return m_poll_timeout;}; ///< get the timeout used for poll() 79 79 80 void setTransmitBufferNb Periods(unsigned int t) {m_xmit_nb_periods = t;};81 int getTransmitBufferNb Periods() {return m_xmit_nb_periods;};80 void setTransmitBufferNbFrames(unsigned int t) {m_xmit_nb_frames = t;}; 81 int getTransmitBufferNbFrames() {return m_xmit_nb_frames;}; 82 82 83 83 void setVerboseLevel(int l); ///< set the verbose level … … 153 153 Util::PosixThread *m_isoManagerThread; 154 154 155 // the preferred number of p eriods to buffer on xmit156 unsigned int m_xmit_nb_ periods;155 // the preferred number of packets to buffer on xmit 156 unsigned int m_xmit_nb_frames; 157 157 158 158 // debug stuff