Changeset 3275:8786fd84f600 in roaraudio


Ignore:
Timestamp:
02/01/10 11:31:03 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

implement write()

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • include/libroar/vio_rtp.h

    r3273 r3275  
    107107 struct roar_vio_calls * vio; 
    108108 struct roar_rtp_header header; 
     109 struct roar_buffer    * tx; 
    109110}; 
    110111 
  • libroar/vio_rtp.c

    r3274 r3275  
    6767 
    6868ssize_t roar_vio_rtp_read    (struct roar_vio_calls * vio, void *buf, size_t count); 
    69 ssize_t roar_vio_rtp_write   (struct roar_vio_calls * vio, void *buf, size_t count); 
     69ssize_t roar_vio_rtp_write   (struct roar_vio_calls * vio, void *buf, size_t count) { 
     70 struct roar_rtp_inst * self = vio->inst; 
     71 size_t len_need = count + sizeof(struct roar_rtp_header); // this is a bit more than we need 
     72                                                           // we ignore this at the moment 
     73 size_t len_have; 
     74 union { 
     75  void     * vp; 
     76  char     * cp; 
     77  uint16_t * u16; 
     78  uint32_t * u32; 
     79 } data; 
     80 size_t  dataoffset; 
     81 ssize_t ret; 
     82 int     i; 
     83 
     84 if ( self->tx == NULL ) { 
     85  if ( roar_buffer_new(&(self->tx), len_need) == -1 ) 
     86   return -1; 
     87 
     88  len_have = len_need; 
     89 } else { 
     90  if ( roar_buffer_get_len(self->tx, &len_have) == -1 ) 
     91   return -1; 
     92 
     93  if ( len_have < len_need ) { 
     94   if ( roar_buffer_set_len(self->tx, len_need) == -1 ) { 
     95    if ( roar_buffer_free(self->tx) == -1 ) 
     96     return -1; 
     97 
     98    self->tx = NULL; 
     99    return roar_vio_rtp_write(vio, buf, count); // restart ower self from the beginning with no buffer 
     100   } 
     101  } 
     102 } 
     103 
     104 if ( roar_buffer_get_data(self->tx, &(data.vp)) == -1 ) 
     105  return -1; 
     106 
     107 memset(data.vp, 0, len_need); 
     108 
     109 data.cp[0]   = 2; 
     110 data.cp[0]  |= self->header.csrc_count   << 4; 
     111 data.cp[1]  |= self->header.payload_type << 1; 
     112 
     113 data.u16[1]  = self->header.seq_num; 
     114 
     115 data.u32[1]  = self->header.ts; 
     116 data.u32[2]  = self->header.ssrc; 
     117 
     118 for (i = 0; i < self->header.csrc_count; i++) { 
     119  data.u32[3+i] = self->header.csrc[i]; 
     120 } 
     121 
     122 dataoffset   = 3*4 + self->header.csrc_count*4; 
     123 
     124 memcpy(data.vp + dataoffset, buf, count); 
     125 
     126 if ( (ret = roar_vio_write(self->vio, data.vp, count+dataoffset)) == -1 ) 
     127  return -1; 
     128 
     129 return ret - dataoffset; 
     130} 
     131 
    70132off_t   roar_vio_rtp_lseek   (struct roar_vio_calls * vio, off_t offset, int whence); 
    71133 
     
    108170 ret = roar_vio_close(self->vio); 
    109171 
     172 if ( self->tx != NULL ) 
     173  if ( roar_buffer_free(self->tx) == -1 ) 
     174   ret = -1; 
     175 
    110176 roar_mm_free(self); 
    111177 
Note: See TracChangeset for help on using the changeset viewer.