Changeset 1017:055034719a76 in roaraudio


Ignore:
Timestamp:
12/21/08 11:14:58 (15 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

print header, do the main loop as IO buffer

File:
1 edited

Legend:

Unmodified
Added
Removed
  • roarclients/roarmonhttp.c

    r1016 r1017  
    2727#define BUFSIZE 1024 
    2828 
     29void 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 
     44int 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 
    29124int main (int argc, char * argv[]) { 
    30125 int    rate     = 44100; 
    31126 int    bits     = 16; 
    32127 int    channels = 2; 
    33  int    codec    = ROAR_CODEC_OGG_VORBIS; 
     128// int    codec    = ROAR_CODEC_OGG_VORBIS; 
     129 int    codec    = ROAR_CODEC_DEFAULT; 
    34130 char * server   = NULL; 
    35  char * k; 
    36131 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; 
    69132 
    70133 if ( (fh = roar_simple_monitor(rate, channels, bits, codec, server, "roarmon")) == -1 ) { 
     
    73136 } 
    74137 
     138 print_header(codec); 
     139 
     140/* 
    75141 while((i = read(fh, buf, BUFSIZE))) 
    76142  if (write(out, buf, i) != i) 
    77143   break; 
     144*/ 
     145 
     146 stream(ROAR_STDOUT, fh); 
    78147 
    79148 roar_simple_close(fh); 
Note: See TracChangeset for help on using the changeset viewer.