Changeset 5388:e5cc8e03a3e1 in roaraudio for libroar


Ignore:
Timestamp:
01/17/12 11:27:07 (10 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

Added support for refcount based VIOs as well as dynamically allocated VIOs (non-stack or global VIOs) (Closes: #127)

Location:
libroar
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • libroar/vio.c

    r5381 r5388  
    5353 memset((void*)calls, 0, sizeof(struct roar_vio_calls)); 
    5454 calls->flags = ROAR_VIO_FLAGS_NONE; 
    55  calls->refc  = 0; 
     55 calls->refc  = 1; 
    5656 
    5757 return 0; 
     
    202202} 
    203203 
    204 int     roar_vio_close    (struct roar_vio_calls * vio) { 
     204 
     205int     roar_vio_ref      (struct roar_vio_calls * vio) { 
     206 if ( vio == NULL ) { 
     207  roar_err_set(ROAR_ERROR_FAULT); 
     208  return -1; 
     209 } 
     210 
     211 vio->refc++; 
     212 
     213 return 0; 
     214} 
     215 
     216int     roar_vio_unref    (struct roar_vio_calls * vio) { 
    205217 int ret; 
    206218 
    207  ROAR_DBG("roar_vio_close(vio=%p) = ?", vio); 
    208  
    209  if ( vio == NULL ) { 
    210   roar_err_set(ROAR_ERROR_FAULT); 
    211   return -1; 
    212  } 
    213  
    214  if ( vio->close == NULL ) { 
     219 ROAR_DBG("roar_vio_unref(vio=%p) = ?", vio); 
     220 
     221 if ( vio == NULL ) { 
     222  roar_err_set(ROAR_ERROR_FAULT); 
     223  return -1; 
     224 } 
     225 
     226 if ( vio->refc == 1 && vio->close == NULL ) { 
    215227  roar_err_set(ROAR_ERROR_NOSYS); 
    216228  return -1; 
    217229 } 
     230 
     231 vio->refc--; 
     232 
     233 if ( vio->refc ) 
     234  return 0; 
    218235 
    219236 roar_err_clear_all(); 
     
    221238 roar_err_update(); 
    222239 
     240 if ( vio->flags & ROAR_VIO_FLAGS_FREESELF ) 
     241  roar_mm_free(vio); 
     242 
    223243 return ret; 
    224244} 
     
    257277 
    258278 memset((void*)calls, 0, sizeof(struct roar_vio_calls)); 
     279 calls->flags    = ROAR_VIO_FLAGS_NONE; 
     280 calls->refc     = 1; 
    259281 
    260282 calls->read     = roar_vio_basic_read; 
     
    642664 
    643665 memset((void*)calls, 0, sizeof(struct roar_vio_calls)); 
     666 calls->flags    = ROAR_VIO_FLAGS_NONE; 
     667 calls->refc     = 1; 
    644668 
    645669 calls->read     = roar_vio_pass_read; 
  • libroar/vio_bio.c

    r5381 r5388  
    4242 
    4343 memset(calls, 0, sizeof(struct roar_vio_calls)); 
     44 calls->flags    = ROAR_VIO_FLAGS_NONE; 
     45 calls->refc     = 1; 
    4446 
    4547 calls->read     = roar_vio_bio_read; 
  • libroar/vio_buffer.c

    r5381 r5388  
    5959 
    6060 memset(calls, 0, sizeof(struct roar_vio_calls)); 
     61 calls->flags    = ROAR_VIO_FLAGS_NONE; 
     62 calls->refc     = 1; 
    6163 
    6264 calls->inst     = self; 
  • libroar/vio_buffer_store.c

    r5381 r5388  
    5050 
    5151 memset(calls, 0, sizeof(struct roar_vio_calls)); 
     52 calls->flags    = ROAR_VIO_FLAGS_NONE; 
     53 calls->refc     = 1; 
    5254 
    5355 if ( inst != NULL ) 
  • libroar/vio_cmd.c

    r5381 r5388  
    5454 // clear all 
    5555 memset(calls, 0, sizeof(struct roar_vio_calls)); 
     56 calls->flags    = ROAR_VIO_FLAGS_NONE; 
     57 calls->refc     = 1; 
    5658 memset(state, 0, sizeof(struct roar_vio_cmd_state)); 
    5759 
     
    233235 // clear all 
    234236 memset(calls, 0, sizeof(struct roar_vio_calls)); 
     237 calls->flags    = ROAR_VIO_FLAGS_NONE; 
     238 calls->refc     = 1; 
    235239 memset(state, 0, sizeof(struct roar_vio_2popen_state)); 
    236240 
  • libroar/vio_dstr.c

    r5381 r5388  
    411411} 
    412412 
     413struct roar_vio_calls * roar_vio_open_dstr_simple_new(const char * dstr, int o_flags) { 
     414 struct roar_vio_calls * ret = roar_mm_malloc(sizeof(struct roar_vio_calls)); 
     415 int err; 
     416 
     417 if ( ret == NULL ) 
     418  return NULL; 
     419 
     420 if ( roar_vio_open_dstr_simple(ret, dstr, o_flags) == -1 ) { 
     421  err = roar_error; 
     422  roar_mm_free(ret); 
     423  roar_error = err; 
     424  return NULL; 
     425 } 
     426 
     427 ret->flags |= ROAR_VIO_FLAGS_FREESELF; 
     428 
     429 return ret; 
     430} 
     431 
    413432int     roar_vio_open_dstr    (struct roar_vio_calls * calls, const char * dstr, struct roar_vio_defaults * def, int dnum) { 
    414433 return roar_vio_open_dstr_vio(calls, dstr, def, dnum, NULL); 
  • libroar/vio_jumbo.c

    r5381 r5388  
    5353 
    5454 memset(calls, 0, sizeof(struct roar_vio_calls)); 
     55 calls->flags    = ROAR_VIO_FLAGS_NONE; 
     56 calls->refc     = 1; 
    5557 calls->inst     = self; 
    5658 calls->close    = roar_vio_jumbo_close; 
  • libroar/vio_misc.c

    r5381 r5388  
    106106 
    107107 memset(calls, 0, sizeof(struct roar_vio_calls)); 
     108 calls->flags    = ROAR_VIO_FLAGS_NONE; 
     109 calls->refc     = 1; 
    108110 calls->read     = roar_vio_misc_read; 
    109111 calls->write    = roar_vio_misc_write; 
  • libroar/vio_pipe.c

    r5381 r5388  
    125125 
    126126 memset(s, 0, sizeof(struct roar_vio_calls)); 
     127 s->flags    = ROAR_VIO_FLAGS_NONE; 
     128 s->refc     = 1; 
    127129 
    128130 s->close    = roar_vio_pipe_close; 
  • libroar/vio_rtp.c

    r5381 r5388  
    110110 
    111111 memset(calls, 0, sizeof(struct roar_vio_calls)); 
     112 calls->flags    = ROAR_VIO_FLAGS_NONE; 
     113 calls->refc     = 1; 
    112114 
    113115 calls->inst               = self; 
  • libroar/vio_stack.c

    r5381 r5388  
    5656 memset(self,  0, sizeof(struct roar_vio_stack)); 
    5757 memset(calls, 0, sizeof(struct roar_vio_calls)); 
     58 calls->flags    = ROAR_VIO_FLAGS_NONE; 
     59 calls->refc     = 1; 
    5860 
    5961 self->free      = func; 
  • libroar/vio_stdio.c

    r5381 r5388  
    4242 
    4343 memset(calls, 0, sizeof(struct roar_vio_calls)); 
     44 calls->flags    = ROAR_VIO_FLAGS_NONE; 
     45 calls->refc     = 1; 
    4446 
    4547 calls->read  = roar_vio_stdio_read; 
  • libroar/vio_tantalos.c

    r5381 r5388  
    9797   return 0; 
    9898 
    99   memset(calls, 0, sizeof(*calls)); 
     99  memset(calls, 0, sizeof(struct roar_vio_calls)); 
    100100 } 
    101101 
  • libroar/vio_zlib.c

    r5381 r5388  
    538538 
    539539 memset(calls, 0, sizeof(struct roar_vio_calls)); 
     540 calls->flags      = ROAR_VIO_FLAGS_NONE; 
     541 calls->refc       = 1; 
    540542 
    541543 calls->inst       = self; 
Note: See TracChangeset for help on using the changeset viewer.