Changeset 1518:5d7a197eceb6 in roaraudio for roard/driver_oss.c


Ignore:
Timestamp:
04/11/09 20:53:33 (15 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

reordered a lot code within oss driver, should be more flexible now

File:
1 edited

Legend:

Unmodified
Added
Removed
  • roard/driver_oss.c

    r1242 r1518  
    2626#if defined(ROAR_HAVE_OSS_BSD) || defined(ROAR_HAVE_OSS) 
    2727 
    28 #define er() close(fh); return -1 
    29  
    30 int driver_oss_open(struct roar_vio_calls * inst, char * device, struct roar_audio_info * info, int fh) { 
    31  int tmp; 
    32  int ctmp; 
    33  char * es; 
    34  uint32_t tmp32; 
     28struct driver_oss { 
     29 char * device; 
     30 int fh; 
     31 int blocks; 
     32 int blocksize; 
     33 struct roar_audio_info info; 
     34}; 
     35 
     36#define _get(vio,obj) (((struct driver_oss*)((vio)->inst))->obj) 
     37 
     38ssize_t driver_oss_write    (struct roar_vio_calls * vio, void *buf, size_t count); 
     39int     driver_oss_nonblock (struct roar_vio_calls * vio, int state); 
     40int     driver_oss_close_vio(struct roar_vio_calls * vio); 
     41 
     42int driver_oss_init_vio(struct roar_vio_calls * vio, struct driver_oss * inst) { 
     43 if ( vio == NULL ) 
     44  return -1; 
     45 
     46 memset(vio, 0, sizeof(struct roar_vio_calls)); 
     47 
     48 vio->write    = driver_oss_write; 
     49 vio->nonblock = driver_oss_nonblock; 
     50 vio->sync     = driver_oss_sync; 
     51 vio->ctl      = driver_oss_ctl; 
     52 vio->close    = driver_oss_close_vio; 
     53 
     54 vio->inst     = (void*) inst; 
     55 
     56 return 0; 
     57} 
     58 
     59int driver_oss_open_device(struct driver_oss * self) { 
     60 int    fh     = self->fh; 
     61 char * device = self->device; 
     62 
     63 if ( fh != -1 ) 
     64  return 0; 
    3565 
    3666#ifdef ROAR_DEFAULT_OSS_DEV 
     
    4070 
    4171 if ( device == NULL ) { 
    42   ROAR_ERR("driver_oss_open(*): no default device found, you need to specify one manuelly"); 
    43   return -1; 
    44  } 
    45  
    46  roar_vio_init_calls(inst); 
    47  inst->sync = driver_oss_sync; 
    48  inst->ctl  = driver_oss_ctl; 
    49  
    50  if (  fh == -1 ) { 
    51   if ( (fh = open(device, O_WRONLY, 0644)) == -1 ) { 
    52    ROAR_ERR("driver_oss_open(*): Can not open OSS device: %s: %s", device, strerror(errno)); 
    53    return -1; 
    54   } 
    55  } 
    56  
    57  roar_vio_set_fh(inst, fh); 
    58  
    59  
     72  ROAR_ERR("driver_oss_open_device(*): no default device found, you need to specify one manuelly"); 
     73  return -1; 
     74 } 
     75 
     76 if ( (fh = open(device, O_WRONLY, 0644)) == -1 ) { 
     77  ROAR_ERR("driver_oss_open_device(*): Can not open OSS device: %s: %s", device, strerror(errno)); 
     78  return -1; 
     79 } 
     80 
     81 self->fh = fh; 
     82 
     83 return 0; 
     84} 
     85 
     86int driver_oss_config_device(struct driver_oss * self) { 
     87 int                      fh   =   self->fh; 
     88 struct roar_audio_info * info = &(self->info); 
     89 int tmp, ctmp; 
     90 char * es; 
     91 
     92 if ( fh == -1 ) 
     93  return -1; 
    6094 
    6195#ifdef SNDCTL_DSP_CHANNELS 
     
    6498 if ( ioctl(fh, SNDCTL_DSP_CHANNELS, &tmp) == -1 ) { 
    6599  ROAR_ERR("driver_oss_open(*): can not set number of channels"); 
    66   er(); 
     100  return -1; 
    67101 } 
    68102 
    69103 if ( tmp != info->channels ) { 
    70104   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); 
    71   er(); 
     105  return -1; 
    72106 } 
    73107#else 
     
    75109  case  1: tmp = 0; break; 
    76110  case  2: tmp = 1; break; 
    77   default: er(); 
     111  default: return -1; 
    78112 } 
    79113 
    80114 if ( ioctl(fh, SNDCTL_DSP_STEREO, &tmp) == -1 ) { 
    81115  ROAR_ERR("driver_oss_open(*): can not set number of channels"); 
    82   er(); 
     116  return -1; 
    83117 } 
    84118#endif 
     
    93127     case 32: tmp = AFMT_S32_LE; break; 
    94128#endif 
    95      default: er(); 
     129     default: return -1; 
    96130    } 
    97131   break; 
     
    104138     case 32: tmp = AFMT_S32_BE; break; 
    105139#endif 
    106      default: er(); 
     140     default: return -1; 
    107141    } 
    108142   break; 
     
    111145     case  8: tmp = AFMT_U8;     break; 
    112146     case 16: tmp = AFMT_U16_LE; break; 
    113      default: er(); 
     147     default: return -1; 
    114148    } 
    115149   break; 
     
    118152     case  8: tmp = AFMT_U8;     break; 
    119153     case 16: tmp = AFMT_U16_BE; break; 
    120      default: er(); 
     154     default: return -1; 
    121155    } 
    122156  case ROAR_CODEC_ALAW: 
     
    132166#endif 
    133167  default: 
    134     er(); 
     168    return -1; 
    135169   break; 
    136170 } 
     
    143177#endif 
    144178  ROAR_ERR("driver_oss_open(*): can not set sample format"); 
    145   er(); 
     179  return -1; 
    146180 } 
    147181 
     
    173207   ROAR_ERR("driver_oss_open(*): can not set requested codec, set codec manuelly via -oO codec=somecodec"); 
    174208  } 
    175   er(); 
     209  return -1; 
    176210 } 
    177211 
     
    180214 if ( ioctl(fh, SNDCTL_DSP_SPEED, &tmp) == -1 ) { 
    181215  ROAR_ERR("driver_oss_open(*): can not set sample rate"); 
    182   er(); 
     216  return -1; 
    183217 } 
    184218 
    185219 if ( tmp < info->rate * 0.98 || tmp > info->rate * 1.02 ) { 
    186220  ROAR_ERR("driver_oss_open(*): sample rate out of acceptable accuracy"); 
     221  return -1; 
     222 } 
     223 
     224 return 0; 
     225} 
     226 
     227#define er() close(self->fh); if ( self->device ) free(self->device); free(self); return -1 
     228int driver_oss_open(struct roar_vio_calls * inst, char * device, struct roar_audio_info * info, int fh) { 
     229 struct driver_oss * self = NULL; 
     230 uint32_t tmp32; 
     231 
     232 if ( (self = malloc(sizeof(struct driver_oss))) == NULL ) { 
     233  ROAR_ERR("driver_oss_open(*): Can not malloc() instance data: %s", strerror(errno)); 
     234  return -1; 
     235 } 
     236 
     237 memset(self, 0, sizeof(struct driver_oss)); 
     238 memcpy(&(self->info), info, sizeof(struct roar_audio_info)); 
     239 
     240 self->fh = fh; 
     241 
     242 if ( device != NULL ) 
     243  self->device = strdup(device); 
     244 
     245 if ( driver_oss_init_vio(inst, self) == -1 ) { 
     246  ROAR_ERR("driver_oss_open(*): Can not init vio interface"); 
    187247  er(); 
    188248 } 
    189249 
     250 if ( driver_oss_open_device(self) == -1 ) { 
     251  ROAR_ERR("driver_oss_open(*): Can not open audio device"); 
     252  er(); 
     253 } 
     254 
     255 if ( driver_oss_config_device(self) == -1 ) { 
     256  ROAR_ERR("driver_oss_open(*): Can not configure audio device"); 
     257  er(); 
     258 } 
    190259 
    191260 tmp32 = 4; 
     
    196265 return 0; 
    197266} 
     267#undef er 
    198268 
    199269int driver_oss_close(DRIVER_USERDATA_T   inst) { 
     
    201271} 
    202272 
     273int     driver_oss_close_vio(struct roar_vio_calls * vio) { 
     274 close(_get(vio,fh)); 
     275 
     276 if ( _get(vio,device) != NULL ) 
     277  free(_get(vio,device)); 
     278 
     279 free(vio->inst); 
     280 return 0; 
     281} 
     282 
     283int     driver_oss_nonblock(struct roar_vio_calls * vio, int state) { 
     284 if ( roar_socket_nonblock(_get(vio,fh), state) == -1 ) 
     285  return -1; 
     286 
     287 if ( state == ROAR_SOCKET_NONBLOCK ) 
     288  return 0; 
     289 
     290 roar_vio_sync(vio); 
     291 
     292 return 0; 
     293} 
     294 
    203295int driver_oss_sync(struct roar_vio_calls * vio) { 
    204296#ifdef SNDCTL_DSP_SYNC 
    205  return ioctl(roar_vio_get_fh(vio), SNDCTL_DSP_SYNC, NULL); 
     297 return ioctl(_get(vio,fh), SNDCTL_DSP_SYNC, NULL); 
    206298#else 
    207299 return 0; 
     
    218310  case ROAR_VIO_CTL_GET_DELAY: 
    219311#ifdef SNDCTL_DSP_GETODELAY 
    220     if ( ioctl(roar_vio_get_fh(vio), SNDCTL_DSP_GETODELAY, &d) == -1 ) 
     312    if ( ioctl(_get(vio,fh), SNDCTL_DSP_GETODELAY, &d) == -1 ) 
    221313     return -1; 
    222314 
     
    231323#ifdef SNDCTL_DSP_SETFRAGMENT 
    232324    d = (*(uint_least32_t *)data) << 16 | 11; // (*data) fragements of 2048 Bytes. 
    233     if ( ioctl(roar_vio_get_fh(vio), SNDCTL_DSP_SETFRAGMENT, &d) == -1 ) { 
     325    if ( ioctl(_get(vio,fh), SNDCTL_DSP_SETFRAGMENT, &d) == -1 ) { 
    234326     ROAR_WARN("driver_oss_ctl(*): Can not set fragment size, sorry :("); 
    235327    } 
     
    249341} 
    250342 
     343ssize_t driver_oss_write   (struct roar_vio_calls * vio, void *buf, size_t count) { 
     344 return write(_get(vio,fh), buf, count); 
     345} 
     346 
    251347#endif 
    252348//ll 
Note: See TracChangeset for help on using the changeset viewer.