Ignore:
Timestamp:
11/09/12 01:09:22 (11 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

commit 0: make protocol emulations for esd, gopher and rplay more independed so they can be moved into plugins easily (See: #311)

File:
1 edited

Legend:

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

    r5640 r5739  
    2828#ifndef ROAR_WITHOUT_DCOMP_EMUL_ESD 
    2929#ifdef ROAR_HAVE_H_ESD 
     30#include <esd.h> 
     31 
     32 
     33struct emul_esd_command { 
     34 int    cmd; 
     35 size_t datalen; 
     36#if !defined(ROAR_TARGET_MICROCONTROLLER) && !defined(ROAR_MINIMAL) 
     37 char name[COMMAND_MAX_NAMELEN]; 
     38#else 
     39 char * name; 
     40#endif 
     41 int (*handler)(int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio); 
     42}; 
     43 
     44static int emul_esd_exec_command  (int client, int cmd, struct roar_vio_calls * vio); 
     45static int emul_esd_check_client  (int client, struct roar_vio_calls * vio, struct roar_buffer ** obuffer, void ** userdata, const struct roar_keyval * protopara, ssize_t protoparalen, struct roar_dl_librarypara * pluginpara); 
     46 
     47static int emul_esd_int_read_buf  (int client, int * data, void * buf); 
     48static int emul_esd_int_read      (int client, int * data, struct roar_vio_calls * vio); 
     49static int emul_esd_int_write     (int client, int   data, struct roar_vio_calls * vio); 
     50static int emul_esd_test_auth     (int client, void * data, struct roar_vio_calls * vio); 
     51static int emul_esd_test_byteorder(int client, void * data); 
     52 
     53static int emul_esd_on_connect    (int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio); 
     54static int emul_esd_on_stream     (int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio); 
     55static int emul_esd_on_latency    (int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio); 
     56static int emul_esd_on_standby    (int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio); 
     57static int emul_esd_on_standbymode(int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio); 
     58 
     59static int emul_esd_on_stream_pan (int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio); 
     60 
     61static int emul_esd_on_server_info(int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio); 
     62 
     63static int emul_esd_on_all_info   (int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio); 
     64 
     65 
    3066 
    3167#if !defined(ROAR_TARGET_MICROCONTROLLER) && !defined(ROAR_MINIMAL) 
     
    4581#define _ESD2ROAR(x) ((x)-1) 
    4682 
    47 struct emul_esd_command g_emul_esd_commands[] = { 
     83static struct emul_esd_command g_emul_esd_commands[] = { 
    4884 {ESD_PROTO_CONNECT,      ESD_KEY_LEN  +     _INTSIZE, _NAME("CONNECT"),      emul_esd_on_connect}, 
    4985 {ESD_PROTO_LOCK,         ESD_KEY_LEN  +     _INTSIZE, _NAME("LOCK"),         NULL}, 
     
    75111 
    76112// command handling: 
    77 int emul_esd_exec_command(int client, int cmd, struct roar_vio_calls * vio) { 
     113static int emul_esd_exec_command(int client, int cmd, struct roar_vio_calls * vio) { 
    78114 struct emul_esd_command * cur; 
    79115 void * data = NULL; 
     
    95131    if ( (data = roar_mm_malloc(cur->datalen)) == NULL ) { 
    96132     // we will do a protocol error in case we do not drop the client 
    97      clients_delete(client); 
    98133     return -1; 
    99134    } 
     
    104139     if ( ret < 1 ) { 
    105140      roar_mm_free(data); 
    106       clients_delete(client); 
    107141      return -1; 
    108142     } else { 
     
    116150               client, cur->name, cmd, vio 
    117151             ); 
    118     clients_delete(client); 
    119152    r = -1; 
    120153   } else { 
     
    132165} 
    133166 
    134 int emul_esd_check_client(int client, struct roar_vio_calls * vio, struct roar_buffer ** obuffer, void ** userdata, const struct roar_keyval * protopara, ssize_t protoparalen, struct roar_dl_librarypara * pluginpara) { 
    135  struct roar_vio_calls calls; 
     167static int emul_esd_set_proto(int client, struct roar_vio_calls * vio, struct roar_buffer ** obuffer, void ** userdata, const struct roar_keyval * protopara, ssize_t protoparalen, struct roar_dl_librarypara * pluginpara) { 
     168 if ( emul_esd_exec_command(client, ESD_PROTO_CONNECT, vio) == -1 ) 
     169  return -1; 
     170 
     171 return 0; 
     172} 
     173 
     174static int emul_esd_check_client(int client, struct roar_vio_calls * vio, struct roar_buffer ** obuffer, void ** userdata, const struct roar_keyval * protopara, ssize_t protoparalen, struct roar_dl_librarypara * pluginpara) { 
    136175 _cmd_t cmd; 
    137176 
    138177 if ( client == -1 ) 
    139178  return -1; 
    140  
    141  if ( vio == NULL ) { 
    142   vio = &calls; 
    143   if ( roar_vio_open_fh_socket(vio, clients_get_fh(client)) == -1 ) 
    144    return -1; 
    145  } 
    146179 
    147180 if ( roar_vio_read(vio, &cmd, _INTSIZE) != _INTSIZE ) { 
    148181  // really bad protocol error 
    149   clients_delete(client); 
    150182  return -1; 
    151183 } 
     
    167199 return 0; 
    168200} 
    169 int emul_esd_int_read      (int client, int * data, struct roar_vio_calls * vio) { 
     201static int emul_esd_int_read      (int client, int * data, struct roar_vio_calls * vio) { 
    170202 _cmd_t d; 
    171203 
     
    181213} 
    182214 
    183 int emul_esd_int_write     (int client, int   data, struct roar_vio_calls * vio) { 
     215static int emul_esd_int_write     (int client, int   data, struct roar_vio_calls * vio) { 
    184216 _cmd_t d = data; 
    185217 
     
    187219} 
    188220 
    189 int emul_esd_test_auth     (int client, void * data, struct roar_vio_calls * vio) { 
     221static int emul_esd_test_auth     (int client, void * data, struct roar_vio_calls * vio) { 
    190222 // accept all clients for the moment. 
    191223 return emul_esd_int_write(client, 1, vio); 
    192224} 
    193225 
    194 int emul_esd_test_byteorder(int client, void * data) { 
     226static int emul_esd_test_byteorder(int client, void * data) { 
    195227 struct roar_client * c; 
    196228 
     
    214246 
    215247// handler: 
    216 int emul_esd_on_connect    (int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio) { 
     248static int emul_esd_on_connect    (int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio) { 
    217249 
    218250 ROAR_DBG("emul_esd_on_connect(client=%i, cmd=%p, data=%p, vio=%p) = ?", client, cmd, data, vio); 
     
    236268} 
    237269 
    238 int emul_esd_on_stream     (int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio) { 
     270static int emul_esd_on_stream     (int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio) { 
    239271 struct roar_stream_server * ss; 
    240272 struct roar_stream        *  s; 
     
    254286  case ESD_PROTO_STREAM_FILT: dir = ROAR_DIR_FILTER;  break; 
    255287  default: 
    256     clients_delete(client); 
    257288    return -1; 
    258289 } 
     
    264295 ROAR_DBG("emul_esd_on_stream(client=%i, ...): creating stream...", client); 
    265296 if ((stream = streams_new()) == -1 ) { 
    266   clients_delete(client); 
    267297  return -1; 
    268298 } 
     
    271301 if ( streams_get(stream, &ss) == -1 ) { 
    272302  streams_delete(stream); 
    273   clients_delete(client); 
    274303  return -1; 
    275304 } 
     
    280309 if ( client_stream_add(client, stream) == -1 ) { 
    281310  streams_delete(stream); 
    282   clients_delete(client); 
    283311  return -1; 
    284312 } 
     
    299327  default: 
    300328    streams_delete(stream); 
    301     clients_delete(client); 
    302329    return -1; 
    303330 } 
     
    308335  default: 
    309336    streams_delete(stream); 
    310     clients_delete(client); 
    311337    return -1; 
    312338 } 
     
    317343 
    318344 if ( streams_set_dir(stream, dir, 1) == -1 ) { 
    319   clients_delete(client); 
    320345  return -1; 
    321346 } 
    322347 
    323348 if ( client_stream_exec(client, stream) == -1 ) { 
    324   clients_delete(client); 
    325   return -1; 
    326  } 
    327  
    328  return 0; 
    329 } 
    330  
    331 int emul_esd_on_latency    (int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio) { 
     349  return -1; 
     350 } 
     351 
     352 return 0; 
     353} 
     354 
     355static int emul_esd_on_latency    (int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio) { 
    332356 int lag = ROAR_OUTPUT_CFREQ; 
    333357 
     
    337361} 
    338362 
    339 int emul_esd_on_standby    (int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio) { 
     363static int emul_esd_on_standby    (int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio) { 
    340364 int ok = 0; 
    341365 
     
    356380} 
    357381 
    358 int emul_esd_on_standbymode(int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio) { 
     382static int emul_esd_on_standbymode(int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio) { 
    359383 int mode = ESM_ERROR; 
    360384 
     
    372396} 
    373397 
    374 int emul_esd_on_stream_pan (int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio) { 
     398static int emul_esd_on_stream_pan (int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio) { 
    375399 struct roar_stream_server * ss; 
    376400 int stream = -1; 
     
    395419} 
    396420 
    397 int emul_esd_on_server_info(int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio) { 
     421static int emul_esd_on_server_info(int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio) { 
    398422 int version = 0; 
    399423 int rate    = g_sa->rate; 
     
    422446} 
    423447 
    424 int emul_esd_on_all_info   (int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio) { 
     448static int emul_esd_on_all_info   (int client, struct emul_esd_command * cmd, void * data, struct roar_vio_calls * vio) { 
    425449 struct roar_stream_server *   ss; 
    426450 struct roar_audio_info    * info; 
     
    532556} 
    533557 
     558struct roar_dl_proto __proto_common_esd = { 
     559 .proto = ROAR_PROTO_ESOUND, 
     560 .description = "EsounD emulation", 
     561 .flags = ROAR_DL_PROTO_FLAGS_NONE, 
     562 .set_proto = emul_esd_set_proto, 
     563 .handle = emul_esd_check_client 
     564}; 
     565 
    534566#endif 
    535567#endif 
Note: See TracChangeset for help on using the changeset viewer.