Changeset 1831
- Timestamp:
- 05/11/10 06:38:27 (14 years ago)
- Files:
-
- trunk/libffado/src/motu/motu_avdevice.cpp (modified) (13 diffs)
- trunk/libffado/src/motu/motu_avdevice.h (modified) (2 diffs)
- trunk/libffado/src/motu/motu_controls.cpp (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/libffado/src/motu/motu_avdevice.cpp
r1828 r1831 657 657 // port if the sample rate is set to a 1x or 2x rate later. 658 658 if (cancel_adat) { 659 setOpticalMode( 0, MOTU_CTRL_DIR_INOUT, MOTU_OPTICAL_MODE_OFF);659 setOpticalMode(MOTU_CTRL_DIR_INOUT, MOTU_OPTICAL_MODE_OFF, MOTU_OPTICAL_MODE_OFF); 660 660 } 661 661 … … 713 713 src_name = "ADAT Optical "; 714 714 break; 715 case MOTU_CLKSRC_SPDIF_TOSLINK: 716 if (getOpticalMode(0, MOTU_DIR_IN) == MOTU_OPTICAL_MODE_TOSLINK) 715 case MOTU_CLKSRC_SPDIF_TOSLINK: { 716 unsigned int p0_mode; 717 getOpticalMode(MOTU_DIR_IN, &p0_mode, NULL); 718 if (p0_mode == MOTU_OPTICAL_MODE_TOSLINK) 717 719 src_name = "TOSLink "; 718 720 else 719 721 src_name = "SPDIF "; 720 722 break; 723 } 721 724 case MOTU_CLKSRC_SMPTE: 722 725 src_name = "SMPTE "; … … 895 898 896 899 int samp_freq = getSamplingFrequency(); 897 unsigned int optical_in_mode = getOpticalMode(0, MOTU_DIR_IN); 898 unsigned int optical_out_mode = getOpticalMode(0, MOTU_DIR_OUT); 900 unsigned int optical_in_mode, optical_out_mode; 899 901 unsigned int event_size_in = getEventSize(MOTU_DIR_IN); 900 902 unsigned int event_size_out= getEventSize(MOTU_DIR_OUT); 901 903 902 904 debugOutput(DEBUG_LEVEL_NORMAL, "Preparing MotuDevice...\n" ); 905 906 getOpticalMode(MOTU_DIR_IN, &optical_in_mode, NULL); 907 getOpticalMode(MOTU_DIR_OUT, &optical_out_mode, NULL); 903 908 904 909 // Explicitly set the optical mode, primarily to ensure that the … … 907 912 // up without this set to anything sensible. In this case, writes to 908 913 // MOTU_REG_ISOCTRL fail more often than not, which is bad. 909 setOpticalMode( 0, MOTU_DIR_IN, optical_in_mode);910 setOpticalMode( 0, MOTU_DIR_OUT, optical_out_mode);914 setOpticalMode(MOTU_DIR_IN, optical_in_mode, MOTU_OPTICAL_MODE_KEEP); 915 setOpticalMode(MOTU_DIR_OUT, optical_out_mode, MOTU_OPTICAL_MODE_KEEP); 911 916 912 917 // Allocate bandwidth if not previously done. … … 1230 1235 } 1231 1236 1232 unsigned int MotuDevice::getOpticalMode(unsigned int port, unsigned int dir) { 1233 // Only the "Mark 3" (aka G3) MOTU devices had more than one optical port. 1234 // Therefore the "port" parameter is ignored for all devices other than 1235 // the Mark 3 devices. 1237 unsigned int MotuDevice::getOpticalMode(unsigned int dir, 1238 unsigned int *port_a_mode, unsigned int *port_b_mode) { 1239 // Only the "Mark 3" (aka G3) MOTU devices had more than one optical 1240 // port. Therefore the "port_b_mode" parameter is unused by all 1241 // devices other than the Mark 3 devices. 1242 // 1243 // If a mode parameter pointer is NULL it will not be returned. 1236 1244 unsigned int reg; 1237 1245 unsigned int mask, shift; 1246 1247 if (port_b_mode != NULL) 1248 *port_b_mode = MOTU_OPTICAL_MODE_OFF; 1249 if (getDeviceGeneration()!=MOTU_DEVICE_G3 && port_a_mode==NULL) 1250 return 0; 1238 1251 1239 1252 if (m_motu_model == MOTU_MODEL_828MkI) { … … 1243 1256 shift = (dir==MOTU_DIR_IN)?MOTU_G1_OPT_IN_MODE_BIT0:MOTU_G1_OPT_OUT_MODE_BIT0; 1244 1257 switch ((reg & mask) >> shift) { 1245 case MOTU_G1_OPTICAL_OFF: return MOTU_OPTICAL_MODE_OFF;1246 case MOTU_G1_OPTICAL_TOSLINK: return MOTU_OPTICAL_MODE_TOSLINK;1258 case MOTU_G1_OPTICAL_OFF: *port_a_mode = MOTU_OPTICAL_MODE_OFF; break; 1259 case MOTU_G1_OPTICAL_TOSLINK: *port_a_mode = MOTU_OPTICAL_MODE_TOSLINK; break; 1247 1260 // MOTU_G1_OPTICAL_OFF and MOTU_G1_OPTICAL_ADAT seem to be 1248 1261 // identical, so currently we don't know how to differentiate … … 1261 1274 mask = (dir==MOTU_DIR_IN)?MOTU_G2_OPTICAL_IN_MODE_MASK:MOTU_G2_OPTICAL_OUT_MODE_MASK; 1262 1275 shift = (dir==MOTU_DIR_IN)?MOTU_G2_OPTICAL_IN_MODE_BIT0:MOTU_G2_OPTICAL_OUT_MODE_BIT0; 1263 1264 1276 switch ((reg & mask) >> shift) { 1265 case MOTU_G2_OPTICAL_MODE_OFF: return MOTU_OPTICAL_MODE_OFF; 1266 case MOTU_G2_OPTICAL_MODE_ADAT: return MOTU_OPTICAL_MODE_ADAT; 1267 case MOTU_G2_OPTICAL_MODE_TOSLINK: return MOTU_OPTICAL_MODE_TOSLINK; 1268 } 1269 1277 case MOTU_G2_OPTICAL_MODE_OFF: *port_a_mode = MOTU_OPTICAL_MODE_OFF; break; 1278 case MOTU_G2_OPTICAL_MODE_ADAT: *port_a_mode = MOTU_OPTICAL_MODE_ADAT; break; 1279 case MOTU_G2_OPTICAL_MODE_TOSLINK: *port_a_mode = MOTU_OPTICAL_MODE_TOSLINK; break; 1280 } 1270 1281 return 0; 1271 1282 } 1272 1283 1273 signed int MotuDevice::setOpticalMode(unsigned int port, unsigned intdir,1274 unsigned int mode) {1284 signed int MotuDevice::setOpticalMode(unsigned int dir, 1285 unsigned int port_a_mode, unsigned int port_b_mode) { 1275 1286 // Only the "Mark 3" (aka G3) MOTU devices had more than one optical port. 1276 // Therefore the "port " parameteris ignored for all devices other than1287 // Therefore the "port B" mode is ignored for all devices other than 1277 1288 // the Mark 3 devices. 1278 1289 unsigned int reg, g2mode; … … 1282 1293 * set it 1283 1294 */ 1284 if (m_motu_model==MOTU_MODEL_896HD && mode==MOTU_OPTICAL_MODE_TOSLINK)1295 if (m_motu_model==MOTU_MODEL_896HD && port_a_mode==MOTU_OPTICAL_MODE_TOSLINK) 1285 1296 return -1; 1297 1298 if (getDeviceGeneration()!=MOTU_DEVICE_G3 && port_a_mode==MOTU_OPTICAL_MODE_KEEP) 1299 return 0; 1286 1300 1287 1301 if (m_motu_model == MOTU_MODEL_828MkI) { … … 1291 1305 mask = (dir==MOTU_DIR_IN)?MOTU_G1_OPT_IN_MODE_MASK:MOTU_G1_OPT_OUT_MODE_MASK; 1292 1306 shift = (dir==MOTU_DIR_IN)?MOTU_G1_OPT_IN_MODE_BIT0:MOTU_G1_OPT_OUT_MODE_BIT0; 1293 switch ( mode) {1307 switch (port_a_mode) { 1294 1308 case MOTU_OPTICAL_MODE_OFF: g1mode = MOTU_G1_OPTICAL_OFF; break; 1295 1309 case MOTU_OPTICAL_MODE_ADAT: g1mode = MOTU_G1_OPTICAL_ADAT; break; … … 1310 1324 // Map from user mode to values sent to the device registers. 1311 1325 g2mode = 0; 1312 switch ( mode) {1326 switch (port_a_mode) { 1313 1327 case MOTU_OPTICAL_MODE_OFF: g2mode = MOTU_G2_OPTICAL_MODE_OFF; break; 1314 1328 case MOTU_OPTICAL_MODE_ADAT: g2mode = MOTU_G2_OPTICAL_MODE_ADAT; break; … … 1335 1349 if (dir & MOTU_DIR_OUT) { 1336 1350 reg &= ~MOTU_G2_OPTICAL_OUT_MODE_MASK; 1337 reg |= ( mode << MOTU_G2_OPTICAL_OUT_MODE_BIT0) & MOTU_G2_OPTICAL_OUT_MODE_MASK;1351 reg |= (g2mode << MOTU_G2_OPTICAL_OUT_MODE_BIT0) & MOTU_G2_OPTICAL_OUT_MODE_MASK; 1338 1352 if (g2mode != MOTU_G2_OPTICAL_MODE_ADAT) 1339 1353 opt_ctrl |= 0x00000040; … … 1370 1384 // Note that all audio channels are sent using 3 bytes. 1371 1385 signed int sample_rate = getSamplingFrequency(); 1372 signed int optical_mode = getOpticalMode(0, direction);1386 unsigned int optical_mode; 1373 1387 signed int size = 4+6; 1374 1388 … … 1376 1390 unsigned int dir = direction==Streaming::Port::E_Capture?MOTU_PA_IN:MOTU_PA_OUT; 1377 1391 unsigned int flags = (1 << ( optical_mode + 4 )); 1392 1393 getOpticalMode(direction, &optical_mode, NULL); 1378 1394 1379 1395 if ( sample_rate > 96000 ) trunk/libffado/src/motu/motu_avdevice.h
r1828 r1831 208 208 #define MOTU_OPTICAL_MODE_ADAT 0x0001 209 209 #define MOTU_OPTICAL_MODE_TOSLINK 0x0002 210 #define MOTU_OPTICAL_PORT_A 0x0001 211 #define MOTU_OPTICAL_PORT_B 0x0002 212 #define MOTU_OPTICAL_PORT_ALL (MOTU_OPTICAL_PORT_A|MOTU_OPTICAL_PORT_B) 213 210 #define MOTU_OPTICAL_MODE_KEEP 0xffff 214 211 /* Device generation identifiers */ 215 212 #define MOTU_DEVICE_G1 0x0001 … … 342 339 signed int getIsoRecvChannel(void); 343 340 signed int getIsoSendChannel(void); 344 unsigned int getOpticalMode(unsigned int port, unsigned int dir); 345 signed int setOpticalMode(unsigned int port, unsigned int dir, unsigned int mode); 341 unsigned int getOpticalMode(unsigned int dir, unsigned int *port_a_mode, 342 unsigned int *port_b_mode); 343 signed int setOpticalMode(unsigned int dir, 344 unsigned int port_a_mode, unsigned int port_b_mode); 346 345 347 346 signed int getEventSize(unsigned int dir); trunk/libffado/src/motu/motu_controls.cpp
r1828 r1831 696 696 } 697 697 dir = (m_register==MOTU_CTRL_DIR_IN)?MOTU_DIR_IN:MOTU_DIR_OUT; 698 m_parent.setOpticalMode( 0, dir, val);698 m_parent.setOpticalMode(dir, val, MOTU_OPTICAL_MODE_KEEP); 699 699 return true; 700 700 } … … 703 703 OpticalMode::getValue() 704 704 { 705 unsigned int dir ;705 unsigned int dir, omode_a; 706 706 debugOutput(DEBUG_LEVEL_VERBOSE, "getValue for optical mode %d\n", m_register); 707 707 … … 709 709 // receive stream processor once we work out an efficient way to do this. 710 710 dir = (m_register==MOTU_CTRL_DIR_IN)?MOTU_DIR_IN:MOTU_DIR_OUT; 711 switch (m_parent.getOpticalMode(0, dir)) { 711 m_parent.getOpticalMode(dir, &omode_a, NULL); 712 switch (omode_a) { 712 713 case MOTU_OPTICAL_MODE_OFF: return 0; 713 714 case MOTU_OPTICAL_MODE_ADAT: return 1;