Changeset 4934:a88414aa5705 in roaraudio for roard/streams.c


Ignore:
Timestamp:
05/09/11 01:39:41 (13 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

Added support for role based handling in roard (Closes: #49)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • roard/streams.c

    r4896 r4934  
    3333int streams_recsource_id = -1; 
    3434 
     35static const struct rolestack * streams_rolestack = NULL; 
     36static int streams_role_num     =  0; 
     37 
     38 
    3539static void _streams_change_state(struct roar_stream_server * s, const int new, const char * func) { 
    3640 register int id  = ROAR_STREAM(s)->id; 
     
    122126int streams_init (void) { 
    123127 int i; 
     128 
     129 streams_rolestack = rolestack_get_role(-1); // get default 
    124130 
    125131 for (i = 0; i < ROAR_STREAMS_MAX; i++) 
     
    263269 roar_notify_core_emit_snoargs(ROAR_OE_BASICS_DELETE, -1, id, ROAR_OT_STREAM); 
    264270 
     271 streams_set_role(id, -1); 
     272 
    265273 prim = s->primary; 
    266274 
     
    513521} 
    514522 
     523static int streams_set_role_handle(int id) { 
     524   switch (streams_rolestack->action) { 
     525    case RS_ERROR: /* nothing to do */; break; 
     526    case RS_MIX:   /* nothing to do */; break; 
     527    case RS_KICK:  streams_delete(id);  break; 
     528    case RS_MUTE:  streams_set_flag(id, ROAR_FLAG_MUTE);  break; 
     529    case RS_PAUSE: streams_set_flag(id, ROAR_FLAG_PAUSE); break; 
     530   } 
     531 return 0; 
     532} 
     533 
    515534int streams_set_role   (int id, int role) { 
    516535 struct roar_stream_server * ss; 
     536 const struct rolestack * rs; 
     537 int old_role; 
     538 int i; 
     539 
     540 ROAR_DBG("streams_set_role(id=%i, role=%i) = ?", id, role); 
    517541 
    518542 _CHECK_SID(id); 
     
    521545  return -1; 
    522546 
     547 old_role = ss->role; 
    523548 ss->role = role; 
    524549 
     550 ROAR_DBG("streams_set_role(id=%i, role=%i) = ?", id, role); 
     551 
     552 if ( ROAR_STREAM(ss)->dir != ROAR_DIR_PLAY ) 
     553  return 0; 
     554 
     555 ROAR_DBG("streams_set_role(id=%i, role=%i) = ?", id, role); 
     556 
     557 if ( old_role == role ) 
     558  return 0; 
     559 
     560 if ( old_role != role && old_role != -1 && role != -1 ) { 
     561  streams_set_role(id, -1); 
     562  streams_set_role(id, role); 
     563 } 
     564 
     565 ROAR_DBG("streams_set_role(id=%i, role=%i) = ?", id, role); 
     566 
     567 if ( ss->role != -1 && ss->role == streams_rolestack->role ) { 
     568  ROAR_DBG("streams_set_role(id=%i, role=%i) = ?", id, role); 
     569 
     570  streams_role_num--; 
     571  if ( streams_role_num == 0 ) { 
     572   streams_rolestack = rolestack_get_role(-1); // get default 
     573   for (i = 0; i < ROAR_STREAMS_MAX; i++) { 
     574    if ( (ss = g_streams[i]) == NULL ) 
     575     continue; 
     576    if ( ROAR_STREAM(ss)->dir != ROAR_DIR_PLAY ) 
     577     continue; 
     578    if ( ss->role == -1 ) 
     579     continue; 
     580    rs = rolestack_get_role(ss->role); 
     581    if ( rs->index > streams_rolestack->role ) { 
     582     streams_rolestack = rs; 
     583    } 
     584   } 
     585   for (i = 0; i < ROAR_STREAMS_MAX; i++) { 
     586    if ( (ss = g_streams[i]) == NULL ) 
     587     continue; 
     588    if ( ROAR_STREAM(ss)->dir != ROAR_DIR_PLAY ) 
     589     continue; 
     590    if ( ss->role == streams_rolestack->role ) 
     591     streams_role_num++; 
     592   } 
     593  } 
     594 } else if ( role != -1 ) { 
     595  ROAR_DBG("streams_set_role(id=%i, role=%i) = ?", id, role); 
     596 
     597  rs = rolestack_get_role(role); 
     598  ROAR_DBG("streams_set_role(id=%i, role=%i): rs->index=%i, streams_rolestack->index=%i", id, role, rs->index, streams_rolestack->index); 
     599  if ( rs->index == streams_rolestack->index ) { 
     600   ROAR_DBG("streams_set_role(id=%i, role=%i): rs->index=%i, streams_rolestack->index=%i", id, role, rs->index, streams_rolestack->index); 
     601   streams_role_num++; 
     602  } else if ( rs->index > streams_rolestack->index ) { 
     603   ROAR_DBG("streams_set_role(id=%i, role=%i): rs=%p{.index=%i, .action=%s}", id, role, rs, rs->index, rolestack_action2str(rs->action)); 
     604   streams_role_num  = 1; 
     605   streams_rolestack = rs; 
     606   for (i = 0; i < ROAR_STREAMS_MAX; i++) { 
     607    if ( (ss = g_streams[i]) == NULL ) 
     608     continue; 
     609    if ( ROAR_STREAM(ss)->dir != ROAR_DIR_PLAY ) 
     610     continue; 
     611    rs = rolestack_get_role(ss->role); 
     612    ROAR_DBG("streams_set_role(id=%i, role=%i): i=%i, rs->index=%i, streams_rolestack->index=%i", id, role, i, rs->index, streams_rolestack->index); 
     613    if ( rs->index < streams_rolestack->index ) 
     614     streams_set_role_handle(i); 
     615   } 
     616  } else { 
     617   ROAR_DBG("streams_set_role(id=%i, role=%i): streams_rolestack->action=%s", id, role, rolestack_action2str(streams_rolestack->action)); 
     618   streams_set_role_handle(id); 
     619  } 
     620 } 
     621 
     622 ROAR_DBG("streams_set_role(id=%i, role=%i) = 0", id, role); 
    525623 return 0; 
    526624} 
Note: See TracChangeset for help on using the changeset viewer.