Changeset 1938

Show
Ignore:
Timestamp:
12/07/10 08:17:21 (13 years ago)
Author:
adi
Message:

Refactor stopStreamByIndex.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libffado/src/dice/dice_avdevice.cpp

    r1937 r1938  
    13001300Device::stopStreamByIndex(int i) { 
    13011301    bool snoopMode = false; 
     1302    fb_nodeaddr_t base_address;   // holds DICE_REGISTER_TX_ISOC_BASE or DICE_REGISTER_RX_ISOC_BASE 
     1303    int n;                       // number of streaming processor 
     1304 
     1305    Streaming::StreamProcessor *p; 
     1306 
    13021307    if(!getOption("snoopMode", snoopMode)) { 
    13031308        debugWarning("Could not retrieve snoopMode parameter, defauling to false\n"); 
     
    13101315 
    13111316    if (i<(int)m_receiveProcessors.size()) { 
    1312         int n=i; 
    1313         Streaming::StreamProcessor *p=m_receiveProcessors.at(n); 
    1314         if(snoopMode) { // a stream from the device to another host 
    1315             // nothing to do 
    1316         } else { 
    1317             unsigned int isochannel = p->getChannel(); 
    1318      
    1319             fb_quadlet_t reg_isoch; 
    1320             // check value of ISO_CHANNEL register 
    1321             if(!readTxReg(n, DICE_REGISTER_TX_ISOC_BASE, &reg_isoch)) { 
    1322                 debugError("Could not read ISO_CHANNEL register for ATX %d\n", n); 
    1323                 return false; 
    1324             } 
    1325             if(reg_isoch != isochannel) { 
    1326                 debugError("ISO_CHANNEL register != 0x%08"PRIX32" (=0x%08"PRIX32") for ATX %d\n", isochannel, reg_isoch, n); 
    1327                 return false; 
    1328             } 
    1329      
    1330             // write value of ISO_CHANNEL register 
    1331             reg_isoch=0xFFFFFFFFUL; 
    1332             if(!writeTxReg(n, DICE_REGISTER_TX_ISOC_BASE, reg_isoch)) { 
    1333                 debugError("Could not write ISO_CHANNEL register for ATX %d\n", n); 
    1334                 return false; 
    1335             } 
    1336      
    1337             // deallocate ISO channel 
    1338             if(!deallocateIsoChannel(isochannel)) { 
    1339                 debugError("Could not deallocate iso channel for SP %d (ATX %d)\n",i,n); 
    1340                 return false; 
    1341             } 
    1342         } 
    1343         p->setChannel(-1); 
    1344         return true; 
    1345  
     1317        n=i; 
     1318        p = m_receiveProcessors.at(n); 
     1319        base_address = DICE_REGISTER_TX_ISOC_BASE; 
     1320        setRXTXfuncs (Streaming::Port::E_Capture); 
    13461321    } else if (i<(int)m_receiveProcessors.size() + (int)m_transmitProcessors.size()) { 
    1347         int n=i-m_receiveProcessors.size(); 
    1348         Streaming::StreamProcessor *p=m_transmitProcessors.at(n); 
    1349  
    1350         if(snoopMode) { // a stream from the device to another host 
    1351             // nothing to do 
    1352         } else { 
    1353             unsigned int isochannel = p->getChannel(); 
    1354      
    1355             fb_quadlet_t reg_isoch; 
    1356             // check value of ISO_CHANNEL register 
    1357             if(!readRxReg(n, DICE_REGISTER_RX_ISOC_BASE, &reg_isoch)) { 
    1358                 debugError("Could not read ISO_CHANNEL register for ARX %d\n", n); 
    1359                 return false; 
    1360             } 
    1361             if(reg_isoch != isochannel) { 
    1362                 debugError("ISO_CHANNEL register != 0x%08"PRIX32" (=0x%08"PRIX32") for ARX %d\n", isochannel, reg_isoch, n); 
    1363                 return false; 
    1364             } 
    1365      
    1366             // write value of ISO_CHANNEL register 
    1367             reg_isoch=0xFFFFFFFFUL; 
    1368             if(!writeRxReg(n, DICE_REGISTER_RX_ISOC_BASE, reg_isoch)) { 
    1369                 debugError("Could not write ISO_CHANNEL register for ARX %d\n", n); 
    1370                 return false; 
    1371             } 
    1372      
    1373             // deallocate ISO channel 
    1374             if(!deallocateIsoChannel(isochannel)) { 
    1375                 debugError("Could not deallocate iso channel for SP %d (ARX %d)\n",i,n); 
    1376                 return false; 
    1377             } 
    1378         } 
    1379  
    1380         p->setChannel(-1); 
    1381         return true; 
    1382     } 
    1383  
    1384     debugError("SP index %d out of range!\n",i); 
    1385  
    1386     return false; 
     1322        n=i-m_receiveProcessors.size(); 
     1323        p=m_transmitProcessors.at(n); 
     1324        base_address = DICE_REGISTER_RX_ISOC_BASE; 
     1325        setRXTXfuncs (Streaming::Port::E_Playback); 
     1326    } else { 
     1327        debugError("SP index %d out of range!\n",i); 
     1328        return false; 
     1329    } 
     1330 
     1331    if(!snoopMode) { 
     1332        unsigned int isochannel = p->getChannel(); 
     1333     
     1334        fb_quadlet_t reg_isoch; 
     1335        // check value of ISO_CHANNEL register 
     1336        if(!(*this.*readFunc)(n, base_address, &reg_isoch)) { 
     1337            debugError("Could not read ISO_CHANNEL register for A%s %d\n", dir, n); 
     1338            return false; 
     1339        } 
     1340        if(reg_isoch != isochannel) { 
     1341            debugError("ISO_CHANNEL register != 0x%08"PRIX32" (=0x%08"PRIX32") for A%s %d\n", isochannel, reg_isoch, dir, n); 
     1342            return false; 
     1343        } 
     1344 
     1345        // write value of ISO_CHANNEL register 
     1346        reg_isoch=0xFFFFFFFFUL; 
     1347        if(!writeTxReg(n, base_address, reg_isoch)) { 
     1348            debugError("Could not write ISO_CHANNEL register for A%s %d\n", dir, n); 
     1349            return false; 
     1350        } 
     1351 
     1352        // deallocate ISO channel 
     1353        if(!deallocateIsoChannel(isochannel)) { 
     1354            debugError("Could not deallocate iso channel for SP %d (A%s %d)\n",i, dir, n); 
     1355            return false; 
     1356        } 
     1357    } 
     1358    p->setChannel(-1); 
     1359    return true; 
    13871360} 
    13881361