Changeset 4719:a10929cd0665 in roaraudio


Ignore:
Timestamp:
01/12/11 22:06:28 (13 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

some basic latency control

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • include/libroar/vs.h

    r4708 r4719  
    266266 ROAR_VS_CMD_GET_FIRST_PRIM, 
    267267#define ROAR_VS_CMD_GET_FIRST_PRIM ROAR_VS_CMD_GET_FIRST_PRIM 
     268 
     269 // Latency control: 
     270 ROAR_VS_CMD_SET_LATC_P, 
     271#define ROAR_VS_CMD_SET_LATC_P ROAR_VS_CMD_SET_LATC_P 
     272 ROAR_VS_CMD_GET_LATC_P, 
     273#define ROAR_VS_CMD_GET_LATC_P ROAR_VS_CMD_GET_LATC_P 
     274 ROAR_VS_CMD_SET_LATC_TARGET, 
     275#define ROAR_VS_CMD_SET_LATC_TARGET ROAR_VS_CMD_SET_LATC_TARGET 
     276 ROAR_VS_CMD_GET_LATC_TARGET, 
     277#define ROAR_VS_CMD_GET_LATC_TARGET ROAR_VS_CMD_GET_LATC_TARGET 
     278 ROAR_VS_CMD_SET_LATC_WINDOW, 
     279#define ROAR_VS_CMD_SET_LATC_WINDOW ROAR_VS_CMD_SET_LATC_WINDOW 
     280 ROAR_VS_CMD_GET_LATC_WINDOW, 
     281#define ROAR_VS_CMD_GET_LATC_WINDOW ROAR_VS_CMD_GET_LATC_WINDOW 
     282 ROAR_VS_CMD_SET_LATC_MINLAG, 
     283#define ROAR_VS_CMD_SET_LATC_MINLAG ROAR_VS_CMD_SET_LATC_MINLAG 
     284 ROAR_VS_CMD_GET_LATC_MINLAG, 
     285#define ROAR_VS_CMD_GET_LATC_MINLAG ROAR_VS_CMD_GET_LATC_MINLAG 
    268286}; 
    269287 
  • libroar/vs.c

    r4717 r4719  
    3636#include "libroar.h" 
    3737 
     38#if defined(ROAR_HAVE_GETSOCKOPT) && defined(ROAR_HAVE_SETSOCKOPT) 
     39#define _HAVE_SOCKOPT 
     40#endif 
     41 
    3842#define FLAG_NONE      0x0000 
    3943#define FLAG_STREAM    0x0001 
     
    6468 struct roar_vio_calls  * file; 
    6569 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 
    6678}; 
    6779 
     
    111123 vss->first_primid = -1; 
    112124 
     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 
    113132 return vss; 
    114133} 
     
    662681} 
    663682 
     683#ifdef _HAVE_SOCKOPT 
     684static 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 
    664710roar_mus_t roar_vs_latency(roar_vs_t * vss, int backend, int * error) { 
    665711 ssize_t pos  = roar_vs_position(vss, backend, error); 
     
    717763  _seterr(ROAR_ERROR_NONE); 
    718764 } 
     765 
     766#ifdef _HAVE_SOCKOPT 
     767 if (vss->latc.target > vss->latc.minlag) { 
     768  roar_vs_latency_managed(vss, lag); 
     769 } 
     770#endif 
    719771 
    720772 return lag; 
     
    13041356    *(int*)argp = vss->first_primid; 
    13051357   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 
    13061390 } 
    13071391 
Note: See TracChangeset for help on using the changeset viewer.