Changeset 3538:a5ca10905545 in roaraudio for libroardsp


Ignore:
Timestamp:
02/20/10 00:15:36 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added function to init channel map list

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroardsp/channels.c

    r3517 r3538  
    100100} 
    101101 
     102int    roardsp_chanlist_init(char * list, int channels, int map) { 
     103 if ( channels == 0 ) 
     104  return 0; 
     105 
     106 if ( list == NULL ) 
     107  return -1; 
     108 
     109 if ( channels > ROAR_MAX_CHANNELS ) 
     110  return -1; 
     111 
     112 // test for common maps: 
     113 if ( channels == 1 ) { 
     114  list[0] = ROARDSP_CHAN_MONO; 
     115  return 0; 
     116 } 
     117 
     118 if ( channels == 2 ) { 
     119  list[0] = ROARDSP_CHAN_LEFT; 
     120  list[1] = ROARDSP_CHAN_RIGHT; 
     121  return 0; 
     122 } 
     123 
     124 // test for specific maps: 
     125 switch (map) { 
     126  case ROARDSP_CHANLIST_MAP_ROARAUDIO: 
     127  case ROARDSP_CHANLIST_MAP_FLAC: 
     128    if ( map == ROARDSP_CHANLIST_MAP_FLAC && channels > 6 ) { 
     129     // FLAC only has a fixed mapping for up to 6 channels. 
     130     return -1; 
     131    } 
     132 
     133    switch (channels) { 
     134     // FLAC or RoarAudio: 
     135     case 3: 
     136       list[0] = ROARDSP_CHAN_LEFT; 
     137       list[1] = ROARDSP_CHAN_RIGHT; 
     138       list[2] = ROARDSP_CHAN_CENTER; 
     139      break; 
     140     case 4: 
     141       list[0] = ROARDSP_CHAN_FRONT_LEFT; 
     142       list[1] = ROARDSP_CHAN_FRONT_RIGHT; 
     143       list[2] = ROARDSP_CHAN_BACK_LEFT; 
     144       list[3] = ROARDSP_CHAN_BACK_RIGHT; 
     145      break; 
     146     case 5: 
     147       list[0] = ROARDSP_CHAN_FRONT_LEFT; 
     148       list[1] = ROARDSP_CHAN_FRONT_RIGHT; 
     149       list[2] = ROARDSP_CHAN_CENTER; 
     150       list[3] = ROARDSP_CHAN_BACK_LEFT; 
     151       list[4] = ROARDSP_CHAN_BACK_RIGHT; 
     152      break; 
     153     case 6: 
     154       list[0] = ROARDSP_CHAN_FRONT_LEFT; 
     155       list[1] = ROARDSP_CHAN_FRONT_RIGHT; 
     156       list[2] = ROARDSP_CHAN_CENTER; 
     157       list[3] = ROARDSP_CHAN_LFE; 
     158       list[4] = ROARDSP_CHAN_BACK_LEFT; 
     159       list[5] = ROARDSP_CHAN_BACK_RIGHT; 
     160      break; 
     161     // RoarAudio: 
     162     case 7: 
     163       list[0] = ROARDSP_CHAN_FRONT_LEFT; 
     164       list[1] = ROARDSP_CHAN_FRONT_RIGHT; 
     165       list[2] = ROARDSP_CHAN_CENTER; 
     166       list[3] = ROARDSP_CHAN_LFE; 
     167       list[4] = ROARDSP_CHAN_SIDE_LEFT; 
     168       list[5] = ROARDSP_CHAN_SIDE_RIGHT; 
     169       list[6] = ROARDSP_CHAN_BACK_CENTER; 
     170      break; 
     171     case 8: 
     172       list[0] = ROARDSP_CHAN_FRONT_LEFT; 
     173       list[1] = ROARDSP_CHAN_FRONT_RIGHT; 
     174       list[2] = ROARDSP_CHAN_CENTER; 
     175       list[3] = ROARDSP_CHAN_LFE; 
     176       list[4] = ROARDSP_CHAN_SIDE_LEFT; 
     177       list[5] = ROARDSP_CHAN_SIDE_RIGHT; 
     178       list[6] = ROARDSP_CHAN_BACK_LEFT; 
     179       list[7] = ROARDSP_CHAN_BACK_RIGHT; 
     180      break; 
     181     default: 
     182       return -1; 
     183      break; 
     184    } 
     185   break; 
     186  case ROARDSP_CHANLIST_MAP_VORBIS: 
     187    switch (channels) { 
     188     case 3: 
     189       list[0] = ROARDSP_CHAN_LEFT; 
     190       list[1] = ROARDSP_CHAN_CENTER; 
     191       list[2] = ROARDSP_CHAN_RIGHT; 
     192      break; 
     193     case 4: 
     194       list[0] = ROARDSP_CHAN_FRONT_LEFT; 
     195       list[1] = ROARDSP_CHAN_FRONT_RIGHT; 
     196       list[2] = ROARDSP_CHAN_BACK_LEFT; 
     197       list[3] = ROARDSP_CHAN_BACK_RIGHT; 
     198      break; 
     199     case 5: 
     200       list[0] = ROARDSP_CHAN_FRONT_LEFT; 
     201       list[1] = ROARDSP_CHAN_CENTER; 
     202       list[2] = ROARDSP_CHAN_FRONT_RIGHT; 
     203       list[3] = ROARDSP_CHAN_BACK_LEFT; 
     204       list[4] = ROARDSP_CHAN_BACK_RIGHT; 
     205      break; 
     206     case 6: 
     207       list[0] = ROARDSP_CHAN_FRONT_LEFT; 
     208       list[1] = ROARDSP_CHAN_CENTER; 
     209       list[2] = ROARDSP_CHAN_FRONT_RIGHT; 
     210       list[3] = ROARDSP_CHAN_BACK_LEFT; 
     211       list[4] = ROARDSP_CHAN_BACK_RIGHT; 
     212       list[5] = ROARDSP_CHAN_LFE; 
     213      break; 
     214     case 7: 
     215       list[0] = ROARDSP_CHAN_FRONT_LEFT; 
     216       list[1] = ROARDSP_CHAN_CENTER; 
     217       list[2] = ROARDSP_CHAN_FRONT_RIGHT; 
     218       list[3] = ROARDSP_CHAN_SIDE_LEFT; 
     219       list[4] = ROARDSP_CHAN_SIDE_RIGHT; 
     220       list[5] = ROARDSP_CHAN_BACK_CENTER; 
     221       list[6] = ROARDSP_CHAN_LFE; 
     222      break; 
     223     case 8: 
     224       list[0] = ROARDSP_CHAN_FRONT_LEFT; 
     225       list[1] = ROARDSP_CHAN_CENTER; 
     226       list[2] = ROARDSP_CHAN_FRONT_RIGHT; 
     227       list[3] = ROARDSP_CHAN_SIDE_LEFT; 
     228       list[4] = ROARDSP_CHAN_SIDE_RIGHT; 
     229       list[5] = ROARDSP_CHAN_BACK_LEFT; 
     230       list[6] = ROARDSP_CHAN_BACK_RIGHT; 
     231       list[7] = ROARDSP_CHAN_LFE; 
     232      break; 
     233     default: 
     234       return -1; 
     235      break; 
     236    } 
     237   break; 
     238  case ROARDSP_CHANLIST_MAP_OSS: 
     239    switch (channels) { 
     240     case 8: 
     241       list[7] = ROARDSP_CHAN_BACK_RIGHT; 
     242     case 7: 
     243       list[6] = ROARDSP_CHAN_BACK_LEFT; 
     244     case 6: 
     245       list[5] = ROARDSP_CHAN_SIDE_RIGHT; 
     246     case 5: 
     247       list[4] = ROARDSP_CHAN_SIDE_LEFT; 
     248     case 4: 
     249       list[3] = ROARDSP_CHAN_LFE; 
     250     case 3: 
     251       list[2] = ROARDSP_CHAN_CENTER; 
     252       list[1] = ROARDSP_CHAN_RIGHT; 
     253       list[0] = ROARDSP_CHAN_LEFT; 
     254      break; 
     255     default: 
     256       return -1; 
     257      break; 
     258    } 
     259   break; 
     260  case ROARDSP_CHANLIST_MAP_ALSA: 
     261    // we guess: L,R,BL,BR,C,LFE,SL,SR (really, just guessing, see ALSA plugin of libao) 
     262    switch (channels) { 
     263     case 8: 
     264       list[7] = ROARDSP_CHAN_BACK_RIGHT; 
     265     case 7: 
     266       list[6] = ROARDSP_CHAN_BACK_LEFT; 
     267     case 6: 
     268       list[5] = ROARDSP_CHAN_LFE; 
     269     case 5: 
     270       list[4] = ROARDSP_CHAN_CENTER; 
     271     case 4: 
     272       list[3] = ROARDSP_CHAN_BACK_RIGHT; 
     273     case 3: 
     274       list[2] = ROARDSP_CHAN_BACK_LEFT; 
     275       list[1] = ROARDSP_CHAN_RIGHT; 
     276       list[0] = ROARDSP_CHAN_LEFT; 
     277      break; 
     278     default: 
     279       return -1; 
     280      break; 
     281    } 
     282   break; 
     283  case ROARDSP_CHANLIST_MAP_RIFF_WAVE: 
     284    // here we are again, guessing:  L,R,C,LFE,BL,BR,CL,CR,BC,SL,SR 
     285    // strange, C, LFE on 4 channel file? 
     286    // return -1 to be sure.... 
     287    switch (channels) { 
     288     default: 
     289       return -1; 
     290      break; 
     291    } 
     292   break; 
     293  default: 
     294    return -1; 
     295   break; 
     296 } 
     297 
     298 return 0; 
     299} 
     300 
    102301int roardsp_chanmap_calc(struct roardsp_chanmap * map, int what, int err_on_none) { 
    103302 int a, b; 
Note: See TracChangeset for help on using the changeset viewer.