Changeset 942:7e85e08c6501 in roaraudio for roard/driver_oss.c


Ignore:
Timestamp:
12/07/08 22:13:45 (15 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

chaned codec handling a lot, return codec name in case OSS suggest another

File:
1 edited

Legend:

Unmodified
Added
Removed
  • roard/driver_oss.c

    r935 r942  
    3030int driver_oss_open(struct roar_vio_calls * inst, char * device, struct roar_audio_info * info, int fh) { 
    3131 int tmp; 
     32 int ctmp; 
     33 char * es; 
    3234 
    3335#ifdef ROAR_DEFAULT_OSS_DEV 
     
    6264 } 
    6365 
    64  switch (info->bits) { 
    65   case  8: tmp = AFMT_S8; break; 
    66   case 16: 
    67     switch (info->codec) { 
    68      case ROAR_CODEC_PCM_S_LE: tmp = AFMT_S16_LE; break; 
    69      case ROAR_CODEC_PCM_S_BE: tmp = AFMT_S16_BE; break; 
    70      default                 : er(); 
     66 switch (info->codec) { 
     67  case ROAR_CODEC_PCM_S_LE: 
     68    switch (info->bits) { 
     69     case  8: tmp = AFMT_S8;     break; 
     70     case 16: tmp = AFMT_S16_LE; break; 
     71//     case 24: tmp = AFMT_S24_PACKED; break; 
     72#ifdef AFMT_S32_LE 
     73     case 32: tmp = AFMT_S32_LE; break; 
     74#endif 
     75     default: er(); 
    7176    } 
    7277   break; 
    73   default: er(); 
     78  case ROAR_CODEC_PCM_S_BE: 
     79    switch (info->bits) { 
     80     case  8: tmp = AFMT_S8;     break; 
     81     case 16: tmp = AFMT_S16_BE; break; 
     82//     case 24: tmp = AFMT_S24_PACKED; break; 
     83#ifdef AFMT_S32_BE 
     84     case 32: tmp = AFMT_S32_BE; break; 
     85#endif 
     86     default: er(); 
     87    } 
     88   break; 
     89  case ROAR_CODEC_PCM_U_LE: 
     90    switch (info->bits) { 
     91     case  8: tmp = AFMT_U8;     break; 
     92     case 16: tmp = AFMT_U16_LE; break; 
     93     default: er(); 
     94    } 
     95   break; 
     96  case ROAR_CODEC_PCM_U_BE: 
     97    switch (info->bits) { 
     98     case  8: tmp = AFMT_U8;     break; 
     99     case 16: tmp = AFMT_U16_BE; break; 
     100     default: er(); 
     101    } 
     102  case ROAR_CODEC_ALAW: 
     103    tmp = AFMT_A_LAW; 
     104   break; 
     105  case ROAR_CODEC_MULAW: 
     106    tmp = AFMT_MU_LAW; 
     107   break; 
     108#ifdef AFMT_VORBIS 
     109  case ROAR_CODEC_OGG_VORBIS: 
     110    tmp = AFMT_VORBIS; 
     111   break; 
     112#endif 
     113  default: 
     114    er(); 
     115   break; 
    74116 } 
    75117 
     118 ctmp = tmp; 
    76119 if ( ioctl(fh, SNDCTL_DSP_SAMPLESIZE, &tmp) == -1 ) { 
     120  ROAR_ERR("driver_oss_open(*): can not set sample format"); 
     121  er(); 
     122 } 
     123 
     124 if ( tmp != ctmp ) { 
     125  es = NULL; 
     126  switch (tmp) { 
     127   case AFMT_S8    : es = "bits=8,codec=pcm";       break; 
     128   case AFMT_U8    : es = "bits=8,codec=pcm_u_le";  break; 
     129   case AFMT_S16_LE: es = "bits=16,codec=pcm_s_le"; break; 
     130   case AFMT_S16_BE: es = "bits=16,codec=pcm_s_be"; break; 
     131   case AFMT_U16_LE: es = "bits=16,codec=pcm_u_le"; break; 
     132   case AFMT_U16_BE: es = "bits=16,codec=pcm_u_be"; break; 
     133#ifdef AFMT_S32_LE 
     134   case AFMT_S32_LE: es = "bits=32,codec=pcm_s_le"; break; 
     135#endif 
     136#ifdef AFMT_S32_BE 
     137   case AFMT_S32_BE: es = "bits=32,codec=pcm_s_be"; break; 
     138#endif 
     139   case AFMT_A_LAW : es = "codec=alaw";             break; 
     140   case AFMT_MU_LAW: es = "codec=mulaw";            break; 
     141#ifdef AFMT_VORBIS 
     142   case AFMT_VORBIS: es = "codec=ogg_vorbis";       break; 
     143#endif 
     144  } 
     145 
     146  if ( es != NULL ) { 
     147   ROAR_ERR("driver_oss_open(*): can not set requested codec, OSS retruned another codec then requested, to use this restart with -oO %s or set codec manuelly via -oO codec=somecodec", es); 
     148  } else { 
     149   ROAR_ERR("driver_oss_open(*): can not set requested codec, set codec manuelly via -oO codec=somecodec"); 
     150  } 
    77151  er(); 
    78152 } 
     
    81155 
    82156 if ( ioctl(fh, SNDCTL_DSP_SPEED, &tmp) == -1 ) { 
     157  ROAR_ERR("driver_oss_open(*): can not set sample rate"); 
    83158  er(); 
    84159 } 
    85160 
    86161 if ( tmp < info->rate * 0.98 || tmp > info->rate * 1.02 ) { 
     162  ROAR_ERR("driver_oss_open(*): sample rate out of acceptable accuracy"); 
    87163  er(); 
    88164 } 
Note: See TracChangeset for help on using the changeset viewer.