Changeset 4815:df2ef6edb97f in roaraudio


Ignore:
Timestamp:
03/27/11 20:04:27 (13 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added support to roard for record streams.

Files:
11 edited

Legend:

Unmodified
Added
Removed
  • ChangeLog

    r4811 r4815  
    66        * Added aRts (artsc) driver to roard. 
    77        * Removed old -d and friends from roard (Closes: #122) 
     8        * added support to roard for record streams. 
    89 
    910v. 0.4beta4 - Sun Mar 20 2011 12:15 CET 
  • include/libroar/vio_ctl.h

    r4718 r4815  
    121121#define ROAR_VIO_CTL_GET_VOLUME    (ROAR_VIO_CTL_DRIVER|ROAR_VIO_CTL_GET|0x10) 
    122122#define ROAR_VIO_CTL_SET_VOLUME    (ROAR_VIO_CTL_DRIVER|ROAR_VIO_CTL_SET|0x10) 
     123#define ROAR_VIO_CTL_GET_RECORD    (ROAR_VIO_CTL_DRIVER|ROAR_VIO_CTL_GET|0x20) /* int */ 
     124#define ROAR_VIO_CTL_SET_RECORD    (ROAR_VIO_CTL_DRIVER|ROAR_VIO_CTL_SET|0x20) /* int */ 
    123125 
    124126// consts for ROAR_VIO_CTL_SHUTDOWN: 
  • roard/clients.c

    r4713 r4815  
    360360 int have_stream; 
    361361 
     362 ROAR_DBG("clients_check_all(void) = ?"); 
     363 
    362364 FD_ZERO(&r); 
    363365 FD_ZERO(&w); 
     
    371373   continue; 
    372374 
     375  ROAR_DBG("clients_check_all(void): i(client)=%i", i); 
     376 
    373377  if ( (fh = c->fh) != -1 ) { 
    374378   have++; 
     
    390394 
    391395  for (j = 0; j < ROAR_CLIENTS_MAX_STREAMS_PER_CLIENT; j++) { 
     396   ROAR_DBG("clients_check_all(void): i(client)=%i, j(stream)=%i", i, j); 
    392397   if ( (fh = streams_get_fh(c->streams[j])) != -1 ) { 
    393398    ROAR_DBG("clients_check_all(*): g_clients[i=%i]->streams[j=%i] = %i, fh = %i", i, j, c->streams[j], fh); 
     
    412417  } 
    413418 } 
     419 
     420 ROAR_DBG("clients_check_all(void): max_fh=%i", max_fh); 
    414421 
    415422 if ( max_fh == -1 ) 
     
    513520 return have; 
    514521#else 
     522 ROAR_DBG("clients_check_all(void) = -1"); 
    515523 return -1; 
    516524#endif 
  • roard/driver.c

    r4812 r4815  
    5050#define ROAR_DEFAULT_OSS_DEV "no default device" 
    5151#endif 
    52  { "oss", "Open Sound System", ROAR_DEFAULT_OSS_DEV, STREAM_DIR_OUT, DRV_FLAG_FHSEC, ROAR_SUBSYS_WAVEFORM, 
     52 { "oss", "Open Sound System", ROAR_DEFAULT_OSS_DEV, STREAM_DIR_BIDIR, DRV_FLAG_FHSEC, ROAR_SUBSYS_WAVEFORM, 
    5353   NULL, NULL, driver_oss_open}, 
    5454#endif 
     
    203203   } 
    204204 
     205   // if this driver does not support input we need to check if it is used in input mode. 
     206   if ( !(g_driver[i].mode & STREAM_DIR_IN) ) { 
     207    if ( sstream == NULL ) 
     208     return -1; 
     209 
     210    if ( streams_get_flag(ROAR_STREAM(sstream)->id, ROAR_FLAG_RECSOURCE) ) { 
     211     if ( streams_get_flag(ROAR_STREAM(sstream)->id, ROAR_FLAG_AUTOCONF) == 1 ) { 
     212      if ( streams_reset_flag(ROAR_STREAM(sstream)->id, ROAR_FLAG_RECSOURCE) == -1 ) 
     213       return -1; 
     214     } else { 
     215      ROAR_WARN("driver_openvio(*): driver(%s) is not abled to record data and autoconf flag is not set.", driver); 
     216      return -1; 
     217     } 
     218    } 
     219   } 
     220 
    205221   ROAR_DBG("driver_openvio(*): Opening VIO driver %s(%i)...", driver, i); 
    206222   return g_driver[i].vio_init(calls, device, info, fh, sstream); 
  • roard/driver_oss.c

    r4708 r4815  
    3737 
    3838 vio->write    = driver_oss_write; 
     39 vio->read     = driver_oss_read; 
    3940 vio->nonblock = driver_oss_nonblock; 
    4041 vio->sync     = driver_oss_sync; 
     
    4849 
    4950int driver_oss_open_device(struct driver_oss * self) { 
     51 int    flags  = 0; 
     52 int    rw     = 0; 
    5053 int    fh     = self->fh; 
    5154 char * device = self->device; 
     
    6467 } 
    6568 
    66  if ( (fh = open(device, O_WRONLY, 0644)) == -1 ) { 
     69 if ( self->ssid != -1 ) { 
     70  rw = streams_get_flag(self->ssid, ROAR_FLAG_RECSOURCE); 
     71 } 
     72 
     73 if ( rw ) { 
     74  flags |= O_RDWR; 
     75 } else { 
     76  flags |= O_WRONLY; 
     77 } 
     78 
     79 if ( (fh = open(device, flags, 0644)) == -1 ) { 
    6780  ROAR_ERR("driver_oss_open_device(*): Can not open OSS device: %s: %s", device, strerror(errno)); 
    6881  return -1; 
     
    324337 } 
    325338 
     339 ROAR_DBG("driver_oss_config_device(*): self->ssid=%i, fh=%i", self->ssid, fh); 
     340 streams_set_fh(self->ssid, -2); 
    326341 self->need_config = 0; 
    327342 
     343 ROAR_DBG("driver_oss_config_device(*) = 0"); 
    328344 return 0; 
    329345} 
     
    343359 self->ssid = -1; 
    344360 self->fh   = fh; 
     361 
     362 if ( sstream != NULL ) 
     363  self->ssid = ROAR_STREAM(sstream)->id; 
    345364 
    346365 if ( fh != -1 ) { 
     
    528547} 
    529548 
     549ssize_t driver_oss_read     (struct roar_vio_calls * vio, void *buf, size_t count) { 
     550 if ( _get(vio,fh) == -1 ) 
     551  return -1; 
     552 
     553 if ( _get(vio,need_config) ) { 
     554  if ( driver_oss_config_device(vio->inst) == -1 ) { 
     555   return -1; 
     556  } 
     557 } 
     558 
     559 return read(_get(vio,fh), buf, count); 
     560} 
     561 
    530562#endif 
    531563//ll 
  • roard/include/driver.h

    r4812 r4815  
    147147#define DRV_FLAG_FHSEC          0x01 
    148148 
     149#define ROAR_DRIVER_CTL_NOOP            ROAR_STREAM_CTL_COMP_DRV|0x0000 /* noop... */ 
     150#define ROAR_DRIVER_CTL_BASE            ROAR_STREAM_CTL_COMP_DRV|0x0000 /* Base ops... */ 
     151 
     152#define ROAR_DRIVER_CTL_SET             0x0002 
     153#define ROAR_DRIVER_CTL_GET             0x0003 
     154 
     155#define ROAR_DRIVER_CTL_RECORD          0x0010 
     156#define ROAR_DRIVER_CTL_SET_RECORD      ROAR_DRIVER_CTL_BASE|ROAR_DRIVER_CTL_RECORD|ROAR_DRIVER_CTL_SET 
     157 
     158 
     159#define ROAR_DRIVER_CTL2CMD(x)          ((x) & (~ROAR_STREAM_CTL_COMP_DRV)) 
     160 
     161 
     162 
    149163struct roar_driver { 
    150164 char * name; 
  • roard/include/driver_oss.h

    r4708 r4815  
    4545 
    4646ssize_t driver_oss_write    (struct roar_vio_calls * vio, void *buf, size_t count); 
     47ssize_t driver_oss_read     (struct roar_vio_calls * vio, void *buf, size_t count); 
    4748int     driver_oss_nonblock (struct roar_vio_calls * vio, int state); 
    4849int     driver_oss_close_vio(struct roar_vio_calls * vio); 
  • roard/include/streams.h

    r4753 r4815  
    210210ssize_t stream_vio_read (int stream, void *buf, size_t count); 
    211211ssize_t stream_vio_write(int stream, void *buf, size_t count); 
     212int     stream_vio_ctl  (int stream, int cmd,   void * data); 
    212213ssize_t stream_vio_s_read (struct roar_stream_server * stream, void *buf, size_t count); 
    213214ssize_t stream_vio_s_write(struct roar_stream_server * stream, void *buf, size_t count); 
     215int     stream_vio_s_ctl  (struct roar_stream_server * stream, int cmd,   void * data); 
    214216 
    215217#endif 
  • roard/roard.c

    r4811 r4815  
    940940  } else if ( !strcmp(k, "passmixer") ) { 
    941941   flag = ROAR_FLAG_PASSMIXER; 
     942  } else if ( !strcmp(k, "recsource") ) { 
     943   flag = ROAR_FLAG_RECSOURCE; 
    942944  } else { 
    943945   return -1; 
     
    11581160  } else if ( strcmp(k, "passmixer") == 0 ) { 
    11591161   streams_set_flag(stream, ROAR_FLAG_PASSMIXER); 
     1162  } else if ( strcmp(k, "recsource") == 0 ) { 
     1163   streams_set_flag(stream, ROAR_FLAG_RECSOURCE); 
    11601164  } else { 
    11611165   ROAR_ERR("add_output(*): unknown option '%s'", k); 
  • roard/streams.c

    r4753 r4815  
    590590  return -1; 
    591591 
    592  if ( ss->ready ) { 
     592 if ( ss->ready && !(s->fh == -1 && fh == -2) ) { 
    593593  ROAR_DBG("streams_set_fh(id=%i, fh=%i) = -1 // try to set fh for stream which is already ready", id, fh); 
    594594  return -1; 
    595595 } 
    596596 
    597  dir = ROAR_STREAM(ss)->dir; 
     597 dir = s->dir; 
    598598 
    599599 ROAR_DBG("streams_set_fh(id=%i, fh=%i): g_streams[id]->id=%i", id, fh, s->id); 
     
    902902int streams_set_flag     (int id, uint32_t flag) { 
    903903 int parent; 
     904 int tmp; 
    904905 
    905906 _CHECK_SID(id); 
     
    978979  } 
    979980 
     981  if ( g_streams[id]->ready ) { 
     982   tmp = 1; 
     983   if ( stream_vio_ctl(id, ROAR_VIO_CTL_SET_RECORD, &tmp) == -1 ) 
     984    return -1; 
     985  } 
     986 
    980987  streams_recsource_id = id; 
    981988 } 
     
    10001007 
    10011008int streams_reset_flag   (int id, uint32_t flag) { 
     1009 int tmp; 
     1010 
    10021011 _CHECK_SID(id); 
    10031012 
     
    10111020 } 
    10121021 
    1013  if ( flag & ROAR_FLAG_RECSOURCE ) 
    1014   if ( streams_recsource_id == id ) 
    1015    streams_recsource_id = -1; 
     1022 if ( (flag & ROAR_FLAG_RECSOURCE) && streams_recsource_id == id ) { 
     1023  if ( g_streams[id]->ready ) { 
     1024   tmp = 0; 
     1025   if ( stream_vio_ctl(id, ROAR_VIO_CTL_SET_RECORD, &tmp) == -1 ) 
     1026    return -1; 
     1027  } 
     1028 
     1029  streams_recsource_id = -1; 
     1030 } 
     1031 
    10161032 
    10171033 if ( flag & ROAR_FLAG_MMAP ) { 
     
    19591975  case ROAR_DIR_BIDIR: 
    19601976   break; 
     1977  case ROAR_DIR_OUTPUT: 
     1978    if ( !streams_get_flag(id, ROAR_FLAG_RECSOURCE) ) 
     1979     return 0; 
     1980   break; 
    19611981  default: 
    19621982/* 
     
    20572077 struct roar_buffer        *  bufbuf = NULL; 
    20582078 struct roar_remove_state     removalstate; 
    2059  void  * ip; 
     2079 void  * ip              = g_output_buffer; 
    20602080 void  * obuf; 
    20612081 int     olen; 
     
    21302150   break; 
    21312151 
     2152  case ROAR_DIR_RECORD: 
     2153    ip = g_input_buffer; 
     2154   break; 
    21322155  default: 
    21332156    return 0; 
     
    21612184  ROAR_DBG("streams_send_mon(id=%i): obuf=%p, olen=%i", id, obuf, olen); 
    21622185 } else { 
    2163   obuf = g_output_buffer; 
     2186  obuf = ip; 
    21642187  olen = g_output_buffer_len; 
    21652188 } 
    2166  
    2167  ip = g_output_buffer; 
    21682189 
    21692190 if ( antiecho ) { 
     
    23352356} 
    23362357 
     2358int     stream_vio_ctl  (int stream, int cmd,   void * data) { 
     2359 _CHECK_SID(stream); 
     2360 
     2361 return stream_vio_s_ctl(g_streams[stream], cmd, data); 
     2362} 
    23372363 
    23382364ssize_t stream_vio_s_read (struct roar_stream_server * stream, void *buf, size_t count) { 
     
    24432469} 
    24442470 
     2471int     stream_vio_s_ctl  (struct roar_stream_server * stream, int cmd,   void * data) { 
     2472 if ( stream == NULL ) 
     2473  return -1; 
     2474 
     2475 return roar_vio_ctl(stream->viop, cmd, data); 
     2476} 
     2477 
    24452478//ll 
  • roard/waveform.c

    r4708 r4815  
    6262 
    6363int waveform_update_mixer (void) { 
     64 size_t len; 
     65 
     66 // read recorded data...: 
     67 if ( streams_recsource_id != -1 ) { 
     68  len = g_input_buffer_len; 
     69  if ( stream_shift_out_buffer(streams_recsource_id, g_input_buffer, &len) == -1 ) { 
     70   ROAR_WARN("waveform_update_mixer(void): can not read record buffer."); 
     71   memset(g_input_buffer, 0, g_input_buffer_len); 
     72  } else { 
     73   if ( len < g_input_buffer_len ) 
     74    memset(g_input_buffer+len, 0, g_input_buffer_len-len); 
     75  } 
     76 } 
     77 
    6478 if ( streams_get_flag(g_waveform_mixer.stream, ROAR_FLAG_MUTE) == 1 ) { 
    6579  memset(g_output_buffer, 0, (g_sa->bits*ROAR_OUTPUT_BUFFER_SAMPLES*g_sa->channels)/8); 
Note: See TracChangeset for help on using the changeset viewer.