Changeset 4384:58d6bf7eb6a6 in roaraudio


Ignore:
Timestamp:
09/14/10 23:33:19 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added roar_conv_volume()

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • include/libroar/ctl.h

    r4333 r4384  
    9191const char * roar_ot2str  (const int    ot); 
    9292 
     93int roar_conv_volume (struct roar_mixer_settings * dst, struct roar_mixer_settings * src, int dstchans, int srcchans); 
     94 
    9395#endif 
    9496 
  • libroar/ctl.c

    r4333 r4384  
    616616} 
    617617 
     618int roar_conv_volume (struct roar_mixer_settings * dst, struct roar_mixer_settings * src, int dstchans, int srcchans) { 
     619 int i; 
     620 uint_least32_t s; 
     621 
     622 if ( dst == NULL || src == NULL || dstchans < 0 || srcchans < 0 ) 
     623  return -1; 
     624 
     625 if ( dstchans == srcchans ) { 
     626  memcpy(dst, src, sizeof(struct roar_mixer_settings)); 
     627  return 0; 
     628 } 
     629 
     630 // sepcal handling for N->1: 
     631 if ( dstchans == 1 ) { 
     632  s = 0; 
     633 
     634  for (i = 0; i < srcchans; i++) 
     635   s += src->mixer[i]; 
     636 
     637  dst->mixer[0] = s / srcchans; 
     638 } else { 
     639  switch (srcchans) { 
     640   case  1: 
     641     for (i = 0; i < dstchans; i++) 
     642      dst->mixer[i] = src->mixer[0]; 
     643    break; 
     644   case 2: 
     645     switch (dstchans) { 
     646      case 3: 
     647        dst->mixer[0] = src->mixer[0]; 
     648        dst->mixer[1] = src->mixer[1]; 
     649        dst->mixer[2] = (src->mixer[0] + src->mixer[1]) / 2; 
     650       break; 
     651      case 4: 
     652        dst->mixer[0] = src->mixer[0]; 
     653        dst->mixer[1] = src->mixer[1]; 
     654        dst->mixer[2] = src->mixer[0]; 
     655        dst->mixer[3] = src->mixer[1]; 
     656       break; 
     657      case 5: 
     658        dst->mixer[0] = src->mixer[0]; 
     659        dst->mixer[1] = src->mixer[1]; 
     660        dst->mixer[2] = (src->mixer[0] + src->mixer[1]) / 2; 
     661        dst->mixer[3] = src->mixer[0]; 
     662        dst->mixer[4] = src->mixer[1]; 
     663       break; 
     664      case 6: 
     665        dst->mixer[0] = src->mixer[0]; 
     666        dst->mixer[1] = src->mixer[1]; 
     667        dst->mixer[2] = (src->mixer[0] + src->mixer[1]) / 2; 
     668        dst->mixer[3] = dst->mixer[2]; 
     669        dst->mixer[4] = src->mixer[0]; 
     670        dst->mixer[5] = src->mixer[1]; 
     671       break; 
     672      default: 
     673        return -1; 
     674       break; 
     675     } 
     676    break; 
     677   case 3: 
     678     switch (dstchans) { 
     679      case 2: 
     680        dst->mixer[0] = src->mixer[0]; 
     681        dst->mixer[1] = src->mixer[1]; 
     682       break; 
     683      case 4: 
     684        dst->mixer[0] = src->mixer[0]; 
     685        dst->mixer[1] = src->mixer[1]; 
     686        dst->mixer[2] = src->mixer[0]; 
     687        dst->mixer[3] = src->mixer[1]; 
     688       break; 
     689      case 5: 
     690        dst->mixer[0] = src->mixer[0]; 
     691        dst->mixer[1] = src->mixer[1]; 
     692        dst->mixer[2] = src->mixer[2]; 
     693        dst->mixer[3] = src->mixer[0]; 
     694        dst->mixer[4] = src->mixer[1]; 
     695       break; 
     696      case 6: 
     697        dst->mixer[0] = src->mixer[0]; 
     698        dst->mixer[1] = src->mixer[1]; 
     699        dst->mixer[2] = src->mixer[2]; 
     700        dst->mixer[3] = src->mixer[2]; 
     701        dst->mixer[4] = src->mixer[0]; 
     702        dst->mixer[5] = src->mixer[1]; 
     703       break; 
     704      default: 
     705        return -1; 
     706       break; 
     707     } 
     708    break; 
     709   case 4: 
     710     switch (dstchans) { 
     711      case 2: 
     712        dst->mixer[0] = (src->mixer[0] + src->mixer[2]) / 2; 
     713        dst->mixer[1] = (src->mixer[1] + src->mixer[3]) / 2; 
     714       break; 
     715      case 3: 
     716        dst->mixer[0] = (src->mixer[0] + src->mixer[2]) / 2; 
     717        dst->mixer[1] = (src->mixer[1] + src->mixer[3]) / 2; 
     718        dst->mixer[2] = (dst->mixer[0] + dst->mixer[1]) / 2; 
     719       break; 
     720      case 5: 
     721        dst->mixer[0] = src->mixer[0]; 
     722        dst->mixer[1] = src->mixer[1]; 
     723        dst->mixer[2] = (src->mixer[0] + src->mixer[2] + src->mixer[1] + src->mixer[3]) / 4; 
     724        dst->mixer[3] = src->mixer[2]; 
     725        dst->mixer[4] = src->mixer[3]; 
     726       break; 
     727      case 6: 
     728        dst->mixer[0] = src->mixer[0]; 
     729        dst->mixer[1] = src->mixer[1]; 
     730        dst->mixer[2] = (src->mixer[0] + src->mixer[2] + src->mixer[1] + src->mixer[3]) / 4; 
     731        dst->mixer[3] = dst->mixer[2]; 
     732        dst->mixer[4] = src->mixer[2]; 
     733        dst->mixer[5] = src->mixer[3]; 
     734       break; 
     735      default: 
     736        return -1; 
     737       break; 
     738     } 
     739    break; 
     740   case 5: 
     741     switch (dstchans) { 
     742      case 2: 
     743        dst->mixer[0] = (src->mixer[0] + src->mixer[3]) / 2; 
     744        dst->mixer[1] = (src->mixer[1] + src->mixer[4]) / 2; 
     745       break; 
     746      case 3: 
     747        dst->mixer[0] = (src->mixer[0] + src->mixer[3]) / 2; 
     748        dst->mixer[1] = (src->mixer[1] + src->mixer[4]) / 2; 
     749        dst->mixer[2] = src->mixer[2]; 
     750       break; 
     751      case 4: 
     752        dst->mixer[0] = src->mixer[0]; 
     753        dst->mixer[1] = src->mixer[1]; 
     754        dst->mixer[2] = src->mixer[3]; 
     755        dst->mixer[3] = src->mixer[4]; 
     756       break; 
     757      case 6: 
     758        dst->mixer[0] = src->mixer[0]; 
     759        dst->mixer[1] = src->mixer[1]; 
     760        dst->mixer[2] = src->mixer[2]; 
     761        dst->mixer[3] = src->mixer[2]; 
     762        dst->mixer[4] = src->mixer[3]; 
     763        dst->mixer[5] = src->mixer[4]; 
     764       break; 
     765      default: 
     766        return -1; 
     767       break; 
     768     } 
     769    break; 
     770   case 6: 
     771     switch (dstchans) { 
     772      case 2: 
     773        dst->mixer[0] = (src->mixer[0] + src->mixer[4]) / 2; 
     774        dst->mixer[1] = (src->mixer[1] + src->mixer[5]) / 2; 
     775       break; 
     776      case 3: 
     777        dst->mixer[0] = (src->mixer[0] + src->mixer[4]) / 2; 
     778        dst->mixer[1] = (src->mixer[1] + src->mixer[5]) / 2; 
     779        dst->mixer[2] = src->mixer[2]; 
     780       break; 
     781      case 4: 
     782        dst->mixer[0] = src->mixer[0]; 
     783        dst->mixer[1] = src->mixer[1]; 
     784        dst->mixer[2] = src->mixer[4]; 
     785        dst->mixer[3] = src->mixer[5]; 
     786       break; 
     787      case 5: 
     788        dst->mixer[0] = src->mixer[0]; 
     789        dst->mixer[1] = src->mixer[1]; 
     790        dst->mixer[2] = src->mixer[2]; 
     791        dst->mixer[3] = src->mixer[4]; 
     792        dst->mixer[4] = src->mixer[5]; 
     793       break; 
     794      default: 
     795        return -1; 
     796       break; 
     797     } 
     798    break; 
     799   default: 
     800     return -1; 
     801    break; 
     802  } 
     803 } 
     804 
     805 dst->scale   = src->scale; 
     806 dst->rpg_mul = src->rpg_mul; 
     807 dst->rpg_div = src->rpg_div; 
     808 
     809 return 0; 
     810} 
     811 
    618812//ll 
Note: See TracChangeset for help on using the changeset viewer.