int main (int argc, char * argv[]) { int rate = 44100; int bits = 16; int channels = 2; int codec = ROAR_CODEC_DEFAULT; char * server = NULL; char * k; int i; int fh; char buf[BUFSIZE]; struct roar_connection con; for (i = 1; i < argc; i++) { k = argv[i]; if ( strcmp(k, "--server") == 0 ) { server = argv[++i]; } else if ( strcmp(k, "--rate") == 0 ) { rate = atoi(argv[++i]); } else if ( strcmp(k, "--bits") == 0 ) { bits = atoi(argv[++i]); } else if ( strcmp(k, "--channels") == 0 ) { channels = atoi(argv[++i]); } else if ( strcmp(k, "--help") == 0 ) { usage(); return 0; } else { fprintf(stderr, "Error: unknown argument: %s\n", k); usage(); return 1; } } if ( roar_simple_connect(&con, server, "roarcat2sock") == -1 ) { ROAR_DBG("roar_simple_play(*): roar_simple_connect() faild!"); return 1; } if ( (fh = roar_simple_new_stream(&con, rate, channels, bits, codec, ROAR_DIR_PLAY)) == -1 ) { roar_disconnect(&con); return 1; } while((i = read(0, buf, BUFSIZE))) write(fh, buf, i); close(fh); roar_disconnect(&con); return 0; }
/* * close audio device */ static void uninit(int immed) { if ( roar_fh != -1 ) close(roar_fh); roar_fh = -1; roar_disconnect(&roar_con); }
static void roar_close(void *data) { roar_t * self = data; g_mutex_lock(self->lock); self->alive = false; if (self->vss != NULL) roar_vs_close(self->vss, ROAR_VS_TRUE, &(self->err)); self->vss = NULL; roar_disconnect(&(self->con)); g_mutex_unlock(self->lock); }
int roar_vs_close(roar_vs_t * vss, int killit, int * error) { if ( killit != ROAR_VS_TRUE && killit != ROAR_VS_FALSE ) { _seterr(ROAR_ERROR_UNKNOWN); return -1; } _ckvss(-1); if ( vss->flags & FLAG_STREAM ) { if ( killit == ROAR_VS_TRUE ) { roar_kick(vss->con, ROAR_OT_STREAM, roar_stream_get_id(&(vss->stream))); } roar_vio_close(&(vss->vio)); } if ( vss->con == &(vss->con_store) ) { roar_disconnect(vss->con); } roar_mm_free(vss); return 0; }
static int op_roar_close(void) { roar_vs_close(vss, ROAR_VS_FALSE, &err); roar_disconnect(&con); return 0; }
static int op_roar_open(sample_format_t sf, const channel_position_t *channel_map) { struct roar_audio_info info; int ret; memset(&info, 0, sizeof(info)); ROAR_DBG("op_roar_open(*) = ?"); format = sf; info.rate = sf_get_rate(sf); info.channels = sf_get_channels(sf); info.bits = sf_get_bits(sf); if (sf_get_bigendian(sf)) { if (sf_get_signed(sf)) { info.codec = ROAR_CODEC_PCM_S_BE; } else { info.codec = ROAR_CODEC_PCM_U_BE; } } else { if (sf_get_signed(sf)) { info.codec = ROAR_CODEC_PCM_S_LE; } else { info.codec = ROAR_CODEC_PCM_U_LE; } } ROAR_DBG("op_roar_open(*) = ?"); if (roar_libroar_set_server(host) == -1) { ROAR_DBG("op_roar_open(*) = ?"); roar_err_to_errno(); return -OP_ERROR_ERRNO; } if ( roar_simple_connect2(&con, NULL, "C* Music Player (cmus)", ROAR_ENUM_FLAG_NONBLOCK, 0) == -1 ) { ROAR_DBG("op_roar_open(*) = ?"); roar_err_to_errno(); return -OP_ERROR_ERRNO; } vss = roar_vs_new_from_con(&con, &err); if (vss == NULL) { ROAR_DBG("op_roar_open(*) = ?"); roar_disconnect(&con); _err_to_errno(); return -OP_ERROR_ERRNO; } if (roar_vs_stream(vss, &info, ROAR_DIR_PLAY, &err) == -1) { ROAR_DBG("op_roar_open(*) = ?"); roar_disconnect(&con); _err_to_errno(); return -OP_ERROR_ERRNO; } ROAR_DBG("op_roar_open(*) = ?"); if (roar_vs_buffer(vss, 2048*8, &err) == -1) { roar_vs_close(vss, ROAR_VS_TRUE, NULL); roar_disconnect(&con); _err_to_errno(); return -OP_ERROR_ERRNO; } ROAR_DBG("op_roar_open(*) = ?"); ret = _set_role(); if (ret != 0) { roar_vs_close(vss, ROAR_VS_TRUE, NULL); roar_disconnect(&con); _err_to_errno(); return ret; } ROAR_DBG("op_roar_open(*) = ?"); if (roar_vs_blocking(vss, ROAR_VS_FALSE, &err) == -1) { /* FIXME: handle this error */ } ROAR_DBG("op_roar_open(*) = 0"); return 0; }
int main (int argc, char * argv[]) { char * server = NULL; char * k; int i; struct roar_connection con; for (i = 1; i < argc; i++) { k = argv[i]; if ( !strcmp(k, "--server") || !strcmp(k, "-s") ) { server = argv[++i]; } else if ( !strcmp(k, "--codec") ) { } else if ( !strcmp(k, "--help") || !strcmp(k, "-h") ) { usage(); return 0; } else if ( *k == '-' ) { fprintf(stderr, "Error: unknown argument: %s\n", k); usage(); return 1; } else { break; } } if ( roar_simple_connect(&con, server, "roarlight") == -1 ) { fprintf(stderr, "Error: Can not connect to server\n"); return 1; } if ( i == argc ) { fprintf(stderr, "Error: No Commands given\n"); return 0; // this is not a fatal error... } for (; i < argc; i++) { k = argv[i]; // cmd is in k printf("--- [ %s ] ---\n", k); if ( !strcmp(k, "help") ) { usage(); } else if ( !strcmp(k, "sleep") ) { sleep(atoi(argv[++i])); } else if ( !strcmp(k, "set") ) { i++; if ( cmd_set(&con, argv[i]) == -1 ) { fprintf(stderr, "Error: can not set channels\n"); } else { printf("channels changed\n"); } } else { fprintf(stderr, "Error: invalid command: %s\n", k); } } roar_disconnect(&con); return 0; }
int main (int argc, char * argv[]) { int rate = 44100; int bits = 16; int channels = 2; int codec = ROAR_CODEC_OGG_VORBIS; char * server = NULL; char * k; int i; int in = -1; char * file = NULL; char * host; int port; FILE * http; struct roar_connection con[1]; struct roar_stream stream[1]; char buf0[80], buf1[80]; int proto = P_UNKNOWN; for (i = 1; i < argc; i++) { k = argv[i]; if ( strcmp(k, "--server") == 0 ) { server = argv[++i]; } else if ( strcmp(k, "--rate") == 0 ) { rate = atoi(argv[++i]); } else if ( strcmp(k, "--bits") == 0 ) { bits = atoi(argv[++i]); } else if ( strcmp(k, "--channels") == 0 || strcmp(k, "--chans") == 0 ) { channels = atoi(argv[++i]); } else if ( strcmp(k, "--codec") == 0 ) { codec = roar_str2codec(argv[++i]); } else if ( strcmp(k, "--help") == 0 ) { usage(); return 0; } else if ( file == NULL ) { file = argv[i]; } else { fprintf(stderr, "Error: unknown argument: %s\n", k); usage(); return 1; } } if ( file == NULL ) { file = "/dev/stdin"; in = ROAR_STDIN; } else { if ( strncmp(file, "http://", 7) == 0 ) { proto = P_HTTP; host = file+7; port = 80; } else if ( strncmp(file, "gopher://", 9) == 0 ) { proto = P_GOPHER; host = file+9; port = 70; } else { fprintf(stderr, "Error: unknown protocol: %s\n", file); return 20; } if ( proto == P_HTTP || proto == P_GOPHER ) { for (i = 0; host[i] != 0; i++) { if ( host[i] == ':' ) { port = atoi(host+i+1); // atoi() ignores the rest after '/' host[i] = 0; } else if ( host[i] == '/' ) { file = host+i; break; } } if ( !*file ) { file = "/"; if ( (in = roar_socket_connect(host, port)) == -1 ) { ROAR_ERR("can not connect to remote server %s (port %i): %s", host, port, strerror(errno)); return 0; } } else { *file = 0; if ( (in = roar_socket_connect(host, port)) == -1 ) { ROAR_ERR("can not connect to remote server %s (port %i): %s", host, port, strerror(errno)); return 0; } *file = '/'; } switch (proto) { case P_HTTP: if ( (http = fdopen(in, "r+")) == NULL ) { ROAR_ERR("can not create FILE* object: %s", strerror(errno)); return 0; } fprintf(http, "GET %s HTTP/1.1\r\n", file); fprintf(http, "Host: %s\r\n", host); fprintf(http, "User-Agent: roarradio $Revision: 1.9 $\r\n"); fprintf(http, "Connection: close\r\n"); fprintf(http, "\r\n"); fflush(http); if ( fscanf(http, "%79s %i %79s\n", buf0, &port, buf1) != 3 ) { ROAR_ERR("HTTP protocol error!, no initial HTTP/1.x-line!"); return 1; } if ( port != 200 ) { // 200 = HTTP OK ROAR_ERR("HTTP Error: %i - %s", port, buf1); return 1; } *buf0 = 0; while (*buf0 != '\r' && *buf0 != '\n') { fgets(buf0, 80, http); } fflush(http); break; case P_GOPHER: if ( file[0] == 0 ) { file[0] = '/'; file[1] = 0; } else if ( file[0] == '/' && file[1] != 0 && file[2] == '/' ) { // strip the type prefix file += 2; } // TODO: do some error checks here write(in, file, strlen(file)); write(in, "\r\n", 2); ROAR_SHUTDOWN(in, SHUT_WR); break; } } else { if ( (in = open(file, O_RDONLY, 0644)) == -1 ) { ROAR_ERR("can not open file: %s: %s", file, strerror(errno)); return 1; } } } if ( in == -1 ) { ROAR_ERR("No open file, bad. This should not happen"); return 1; } if ( roar_simple_connect(con, server, "roarradio") == -1 ) { ROAR_ERR("Can not connect to server"); return 1; } if ( roar_stream_new(stream, rate, channels, bits, codec) == -1 ) { roar_disconnect(con); return 1; } if ( roar_stream_connect(con, stream, ROAR_DIR_PLAY) == -1 ) { roar_disconnect(con); return 1; } if ( roar_stream_passfh(con, stream, in) == -1 ) { roar_disconnect(con); return 1; } close(in); if ( roar_stream_attach_simple(con, stream, 0) == -1 ) { ROAR_ERR("Can not attach stream to server"); } roar_disconnect(con); return 0; }
int main (int argc, char * argv[]) { struct roar_connection con; struct roar_client client; char * server = NULL; char * k; int i; int clientfh = -1; int cflags = 0; int flags = 0; int proto = ROAR_PROTO_ROARAUDIO; int byteorder = ROAR_BYTEORDER_NETWORK; int mode = ROAR_SOCKET_MODE_NONE; int type = ROAR_SOCKET_TYPE_UNKNOWN; char * host = NULL; int port = -1; for (i = 1; i < argc; i++) { k = argv[i]; if ( !strcmp(k, "--server") || !strcmp(k, "-s") ) { server = argv[++i]; } else if ( !strcmp(k, "--stdin") ) { cflags |= F_STDIN; } else if ( !strcmp(k, "--stdout") ) { cflags |= F_STDOUT; } else if ( !strcmp(k, "--stderr") ) { cflags |= F_STDERR; } else if ( !strcmp(k, "--stdio") ) { cflags |= F_STDIN|F_STDOUT; } else if ( !strcmp(k, "--client-fh") ) { clientfh = atoi(argv[++i]); } else if ( !strcmp(k, "--proto") ) { proto = roar_str2proto(argv[++i]); } else if ( !strcmp(k, "--byteorder") ) { byteorder = roar_str2byteorder(argv[++i]); } else if ( !strcmp(k, "--listen") ) { flags |= ROAR_CLIENTPASS_FLAG_LISTEN; } else if ( !strcmp(k, "--mode") ) { k = argv[++i]; if ( !strcasecmp(k, "none") ) { mode = ROAR_SOCKET_MODE_NONE; } else if ( !strcasecmp(k, "listen") ) { mode = ROAR_SOCKET_MODE_LISTEN; flags |= ROAR_CLIENTPASS_FLAG_LISTEN; } else if ( !strcasecmp(k, "connect") ) { mode = ROAR_SOCKET_MODE_CONNECT; flags -= ROAR_CLIENTPASS_FLAG_LISTEN; } else { ROAR_ERR("unknown mode: %s", k); return 1; } } else if ( !strcmp(k, "--bind") ) { host = argv[++i]; } else if ( !strcmp(k, "--port") ) { port = atoi(argv[++i]); } else if ( !strcmp(k, "--help") || !strcmp(k, "-h") ) { usage(); return 0; } else { ROAR_ERR("unknown argument: %s", k); usage(); return 1; } } if ( cflags & F_STDERR ) { #ifdef ROAR_HAVE_SYSLOG roar_debug_set_stderr_mode(ROAR_DEBUG_MODE_SYSLOG); #else roar_debug_set_stderr_fh(-1); #endif } else { roar_debug_set_stderr_fh(ROAR_STDERR); } if ( mode != ROAR_SOCKET_MODE_NONE ) { if ( clientfh != -1 ) { ROAR_ERR("Too may socket types given"); return 30; } clientfh = roar_socket_open(mode, type, host, port); if ( clientfh == -1 ) { ROAR_ERR("Unabled to open socket"); return 31; } } if ( clientfh == -1 ) { if ( cflags & F_STDIN ) { clientfh = ROAR_STDIN; } else if ( cflags & F_STDOUT ) { clientfh = ROAR_STDOUT; } else if ( cflags & F_STDERR ) { clientfh = ROAR_STDERR; } else { ROAR_ERR("No client socket given"); return 32; } } roar_client_new(&client); roar_client_set_fh(&client, clientfh); roar_client_set_proto(&client, proto, byteorder); if ( roar_simple_connect(&con, server, "roarclientpass") == -1 ) { ROAR_ERR("Can not connect to server"); return 10; } if ( roar_client_pass(&con, &client, flags) == -1 ) { ROAR_ERR("Can not pass client fh to server"); roar_disconnect(&con); return 20; } roar_disconnect(&con); return 0; }
int main (int argc, char * argv[]) { struct roar_audio_info info = {.rate = ROAR_RATE_DEFAULT, .bits = ROAR_BITS_DEFAULT, .channels = ROAR_CHANNELS_DEFAULT, .codec = ROAR_CODEC_DEFAULT }; struct roar_audio_info dinfo; struct roar_vio_calls dvio, svio, svio_jumbo, svio_real; struct roar_vio_calls * svio_p; struct roardsp_filter * filter; char * driver = DRIVER; char * device = NULL; char * server = NULL; char * k; int i; union { int32_t i32; size_t size; } tmp; memset(&g_conf, 0, sizeof(g_conf)); g_conf.antiecho = AE_ROARD; g_conf.dtx_threshold = -1; g_conf.ioflush_interval = -1; memset(&g_cons, 0, sizeof(g_cons)); g_cons.state = CON_NONE; memset(&g_meta, 0, sizeof(g_meta)); roardsp_fchain_init(&(g_filterchains.input)); roardsp_fchain_init(&(g_filterchains.output)); for (i = 1; i < argc; i++) { k = argv[i]; if ( strcmp(k, "--server") == 0 ) { server = argv[++i]; } else if ( strcmp(k, "--jumbo-mtu") == 0 ) { g_conf.jumbo_mtu = atoi(argv[++i]); } else if ( strcmp(k, "--io-flush") == 0 ) { g_conf.ioflush_interval = atoi(argv[++i]); } else if ( strcmp(k, "--rate") == 0 ) { info.rate = atoi(argv[++i]); } else if ( strcmp(k, "--bits") == 0 ) { info.bits = atoi(argv[++i]); } else if ( strcmp(k, "--channels") == 0 || strcmp(k, "--chans") == 0 ) { info.channels = atoi(argv[++i]); } else if ( strcmp(k, "--afi-downmix") == 0 ) { g_conf.filter.in.downmix = 1; } else if ( strcmp(k, "--afi-lowpass") == 0 ) { g_conf.filter.in.lowp_freq = atof(argv[++i]); } else if ( strcmp(k, "--afi-speex-prep") == 0 ) { g_conf.filter.in.speex_prep = 1; } else if ( strcmp(k, "--afi-speex-denoise") == 0 ) { g_conf.filter.in.speex_prep = 1; g_conf.filter.in.speex_prep_denoise = 1; } else if ( strcmp(k, "--afi-speex-agc") == 0 ) { g_conf.filter.in.speex_prep = 1; g_conf.filter.in.speex_prep_agc = 1; } else if ( strcmp(k, "--afi-speex-vad") == 0 ) { g_conf.filter.in.speex_prep = 1; g_conf.filter.in.speex_prep_vad = 1; } else if ( strcmp(k, "--codec") == 0 ) { info.codec = roar_str2codec(argv[++i]); } else if ( strcmp(k, "--driver") == 0 ) { driver = argv[++i]; } else if ( strcmp(k, "--device") == 0 ) { device = argv[++i]; } else if ( strcmp(k, "--antiecho") == 0 ) { k = argv[++i]; if ( !strcmp(k, "none") ) { g_conf.antiecho = AE_NONE; } else if ( !strcmp(k, "simple") ) { g_conf.antiecho = AE_SIMPLE; } else if ( !strcmp(k, "speex") ) { g_conf.antiecho = AE_SPEEX; } else if ( !strcmp(k, "roard") ) { g_conf.antiecho = AE_ROARD; } else { fprintf(stderr, "Error: unknown mode: %s\n", k); return 1; } } else if ( strcmp(k, "--threshold") == 0 ) { g_conf.dtx_threshold = atol(argv[++i]); // use threshold^2 or threshold < 0 for not using DTX if ( g_conf.dtx_threshold > 0 ) g_conf.dtx_threshold *= g_conf.dtx_threshold; } else if ( strcmp(k, "--transcode") == 0 ) { g_conf.transcode = 1; // META DATA: } else if ( strcmp(k, "--m-rn") == 0 ) { g_meta.rn = argv[++i]; } else if ( strcmp(k, "--m-nick") == 0 ) { g_meta.nick = argv[++i]; } else if ( strcmp(k, "--m-email") == 0 ) { g_meta.email = argv[++i]; } else if ( strcmp(k, "--m-hp") == 0 ) { g_meta.hp = argv[++i]; } else if ( strcmp(k, "--m-thumbn") == 0 ) { g_meta.thumbnail = argv[++i]; } else if ( strcmp(k, "--m-loc") == 0 ) { g_meta.loc = argv[++i]; } else if ( strcmp(k, "--m-org") == 0 ) { g_meta.org = argv[++i]; } else if ( strcmp(k, "--help") == 0 ) { usage(); return 0; } else { fprintf(stderr, "Error: unknown argument: %s\n", k); usage(); return 1; } } // ignore errors, maybe it will work even if this fails // (btw. it will never fail without crashing the rest of the app ;) roar_libroar_set_server(server); if ( g_conf.antiecho == AE_SPEEX ) { ROAR_WARN("Speex Antiecho is obsolete and may be removed in future versions. Use --antiecho roard"); } g_conf.samples = info.channels * info.rate / TIMEDIV; memcpy(&dinfo, &info, sizeof(dinfo)); if ( g_conf.transcode ) { dinfo.bits = 16; dinfo.codec = ROAR_CODEC_DEFAULT; switch (info.codec) { case ROAR_CODEC_ALAW: case ROAR_CODEC_MULAW: info.bits = 8; break; case ROAR_CODEC_ROAR_CELT: info.bits = 16; break; case ROAR_CODEC_ROAR_SPEEX: info.bits = 16; break; } } if ( roar_cdriver_open(&dvio, driver, device, &dinfo, ROAR_DIR_BIDIR) == -1 ) { ROAR_ERR("Can not open sound card."); return 1; } ROAR_DBG("main(*): CALL open_stream(&svio, server, &info)"); if ( open_stream(&svio_real, server, &info) == -1 ) { ROAR_ERR("Can not open connection to server."); roar_vio_close(&dvio); return 2; } ROAR_DBG("main(*): RET"); if ( roar_vio_open_re(&svio, &svio_real) == -1 ) { ROAR_ERR("Can not open connection to server (RE VIO)."); roar_vio_close(&dvio); return 2; } if ( g_conf.jumbo_mtu ) { if ( roar_vio_open_jumbo(&svio_jumbo, &svio, g_conf.jumbo_mtu) == -1 ) { roar_vio_close(&dvio); roar_vio_close(&svio); return 2; } svio_p = &svio_jumbo; } else { svio_p = &svio; } set_meta(); if ( g_conf.transcode ) { dinfo.codec = info.codec; if ( roar_bixcoder_init(transcoder, &dinfo, svio_p) == -1 ) { roar_vio_close(&svio); roar_vio_close(&dvio); return 10; } // ignore errors as it may also work if this fails roar_bixcoder_write_header(transcoder); roar_bixcoder_read_header(transcoder); g_conf.samples = 8 * roar_bixcoder_packet_size(transcoder, -1) / dinfo.bits; } #define _err(x) roar_vio_close(&dvio); roar_vio_close(&svio); return (x) if ( g_conf.filter.in.downmix ) { if ( roardsp_filter_new(&filter, &(g_cons.stream), ROARDSP_FILTER_DOWNMIX) == -1 ) { _err(2); } if ( roardsp_fchain_add(&(g_filterchains.input), filter) == -1 ) { _err(2); } } if ( g_conf.filter.in.lowp_freq > 1 ) { if ( roardsp_filter_new(&filter, &(g_cons.stream), ROARDSP_FILTER_LOWP) == -1 ) { _err(2); } if ( roardsp_filter_ctl(filter, ROARDSP_FCTL_FREQ, &(g_conf.filter.in.lowp_freq)) == -1 ) { _err(2); } if ( roardsp_fchain_add(&(g_filterchains.input), filter) == -1 ) { _err(2); } } if ( g_conf.filter.in.speex_prep ) { if ( roardsp_filter_new(&filter, &(g_cons.stream), ROARDSP_FILTER_SPEEX_PREP) == -1 ) { _err(2); } tmp.size = g_conf.samples; if ( roardsp_filter_ctl(filter, ROARDSP_FCTL_PACKET_SIZE, &tmp) == -1 ) { _err(2); } tmp.i32 = 0; if ( g_conf.filter.in.speex_prep_denoise ) tmp.i32 |= ROARDSP_SPEEX_PREP_DENOISE_ON; if ( g_conf.filter.in.speex_prep_agc ) tmp.i32 |= ROARDSP_SPEEX_PREP_AGC_ON; if ( g_conf.filter.in.speex_prep_vad ) tmp.i32 |= ROARDSP_SPEEX_PREP_VAD_ON; if ( roardsp_filter_ctl(filter, ROARDSP_FCTL_MODE, &tmp) == -1 ) { _err(2); } if ( roardsp_fchain_add(&(g_filterchains.input), filter) == -1 ) { _err(2); } } #undef _err ROAR_DBG("main(*): CALL run_stream(&dvio, &svio, &info);"); run_stream(&dvio, svio_p, &info); ROAR_DBG("main(*): RET"); roar_bixcoder_close(transcoder); roar_vio_close(svio_p); roar_vio_close(&dvio); roardsp_fchain_uninit(&(g_filterchains.input)); roardsp_fchain_uninit(&(g_filterchains.output)); roar_disconnect(&(g_cons.con)); return 0; }
int main (int argc, char * argv[]) { int rate = 44100; int bits = 16; int channels = 2; int codec = ROAR_CODEC_DEFAULT; char * server = NULL; char * k; int i; int in = ROAR_STDIN; struct roar_connection con; struct roar_stream s; for (i = 1; i < argc; i++) { k = argv[i]; if ( strcmp(k, "--server") == 0 ) { server = argv[++i]; } else if ( strcmp(k, "--rate") == 0 ) { rate = atoi(argv[++i]); } else if ( strcmp(k, "--bits") == 0 ) { bits = atoi(argv[++i]); } else if ( strcmp(k, "--channels") == 0 || strcmp(k, "--chans") == 0 ) { channels = atoi(argv[++i]); } else if ( strcmp(k, "--codec") == 0 ) { codec = roar_str2codec(argv[++i]); } else if ( strcmp(k, "--help") == 0 ) { usage(); return 0; } else { fprintf(stderr, "Error: unknown argument: %s\n", k); usage(); return 1; } } if ( roar_simple_connect(&con, server, "roarcatpassfh") == -1 ) { ROAR_DBG("roar_simple_play(*): roar_simple_connect() faild!"); return 1; } if ( roar_stream_new(&s, rate, channels, bits, codec) == -1 ) { roar_disconnect(&con); return 1; } if ( roar_stream_connect(&con, &s, ROAR_DIR_PLAY) == -1 ) { roar_disconnect(&con); return 1; } if ( roar_stream_passfh(&con, &s, in) == -1 ) { roar_disconnect(&con); return 1; } close(in); sleep(1000); roar_disconnect(&con); return 0; }
int main (int argc, char * argv[]) { struct roar_connection con; char * server = NULL; char * k = NULL; int i; int t = 0; for (i = 1; i < argc; i++) { k = argv[i]; if ( strcmp(k, "--server") == 0 ) { server = argv[++i]; } else if ( strcmp(k, "-v") == 0 || strcmp(k, "--verbose") == 0 ) { g_verbose++; } else if ( strcmp(k, "--help") == 0 ) { usage(); return 0; } else if ( strcmp(k, "--list-aiprofiles") == 0 ) { list_aiprofiles(); return 0; } else if ( strcmp(k, "--enum-servers") == 0 ) { enum_servers(); return 0; } else if ( *k == '-' ) { fprintf(stderr, "Error: unknown argument: %s\n", k); usage(); return 1; } else { break; } } // connect if ( roar_simple_connect(&con, server, "roarctl") == -1 ) { fprintf(stderr, "Error: Can not connect to server\n"); return 1; } if ( i == argc ) { fprintf(stderr, "Error: No Commands given\n"); return 0; // this is not a fatal error... } for (; i < argc; i++) { k = argv[i]; // cmd is in k printf("--- [ %s ] ---\n", k); if ( !strcmp(k, "help") ) { usage(); } else if ( !strcmp(k, "sleep") ) { sleep(atoi(argv[++i])); } else if ( !strcmp(k, "ping") ) { #ifdef ROAR_HAVE_GETTIMEOFDAY if ( ping(&con, atoi(argv[++i])) == -1 ) { fprintf(stderr, "Error: can not ping\n"); } #else fprintf(stderr, "Error: ping not supported.\n"); i++; #endif } else if ( !strcmp(k, "standby") || !strcmp(k, "off") ) { if ( roar_set_standby(&con, ROAR_STANDBY_ACTIVE) == -1 ) { fprintf(stderr, "Error: can not set mode to standby\n"); } else { printf("going into standby\n"); } } else if ( !strcmp(k, "resume") || !strcmp(k, "on") ) { if ( roar_set_standby(&con, ROAR_STANDBY_INACTIVE) == -1 ) { fprintf(stderr, "Error: can not set mode to active\n"); } else { printf("going into active mode\n"); } } else if ( !strcmp(k, "exit") ) { if ( roar_terminate(&con, 0) == -1 ) { fprintf(stderr, "Error: can not quit server\n"); } else { printf("Server quited\n"); break; } } else if ( !strcmp(k, "terminate") ) { if ( roar_terminate(&con, 1) == -1 ) { fprintf(stderr, "Error: can not terminate server\n"); } else { printf("Server got asked to quited\n"); break; } } else if ( !strcmp(k, "standbymode") ) { t = roar_get_standby(&con); if ( t == -1 ) { fprintf(stderr, "Error: can not get stanby mode\n"); } else if ( t == ROAR_STANDBY_ACTIVE ) { printf("Server is in standby\n"); } else if ( t == ROAR_STANDBY_INACTIVE ) { printf("Server is active\n"); } else { fprintf(stderr, "Error: unknown standby mode: %i\n", t); } } else if ( !strcmp(k, "whoami") ) { printf("My client ID is: %i\n", roar_get_clientid(&con)); } else if ( !strcmp(k, "serverinfo") ) { server_info(&con); } else if ( !strcmp(k, "serveroinfo") ) { server_oinfo(&con); } else if ( !strcmp(k, "serverstandards") ) { server_standards(&con); } else if ( !strcmp(k, "listclients") ) { list_clients(&con); } else if ( !strcmp(k, "liststreams") ) { list_streams(&con); } else if ( !strcmp(k, "allinfo") ) { server_oinfo(&con); printf("\n"); list_clients(&con); printf("\n"); list_streams(&con); } else if ( !strcmp(k, "kick") ) { t = roar_str2ot((k = argv[++i])); if ( t == -1 ) { fprintf(stderr, "Error: unknown type: %s\n", k); continue; } //t = atoi(argv[i++]); if ( roar_kick(&con, t, atoi(argv[++i])) == -1 ) { fprintf(stderr, "Error: can not kick %s\n", k); } else { printf("%s kicked\n", k); } } else if ( !strcmp(k, "newvirtual") ) { if ( newvirtual(&con, argv[i+1], argv[i+2], argv[i+3], argv[i+4], argv[i+5], argv[i+6]) == -1 ) { fprintf(stderr, "Error: can not create new virtual stream\n"); } else { printf("virtual stream created\n"); } i += 6; } else if ( !strcmp(k, "volume") ) { if ( set_mixer(&con, &i, argc, argv) == -1 ) { fprintf(stderr, "Error: can not set volume\n"); } else { printf("volume changed\n"); } } else if ( !strcmp(k, "flag") ) { i++; if ( set_flags(&con, atoi(argv[i]), ROAR_SET_FLAG, argv[i+1]) == -1 ) { fprintf(stderr, "Error: can not set flags\n"); } else { printf("flags changed\n"); } i++; } else if ( !strcmp(k, "unflag") ) { i++; if ( set_flags(&con, atoi(argv[i]), ROAR_RESET_FLAG, argv[i+1]) == -1 ) { fprintf(stderr, "Error: can not reset flags\n"); } else { printf("flags changed\n"); } i++; } else if ( !strcmp(k, "metaset") ) { i++; if ( set_meta(&con, atoi(argv[i]), argv[i+1], argv[i+2], argv[i+3]) == -1 ) { fprintf(stderr, "Error: can not set meta data\n"); } else { printf("meta data changed\n"); } i += 3; } else if ( !strcmp(k, "metaget") ) { i++; if ( show_meta_type(&con, atoi(argv[i]), argv[i+1]) == -1 ) { fprintf(stderr, "Error: can not get meta data\n"); } i++; } else if ( !strcmp(k, "metasave") ) { i++; if ( save_meta(&con, atoi(argv[i]), argv[i+1]) == -1 ) { fprintf(stderr, "Error: can not get meta data\n"); } else { printf("meta data saved\n"); } i++; } else if ( !strcmp(k, "metaload") ) { i++; if ( load_meta(&con, atoi(argv[i]), argv[i+1]) == -1 ) { fprintf(stderr, "Error: can not set meta data\n"); } else { printf("meta data saved\n"); } i++; } else if ( !strcmp(k, "listaiprofiles") || !strcmp(k, "listprofiles") ) { if ( list_aiprofiles() == -1 ) { fprintf(stderr, "Error: can not list profiles\n"); } } else if ( !strcmp(k, "aiprofileget") || !strcmp(k, "profileget") ) { i++; if ( show_aiprofile(argv[i]) == -1 ) { fprintf(stderr, "Error: can not get profile data\n"); } } else { fprintf(stderr, "Error: invalid command: %s\n", k); } } roar_disconnect(&con); return 0; }