Changeset 3820:105b2c84ffdc in roaraudio


Ignore:
Timestamp:
05/11/10 14:20:16 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

started with better protocol support for RSD

Location:
roard
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • roard/clients.c

    r3737 r3820  
    457457#ifndef ROAR_WITHOUT_DCOMP_EMUL_ESD 
    458458  case ROAR_PROTO_RSOUND: 
    459     rv = clients_delete(id); 
     459    rv = emul_rsound_check_client(id, NULL); 
    460460   break; 
    461461#endif 
  • roard/emul_rsound.c

    r3686 r3820  
    132132} 
    133133 
     134int emul_rsound_vrecv_msg(struct emul_rsound_msg * msg, struct roar_vio_calls * vio) { 
     135 ssize_t ret; 
     136 int     num; 
     137 
     138 if ( msg == NULL || vio == NULL ) 
     139  return -1; 
     140 
     141 ret = roar_vio_read(vio, msg->header, EMUL_RSOUND_MSG_HEADER_LEN); 
     142 
     143 if ( ret != EMUL_RSOUND_MSG_HEADER_LEN ) 
     144  return -1; 
     145 
     146 msg->header[ret] = 0; 
     147 
     148 if ( msg->header[0] != 'R' || msg->header[1] != 'S' || msg->header[2] != 'D' ) 
     149  return -1; 
     150 
     151 if ( sscanf(&(msg->header[3]), "%5d", &num) != 1 ) 
     152  return -1; 
     153 
     154 if ( num > EMUL_RSOUND_MSG_DATA_LEN ) 
     155  return -1; 
     156 
     157 msg->datalen = num; 
     158 
     159 ret = roar_vio_read(vio, msg->data, num); 
     160 
     161 if ( ret != (ssize_t)num ) 
     162  return -1; 
     163 
     164 msg->data[num] = 0; 
     165 
     166 msg->datasp   = msg->data; 
     167 msg->dataslen = msg->datalen; 
     168 
     169 for (num = 0; msg->data[num] == ' '; num++) { 
     170  msg->datasp++; 
     171  msg->dataslen--; 
     172 } 
     173 
     174 return 0; 
     175} 
     176 
     177int emul_rsound_vsend_msg(struct emul_rsound_msg * msg, struct roar_vio_calls * vio) { 
     178 ssize_t ret; 
     179 
     180 if ( msg == NULL || vio == NULL ) 
     181  return -1; 
     182 
     183 snprintf(msg->header, EMUL_RSOUND_MSG_HEADER_LEN+1, "RSD%5d", msg->datalen); 
     184 
     185 ret = roar_vio_write(vio, msg->header, EMUL_RSOUND_MSG_HEADER_LEN); 
     186 
     187 if ( ret != EMUL_RSOUND_MSG_HEADER_LEN ) 
     188  return -1; 
     189 
     190 ret = roar_vio_write(vio, msg->data, msg->datalen); 
     191 
     192 if ( ret != (ssize_t)msg->datalen ) 
     193  return -1; 
     194 
     195 return 0; 
     196} 
     197 
     198int emul_rsound_check_client(int client, struct roar_vio_calls * vio) { 
     199 struct roar_vio_calls rvio; 
     200 struct emul_rsound_msg msg; 
     201 
     202 if ( vio == NULL ) { 
     203  vio = &rvio; 
     204  roar_vio_open_fh_socket(vio, clients_get_fh(client)); 
     205 } 
     206 
     207 if ( emul_rsound_vrecv_msg(&msg, vio) == -1 ) 
     208  return clients_delete(client); 
     209 
     210 if ( !strncmp(msg.datasp, "INFO", 4) ) { 
     211  // TODO: add support for INFO 
     212  return clients_delete(client); 
     213 } else if ( !strncmp(msg.datasp, "NULL", 4) ) { 
     214  // NULL is simular to NOOP 
     215  return 0; 
     216 } else if ( !strncmp(msg.datasp, "STOP", 4) ) { 
     217  // This is quit. 
     218  return clients_delete(client); 
     219 } else { 
     220  return clients_delete(client); 
     221 } 
     222} 
    134223#endif 
    135224 
  • roard/include/emul_rsound.h

    r3684 r3820  
    3131#ifndef ROAR_WITHOUT_DCOMP_EMUL_RSOUND 
    3232 
     33#define EMUL_RSOUND_MSG_HEADER_LEN (3+5) 
     34#define EMUL_RSOUND_MSG_DATA_LEN   (64) 
     35 
     36struct emul_rsound_msg { 
     37 char header[EMUL_RSOUND_MSG_HEADER_LEN+1]; 
     38 size_t datalen; 
     39 char data[EMUL_RSOUND_MSG_DATA_LEN+1]; 
     40 char * datasp; 
     41 size_t dataslen; 
     42}; 
     43 
     44int emul_rsound_vrecv_msg(struct emul_rsound_msg * msg, struct roar_vio_calls * vio); 
     45int emul_rsound_vsend_msg(struct emul_rsound_msg * msg, struct roar_vio_calls * vio); 
     46 
    3347int emul_rsound_on_connect  (int fh, struct roard_listen * lsock); 
     48int emul_rsound_check_client(int client, struct roar_vio_calls * vio); 
    3449 
    3550#endif 
Note: See TracChangeset for help on using the changeset viewer.