Changeset 4719:a10929cd0665 in roaraudio for libroar/vs.c
- Timestamp:
- 01/12/11 22:06:28 (13 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroar/vs.c
r4717 r4719 36 36 #include "libroar.h" 37 37 38 #if defined(ROAR_HAVE_GETSOCKOPT) && defined(ROAR_HAVE_SETSOCKOPT) 39 #define _HAVE_SOCKOPT 40 #endif 41 38 42 #define FLAG_NONE 0x0000 39 43 #define FLAG_STREAM 0x0001 … … 64 68 struct roar_vio_calls * file; 65 69 struct roar_buffer * readring, * writering; 70 #ifdef _HAVE_SOCKOPT 71 struct { 72 float target; 73 float window; 74 float minlag; 75 float p; 76 } latc; 77 #endif 66 78 }; 67 79 … … 111 123 vss->first_primid = -1; 112 124 125 #ifdef _HAVE_SOCKOPT 126 vss->latc.target = -2.; // must be less than latc.minlag! 127 vss->latc.window = -1.; 128 vss->latc.minlag = -1.; 129 vss->latc.p = 0.005; 130 #endif 131 113 132 return vss; 114 133 } … … 662 681 } 663 682 683 #ifdef _HAVE_SOCKOPT 684 static void roar_vs_latency_managed(roar_vs_t * vss, roar_mus_t lat) { 685 struct roar_vio_sysio_sockopt sockopt; 686 float tmp = ((float)lat/1000.0) - vss->latc.target; 687 int val; 688 689 tmp *= vss->latc.p; 690 691 sockopt.level = SOL_SOCKET; 692 sockopt.optname = SO_SNDBUF; 693 sockopt.optval = &val; 694 sockopt.optlen = sizeof(val); 695 696 roar_vio_ctl(&(vss->vio), ROAR_VIO_CTL_GET_SYSIO_SOCKOPT, &sockopt); 697 698 val /= 2; 699 700 tmp = 1.0 - tmp; 701 702 val = (float)val*tmp; 703 704 sockopt.optlen = sizeof(val); 705 706 roar_vio_ctl(&(vss->vio), ROAR_VIO_CTL_SET_SYSIO_SOCKOPT, &sockopt); 707 } 708 #endif 709 664 710 roar_mus_t roar_vs_latency(roar_vs_t * vss, int backend, int * error) { 665 711 ssize_t pos = roar_vs_position(vss, backend, error); … … 717 763 _seterr(ROAR_ERROR_NONE); 718 764 } 765 766 #ifdef _HAVE_SOCKOPT 767 if (vss->latc.target > vss->latc.minlag) { 768 roar_vs_latency_managed(vss, lag); 769 } 770 #endif 719 771 720 772 return lag; … … 1304 1356 *(int*)argp = vss->first_primid; 1305 1357 break; 1358 #ifdef _HAVE_SOCKOPT 1359 case ROAR_VS_CMD_SET_LATC_P: 1360 vss->latc.p = *(float*)argp; 1361 break; 1362 case ROAR_VS_CMD_GET_LATC_P: 1363 *(float*)argp = vss->latc.p; 1364 break; 1365 case ROAR_VS_CMD_SET_LATC_TARGET: 1366 vss->latc.target = *(float*)argp; 1367 break; 1368 case ROAR_VS_CMD_GET_LATC_TARGET: 1369 *(float*)argp = vss->latc.target; 1370 break; 1371 case ROAR_VS_CMD_SET_LATC_WINDOW: 1372 vss->latc.window = *(float*)argp; 1373 break; 1374 case ROAR_VS_CMD_GET_LATC_WINDOW: 1375 *(float*)argp = vss->latc.window; 1376 break; 1377 case ROAR_VS_CMD_SET_LATC_MINLAG: 1378 vss->latc.minlag = *(float*)argp; 1379 break; 1380 case ROAR_VS_CMD_GET_LATC_MINLAG: 1381 *(float*)argp = vss->latc.minlag; 1382 break; 1383 #endif 1384 // use ifndef here so warnings of unhandled enum values will be shown in DEBUG mode. 1385 #ifndef DEBUG 1386 default: 1387 return -1; 1388 break; 1389 #endif 1306 1390 } 1307 1391
Note: See TracChangeset
for help on using the changeset viewer.