Changeset 4514:c535e42e44f3 in roaraudio for libroardsp


Ignore:
Timestamp:
10/15/10 16:53:07 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added converting functions

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroardsp/float.c

    r4513 r4514  
    2525#include "libroardsp.h" 
    2626 
    27 int roar_conv_int32_float(float   * dst, int32_t * src, size_t len); 
    28 int roar_conv_float_int32(int32_t * dst, float   * src, size_t len); 
     27static inline float   _si32_to_float (int32_t src) { 
     28 if ( src > 0 ) { 
     29  return (float)src / 2147483647.f; 
     30 } else { 
     31  return (float)src / 2147483648.f; 
     32 } 
     33} 
    2934 
    30 int roar_conv_int32_float_deint(float   ** dst, int32_t * src, size_t len, size_t channels); 
    31 int roar_conv_float_int32_enint(int32_t ** dst, float   * src, size_t len, size_t channels); 
     35static inline int32_t _float_to_si32 (float   src) { 
     36 if ( src > 0 ) { 
     37  return (src * 2147483647.f); 
     38 } else { 
     39  return (src * 2147483648.f); 
     40 } 
     41} 
     42 
     43int roar_conv_int32_float(float   * dst, const int32_t * src, size_t len) { 
     44 size_t i; 
     45 
     46 if ( len == 0 ) 
     47  return 0; 
     48 
     49 if ( dst == NULL || src == NULL ) 
     50  return -1; 
     51 
     52 for (i = 0; i < len; i++) 
     53  dst[i] = _si32_to_float(src[i]); 
     54 
     55 return 0; 
     56} 
     57 
     58int roar_conv_float_int32(int32_t * dst, const float   * src, size_t len) { 
     59 size_t i; 
     60 
     61 if ( len == 0 ) 
     62  return 0; 
     63 
     64 if ( dst == NULL || src == NULL ) 
     65  return -1; 
     66 
     67 for (i = 0; i < len; i++) 
     68  dst[i] = _float_to_si32(src[i]); 
     69 
     70 return 0; 
     71} 
     72 
     73int roar_conv_int32_float_deint(float   ** dst, const int32_t * src, size_t len, size_t channels) { 
     74 register size_t i, c, o; 
     75 
     76 ROAR_DBG("roar_conv_int32_float_deint(*) = ?"); 
     77 
     78 if ( len == 0 ) 
     79  return 0; 
     80 
     81 ROAR_DBG("roar_conv_int32_float_deint(*) = ?"); 
     82 
     83 if ( dst == NULL || src == NULL ) 
     84  return -1; 
     85 
     86 ROAR_DBG("roar_conv_int32_float_deint(*) = ?"); 
     87 
     88 // check if len is a multiple of channels: 
     89 if ( (len % channels) != 0 ) 
     90  return -1; 
     91 
     92 ROAR_DBG("roar_conv_int32_float_deint(*) = ?"); 
     93 
     94 for (c = 0; c < channels; c++) 
     95  if ( dst[c] == NULL ) 
     96   return -1; 
     97 
     98 ROAR_DBG("roar_conv_int32_float_deint(*) = ?"); 
     99 
     100 switch (channels) { 
     101  case  1: 
     102    return roar_conv_int32_float(dst[0], src, len); 
     103   break; 
     104  case  2: 
     105    for (i = o = 0; i < len; i += 2, o += 1) { 
     106     dst[0][o] = _si32_to_float(src[i+0]); 
     107     dst[1][o] = _si32_to_float(src[i+1]); 
     108    } 
     109   break; 
     110  default: 
     111    for (i = c = o = 0; i < len; i++) { 
     112     dst[c][o] = _si32_to_float(src[i]); 
     113     c++; 
     114     if ( c == channels ) { 
     115      c = 0; 
     116      o++; 
     117     } 
     118    } 
     119   break; 
     120 } 
     121 
     122 return 0; 
     123} 
     124 
     125int roar_conv_float_int32_enint(int32_t  * dst, const float   ** src, size_t len, size_t channels) { 
     126 size_t i, c, o; 
     127 
     128 if ( len == 0 ) 
     129  return 0; 
     130 
     131 if ( dst == NULL || src == NULL ) 
     132  return -1; 
     133 
     134 // check if len is a multiple of channels: 
     135 if ( (len % channels) != 0 ) 
     136  return -1; 
     137 
     138 for (c = 0; c < channels; c++) 
     139  if ( src[c] == NULL ) 
     140   return -1; 
     141 
     142 switch (channels) { 
     143  default: 
     144    for (i = c = o = 0; o < len; o++) { 
     145     dst[o] = _float_to_si32(src[c][i]); 
     146     c++; 
     147     if ( c == channels ) { 
     148      c = 0; 
     149      i++; 
     150     } 
     151    } 
     152   break; 
     153 } 
     154 
     155 return 0; 
     156} 
    32157 
    33158//ll 
Note: See TracChangeset for help on using the changeset viewer.