Changeset 5388:e5cc8e03a3e1 in roaraudio


Ignore:
Timestamp:
01/17/12 11:27:07 (12 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)

Files:
35 edited

Legend:

Unmodified
Added
Removed
  • ChangeLog

    r5380 r5388  
    11v. 1.0beta0 - ? 
    22        * Updated API (SONAME change) 
    3           (Closes: #184, #185, #128, #135, #134, #133, #129, #188, #126) 
     3          (Closes: #184, #185, #128, #135, #134, #133, #129, #188, #126, #127) 
    44        * Do not set errno to zero in ogg_vorbis codec filter (Closes: #191) 
    55        * Updated data types for struct roar_audio_info (Closes: #189) 
  • include/libroar/vio.h

    r5381 r5388  
    5252 
    5353#define ROAR_VIO_FLAGS_NONE        0x00000000UL 
    54 #define ROAR_VIO_FLAGS_FREESELF    0x00000020UL /* Free the VIO object */ 
     54#define ROAR_VIO_FLAGS_FREESELF    0x00000001UL /* Free the VIO object */ 
    5555 
    5656struct roar_connection; 
     
    8181int     roar_vio_sync    (struct roar_vio_calls * vio) _LIBROAR_ATTR_NONNULL_ALL; 
    8282int     roar_vio_ctl     (struct roar_vio_calls * vio, roar_vio_ctl_t cmd, void * data) _LIBROAR_ATTR_USE_RESULT _LIBROAR_ATTR_NONNULL(1); 
    83 int     roar_vio_close   (struct roar_vio_calls * vio) _LIBROAR_ATTR_NONNULL_ALL; 
     83 
     84#define roar_vio_close(x) roar_vio_unref((x)) 
     85int     roar_vio_ref     (struct roar_vio_calls * vio) _LIBROAR_ATTR_NONNULL_ALL; 
     86int     roar_vio_unref   (struct roar_vio_calls * vio) _LIBROAR_ATTR_NONNULL_ALL; 
    8487 
    8588// specal commands: 
  • include/libroar/vio_dstr.h

    r5381 r5388  
    199199 
    200200int     roar_vio_open_dstr_simple(struct roar_vio_calls * calls, const char * dstr, int o_flags); 
     201struct roar_vio_calls * roar_vio_open_dstr_simple_new(const char * dstr, int o_flags); 
    201202 
    202203int     roar_vio_open_dstr    (struct roar_vio_calls * calls, const char * dstr, struct roar_vio_defaults * def, int dnum); 
  • 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; 
  • libroardsp/vio_transcode.c

    r5381 r5388  
    4444 
    4545 memset(calls, 0, sizeof(struct roar_vio_calls)); 
     46 calls->flags  = ROAR_VIO_FLAGS_NONE; 
     47 calls->refc   = 1; 
    4648 
    4749 calls->inst   = (void*)xcoder; 
     
    115117 
    116118 memset(calls, 0, sizeof(struct roar_vio_calls)); 
     119 calls->flags = ROAR_VIO_FLAGS_NONE; 
     120 calls->refc  = 1; 
    117121 
    118  calls->inst   = (void*)bixcoder; 
     122 calls->inst  = (void*)bixcoder; 
    119123 
    120  calls->close  = roar_vio_bixcode_close; 
     124 calls->close = roar_vio_bixcode_close; 
    121125 
    122126 calls->read  = roar_vio_bixcode_read; 
  • libroareio/driver.c

    r5381 r5388  
    3838 
    3939 memset(calls, 0, sizeof(struct roar_vio_calls)); 
     40 calls->flags = ROAR_VIO_FLAGS_NONE; 
     41 calls->refc  = 1; 
    4042 calls->read  = roar_vio_null_rw; 
    4143 calls->write = roar_vio_null_rw; 
  • roard/beep.c

    r5381 r5388  
    6161 
    6262 memset(vio, 0, sizeof(struct roar_vio_calls)); 
    63  
     63 vio->flags = ROAR_VIO_FLAGS_NONE; 
     64 vio->refc  = 1; 
    6465 vio->inst  = inst; 
    6566 vio->read  = beep_read; 
  • roard/container_framework.c

    r5381 r5388  
    169169 
    170170 memset(vio, 0, sizeof(struct roar_vio_calls)); 
    171  vio->inst = inst; 
    172  
     171 vio->flags = ROAR_VIO_FLAGS_NONE; 
     172 vio->refc  = 1; 
     173 vio->inst  = inst; 
    173174 vio->read  = cont_fw_read; 
    174175 vio->write = cont_fw_write; 
     
    238239int     cont_pvio_open    (struct roar_vio_calls * vio, void * inst) { 
    239240 memset(vio, 0, sizeof(struct roar_vio_calls)); 
     241 vio->flags = ROAR_VIO_FLAGS_NONE; 
     242 vio->refc  = 1; 
    240243 
    241244 vio->inst  = inst; 
  • roard/driver.c

    r5381 r5388  
    220220    if ( g_driver[i].open == NULL ) { // this is the null driver 
    221221     memset(calls, 0, sizeof(struct roar_vio_calls)); 
     222     calls->flags = ROAR_VIO_FLAGS_NONE; 
     223     calls->refc  = 1; 
    222224     calls->read  = roar_vio_null_rw; 
    223225     calls->write = roar_vio_null_rw; 
  • roard/driver_alsa.c

    r5381 r5388  
    225225 
    226226 memset(inst, 0, sizeof(struct roar_vio_calls)); 
     227 inst->flags    = ROAR_VIO_FLAGS_NONE; 
     228 inst->refc     = 1; 
    227229 
    228230 inst->inst     = (void*) interface; 
  • roard/driver_ao.c

    r5381 r5388  
    131131 
    132132 memset(inst, 0, sizeof(struct roar_vio_calls)); 
     133 inst->flags    = ROAR_VIO_FLAGS_NONE; 
     134 inst->refc     = 1; 
    133135 inst->inst     = (void*) aodevice; 
    134136 inst->write    = driver_ao_write; 
  • roard/driver_artsc.c

    r5381 r5388  
    119119 
    120120 memset(inst, 0, sizeof(struct roar_vio_calls)); 
     121 inst->flags    = ROAR_VIO_FLAGS_NONE; 
     122 inst->refc     = 1; 
    121123 
    122124 inst->inst     = (void*) self; 
  • roard/driver_jack.c

    r5381 r5388  
    6161 // set up VIO: 
    6262 memset(inst, 0, sizeof(struct roar_vio_calls)); 
     63 inst->flags    = ROAR_VIO_FLAGS_NONE; 
     64 inst->refc     = 1; 
    6365 
    6466 inst->read     = driver_jack_read; 
  • roard/driver_oss.c

    r5381 r5388  
    3535 
    3636 memset(vio, 0, sizeof(struct roar_vio_calls)); 
     37 vio->flags    = ROAR_VIO_FLAGS_NONE; 
     38 vio->refc     = 1; 
    3739 
    3840 vio->write    = driver_oss_write; 
  • roard/driver_portaudio.c

    r5381 r5388  
    120120 
    121121 memset(inst, 0, sizeof(struct roar_vio_calls)); 
     122 inst->flags = ROAR_VIO_FLAGS_NONE; 
     123 inst->refc  = 1; 
    122124 
    123125 inst->inst  = self; 
  • roard/driver_pulsesimple.c

    r5381 r5388  
    121121 
    122122 memset(inst, 0, sizeof(struct roar_vio_calls)); 
     123 inst->flags    = ROAR_VIO_FLAGS_NONE; 
     124 inst->refc     = 1; 
    123125 
    124126 inst->inst     = self; 
  • roard/driver_rsound.c

    r5381 r5388  
    167167 
    168168 memset(inst, 0, sizeof(struct roar_vio_calls)); 
     169 inst->flags    = ROAR_VIO_FLAGS_NONE; 
     170 inst->refc     = 1; 
    169171 
    170172 inst->inst     = self; 
  • roard/driver_shout.c

    r5381 r5388  
    199199 
    200200 memset(inst, 0, sizeof(struct roar_vio_calls)); 
     201 inst->flags    = ROAR_VIO_FLAGS_NONE; 
     202 inst->refc     = 1; 
    201203 inst->inst     = (void*)shout; 
    202204 inst->write    = driver_shout_write; 
  • roard/driver_sndio.c

    r5381 r5388  
    3232 
    3333 memset(vio, 0, sizeof(struct roar_vio_calls)); 
     34 vio->flags    = ROAR_VIO_FLAGS_NONE; 
     35 vio->refc     = 1; 
    3436 
    3537 vio->close    = driver_sndio_close_vio; 
  • roard/driver_sysclock.c

    r5381 r5388  
    3939 memset(self, 0, sizeof(struct driver_sysclock)); 
    4040 memset(inst, 0, sizeof(struct roar_vio_calls)); 
     41 inst->flags    = ROAR_VIO_FLAGS_NONE; 
     42 inst->refc     = 1; 
    4143 
    4244 inst->inst     = self; 
  • roard/driver_wmm.c

    r5381 r5388  
    188188 // VIO Setup: 
    189189 memset(inst, 0, sizeof(struct roar_vio_calls)); 
     190 inst->flags    = ROAR_VIO_FLAGS_NONE; 
     191 inst->refc     = 1; 
    190192 inst->inst     = self; 
    191193 inst->close    = driver_wmm_close_vio; 
  • roard/sources.c

    r5381 r5388  
    441441 
    442442 memset(&(ss->vio), 0, sizeof(struct roar_vio_calls)); 
     443 ss->vio.flags    = ROAR_VIO_FLAGS_NONE; 
     444 ss->vio.refc     = 1; 
    443445 ss->vio.read     = sources_radionoise_read; 
    444446 ss->vio.close    = sources_radionoise_return_zero; 
Note: See TracChangeset for help on using the changeset viewer.