Changeset 5073:f9b421aec994 in roaraudio for libroar


Ignore:
Timestamp:
06/19/11 22:21:38 (13 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added code to handle responses to async messages, still need code to send them

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroar/vs.c

    r5071 r5073  
    4141 
    4242#define LOCAL_CLOCK    ROAR_CLOCK_DEFAULT 
     43#define ASYNC_QLEN     4 
    4344 
    4445#define FLAG_NONE      0x0000 
     
    4950#define FLAG_FREE_VOL  0x0010 
    5051#define FLAG_DEF_PAUSE 0x0020 
     52#define FLAG_ASYNC     0x0040 
    5153#define FLAG_DIR_IN    0x1000 
    5254#define FLAG_DIR_OUT   0x2000 
     
    8789 } latmes; 
    8890 struct { 
     91  size_t lock; 
    8992  size_t qlen; 
     93  int qcmd[ASYNC_QLEN]; 
     94  int qsubcmd[ASYNC_QLEN]; 
    9095 } async; 
    9196}; 
     
    9499 
    95100static int _handle_async_req(roar_vs_t * vss, int * error) { 
     101 struct roar_message mes; 
     102 char * data = NULL; 
     103 uint16_t * ud16 = (uint16_t *) mes.data; 
     104 ssize_t offset; 
     105 int cmd, subcmd; 
     106 int i; 
     107 
     108 if ( roar_recv_message(vss->con, &mes, &data) == -1 ) { 
     109  _seterrre(); 
     110 } 
     111 
     112 cmd    = vss->async.qcmd[0]; 
     113 subcmd = vss->async.qsubcmd[0]; 
     114 vss->async.qlen--; 
     115 
     116 for (i = 1; i < ASYNC_QLEN; i++) { 
     117  vss->async.qcmd[i-1]    = vss->async.qcmd[i]; 
     118  vss->async.qsubcmd[i-1] = vss->async.qsubcmd[i]; 
     119 } 
     120 
     121 if ( mes.cmd == ROAR_CMD_OK ) { 
     122  switch (cmd) { 
     123   case ROAR_CMD_GET_STREAM_PARA: 
     124     if ( subcmd == ROAR_STREAM_PARA_INFO ) { 
     125      if ( mes.datalen >= 16 ) { 
     126       for (i = 0; i < mes.datalen/2; i++) { 
     127        ud16[i] = ROAR_HOST2NET16(ud16[i]); 
     128       } 
     129       if ( ud16[0] == 0 || ud16[1] == 1 ) { 
     130        offset  = ud16[7]; 
     131        offset *= 1000; 
     132        offset *= vss->info.rate; 
     133        offset /= 1000000; 
     134        vss->latmes.last_offset = offset; 
     135       } 
     136      } 
     137     } else { 
     138      ROAR_WARN("_handle_async_req(vss=%p, error=%p): Got unexpected reply for command GET_STREAM_PARA, subcommand", vss, error, subcmd); 
     139     } 
     140    break; 
     141   case ROAR_CMD_GET_STREAM: 
     142     vss->latmes.last_offset = mes.pos; // ha, this is a easy one ;) 
     143    break; 
     144   default: 
     145     ROAR_WARN("_handle_async_req(vss=%p, error=%p): Got unexpected reply for command %i", vss, error, cmd); 
     146    break; 
     147  } 
     148 } 
     149 
     150 if ( data != NULL ) 
     151  free(data); 
     152 
    96153 _seterr(ROAR_ERROR_NOSYS); 
    97154 return -1; 
     
    11931250   } 
    11941251  } else if ( vios[i].ud.vp == vss->con ) { 
    1195    roar_sync(vss->con); 
     1252   if ( vss->async.qlen ) { 
     1253    _handle_async_req(vss, NULL); 
     1254   } else { 
     1255    roar_sync(vss->con); 
     1256   } 
    11961257  } else if ( vss->file != NULL && vios[i].ud.vp == vss->file ) { 
    11971258   if ( vios[i].eventsa & ROAR_VIO_SELECT_READ ) 
Note: See TracChangeset for help on using the changeset viewer.