Changeset 3548:f45c9bcfcf20 in roaraudio for libroardsp


Ignore:
Timestamp:
02/20/10 02:38:05 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

wrote channel mapper functions for PCM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroardsp/channels.c

    r3545 r3548  
    2525 
    2626#include "libroardsp.h" 
     27#include "roaraudio/units.h" 
    2728 
    2829static struct { 
     
    393394} 
    394395 
     396int roardsp_chanmap_mappcm8 (char    * out, char    * in, size_t len, size_t chans, char * map) { 
     397 char buf[ROAR_MAX_CHANNELS]; 
     398 size_t frame; 
     399 size_t c; 
     400 
     401 if ( len == 0 ) 
     402  return 0; 
     403 
     404 if ( out == NULL || in == NULL || map == NULL ) 
     405  return -1; 
     406 
     407 if ( chans > ROAR_MAX_CHANNELS ) 
     408  return -1; 
     409 
     410 if ( in == out ) { 
     411  for (frame = 0; frame < len/(chans*_8BIT); frame++) { 
     412   memset(buf, 0, sizeof(buf)); 
     413 
     414   for (c = 0; c < chans; c++) { 
     415    buf[map[c]*_8BIT] = in[c]; 
     416   } 
     417 
     418   memcpy(out, buf, chans*_8BIT); 
     419 
     420   in  += chans; 
     421   out += chans; 
     422  } 
     423 } else { 
     424  memset(out, 0, len); // silance channels we do not use 
     425  for (frame = 0; frame < len/(chans*_8BIT); frame++) { 
     426   for (c = 0; c < chans; c++) { 
     427    out[map[c]*_8BIT] = in[c]; 
     428   } 
     429   in  += chans; 
     430   out += chans; 
     431  } 
     432 } 
     433 
     434 return 0; 
     435} 
     436 
     437int roardsp_chanmap_mappcm16(int16_t * out, int16_t * in, size_t len, size_t chans, char * map) { 
     438 int16_t buf[ROAR_MAX_CHANNELS]; 
     439 size_t frame; 
     440 size_t c; 
     441 
     442 if ( len == 0 ) 
     443  return 0; 
     444 
     445 if ( out == NULL || in == NULL || map == NULL ) 
     446  return -1; 
     447 
     448 if ( chans > ROAR_MAX_CHANNELS ) 
     449  return -1; 
     450 
     451 if ( in == out ) { 
     452  for (frame = 0; frame < len/(chans*_16BIT); frame++) { 
     453   memset(buf, 0, sizeof(buf)); 
     454 
     455   for (c = 0; c < chans; c++) { 
     456    buf[map[c]*_16BIT] = in[c]; 
     457   } 
     458 
     459   memcpy(out, buf, chans*_16BIT); 
     460 
     461   in  += chans; 
     462   out += chans; 
     463  } 
     464 } else { 
     465  memset(out, 0, len); // silance channels we do not use 
     466  for (frame = 0; frame < len/(chans*_16BIT); frame++) { 
     467   for (c = 0; c < chans; c++) { 
     468    out[map[c]*_16BIT] = in[c]; 
     469   } 
     470   in  += chans; 
     471   out += chans; 
     472  } 
     473 } 
     474 
     475 return 0; 
     476} 
     477 
     478int roardsp_chanmap_mappcm24(void    * out, void    * in, size_t len, size_t chans, char * map) { 
     479 return -1; 
     480} 
     481 
     482int roardsp_chanmap_mappcm32(int32_t * out, int32_t * in, size_t len, size_t chans, char * map) { 
     483 int32_t buf[ROAR_MAX_CHANNELS]; 
     484 size_t frame; 
     485 size_t c; 
     486 
     487 if ( len == 0 ) 
     488  return 0; 
     489 
     490 if ( out == NULL || in == NULL || map == NULL ) 
     491  return -1; 
     492 
     493 if ( chans > ROAR_MAX_CHANNELS ) 
     494  return -1; 
     495 
     496 if ( in == out ) { 
     497  for (frame = 0; frame < len/(chans*_32BIT); frame++) { 
     498   memset(buf, 0, sizeof(buf)); 
     499 
     500   for (c = 0; c < chans; c++) { 
     501    buf[map[c]*_32BIT] = in[c]; 
     502   } 
     503 
     504   memcpy(out, buf, chans*_32BIT); 
     505 
     506   in  += chans; 
     507   out += chans; 
     508  } 
     509 } else { 
     510  memset(out, 0, len); // silance channels we do not use 
     511  for (frame = 0; frame < len/(chans*_32BIT); frame++) { 
     512   for (c = 0; c < chans; c++) { 
     513    out[map[c]*_32BIT] = in[c]; 
     514   } 
     515   in  += chans; 
     516   out += chans; 
     517  } 
     518 } 
     519 
     520 return 0; 
     521} 
     522 
     523int roardsp_chanmap_mappcm  (void    * out, void    * in, size_t len, size_t chans, char * map, int bits) { 
     524 if ( len == 0 ) 
     525  return 0; 
     526 
     527 if ( out == NULL || in == NULL || map == NULL ) 
     528  return -1; 
     529 
     530 if ( chans > ROAR_MAX_CHANNELS ) 
     531  return -1; 
     532 
     533 switch (bits) { 
     534  case  8: return roardsp_chanmap_mappcm8(out, in, len, chans, map);  break; 
     535  case 16: return roardsp_chanmap_mappcm16(out, in, len, chans, map); break; 
     536  case 24: return roardsp_chanmap_mappcm24(out, in, len, chans, map); break; 
     537  case 32: return roardsp_chanmap_mappcm32(out, in, len, chans, map); break; 
     538  default: 
     539    return -1; 
     540   break; 
     541 } 
     542} 
     543 
    395544//ll 
Note: See TracChangeset for help on using the changeset viewer.