Changeset 1017:055034719a76 in roaraudio
- Timestamp:
- 12/21/08 11:14:58 (15 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
roarclients/roarmonhttp.c
r1016 r1017 27 27 #define BUFSIZE 1024 28 28 29 void print_header (int codec) { 30 char * mime = "application/octet-stream"; 31 32 switch (codec) { 33 case ROAR_CODEC_OGG_VORBIS: 34 mime = "application/ogg"; 35 break; 36 } 37 38 printf("Content-type: %s\r\n", mime); 39 printf("\r\n"); 40 41 fflush(stdout); 42 } 43 44 int stream (int dest, int src) { 45 struct roar_buffer *ring = NULL, *cur; 46 ssize_t len; 47 size_t todo; 48 fd_set fsi[1], fso[1]; 49 struct timeval tv; 50 int alive = 1; 51 int maxfh = (dest > src ? dest : src) + 1; 52 void * data; 53 54 roar_socket_nonblock(src, ROAR_SOCKET_NONBLOCK); 55 roar_socket_nonblock(dest, ROAR_SOCKET_NONBLOCK); 56 57 while (alive) { 58 FD_ZERO(fsi); 59 FD_ZERO(fso); 60 FD_SET(src, fsi); 61 FD_SET(dest, fso); 62 63 tv.tv_sec = 0; 64 tv.tv_usec = 100000; // 100ms 65 66 if (select(maxfh, fsi, fso, NULL, &tv) > 0) { 67 if ( FD_ISSET(src, fsi) ) { // we can read! 68 if ( roar_buffer_new(&cur, BUFSIZE) == -1 ) 69 return -1; 70 71 if ( roar_buffer_get_data(cur, &data) == -1 ) 72 return -1; 73 74 len = read(src, data, BUFSIZE); 75 76 switch (len) { 77 case 0: 78 case -1: 79 roar_buffer_free(cur); 80 81 if ( ring != NULL ) 82 roar_buffer_free(ring); 83 84 return -1; 85 break; 86 } 87 88 if ( ring == NULL ) { 89 ring = cur; 90 } else { 91 roar_buffer_add(ring, cur); 92 } 93 } else if ( FD_ISSET(dest, fso) && ring != NULL ) { // we can write! 94 if ( roar_buffer_get_data(ring, &data) == -1 ) 95 return -1; 96 97 if ( roar_buffer_get_len(ring, &todo) == -1 ) 98 return -1; 99 100 len = write(dest, data, todo); 101 102 if ( len < 1 ) { 103 if ( errno != EAGAIN ) { 104 roar_buffer_free(ring); 105 return -1; 106 } 107 } 108 109 if ( todo == len ) { // we wrote all of the pkg 110 if ( roar_buffer_next(&ring) == -1 ) 111 return -1; 112 } else { 113 if ( roar_buffer_set_offset(ring, len) == -1 ) 114 return -1; 115 } 116 117 } 118 } 119 } 120 121 return 0; 122 } 123 29 124 int main (int argc, char * argv[]) { 30 125 int rate = 44100; 31 126 int bits = 16; 32 127 int channels = 2; 33 int codec = ROAR_CODEC_OGG_VORBIS; 128 // int codec = ROAR_CODEC_OGG_VORBIS; 129 int codec = ROAR_CODEC_DEFAULT; 34 130 char * server = NULL; 35 char * k;36 131 int fh; 37 int i;38 int out = -1;39 char buf[BUFSIZE];40 41 for (i = 1; i < argc; i++) {42 k = argv[i];43 44 if ( strcmp(k, "--server") == 0 ) {45 server = argv[++i];46 } else if ( strcmp(k, "--rate") == 0 ) {47 rate = atoi(argv[++i]);48 } else if ( strcmp(k, "--bits") == 0 ) {49 bits = atoi(argv[++i]);50 } else if ( strcmp(k, "--channels") == 0 ) {51 channels = atoi(argv[++i]);52 } else if ( strcmp(k, "--codec") == 0 ) {53 codec = roar_str2codec(argv[++i]);54 } else if ( strcmp(k, "--help") == 0 ) {55 return 0;56 } else if ( out == -1 ) {57 if ( (out = open(k, O_CREAT|O_TRUNC|O_WRONLY, 0644)) == -1 ) {58 fprintf(stderr, "Error: can not open file: %s: %s\n", k, strerror(errno));59 return 1;60 }61 } else {62 fprintf(stderr, "Error: unknown argument: %s\n", k);63 return 1;64 }65 }66 67 if ( out == -1 )68 out = ROAR_STDOUT;69 132 70 133 if ( (fh = roar_simple_monitor(rate, channels, bits, codec, server, "roarmon")) == -1 ) { … … 73 136 } 74 137 138 print_header(codec); 139 140 /* 75 141 while((i = read(fh, buf, BUFSIZE))) 76 142 if (write(out, buf, i) != i) 77 143 break; 144 */ 145 146 stream(ROAR_STDOUT, fh); 78 147 79 148 roar_simple_close(fh);
Note: See TracChangeset
for help on using the changeset viewer.