Changeset 2985:db2cf63584bc in roaraudio


Ignore:
Timestamp:
10/25/09 21:50:54 (15 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

wrote the jumbo layer

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroar/vio_jumbo.c

    r2982 r2985  
    3535#include "libroar.h" 
    3636 
     37int     roar_vio_open_jumbo    (struct roar_vio_calls * calls, struct roar_vio_calls * vio, size_t buffersize) { 
     38 struct roar_vio_jumbo * self; 
     39 
     40 if ( (self = roar_mm_malloc(sizeof(struct roar_vio_jumbo))) == NULL ) { 
     41  return -1; 
     42 } 
     43 
     44 memset(self, 0, sizeof(struct roar_vio_jumbo)); 
     45 
     46 self->backend = vio; 
     47 
     48 if ( roar_buffer_new(&(self->buffer), buffersize) == -1 ) { 
     49  roar_mm_free(self); 
     50  return -1; 
     51 } 
     52 
     53 memset(calls, 0, sizeof(struct roar_vio_calls)); 
     54 calls->inst     = self; 
     55 calls->close    = roar_vio_jumbo_close; 
     56 calls->read     = roar_vio_jumbo_read; 
     57 calls->write    = roar_vio_jumbo_write; 
     58 calls->lseek    = roar_vio_jumbo_lseek; 
     59 calls->nonblock = roar_vio_jumbo_nonblock; 
     60 calls->sync     = roar_vio_jumbo_sync; 
     61 calls->ctl      = roar_vio_jumbo_ctl; 
     62 
     63 return 0; 
     64} 
     65 
     66int     roar_vio_jumbo_close   (struct roar_vio_calls * vio) { 
     67 struct roar_vio_jumbo * self = vio->inst; 
     68 
     69 if ( roar_vio_jumbo_sync(vio) == -1 ) 
     70  return -1; 
     71 
     72 roar_buffer_free(self->buffer); 
     73 roar_mm_free(self); 
     74 
     75 return 0; 
     76} 
     77 
     78ssize_t roar_vio_jumbo_read    (struct roar_vio_calls * vio, void *buf, size_t count) { 
     79 struct roar_vio_jumbo * self = vio->inst; 
     80 
     81 return roar_vio_read(self->backend, buf, count); 
     82} 
     83 
     84ssize_t roar_vio_jumbo_write   (struct roar_vio_calls * vio, void *buf, size_t count) { 
     85 struct roar_vio_jumbo * self = vio->inst; 
     86 size_t   buflen; 
     87 void   * data; 
     88 
     89 if ( roar_buffer_get_len(self->buffer, &buflen) == -1 ) 
     90  return -1; 
     91 
     92 if ( roar_buffer_get_data(self->buffer, &data) == -1 ) 
     93  return -1; 
     94 
     95 if ( (self->pos + count) > buflen ) { 
     96  if ( roar_vio_jumbo_sync(vio) == -1 ) 
     97   return -1; 
     98 
     99  memcpy(data, buf, count); 
     100  self->pos = count; 
     101 } else { 
     102  memcpy(data + self->pos, buf, count); 
     103  self->pos += count; 
     104 } 
     105 
     106 return 0; 
     107} 
     108 
     109off_t   roar_vio_jumbo_lseek   (struct roar_vio_calls * vio, off_t offset, int whence) { 
     110 struct roar_vio_jumbo * self = vio->inst; 
     111 
     112 if ( roar_vio_jumbo_sync(vio) == -1 ) 
     113  return (off_t) -1; 
     114 
     115 return roar_vio_lseek(self->backend, offset, whence); 
     116} 
     117 
     118int     roar_vio_jumbo_nonblock(struct roar_vio_calls * vio, int state) { 
     119 struct roar_vio_jumbo * self = vio->inst; 
     120 
     121 return roar_vio_nonblock(self->backend, state); 
     122} 
     123 
     124int     roar_vio_jumbo_sync    (struct roar_vio_calls * vio) { 
     125 struct roar_vio_jumbo * self = vio->inst; 
     126 void                  * data; 
     127 
     128 if ( self->pos == 0 ) 
     129  return 0; 
     130 
     131 if ( roar_buffer_get_data(self->buffer, &data) == -1 ) 
     132  return -1; 
     133 
     134 // TODO: do this a bit more intelergent (RE?) 
     135 if ( roar_vio_write(self->backend, data, self->pos) != self->pos ) 
     136  return -1; 
     137 
     138 self->pos = 0; 
     139 
     140 return 0; 
     141} 
     142 
     143int     roar_vio_jumbo_ctl     (struct roar_vio_calls * vio, int cmd, void * data) { 
     144 return -1; 
     145} 
     146 
    37147//ll 
Note: See TracChangeset for help on using the changeset viewer.