Changeset 3820:105b2c84ffdc in roaraudio for roard/emul_rsound.c


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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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 
Note: See TracChangeset for help on using the changeset viewer.