Changeset 5022:b2a2e896974d in roaraudio for roarclients/roarbidir.c
- Timestamp:
- 05/27/11 17:13:54 (13 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
roarclients/roarbidir.c
r4997 r5022 50 50 char * server = NULL; 51 51 char * k; 52 int fh;53 52 int i; 54 int in = -1; 55 int out = -1; 53 struct roar_vio_defaults def; 54 struct roar_vio_calls in_store; 55 struct roar_vio_calls * in = NULL, * out = NULL; 56 struct roar_vio_calls * vss_vio = NULL; 57 roar_vs_t * vss; 58 struct roar_vio_select vios[2]; 56 59 char buf[BUFSIZE]; 57 fd_set sl; 58 struct timeval tv; 59 int max_fh; 60 int err; 61 ssize_t ret; 62 63 if ( roar_vio_dstr_init_defaults(&def, ROAR_VIO_DEF_TYPE_NONE, O_RDONLY, 0644) == -1 ) 64 return 1; 60 65 61 66 for (i = 1; i < argc; i++) { … … 75 80 usage(); 76 81 return 0; 77 } else if ( in == -1) {78 if ( (in = open(k, O_RDONLY, 0644)) == -1 ) {79 fprintf(stderr, "Error: can not open file: %s: %s\n", k, strerror(errno));82 } else if ( in == NULL ) { 83 if ( roar_vio_open_dstr(&in_store, k, &def, 1) == -1 ) { 84 fprintf(stderr, "Error: can not open file: %s: %s\n", k, roar_error2str(roar_error)); 80 85 return 1; 81 86 } 87 in = &in_store; 82 88 } else { 83 89 fprintf(stderr, "Error: unknown argument: %s\n", k); … … 87 93 } 88 94 89 if ( ( fh = roar_simple_stream(rate, channels, bits, codec, server, ROAR_DIR_BIDIR, "roarbidir")) == -1) {90 fprintf(stderr, "Error: can not start playback: %s\n", roar_error2str( roar_error));91 if ( in != -1)92 close(in);95 if ( (vss = roar_vs_new_simple(server, "roarbidir", rate, channels, codec, bits, ROAR_DIR_BIDIR, &err)) == NULL ) { 96 fprintf(stderr, "Error: can not start playback: %s\n", roar_error2str(err)); 97 if ( in != NULL ) 98 roar_vio_close(in); 93 99 return 1; 94 100 } 95 101 96 if ( in == -1)97 in = ROAR_STDIN;98 if ( out == -1)99 out = ROAR_STDOUT;102 if ( in == NULL ) 103 in = roar_stdin; 104 if ( out == NULL ) 105 out = roar_stdout; 100 106 101 max_fh = (in > fh ? in : fh) + 1; 102 i = 1; 107 vss_vio = roar_vs_vio_obj(vss, NULL); 103 108 104 while (i > 0) { 105 FD_ZERO(&sl); 106 FD_SET(in, &sl); 107 FD_SET(fh, &sl); 109 while (1) { 110 memset(vios, 0, sizeof(vios)); 108 111 109 tv.tv_sec = 0;110 tv.tv_usec = 50000;112 ROAR_VIO_SELECT_SETVIO(&(vios[0]), vss_vio, ROAR_VIO_SELECT_READ); 113 ROAR_VIO_SELECT_SETVIO(&(vios[1]), in, ROAR_VIO_SELECT_READ); 111 114 112 if (select(max_fh, &sl, NULL, NULL, &tv) > 0) { 113 if ( FD_ISSET(fh, &sl) ) { 114 if ( (i = read(fh, buf, BUFSIZE)) == -1 ) 115 return -1; 116 if ( write(out, buf, i) != i ) 117 return -1; 118 } 119 if ( FD_ISSET(in, &sl) ) { 120 if ( (i = read(in, buf, BUFSIZE)) == -1 ) 121 return -1; 122 if ( write(fh, buf, i) != i ) 123 return -1; 124 } 115 if ( (ret = roar_vio_select(vios, 2, NULL, NULL)) == -1 ) 116 break; 117 118 if ( ret < 0 ) 119 continue; 120 121 if ( vios[0].eventsa & ROAR_VIO_SELECT_READ ) { 122 if ( (ret = roar_vs_read(vss, buf, sizeof(buf), NULL)) == -1 ) 123 break; 124 if ( roar_vio_write(out, buf, ret) != ret ) 125 break; 126 } 127 if ( vios[1].eventsa & ROAR_VIO_SELECT_READ ) { 128 if ( (ret = roar_vio_read(in, buf, sizeof(buf))) == -1 ) 129 break; 130 if ( roar_vs_write(vss, buf, ret, NULL) != ret ) 131 break; 125 132 } 126 133 } 127 134 128 roar_ simple_close(fh);135 roar_vs_close(vss, ROAR_VS_TRUE, NULL); 129 136 130 close(in);137 roar_vio_close(in); 131 138 132 139 return 0;
Note: See TracChangeset
for help on using the changeset viewer.