Changeset 3986:2c98a7f52f58 in roaraudio for plugins
- Timestamp:
- 06/28/10 00:00:48 (14 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
plugins/roard/protocol-rplay.c
r3985 r3986 42 42 {"monitor", NULL, 1, -1, NULL}, 43 43 {"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}, 46 46 {"quit", NULL, 0, 0, emul_rplay_on_quit}, 47 47 {"reset", NULL, 0, 0, NULL}, … … 71 71 } 72 72 73 static 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 } 73 112 74 113 int emul_rplay_check_client (int client, struct roar_vio_calls * vio) { … … 235 274 } 236 275 276 277 int 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 371 int 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 419 int emul_rplay_on_set(int client, struct emul_rplay_command * cmd, struct roar_vio_calls * vio, struct roar_keyval * kv, size_t kvlen); 420 int emul_rplay_on_modify(int client, struct emul_rplay_command * cmd, struct roar_vio_calls * vio, struct roar_keyval * kv, size_t kvlen); 421 int emul_rplay_on_pause(int client, struct emul_rplay_command * cmd, struct roar_vio_calls * vio, struct roar_keyval * kv, size_t kvlen); 422 int emul_rplay_on_continue(int client, struct emul_rplay_command * cmd, struct roar_vio_calls * vio, struct roar_keyval * kv, size_t kvlen); 423 int emul_rplay_on_stop(int client, struct emul_rplay_command * cmd, struct roar_vio_calls * vio, struct roar_keyval * kv, size_t kvlen); 424 237 425 #endif 238 426
Note: See TracChangeset
for help on using the changeset viewer.