Changeset 4175:c8a616dfbb8a in roaraudio for libroar/vs.c


Ignore:
Timestamp:
08/14/10 06:25:27 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

some very basic stream operations

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroar/vs.c

    r4174 r4175  
    3838#define FLAG_NONE     0x0000 
    3939#define FLAG_STREAM   0x0001 
     40#define FLAG_NONBLOCK 0x0002 
    4041 
    4142#define _seterr(x) do { if ( error != NULL ) *error = (x); } while(1) 
     
    222223} 
    223224 
     225int     roar_vs_sync (roar_vs_t * vss, int wait, int * error) { 
     226 if ( !(vss->flags & FLAG_STREAM) ) { 
     227  _seterr(ROAR_ERROR_INVAL); 
     228  return -1; 
     229 } 
     230 
     231 if ( wait != ROAR_VS_NOWAIT ) { 
     232  _seterr(ROAR_ERROR_INVAL); 
     233  return -1; 
     234 } 
     235 
     236 roar_vio_sync(&(vss->vio)); 
     237 
     238 return 0; 
     239} 
     240 
     241int     roar_vs_blocking (roar_vs_t * vss, int val, int * error) { 
     242 int old = -1; 
     243 
     244  if ( !(vss->flags & FLAG_STREAM) ) { 
     245  _seterr(ROAR_ERROR_INVAL); 
     246  return -1; 
     247 } 
     248 
     249 old = vss->flags & FLAG_NONBLOCK ? ROAR_VS_FALSE : ROAR_VS_TRUE; 
     250 
     251 switch (val) { 
     252  case ROAR_VS_TRUE: 
     253    if ( roar_vio_nonblock(&(vss->vio), ROAR_SOCKET_BLOCK) == -1 ) { 
     254     _seterr(ROAR_ERROR_UNKNOWN); 
     255     return -1; 
     256    } 
     257    vss->flags |= FLAG_NONBLOCK; 
     258    vss->flags -= FLAG_NONBLOCK; 
     259    return old; 
     260   break; 
     261  case ROAR_VS_FALSE: 
     262    if ( roar_vio_nonblock(&(vss->vio), ROAR_SOCKET_NONBLOCK) == -1 ) { 
     263     _seterr(ROAR_ERROR_UNKNOWN); 
     264     return -1; 
     265    } 
     266    vss->flags |= FLAG_NONBLOCK; 
     267    return old; 
     268   break; 
     269  case ROAR_VS_TOGGLE: 
     270    if ( old == ROAR_VS_TRUE ) { 
     271     return roar_vs_blocking(vss, ROAR_VS_FALSE, error); 
     272    } else { 
     273     return roar_vs_blocking(vss, ROAR_VS_TRUE, error); 
     274    } 
     275   break; 
     276  case ROAR_VS_ASK: 
     277    return old; 
     278   break; 
     279 } 
     280 
     281 _seterr(ROAR_ERROR_INVAL); 
     282 return -1; 
     283} 
     284 
     285// .................... 
     286ssize_t roar_vs_latency(roar_vs_t * vss, int backend, int * error) { 
     287 _seterr(ROAR_ERROR_NOTSUP); 
     288 return -1; 
     289} 
     290 
     291static int roar_vs_flag(roar_vs_t * vss, int flag, int val, int * error) { 
     292 struct roar_stream_info info; 
     293 int old = -1; 
     294 
     295 if ( !(vss->flags & FLAG_STREAM) ) { 
     296  _seterr(ROAR_ERROR_INVAL); 
     297  return -1; 
     298 } 
     299 
     300 if ( val != ROAR_VS_ASK ) 
     301  old = roar_vs_flag(vss, flag, ROAR_VS_ASK, error); 
     302 
     303 switch (val) { 
     304  case ROAR_VS_TRUE: 
     305  case ROAR_VS_FALSE: 
     306    if ( roar_stream_set_flags(vss->con, &(vss->stream), flag, 
     307                               val == ROAR_VS_TRUE ? ROAR_SET_FLAG : ROAR_RESET_FLAG) == -1 ) { 
     308     _seterr(ROAR_ERROR_UNKNOWN); 
     309     return -1; 
     310    } 
     311    return old; 
     312   break; 
     313  case ROAR_VS_TOGGLE: 
     314    return roar_vs_flag(vss, flag, old == ROAR_VS_TRUE ? ROAR_VS_FALSE : ROAR_VS_TRUE, error); 
     315   break; 
     316  case ROAR_VS_ASK: 
     317    if ( roar_stream_get_info(vss->con, &(vss->stream), &info) == -1 ) { 
     318     _seterr(ROAR_ERROR_UNKNOWN); 
     319     return -1; 
     320    } 
     321    return info.flags & flag ? ROAR_VS_TRUE : ROAR_VS_FALSE; 
     322   break; 
     323 } 
     324 
     325 _seterr(ROAR_ERROR_NOTSUP); 
     326 return -1; 
     327} 
     328 
     329int     roar_vs_pause(roar_vs_t * vss, int val, int * error) { 
     330 return roar_vs_flag(vss, ROAR_FLAG_PAUSE, val, error); 
     331} 
     332 
     333int     roar_vs_mute (roar_vs_t * vss, int val, int * error) { 
     334 return roar_vs_flag(vss, ROAR_FLAG_MUTE, val, error); 
     335} 
     336 
     337static int roar_vs_volume (roar_vs_t * vss, float * c, size_t channels, int * error) { 
     338 struct roar_mixer_settings mixer; 
     339 size_t i; 
     340 
     341 if ( !(vss->flags & FLAG_STREAM) ) { 
     342  _seterr(ROAR_ERROR_INVAL); 
     343  return -1; 
     344 } 
     345 
     346 if ( channels > ROAR_MAX_CHANNELS ) { 
     347  _seterr(ROAR_ERROR_INVAL); 
     348  return -1; 
     349 } 
     350 
     351 for (i = 0; i < channels; i++) 
     352  mixer.mixer[i] = c[i] * 65535.0; 
     353 
     354 mixer.scale = 65535; 
     355 mixer.rpg_mul = 1; 
     356 mixer.rpg_div = 1; 
     357 
     358 if ( roar_set_vol(vss->con, roar_stream_get_id(&(vss->stream)), &mixer, channels) == -1 ) { 
     359  _seterr(ROAR_ERROR_UNKNOWN); 
     360  return -1; 
     361 } 
     362 
     363 return 0; 
     364} 
     365 
     366int     roar_vs_volume_mono   (roar_vs_t * vss, float c, int * error) { 
     367 return roar_vs_volume(vss, &c, 1, error); 
     368} 
     369 
     370int     roar_vs_volume_stereo (roar_vs_t * vss, float l, float r, int * error) { 
     371 float c[2] = {l, r}; 
     372 return roar_vs_volume(vss, c, 2, error); 
     373} 
     374 
     375int     roar_vs_volume_get    (roar_vs_t * vss, float * l, float * r, int * error) { 
     376 struct roar_mixer_settings mixer; 
     377 int channels; 
     378 
     379 if ( vss == NULL || l == NULL || r == NULL ) { 
     380  _seterr(ROAR_ERROR_INVAL); 
     381  return -1; 
     382 } 
     383 
     384 if ( !(vss->flags & FLAG_STREAM) ) { 
     385  _seterr(ROAR_ERROR_INVAL); 
     386  return -1; 
     387 } 
     388 
     389 if ( roar_get_vol(vss->con, roar_stream_get_id(&(vss->stream)), &mixer, &channels) == -1 ) { 
     390  _seterr(ROAR_ERROR_UNKNOWN); 
     391  return -1; 
     392 } 
     393 
     394 if ( channels == 1 ) 
     395  mixer.mixer[1] = mixer.mixer[0]; 
     396 
     397 *l = mixer.mixer[0] / (float)mixer.scale; 
     398 *r = mixer.mixer[1] / (float)mixer.scale; 
     399 
     400 return 0; 
     401} 
     402 
     403int     roar_vs_meta          (roar_vs_t * vss, struct roar_keyval * kv, size_t len, int * error); 
    224404 
    225405//ll 
Note: See TracChangeset for help on using the changeset viewer.