Changeset 1012:e0923fe24fa9 in roaraudio


Ignore:
Timestamp:
12/20/08 22:48:23 (15 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added support for writeing wave files, ha!

Location:
roard
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • roard/codecfilter.c

    r998 r1012  
    2828 {-1,                     "null", "null codec filter", NULL, ROAR_CODECFILTER_NONE, NULL, NULL, NULL, NULL, NULL, NULL}, 
    2929 
     30/* 
    3031#ifdef ROAR_HAVE_LIBSNDFILE 
    31  {ROAR_CODEC_RIFF_WAVE, "sndfile", "libsndfile codec filter", NULL, ROAR_CODECFILTER_READ, 
    32   cf_sndfile_open, cf_sndfile_close, NULL, NULL, cf_sndfile_read, NULL}, 
    33 #else 
     32 {ROAR_CODEC_RIFF_WAVE, "sndfile", "libsndfile codec filter", NULL, ROAR_CODECFILTER_READ|ROAR_CODECFILTER_WRITE, 
     33  cf_sndfile_open, cf_sndfile_close, NULL, cf_sndfile_write, cf_sndfile_read, NULL}, 
     34#else 
     35*/ 
    3436 {ROAR_CODEC_RIFF_WAVE, "RIFF/WAVE", "RIFF/WAVE", NULL, ROAR_CODECFILTER_READ, 
    35   cf_wave_open, cf_wave_close, NULL, NULL, cf_wave_read, NULL}, 
    36 #endif 
     37  cf_wave_open, cf_wave_close, NULL, cf_wave_write, cf_wave_read, NULL}, 
     38//#endif 
    3739 
    3840 {ROAR_CODEC_ALAW, "alaw", "A-Law", NULL, ROAR_CODECFILTER_READ|ROAR_CODECFILTER_WRITE, 
  • roard/codecfilter_sndfile.c

    r928 r1012  
    3939 obj->stream = info; 
    4040 
     41 ROAR_STREAM(info)->info.codec = ROAR_CODEC_DEFAULT; 
     42 
    4143 *inst = (CODECFILTER_USERDATA_T) obj; 
    4244 
     
    4547 s->info.codec = ROAR_CODEC_DEFAULT; 
    4648*/ 
     49 
     50 ROAR_WARN("cf_sndfile_open(*) = 0"); 
    4751 
    4852 return 0; 
     
    8589   return -1; 
    8690  } 
     91  ROAR_WARN("cf_sndfile_read(*): obj->info={.format=0x%.8x, .samplerate=%i, .channels=%i}", obj->info.format, obj->info.samplerate, obj->info.channels); 
    8792 
    8893  s->info.codec    = ROAR_CODEC_DEFAULT; 
     
    106111 
    107112int cf_sndfile_write(CODECFILTER_USERDATA_T   inst, char * buf, int len) { 
    108  return -1; 
     113 struct codecfilter_sndfile_inst * obj = (struct codecfilter_sndfile_inst *) inst; 
     114 struct roar_stream * s = ROAR_STREAM(obj->stream); 
     115 int ret; 
     116 
     117 ROAR_WARN("cf_sndfile_write(*): obj->opened=%i", obj->opened); 
     118 
     119 if ( !obj->opened ) { 
     120  if ( s->fh == -1 ) { 
     121   errno = EAGAIN; 
     122   return -1; 
     123  } 
     124 
     125  switch (s->info.codec) { 
     126   case ROAR_CODEC_PCM_S_LE: 
     127   case ROAR_CODEC_PCM_S_BE: 
     128     switch (s->info.bits) { 
     129      case  8: 
     130        obj->info.format = SF_FORMAT_PCM_S8; 
     131       break; 
     132      case 16: 
     133        obj->info.format = SF_FORMAT_PCM_16; 
     134       break; 
     135      case 24: 
     136        obj->info.format = SF_FORMAT_PCM_24; 
     137       break; 
     138      case 32: 
     139        obj->info.format = SF_FORMAT_PCM_32; 
     140       break; 
     141     } 
     142     //obj->info.format |= s->info.codec == ROAR_CODEC_PCM_S_LE ? SF_ENDIAN_LITTLE : SF_ENDIAN_BIG; 
     143     obj->info.format |= SF_ENDIAN_FILE; 
     144     obj->info.format |= SF_FORMAT_WAV; 
     145    break; 
     146   default: 
     147     ROAR_ERR("cf_sndfile_write(*): codec(%s) not supported!", roar_codec2str(s->info.bits)); 
     148     return -1; 
     149    break; 
     150  } 
     151 
     152  obj->info.samplerate = s->info.rate; 
     153  obj->info.channels   = s->info.channels; 
     154  obj->info.sections   = 1; 
     155  obj->info.frames     = 182592; // 2147483647; 
     156  obj->info.seekable   = 1; 
     157  obj->info.format     = 0x00010002; 
     158 
     159  if ( (obj->state = sf_open_fd(s->fh, SFM_WRITE, &(obj->info), 0)) == NULL ) { 
     160   ROAR_ERR("cf_sndfile_write(*): can not sf_open_fd(*)!"); 
     161   ROAR_ERR("cf_sndfile_write(*): s->fh=%i", s->fh); 
     162   ROAR_ERR("cf_sndfile_write(*): obj->info={.format=0x%.8x, .samplerate=%i, .channels=%i}", obj->info.format, obj->info.samplerate, obj->info.channels); 
     163   return -1; 
     164  } 
     165 
     166  obj->opened = 1; 
     167//  errno = EAGAIN; 
     168 } 
     169 
     170 ROAR_WARN("cf_sndfile_write(*): obj->opened=%i", obj->opened); 
     171 ret = sf_write_raw(obj->state, (void*) buf, len); 
     172 ROAR_WARN("cf_sndfile_write(inst=%p, buf=%p, len=%i) = %i", inst, buf, len, ret); 
     173 return ret; 
    109174} 
    110175 
  • roard/codecfilter_wave.c

    r668 r1012  
    8383int cf_wave_write(CODECFILTER_USERDATA_T   inst, char * buf, int len) { 
    8484 struct codecfilter_wave_inst * self = (struct codecfilter_wave_inst *) inst; 
     85 struct roar_stream           * s    = ROAR_STREAM(self->stream); 
     86 char header[44]; 
     87 int32_t  tmp32; 
     88 int16_t  tmp16; 
     89 int16_t  bits; 
     90 int16_t  codec; 
    8591 
    86  return 0; 
     92 ROAR_WARN("cf_wave_write(inst=%p, buf=%p, len=%i) = ?", inst, buf, len); 
     93 ROAR_WARN("cf_wave_write(inst=%p, buf=%p, len=%i): self->opened=%i", inst, buf, len, self->opened); 
     94 
     95 if ( self->opened ) { 
     96  return stream_vio_s_write(self->stream, buf, len); 
     97 } else { 
     98 
     99  if ( s->fh == -1 ) { 
     100   errno = EAGAIN; 
     101   return -1; 
     102  } 
     103 
     104  memcpy(header   , "RIFF\367\377\377\177WAVEfmt \020", 17); 
     105  memcpy(header+36, "data\313\377\377\177", 8); 
     106 
     107  switch (s->info.codec) { 
     108   case ROAR_CODEC_PCM_S_LE: 
     109     codec = 0x0001; 
     110    break; 
     111   default: 
     112     ROAR_ERR("cf_wave_write(*) Codec not supported!"); 
     113     return -1; 
     114    break; 
     115  } 
     116 
     117  ROAR_WARN("cf_wave_write(*) Codec supported!"); 
     118 
     119  bits = s->info.bits; 
     120  memcpy(header+24, &(s->info.rate    ), 4); 
     121  memcpy(header+22, &(s->info.channels), 2); 
     122  memcpy(header+34, &bits, 2); 
     123 
     124  tmp16 = s->info.channels * bits / 8; 
     125  memcpy(header+32, &tmp16, 2); 
     126  tmp32 = tmp16 * s->info.rate; 
     127  memcpy(header+28, &tmp32, 4); 
     128  memcpy(header+20, &codec, 2); 
     129 
     130  if ( stream_vio_s_write(self->stream, header, 44) != 44 ) 
     131   return -1; 
     132 
     133  self->opened = 1; 
     134 
     135  errno = EAGAIN; 
     136//  return -1; 
     137 
     138  len = stream_vio_s_write(self->stream, buf, len); 
     139 
     140  cf_wave_close(inst); 
     141  ROAR_STREAM_SERVER(s)->codecfilter = -1; 
     142 
     143  return len; 
     144 
     145//  return stream_vio_s_write(self->stream, buf, len); 
     146 } 
     147 
     148 return -1; 
    87149} 
    88150 
  • roard/streams.c

    r981 r1012  
    738738  } 
    739739 } else { 
     740  errno = 0; 
    740741  if ( codecfilter_write(ss->codecfilter_inst, ss->codecfilter, obuf, olen) 
    741742            == olen ) { 
     
    744745   return 0; 
    745746  } else { // we cann't retry on codec filetered streams 
    746    if ( need_to_free ) free(obuf); 
    747    streams_delete(id); 
    748    return -1; 
     747   if ( errno != EAGAIN ) { 
     748    if ( need_to_free ) free(obuf); 
     749    streams_delete(id); 
     750    return -1; 
     751   } 
    749752  } 
    750753 } 
Note: See TracChangeset for help on using the changeset viewer.