Changeset 1532:ce5df2df033d in roaraudio


Ignore:
Timestamp:
04/12/09 01:07:24 (15 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

got auto config working, need cleanup

File:
1 edited

Legend:

Unmodified
Added
Removed
  • roard/driver_oss.c

    r1530 r1532  
    9494 int tmp, ctmp; 
    9595 char * es; 
     96 int autoconfig         = 0; 
     97 int need_update_server = 0; 
    9698 
    9799 if ( fh == -1 ) 
    98100  return -1; 
     101 
     102 if ( self->ssid != -1 ) { 
     103  autoconfig = streams_get_flag(self->ssid, ROAR_FLAG_AUTOCONF); 
     104 } 
     105 
     106 ROAR_WARN("driver_oss_config_device(self=%p): ssid=%i, autoconfig=%i", self, self->ssid, autoconfig); 
    99107 
    100108#ifdef SNDCTL_DSP_CHANNELS 
     
    107115 
    108116 if ( tmp != info->channels ) { 
     117  if ( autoconfig ) { 
     118   need_update_server = 1; 
     119   self->info.channels = tmp; 
     120  } else { 
    109121   ROAR_ERR("driver_oss_open(*): can not set requested numer of channels, OSS suggested %i channels, to use this restart with -oO channels=%i or set codec manuelly via -oO channels=num", tmp, tmp); 
    110   return -1; 
     122   return -1; 
     123  } 
    111124 } 
    112125#else 
     
    186199 
    187200 if ( tmp != ctmp ) { 
    188   es = NULL; 
    189   switch (tmp) { 
    190    case AFMT_S8    : es = "bits=8,codec=pcm";       break; 
    191    case AFMT_U8    : es = "bits=8,codec=pcm_u_le";  break; 
    192    case AFMT_S16_LE: es = "bits=16,codec=pcm_s_le"; break; 
    193    case AFMT_S16_BE: es = "bits=16,codec=pcm_s_be"; break; 
    194    case AFMT_U16_LE: es = "bits=16,codec=pcm_u_le"; break; 
    195    case AFMT_U16_BE: es = "bits=16,codec=pcm_u_be"; break; 
     201  if ( autoconfig ) { 
     202   need_update_server = 1; 
     203   switch (tmp) { 
     204    case AFMT_S8    : self->info.bits =  8; self->info.codec = ROAR_CODEC_PCM;      break; 
     205    case AFMT_U8    : self->info.bits =  8; self->info.codec = ROAR_CODEC_PCM_U_LE; break; 
     206    case AFMT_S16_LE: self->info.bits = 16; self->info.codec = ROAR_CODEC_PCM_S_LE; break; 
     207    case AFMT_S16_BE: self->info.bits = 16; self->info.codec = ROAR_CODEC_PCM_S_BE; break; 
     208    case AFMT_U16_LE: self->info.bits = 16; self->info.codec = ROAR_CODEC_PCM_U_LE; break; 
     209    case AFMT_U16_BE: self->info.bits = 16; self->info.codec = ROAR_CODEC_PCM_U_BE; break; 
    196210#ifdef AFMT_S32_LE 
    197    case AFMT_S32_LE: es = "bits=32,codec=pcm_s_le"; break; 
     211    case AFMT_S32_LE: self->info.bits = 32; self->info.codec = ROAR_CODEC_PCM_S_LE; break; 
    198212#endif 
    199213#ifdef AFMT_S32_BE 
    200    case AFMT_S32_BE: es = "bits=32,codec=pcm_s_be"; break; 
    201 #endif 
    202    case AFMT_A_LAW : es = "codec=alaw";             break; 
    203    case AFMT_MU_LAW: es = "codec=mulaw";            break; 
     214    case AFMT_S32_BE: self->info.bits = 32; self->info.codec = ROAR_CODEC_PCM_S_BE; break; 
     215#endif 
     216    case AFMT_A_LAW : self->info.bits =  8; self->info.codec = ROAR_CODEC_ALAW;     break; 
     217    case AFMT_MU_LAW: self->info.bits =  8; self->info.codec = ROAR_CODEC_MULAW;    break; 
    204218#ifdef AFMT_VORBIS 
    205    case AFMT_VORBIS: es = "codec=ogg_vorbis";       break; 
    206 #endif 
    207   } 
    208  
    209   if ( es != NULL ) { 
    210    ROAR_ERR("driver_oss_open(*): can not set requested codec, OSS retruned another codec than requested, to use this restart with -oO %s or set codec manuelly via -oO codec=somecodec", es); 
     219    case AFMT_VORBIS: self->info.codec = ROAR_CODEC_OGG_VORBIS;                     break; 
     220#endif 
     221    default: 
     222      ROAR_WARN("driver_oss_config_device(*): Auto config failed: unknown OSS Codec %i", tmp); 
     223      ROAR_ERR("driver_oss_config_device(*): can not set requested codec, set codec manuelly via -oO codec=somecodec"); 
     224     break; 
     225   } 
    211226  } else { 
    212    ROAR_ERR("driver_oss_open(*): can not set requested codec, set codec manuelly via -oO codec=somecodec"); 
    213   } 
    214   return -1; 
     227   es = NULL; 
     228   switch (tmp) { 
     229    case AFMT_S8    : es = "bits=8,codec=pcm";       break; 
     230    case AFMT_U8    : es = "bits=8,codec=pcm_u_le";  break; 
     231    case AFMT_S16_LE: es = "bits=16,codec=pcm_s_le"; break; 
     232    case AFMT_S16_BE: es = "bits=16,codec=pcm_s_be"; break; 
     233    case AFMT_U16_LE: es = "bits=16,codec=pcm_u_le"; break; 
     234    case AFMT_U16_BE: es = "bits=16,codec=pcm_u_be"; break; 
     235#ifdef AFMT_S32_LE 
     236    case AFMT_S32_LE: es = "bits=32,codec=pcm_s_le"; break; 
     237#endif 
     238#ifdef AFMT_S32_BE 
     239    case AFMT_S32_BE: es = "bits=32,codec=pcm_s_be"; break; 
     240#endif 
     241    case AFMT_A_LAW : es = "codec=alaw";             break; 
     242    case AFMT_MU_LAW: es = "codec=mulaw";            break; 
     243#ifdef AFMT_VORBIS 
     244    case AFMT_VORBIS: es = "codec=ogg_vorbis";       break; 
     245#endif 
     246   } 
     247 
     248   if ( es != NULL ) { 
     249    ROAR_ERR("driver_oss_open(*): can not set requested codec, OSS retruned another codec than requested, to use this restart with -oO %s or set codec manuelly via -oO codec=somecodec", es); 
     250   } else { 
     251    ROAR_ERR("driver_oss_open(*): can not set requested codec, set codec manuelly via -oO codec=somecodec"); 
     252   } 
     253   return -1; 
     254  } 
    215255 } 
    216256 
     
    223263 
    224264 if ( tmp != info->rate ) { 
    225   ROAR_WARN("driver_oss_config_device(*): Device does not support requested sample rate: req=%iHz, sug=%iHz", 
    226                     info->rate, tmp); 
    227  
    228   if ( tmp < info->rate * 0.98 || tmp > info->rate * 1.02 ) { 
    229    ROAR_ERR("driver_oss_open(*): sample rate out of acceptable accuracy"); 
    230    return -1; 
     265  if ( autoconfig ) { 
     266   need_update_server = 1; 
     267   self->info.rate = tmp; 
     268  } else { 
     269   ROAR_WARN("driver_oss_config_device(*): Device does not support requested sample rate: req=%iHz, sug=%iHz", 
     270                     info->rate, tmp); 
     271 
     272   if ( tmp < info->rate * 0.98 || tmp > info->rate * 1.02 ) { 
     273    ROAR_ERR("driver_oss_open(*): sample rate out of acceptable accuracy"); 
     274    return -1; 
     275   } 
    231276  } 
    232277 } 
     
    268313#endif 
    269314 
     315 if ( need_update_server ) { 
     316  if ( self->stream == NULL ) { 
     317   streams_get(self->ssid, &(self->stream)); 
     318  } 
     319 
     320  if ( self->stream == NULL ) { 
     321   ROAR_ERR("driver_oss_config_device(*): Auto config failed: can not set new values for stream: no stream object known"); 
     322   return -1; 
     323  } 
     324 
     325  memcpy(&(ROAR_STREAM(self->stream)->info), info, sizeof(struct roar_audio_info)); 
     326 } 
     327 
    270328 self->need_config = 0; 
    271329 
     
    391449    *(uint_least32_t *)data = self->blocksize; 
    392450   break; 
    393   case ROAR_VIO_CTL_GET_SSTREAMID: 
     451  case ROAR_VIO_CTL_SET_SSTREAMID: 
    394452    self->ssid = *(int *)data; 
    395453   break; 
Note: See TracChangeset for help on using the changeset viewer.