Changeset 2522:bfca230702b0 in roaraudio for plugins/roard


Ignore:
Timestamp:
09/01/09 17:25:40 (15 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

wrote basic emul_esd_exec_command() and emul_esd_check_client()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • plugins/roard/protocol-esound.c

    r2521 r2522  
    3434#endif 
    3535 
     36#define _cmd_t   int 
     37#define _INTSIZE sizeof(_cmd_t) 
     38 
    3639struct emul_esd_command g_emul_esd_commands[] = { 
    37  {ESD_PROTO_CONNECT,      ESD_KEY_LEN  +     sizeof(int), _NAME("CONNECT"),      NULL}, 
    38  {ESD_PROTO_LOCK,         ESD_KEY_LEN  +     sizeof(int), _NAME("LOCK"),         NULL}, 
    39  {ESD_PROTO_UNLOCK,       ESD_KEY_LEN  +     sizeof(int), _NAME("UNLOCK"),       NULL}, 
    40  {ESD_PROTO_STREAM_PLAY,  ESD_NAME_MAX + 2 * sizeof(int), _NAME("STREAM_PLAY"),  NULL}, 
    41  {ESD_PROTO_STREAM_REC,   ESD_NAME_MAX + 2 * sizeof(int), _NAME("STREAM_REC"),   NULL}, 
    42  {ESD_PROTO_STREAM_MON,   ESD_NAME_MAX + 2 * sizeof(int), _NAME("STREAM_MON"),   NULL}, 
    43  {ESD_PROTO_SAMPLE_CACHE, ESD_NAME_MAX + 3 * sizeof(int), _NAME("SAMPLE_CACHE"), NULL}, 
    44  {ESD_PROTO_SAMPLE_FREE,                     sizeof(int), _NAME("SAMPLE_FREE"),  NULL}, 
    45  {ESD_PROTO_SAMPLE_PLAY,                     sizeof(int), _NAME("SAMPLE_PLAY"),  NULL}, 
    46  {ESD_PROTO_SAMPLE_LOOP,                     sizeof(int), _NAME("SAMPLE_LOOP"),  NULL}, 
    47  {ESD_PROTO_SAMPLE_STOP,                     sizeof(int), _NAME("SAMPLE_STOP"),  NULL}, 
    48  {ESD_PROTO_SAMPLE_KILL,  0                             , _NAME("SAMPLE_KILL"),  NULL}, 
    49  {ESD_PROTO_STANDBY,      ESD_KEY_LEN +      sizeof(int), _NAME("STANDBY"),      NULL}, 
    50  {ESD_PROTO_RESUME,       ESD_KEY_LEN +      sizeof(int), _NAME("RESUME"),       NULL}, 
    51  {ESD_PROTO_SAMPLE_GETID, ESD_NAME_MAX,                   _NAME("SAMPLE_GETID"), NULL}, 
    52  {ESD_PROTO_STREAM_FILT,  ESD_NAME_MAX + 2 * sizeof(int), _NAME("STREAM_FILT"),  NULL}, 
    53  {ESD_PROTO_SERVER_INFO,                     sizeof(int), _NAME("SERVER_INFO"),  NULL}, 
    54  {ESD_PROTO_ALL_INFO,                        sizeof(int), _NAME("ALL_INFO"),     NULL}, 
    55  {ESD_PROTO_SUBSCRIBE,    0                             , _NAME("SUBSCRIBE"),    NULL}, 
    56  {ESD_PROTO_UNSUBSCRIBE,  0                             , _NAME("UNSUBSCRIBE"),  NULL}, 
    57  {ESD_PROTO_STREAM_PAN,                  3 * sizeof(int), _NAME("STREAM_PAN"),   NULL}, 
    58  {ESD_PROTO_SAMPLE_PAN,                  3 * sizeof(int), _NAME("SAMPLE_PAN"),   NULL}, 
    59  {ESD_PROTO_STANDBY_MODE,                    sizeof(int), _NAME("STANDBY_MODE"), NULL}, 
    60  {ESD_PROTO_LATENCY,      0                             , _NAME("LATENCY"),      NULL}, 
     40 {ESD_PROTO_CONNECT,      ESD_KEY_LEN  +     _INTSIZE, _NAME("CONNECT"),      NULL}, 
     41 {ESD_PROTO_LOCK,         ESD_KEY_LEN  +     _INTSIZE, _NAME("LOCK"),         NULL}, 
     42 {ESD_PROTO_UNLOCK,       ESD_KEY_LEN  +     _INTSIZE, _NAME("UNLOCK"),       NULL}, 
     43 {ESD_PROTO_STREAM_PLAY,  ESD_NAME_MAX + 2 * _INTSIZE, _NAME("STREAM_PLAY"),  NULL}, 
     44 {ESD_PROTO_STREAM_REC,   ESD_NAME_MAX + 2 * _INTSIZE, _NAME("STREAM_REC"),   NULL}, 
     45 {ESD_PROTO_STREAM_MON,   ESD_NAME_MAX + 2 * _INTSIZE, _NAME("STREAM_MON"),   NULL}, 
     46 {ESD_PROTO_SAMPLE_CACHE, ESD_NAME_MAX + 3 * _INTSIZE, _NAME("SAMPLE_CACHE"), NULL}, 
     47 {ESD_PROTO_SAMPLE_FREE,                     _INTSIZE, _NAME("SAMPLE_FREE"),  NULL}, 
     48 {ESD_PROTO_SAMPLE_PLAY,                     _INTSIZE, _NAME("SAMPLE_PLAY"),  NULL}, 
     49 {ESD_PROTO_SAMPLE_LOOP,                     _INTSIZE, _NAME("SAMPLE_LOOP"),  NULL}, 
     50 {ESD_PROTO_SAMPLE_STOP,                     _INTSIZE, _NAME("SAMPLE_STOP"),  NULL}, 
     51 {ESD_PROTO_SAMPLE_KILL,  0                          , _NAME("SAMPLE_KILL"),  NULL}, 
     52 {ESD_PROTO_STANDBY,      ESD_KEY_LEN +      _INTSIZE, _NAME("STANDBY"),      NULL}, 
     53 {ESD_PROTO_RESUME,       ESD_KEY_LEN +      _INTSIZE, _NAME("RESUME"),       NULL}, 
     54 {ESD_PROTO_SAMPLE_GETID, ESD_NAME_MAX               , _NAME("SAMPLE_GETID"), NULL}, 
     55 {ESD_PROTO_STREAM_FILT,  ESD_NAME_MAX + 2 * _INTSIZE, _NAME("STREAM_FILT"),  NULL}, 
     56 {ESD_PROTO_SERVER_INFO,                     _INTSIZE, _NAME("SERVER_INFO"),  NULL}, 
     57 {ESD_PROTO_ALL_INFO,                        _INTSIZE, _NAME("ALL_INFO"),     NULL}, 
     58 {ESD_PROTO_SUBSCRIBE,    0                          , _NAME("SUBSCRIBE"),    NULL}, 
     59 {ESD_PROTO_UNSUBSCRIBE,  0                          , _NAME("UNSUBSCRIBE"),  NULL}, 
     60 {ESD_PROTO_STREAM_PAN,                  3 * _INTSIZE, _NAME("STREAM_PAN"),   NULL}, 
     61 {ESD_PROTO_SAMPLE_PAN,                  3 * _INTSIZE, _NAME("SAMPLE_PAN"),   NULL}, 
     62 {ESD_PROTO_STANDBY_MODE,                    _INTSIZE, _NAME("STANDBY_MODE"), NULL}, 
     63 {ESD_PROTO_LATENCY,      0                          , _NAME("LATENCY"),      NULL}, 
     64 {ESD_PROTO_MAX,          0                          , _NAME("MAX"),          NULL}, 
    6165 {-1, 0, _NAME("END OF LIST"), NULL} 
    6266}; 
     67 
     68int emul_esd_exec_command(int client, int cmd, struct roar_vio_calls * vio) { 
     69 struct emul_esd_command * cur; 
     70 void * data = NULL; 
     71 int r; 
     72 int i; 
     73 
     74 if ( client == -1 || cmd < ESD_PROTO_CONNECT || cmd > ESD_PROTO_MAX || vio == NULL ) 
     75  return -1; 
     76 
     77 for (i = 0; (cur = &(g_emul_esd_commands[i]))->cmd != -1; i++) { 
     78  if ( cur->cmd == cmd ) { 
     79   if ( cur->datalen > 0 ) { 
     80    if ( (data = malloc(cur->datalen)) == NULL ) { 
     81     // we will do a protocol error in case we do not drop the client 
     82     clients_delete(client); 
     83     return -1; 
     84    } 
     85 
     86    if ( roar_vio_read(vio, data, cur->datalen) != cur->datalen ) { 
     87     free(data); 
     88     clients_delete(client); 
     89     return -1; 
     90    } 
     91   } 
     92 
     93   if ( cur->handler == NULL ) { 
     94    ROAR_WARN("emul_esd_exec_command(client=%i, cmd=%s(%i), vio=%p): client uses unimplemted command", 
     95               client, cur->name, cmd, vio 
     96             ); 
     97    r = -1; 
     98   } else { 
     99    r = cur->handler(client, cur, data, vio); 
     100   } 
     101 
     102   if ( data != NULL ) 
     103    free(data); 
     104 
     105   return r; 
     106  } 
     107 } 
     108 
     109 return -1; 
     110} 
     111 
     112int emul_esd_check_client(int client, struct roar_vio_calls * vio) { 
     113 struct roar_vio_calls calls; 
     114 _cmd_t cmd; 
     115 
     116 if ( client == -1 ) 
     117  return -1; 
     118 
     119 if ( vio == NULL ) { 
     120  vio = &calls; 
     121  if ( roar_vio_open_fh(vio, clients_get_fh(client)) == -1 ) 
     122   return -1; 
     123 } 
     124 
     125 if ( roar_vio_read(vio, &cmd, _INTSIZE) != _INTSIZE ) { 
     126  // really bad protocol error 
     127  clients_delete(client); 
     128  return -1; 
     129 } 
     130 
     131 return emul_esd_exec_command(client, cmd, vio); 
     132} 
    63133 
    64134#endif 
Note: See TracChangeset for help on using the changeset viewer.