Changeset 2637:38fc8e7a38c9 in roaraudio


Ignore:
Timestamp:
09/12/09 01:44:00 (15 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

some code used to read/write non block aligned data from/to xcoder

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroardsp/transcode.c

    r2311 r2637  
    147147 
    148148int roar_xcoder_proc       (struct roar_xcoder * state, void * buf, size_t len) { 
    149  return -1; 
     149 struct roar_buffer_stats ringstats; 
     150 struct roar_buffer * bufbuf; 
     151 void               * bufdata; 
     152 size_t               curlen; 
     153 
     154 if ( state == NULL ) 
     155  return -1; 
     156 
     157 if ( buf == NULL && len != 0 ) 
     158  return -1; 
     159 
     160 if ( state->packet_len == -1 ) 
     161  if ( roar_xcoder_packet_size(state, -1) == -1 ) 
     162   return -1; 
     163 
     164 if ( state->packet_len == 0 ) 
     165  return roar_xcoder_proc_packet(state, buf, len); 
     166 
     167 if ( state->iobuffer == NULL ) { 
     168  while ( len >= state->packet_len ) { 
     169   if ( roar_xcoder_proc_packet(state, buf, state->packet_len) == -1 ) 
     170    return -1; 
     171 
     172   buf += state->packet_len; 
     173   len -= state->packet_len; 
     174  } 
     175 
     176  if ( !len ) 
     177   return 0; 
     178 
     179  if ( state->encode ) { 
     180   curlen = len; 
     181  } else { 
     182   curlen = state->packet_len; 
     183  } 
     184 
     185  if ( roar_buffer_new(&bufbuf, curlen) == -1 ) 
     186   return -1; 
     187 
     188  if ( roar_buffer_get_data(bufbuf, &bufdata) == -1 ) { 
     189   roar_buffer_free(bufbuf); 
     190   return -1; 
     191  } 
     192 
     193  if ( state->encode ) { 
     194   memcpy(bufdata, buf, len); 
     195  } else { 
     196   if ( roar_xcoder_proc_packet(state, bufdata, state->packet_len) == -1 ) { 
     197    roar_buffer_free(bufbuf); 
     198    return -1; 
     199   } 
     200 
     201   curlen = len; 
     202 
     203   if ( roar_buffer_shift_out(&bufbuf, buf, &curlen) == -1 ) { 
     204    roar_buffer_free(bufbuf); 
     205    return -1; 
     206   } 
     207 
     208   if ( curlen < len ) { // this should never happen! 
     209    roar_buffer_free(bufbuf); 
     210    return -1; 
     211   } 
     212  } 
     213 
     214  state->iobuffer = bufbuf; 
     215 } else { 
     216  if ( state->encode ) { 
     217   if ( roar_buffer_new(&bufbuf, len) == -1 ) 
     218    return -1; 
     219 
     220   if ( roar_buffer_get_data(bufbuf, &bufdata) == -1 ) { 
     221    roar_buffer_free(bufbuf); 
     222    return -1; 
     223   } 
     224 
     225   memcpy(bufdata, buf, len); 
     226 
     227   if ( roar_buffer_add(state->iobuffer, bufbuf) == -1 ) { 
     228    roar_buffer_free(bufbuf); 
     229    return -1; 
     230   } 
     231 
     232   if ( roar_buffer_ring_stats(state->iobuffer, &ringstats) == -1 ) 
     233    return -1; 
     234 
     235   if ( roar_buffer_new(&bufbuf, state->packet_len) == -1 ) 
     236    return -1; 
     237 
     238   if ( roar_buffer_get_data(bufbuf, &bufdata) == -1 ) { 
     239    roar_buffer_free(bufbuf); 
     240    return -1; 
     241   } 
     242 
     243   while ( ringstats.bytes > state->packet_len ) { 
     244    curlen = state->packet_len; 
     245    if ( roar_buffer_shift_out(&(state->iobuffer), bufdata, &curlen) == -1 ) { 
     246     roar_buffer_free(bufbuf); 
     247     return -1; 
     248    } 
     249 
     250    if ( curlen < state->packet_len ) { // this should not happen... 
     251     roar_buffer_free(bufbuf); 
     252     return -1; 
     253    } 
     254 
     255    if ( roar_xcoder_proc_packet(state, bufdata, state->packet_len) == -1 ) { 
     256     roar_buffer_free(bufbuf); 
     257     return -1; 
     258    } 
     259 
     260    if ( roar_buffer_ring_stats(state->iobuffer, &ringstats) == -1 ) { 
     261     roar_buffer_free(bufbuf); 
     262     return -1; 
     263    } 
     264   } 
     265 
     266   if ( roar_buffer_free(bufbuf) == -1 ) 
     267    return -1; 
     268  } else { 
     269   curlen = len; 
     270 
     271   if ( roar_buffer_shift_out(&(state->iobuffer), buf, &curlen) == -1 ) { 
     272    return -1; 
     273   } 
     274 
     275   if ( curlen == len ) 
     276    return -1; 
     277 
     278   // we now have curlen < len and state->iobuffer == NULL 
     279   // as no data is left in the buffer, need to get some new data. 
     280   // we simply call ourself to get some more data... 
     281 
     282   if ( state->iobuffer == NULL ) { 
     283    ROAR_WARN("roar_xcoder_proc(state=%p, buf=%p, len=%lu): iobuffer != NULL, " 
     284                                "This is a bug in libroar{dsp,} or some hardware is broken", 
     285                   state, buf, (unsigned long)len); 
     286    return -1; 
     287   } 
     288 
     289   len -= curlen; 
     290   buf += curlen; 
     291 
     292   return roar_xcoder_proc(state, buf, len); 
     293  } 
     294 } 
     295 
     296 return 0; 
    150297} 
    151298 
Note: See TracChangeset for help on using the changeset viewer.