- Timestamp:
- 10/23/08 10:02:34 (12 years ago)
- Files:
-
- branches/libffado-2.0/config.h.in (modified) (1 diff)
- branches/libffado-2.0/src/libieee1394/ieee1394service.cpp (modified) (2 diffs)
- branches/libffado-2.0/src/libieee1394/IsoHandler.cpp (modified) (4 diffs)
- branches/libffado-2.0/src/libieee1394/IsoHandler.h (modified) (2 diffs)
- branches/libffado-2.0/src/libieee1394/IsoHandlerManager.cpp (modified) (5 diffs)
- branches/libffado-2.0/src/libieee1394/IsoHandlerManager.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/libffado-2.0/config.h.in
r1371 r1372 133 133 // due to weirdness in the kernel layer 134 134 #define MAX_XMIT_PACKET_SIZE (2048-16) 135 #define MAX_XMIT_NB_BUFFERS 200 135 #define MAX_XMIT_NB_BUFFERS 128 136 #define MAX_RECV_NB_BUFFERS 128 136 137 137 138 // should be PAGE_SIZE (4096) for unpatched kernels branches/libffado-2.0/src/libieee1394/ieee1394service.cpp
r1371 r1372 292 292 } 293 293 } 294 295 // check state294 295 // init helpers 296 296 if(!m_pCTRHelper) { 297 297 debugFatal("No CycleTimerHelper available, bad!\n"); … … 309 309 } 310 310 m_pIsoManager->setVerboseLevel(getDebugLevel()); 311 312 m_pIsoManager->setReceiveMode(RAW1394_DMA_PACKET_PER_BUFFER); 313 311 314 if(!m_pIsoManager->init()) { 312 315 debugFatal("Could not initialize IsoHandlerManager\n"); branches/libffado-2.0/src/libieee1394/IsoHandler.cpp
r1345 r1372 81 81 , m_last_now( 0xFFFFFFFF ) 82 82 , m_last_packet_handled_at( 0xFFFFFFFF ) 83 , m_receive_mode ( RAW1394_DMA_PACKET_PER_BUFFER ) 83 84 , m_Client( 0 ) 84 85 , m_speed( RAW1394_ISO_SPEED_400 ) … … 106 107 , m_last_now( 0xFFFFFFFF ) 107 108 , m_last_packet_handled_at( 0xFFFFFFFF ) 109 , m_receive_mode ( RAW1394_DMA_PACKET_PER_BUFFER ) 108 110 , m_Client( 0 ) 109 111 , m_speed( RAW1394_ISO_SPEED_400 ) … … 131 133 , m_last_now( 0xFFFFFFFF ) 132 134 , m_last_packet_handled_at( 0xFFFFFFFF ) 135 , m_receive_mode ( RAW1394_DMA_PACKET_PER_BUFFER ) 133 136 , m_Client( 0 ) 134 137 , m_speed( speed ) … … 675 678 m_max_packet_size, 676 679 m_Client->getChannel(), 677 RAW1394_DMA_PACKET_PER_BUFFER,680 m_receive_mode, 678 681 m_irq_interval)) { 679 debugFatal("Could not do receive initialisation (DMA_BUFFERFILL)!\n" );682 debugFatal("Could not do receive initialisation!\n" ); 680 683 debugFatal(" %s\n",strerror(errno)); 681 684 return false; branches/libffado-2.0/src/libieee1394/IsoHandler.h
r1343 r1372 168 168 uint32_t getLastPacketTime() {return m_last_packet_handled_at;}; 169 169 170 /** 171 * @brief set iso receive mode. doesn't have any effect if the stream is running 172 * @param m receive mode 173 */ 174 void setReceiveMode(enum raw1394_iso_dma_recv_mode m) 175 {m_receive_mode = m;} 176 170 177 void notifyOfDeath(); 171 178 bool handleBusReset(); … … 181 188 uint32_t m_last_now; 182 189 uint32_t m_last_packet_handled_at; 190 enum raw1394_iso_dma_recv_mode m_receive_mode; 183 191 184 192 Streaming::StreamProcessor *m_Client; // FIXME: implement with functors branches/libffado-2.0/src/libieee1394/IsoHandlerManager.cpp
r1345 r1372 459 459 , m_IsoThreadReceive ( NULL ) 460 460 , m_IsoTaskReceive ( NULL ) 461 , m_receive_mode( RAW1394_DMA_PACKET_PER_BUFFER ) 461 462 { 462 463 } … … 470 471 , m_IsoThreadReceive ( NULL ) 471 472 , m_IsoTaskReceive ( NULL ) 473 , m_receive_mode( RAW1394_DMA_PACKET_PER_BUFFER ) 472 474 { 473 475 } … … 777 779 // the receive buffer size doesn't matter for the latency, 778 780 // but it has a minimal value in order for libraw to operate correctly (300) 779 int buffers=400; 781 int buffers=1; 782 while(buffers < (int)packets_per_period && buffers < MAX_RECV_NB_BUFFERS) { 783 buffers *= 2; 784 } 785 786 // ensure at least 2 hardware interrupts per ISO buffer wraparound 787 if(irq_interval > buffers/2) { 788 irq_interval = buffers/2; 789 } 780 790 781 791 // create the actual handler 792 debugOutput( DEBUG_LEVEL_VERBOSE, " creating IsoRecvHandler\n"); 782 793 h = new IsoHandler(*this, IsoHandler::eHT_Receive, 783 794 buffers, max_packet_size, irq_interval); 784 785 debugOutput( DEBUG_LEVEL_VERBOSE, " creating IsoRecvHandler\n");786 795 787 796 if(!h) { … … 790 799 } 791 800 801 h->setReceiveMode(m_receive_mode); 802 792 803 } else if (stream->getType()==StreamProcessor::ePT_Transmit) { 793 804 // setup the optimal parameters for the raw1394 ISO buffering 794 // unsigned int packets_per_period = stream->getPacketsPerPeriod();795 805 unsigned int max_packet_size = stream->getMaxPacketSize(); 796 // unsigned int page_size = getpagesize(); 797 798 // Ensure we don't request a packet size bigger than the 799 // kernel-enforced maximum which is currently 1 page. 800 // if (max_packet_size > page_size) { 801 // debugError("max packet size (%u) > page size (%u)\n", max_packet_size, page_size); 802 // return false; 803 // } 806 804 807 if (max_packet_size > MAX_XMIT_PACKET_SIZE) { 805 808 debugError("max packet size (%u) > MAX_XMIT_PACKET_SIZE (%u)\n", … … 809 812 810 813 // the SP specifies how many packets to ISO-buffer 811 int buffers = stream->getNbPacketsIsoXmitBuffer(); 812 if (buffers > MAX_XMIT_NB_BUFFERS) { 813 debugOutput(DEBUG_LEVEL_VERBOSE, 814 "nb buffers (%u) > MAX_XMIT_NB_BUFFERS (%u)\n", 815 buffers, MAX_XMIT_NB_BUFFERS); 816 buffers = MAX_XMIT_NB_BUFFERS; 817 } 818 unsigned int irq_interval = buffers / MINIMUM_INTERRUPTS_PER_PERIOD; 819 if(irq_interval <= 0) irq_interval=1; 814 int req_buffers = stream->getNbPacketsIsoXmitBuffer(); 815 int buffers=1; 816 while(buffers < (int)req_buffers && buffers < MAX_RECV_NB_BUFFERS) { 817 buffers *= 2; 818 } 819 820 int irq_interval = req_buffers / MINIMUM_INTERRUPTS_PER_PERIOD; 821 if(irq_interval <= 0) irq_interval = 1; 822 // ensure at least 2 hardware interrupts per ISO buffer wraparound 823 if(irq_interval > buffers/2) irq_interval = buffers/2; 820 824 821 825 debugOutput( DEBUG_LEVEL_VERBOSE, " creating IsoXmitHandler\n"); branches/libffado-2.0/src/libieee1394/IsoHandlerManager.h
r1292 r1372 197 197 */ 198 198 bool handleBusReset(); 199 200 /** 201 * @brief set iso receive mode. doesn't have any effect if the stream is running 202 * @param m receive mode 203 */ 204 void setReceiveMode(enum raw1394_iso_dma_recv_mode m) 205 {m_receive_mode = m;} 206 199 207 // the state machine 200 208 private: … … 236 244 Util::Thread * m_IsoThreadReceive; 237 245 IsoTask * m_IsoTaskReceive; 246 enum raw1394_iso_dma_recv_mode m_receive_mode; 238 247 239 248 // debug stuff