Changeset 1271:7ff82047e706 in roaraudio


Ignore:
Timestamp:
02/27/09 16:28:44 (15 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

wrote a working writer, done things for the sync() code, still need to do some work

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroar/vio_cmd.c

    r1269 r1271  
    9999 struct roar_vio_cmd_state * state = (struct roar_vio_cmd_state *)vio->inst; 
    100100 
     101 if ( state->writer.opened ) { 
     102  if ( state->writer.out != -1 ) { 
     103   close(state->writer.out); 
     104   state->writer.out = -1; 
     105  } 
     106 } 
     107 
     108 roar_vio_cmd_sync(vio); 
     109 
    101110 if ( state->reader.opened ) 
    102111  roar_vio_cmd_wait(&(state->reader)); 
     
    210219 char * tp   = NULL; 
    211220 size_t tlen = 0; 
     221 int    nonblock = state->options & ROAR_VIO_CMD_OPTS_NONBLOCK; 
     222 int    in, out; 
    212223 
    213224 ROAR_DBG("roar_vio_cmd_read(*) = ?"); 
     
    224235 } 
    225236 
     237 in  = state->reader.in; 
     238 out = state->reader.out; 
     239 
    226240 while (done < count) { 
    227   if ( state->options & ROAR_VIO_CMD_OPTS_NONBLOCK ) { 
     241  if ( nonblock ) { 
    228242   tv.tv_sec  =    0; 
    229243   tv.tv_usec =    1; 
     
    236250  FD_ZERO(wfhs); 
    237251 
    238   FD_SET(state->reader.in,  rfhs); 
    239  
    240   if ( state->reader.out != -1 ) { 
    241    FD_SET(state->reader.out, wfhs); 
     252  FD_SET(in,  rfhs); 
     253 
     254  if ( out != -1 ) { 
     255   FD_SET(out, wfhs); 
    242256  } 
    243257 
    244258#ifdef DEBUG 
    245   if ( FD_ISSET(state->reader.in, rfhs) ) { 
     259  if ( FD_ISSET(in, rfhs) ) { 
    246260   ROAR_DBG("roar_vio_cmd_read(*): reader set in fh group"); 
    247261  } 
    248262#endif 
    249263 
    250   max_fh = state->reader.in > state->reader.out ? state->reader.in : state->reader.out; 
     264  max_fh = in > out ? in : out; 
    251265  ROAR_DBG("roar_vio_cmd_read(*): max_fh=%i", max_fh); 
    252266 
     
    255269 
    256270  ROAR_DBG("roar_vio_cmd_read(*): select(*) = %i", ret); 
    257   ROAR_DBG("roar_vio_cmd_read(*): reader=%i, writer=%i", state->reader.in, state->reader.out); 
     271  ROAR_DBG("roar_vio_cmd_read(*): reader=%i, writer=%i", in, out); 
    258272 
    259273  if ( ret > 0 ) { 
    260    if ( FD_ISSET(state->reader.in, rfhs) ) { 
     274   if ( FD_ISSET(in, rfhs) ) { 
    261275    ROAR_DBG("roar_vio_cmd_read(*): event on reader"); 
    262276 
    263     if ( (ret = read(state->reader.in, buf+done, count-done)) == -1 ) 
     277    if ( (ret = read(in, buf+done, count-done)) == -1 ) 
    264278     break; 
    265279 
     
    270284   } 
    271285 
    272    if ( state->reader.out != -1 && FD_ISSET(state->reader.out, wfhs) ) { 
     286   if ( out != -1 && FD_ISSET(out, wfhs) ) { 
    273287    ROAR_DBG("roar_vio_cmd_read(*): event on writer"); 
    274288 
     
    281295 
    282296    if ( tlen ) { 
    283      if ( (ret = write(state->reader.out, tp, tlen)) > 0 ) { 
     297     if ( (ret = write(out, tp, tlen)) > 0 ) { 
    284298      tlen -= ret; 
    285299      tp   += ret; 
    286300     } 
    287301    } else { 
    288      close(state->reader.out); 
    289      state->reader.out = -1; 
     302     close(out); 
     303     state->reader.out = out = -1; 
    290304    } 
    291305   } 
    292306  } 
    293307 
    294   if ( state->options & ROAR_VIO_CMD_OPTS_NONBLOCK ) 
     308  if ( nonblock ) 
    295309   break; 
    296310 } 
     
    306320ssize_t roar_vio_cmd_write   (struct roar_vio_calls * vio, void *buf, size_t count) { 
    307321 struct roar_vio_cmd_state * state = (struct roar_vio_cmd_state *)vio->inst; 
     322 fd_set rfhs[1], wfhs[1]; 
     323 struct timeval tv; 
     324 size_t done = 0; 
     325 int max_fh; 
     326 int ret; 
     327 char   tbuf[ROAR_VIO_CMD_BUFSIZE]; 
     328 int    nonblock = state->options & ROAR_VIO_CMD_OPTS_NONBLOCK; 
     329 int    in, out; 
    308330 
    309331 if ( !state->writer.opened ) { 
     
    318340 } 
    319341 
     342 in  = state->writer.in; 
     343 out = state->writer.out; 
     344 
     345 if ( buf == NULL ) { // we are requested to sync 
     346  if ( in != -1 ) { 
     347   ret = 1; 
     348   done = 0; 
     349   while (ret > 0) { 
     350    tv.tv_sec  = 0; 
     351    tv.tv_usec = done ? 1 : 500000; // half a sec 
     352 
     353    done++; 
     354 
     355    FD_ZERO(rfhs); 
     356    FD_SET(in, rfhs); 
     357 
     358    if ( select(in+1, rfhs, NULL, NULL, &tv) < 1 ) 
     359     break; 
     360 
     361    ret = read(in, tbuf, ROAR_VIO_CMD_BUFSIZE); 
     362 
     363    if ( roar_vio_write(state->next, tbuf, ret) != ret ) 
     364     return -1; 
     365   } 
     366  } 
     367 
     368  return 0; 
     369 } 
     370 
     371 while (done < count) { 
     372  if ( nonblock ) { 
     373   tv.tv_sec  =    0; 
     374   tv.tv_usec =    1; 
     375  } else { 
     376   tv.tv_sec  = 3600; 
     377   tv.tv_usec =    0; 
     378  } 
     379 
     380  FD_ZERO(rfhs); 
     381  FD_ZERO(wfhs); 
     382 
     383  FD_SET(out, wfhs); 
     384 
     385  if ( in != -1 ) { 
     386   FD_SET(in,  rfhs); 
     387  } 
     388 
     389  max_fh = in > out ? in : out; 
     390 
     391  if ( (ret = select(max_fh + 1, rfhs, wfhs, NULL, &tv)) == -1 ) 
     392   return -1; 
     393 
     394  if ( ret > 0 ) { 
     395   if ( FD_ISSET(out, wfhs) ) { 
     396 
     397    if ( (ret = write(out, buf+done, count-done)) == -1 ) 
     398     break; 
     399 
     400    if ( ret == 0 ) 
     401     break; 
     402 
     403    done += ret; 
     404   } 
     405   if ( in != -1 && FD_ISSET(in, wfhs) ) { 
     406    if ( (ret = read(in, tbuf, ROAR_VIO_CMD_BUFSIZE)) == -1 ) { /* error case: can not read on reader -> EOF */ 
     407     close(in); 
     408     state->writer.in = in = -1; 
     409     break; 
     410    } 
     411 
     412    if ( roar_vio_write(state->next, tbuf, ret) != ret ) 
     413     return -1; 
     414   } 
     415  } 
     416 
     417  if ( nonblock ) 
     418   break; 
     419 } 
    320420 
    321421 return -1; 
Note: See TracChangeset for help on using the changeset viewer.