Changeset 3986:2c98a7f52f58 in roaraudio


Ignore:
Timestamp:
06/28/10 00:00:48 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

implemented play command and zero-size put command

Files:
2 edited

Legend:

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

    r3985 r3986  
    4242 {"monitor",     NULL,  1, -1, NULL}, 
    4343 {"pause",       NULL,  1, -1, NULL}, 
    44  {"play",        NULL,  1, -1, NULL}, 
    45  {"put",         NULL,  2, -1, NULL}, 
     44 {"play",        NULL,  1, -1, emul_rplay_on_play}, 
     45 {"put",         NULL,  2, -1, emul_rplay_on_put}, 
    4646 {"quit",        NULL,  0,  0, emul_rplay_on_quit}, 
    4747 {"reset",       NULL,  0,  0, NULL}, 
     
    7171} 
    7272 
     73static int format_to_codec(const char * str, const int bo) { 
     74 
     75 if ( !strcasecmp(str, "ulaw") || !strcasecmp(str, "u_law") || !strcasecmp(str, "u-law") ) 
     76  return ROAR_CODEC_MULAW; 
     77 
     78 if ( !strncasecmp(str, "ulinear", 7) ) { 
     79  switch (bo) { 
     80   case ROAR_BYTEORDER_LE: 
     81     return ROAR_CODEC_PCM_U_LE; 
     82    break; 
     83   case ROAR_BYTEORDER_BE: 
     84     return ROAR_CODEC_PCM_U_BE; 
     85    break; 
     86   case ROAR_BYTEORDER_PDP: 
     87     return ROAR_CODEC_PCM_U_PDP; 
     88    break; 
     89   default: 
     90     return -1; 
     91    break; 
     92  } 
     93 } else if ( !strncasecmp(str, "linear", 6) ) { 
     94  switch (bo) { 
     95   case ROAR_BYTEORDER_LE: 
     96     return ROAR_CODEC_PCM_S_LE; 
     97    break; 
     98   case ROAR_BYTEORDER_BE: 
     99     return ROAR_CODEC_PCM_S_BE; 
     100    break; 
     101   case ROAR_BYTEORDER_PDP: 
     102     return ROAR_CODEC_PCM_S_PDP; 
     103    break; 
     104   default: 
     105     return -1; 
     106    break; 
     107  } 
     108 } 
     109 
     110 return -1; 
     111} 
    73112 
    74113int emul_rplay_check_client  (int client, struct roar_vio_calls * vio) { 
     
    235274} 
    236275 
     276 
     277int emul_rplay_on_play(int client, struct emul_rplay_command * cmd, struct roar_vio_calls * vio, struct roar_keyval * kv, size_t kvlen) { 
     278 struct roar_keyval        * kvr, * rate, * bits, * channels, * format, * byteorder; 
     279 struct roar_audio_info      info; 
     280 struct roar_stream_server * ss; 
     281 struct roar_stream        *  s; 
     282 int stream; 
     283 int bo = -1; 
     284 char * cd = NULL; 
     285 
     286 if ( (kvr = roar_keyval_lookup(kv, "input", kvlen, 0)) == NULL ) { 
     287  emul_rplay_send_error(client, cmd, vio, kv, kvlen, "no input parameter"); 
     288  return -1; 
     289 } 
     290 
     291 if ( !!strcasecmp(kvr->value, "flow") ) { 
     292  emul_rplay_send_error(client, cmd, vio, kv, kvlen, "non-flow input not supported"); 
     293  return -1; 
     294 } 
     295 
     296/* 
     297               "input-format=%s input-sample-rate=%d input-bits=%d " 
     298               "input-channels=%d input-byte-order=%s", 
     299*/ 
     300 
     301 rate      = roar_keyval_lookup(kv, "input-sample-rate", kvlen, 0); 
     302 bits      = roar_keyval_lookup(kv, "input-bits",        kvlen, 0); 
     303 channels  = roar_keyval_lookup(kv, "input-channels",    kvlen, 0); 
     304 format    = roar_keyval_lookup(kv, "input-format",      kvlen, 0); 
     305 byteorder = roar_keyval_lookup(kv, "input-byte-order",  kvlen, 0); 
     306 
     307 if ( rate == NULL || bits == NULL || channels == NULL || format == NULL || byteorder == NULL ) { 
     308  emul_rplay_send_error(client, cmd, vio, kv, kvlen, "missing audio parameter"); 
     309  return -1; 
     310 } 
     311 
     312 info.rate     = atoi(rate->value); 
     313 info.bits     = atoi(bits->value); 
     314 info.channels = atoi(channels->value); 
     315 
     316 if ( !strcasecmp(byteorder->value, "big-endian") || !strcasecmp(byteorder->value, "big") ) { 
     317  bo = ROAR_BYTEORDER_BE; 
     318 } else if ( !strcasecmp(byteorder->value, "little-endian") || !strcasecmp(byteorder->value, "little") ) { 
     319  bo = ROAR_BYTEORDER_LE; 
     320 } else if ( !strcasecmp(byteorder->value, "pdp-endian") || !strcasecmp(byteorder->value, "pdp") ) { 
     321  bo = ROAR_BYTEORDER_PDP; 
     322 } else { 
     323  emul_rplay_send_error(client, cmd, vio, kv, kvlen, "unknown byte order"); 
     324  return -1; 
     325 } 
     326 
     327 info.codec = format_to_codec(format->value, bo); 
     328 
     329 if ((stream = streams_new()) == -1 ) { 
     330  emul_rplay_send_error(client, cmd, vio, kv, kvlen, "can not create new stream"); 
     331  return -1; 
     332 } 
     333 
     334 if ( streams_get(stream, &ss) == -1 ) { 
     335  streams_delete(stream); 
     336  emul_rplay_send_error(client, cmd, vio, kv, kvlen, "can not get stream object"); 
     337  return -1; 
     338 } 
     339 
     340 s = ROAR_STREAM(ss); 
     341 
     342 if ( client_stream_add(client, stream) == -1 ) { 
     343  streams_delete(stream); 
     344  emul_rplay_send_error(client, cmd, vio, kv, kvlen, "can not add stream to client"); 
     345  return -1; 
     346 } 
     347 
     348 memcpy(&(s->info), &info, sizeof(info)); 
     349 ss->codec_orgi = s->info.codec; 
     350 
     351 if ( streams_set_dir(stream, ROAR_DIR_PLAY, 1) == -1 ) { 
     352  streams_delete(stream); 
     353  emul_rplay_send_error(client, cmd, vio, kv, kvlen, "can not set dir on stream"); 
     354  return -1; 
     355 } 
     356 
     357 if ( (kvr = roar_keyval_lookup(kv, "client-data", kvlen, 0)) != NULL ) { 
     358  cd = kvr->value; 
     359 } 
     360 
     361 if ( cd == NULL ) 
     362  cd = ""; 
     363 
     364//        connection_reply(c, "%cid=#%d sound=\"%s\" command=%s client-data=\"%s\" list-name=\"%s\"", 
     365// roar_vio_printf(vio, "+id=#%i sound=\"%s\" command=%s client-data=\"%s\" list-name=\"%s\""); 
     366 roar_vio_printf(vio, "+id=#%i command=%s client-data=\"%s\"\n", stream, "play", cd); 
     367 
     368 return 0; 
     369} 
     370 
     371int emul_rplay_on_put(int client, struct emul_rplay_command * cmd, struct roar_vio_calls * vio, struct roar_keyval * kv, size_t kvlen) { 
     372 struct roar_keyval * kvr; 
     373 int stream; 
     374 size_t len; 
     375 char * cd = NULL; 
     376 
     377//23:00 < ph3-der-loewe>   rptp_putline(flow_fd, "put id=#%d size=0", spool_id); 
     378 if ( (kvr = roar_keyval_lookup(kv, "id", kvlen, 0)) == NULL ) { 
     379  emul_rplay_send_error(client, cmd, vio, kv, kvlen, "no id parameter"); 
     380  return -1; 
     381 } 
     382 
     383 stream = atoi(kvr->value+1); 
     384 
     385 if ( (kvr = roar_keyval_lookup(kv, "size", kvlen, 0)) == NULL ) { 
     386  emul_rplay_send_error(client, cmd, vio, kv, kvlen, "no size parameter"); 
     387  return -1; 
     388 } 
     389 
     390 len = atoi(kvr->value); 
     391 
     392 if ( len != 0 ) { 
     393  emul_rplay_send_error(client, cmd, vio, kv, kvlen, "currently only zero size put supported"); 
     394  return -1; 
     395 } 
     396 
     397 if ( client_stream_exec(client, stream) == -1 ) { 
     398  emul_rplay_send_error(client, cmd, vio, kv, kvlen, "can not exec stream"); 
     399  return -1; 
     400 } 
     401 
     402 
     403 if ( (kvr = roar_keyval_lookup(kv, "client-data", kvlen, 0)) != NULL ) { 
     404  cd = kvr->value; 
     405 } 
     406 
     407 if ( cd == NULL ) 
     408  cd = ""; 
     409 
     410/* 
     411        connection_reply(c, "%cid=#%d size=%d command=put client-data=\"%s\"", 
     412                         RPTP_OK, spool_id, sound_size, client_data); 
     413*/ 
     414 roar_vio_printf(vio, "+id=#%i command=%s client-data=\"%s\"\n", stream, "put", cd); 
     415 
     416 return 0; 
     417} 
     418 
     419int emul_rplay_on_set(int client, struct emul_rplay_command * cmd, struct roar_vio_calls * vio, struct roar_keyval * kv, size_t kvlen); 
     420int emul_rplay_on_modify(int client, struct emul_rplay_command * cmd, struct roar_vio_calls * vio, struct roar_keyval * kv, size_t kvlen); 
     421int emul_rplay_on_pause(int client, struct emul_rplay_command * cmd, struct roar_vio_calls * vio, struct roar_keyval * kv, size_t kvlen); 
     422int emul_rplay_on_continue(int client, struct emul_rplay_command * cmd, struct roar_vio_calls * vio, struct roar_keyval * kv, size_t kvlen); 
     423int emul_rplay_on_stop(int client, struct emul_rplay_command * cmd, struct roar_vio_calls * vio, struct roar_keyval * kv, size_t kvlen); 
     424 
    237425#endif 
    238426 
  • roard/include/emul_rplay.h.OLD

    r3983 r3986  
    4949int emul_rplay_on_help(int client, struct emul_rplay_command * cmd, struct roar_vio_calls * vio, struct roar_keyval * kv, size_t kvlen); 
    5050 
     51// things we need to implent soon: 
     52int emul_rplay_on_play(int client, struct emul_rplay_command * cmd, struct roar_vio_calls * vio, struct roar_keyval * kv, size_t kvlen); 
     53int emul_rplay_on_put(int client, struct emul_rplay_command * cmd, struct roar_vio_calls * vio, struct roar_keyval * kv, size_t kvlen); 
     54int emul_rplay_on_set(int client, struct emul_rplay_command * cmd, struct roar_vio_calls * vio, struct roar_keyval * kv, size_t kvlen); 
     55int emul_rplay_on_modify(int client, struct emul_rplay_command * cmd, struct roar_vio_calls * vio, struct roar_keyval * kv, size_t kvlen); 
     56int emul_rplay_on_pause(int client, struct emul_rplay_command * cmd, struct roar_vio_calls * vio, struct roar_keyval * kv, size_t kvlen); 
     57int emul_rplay_on_continue(int client, struct emul_rplay_command * cmd, struct roar_vio_calls * vio, struct roar_keyval * kv, size_t kvlen); 
     58int emul_rplay_on_stop(int client, struct emul_rplay_command * cmd, struct roar_vio_calls * vio, struct roar_keyval * kv, size_t kvlen); 
    5159#endif 
    5260 
Note: See TracChangeset for help on using the changeset viewer.