Changeset 1521:1ecaaea92527 in roaraudio


Ignore:
Timestamp:
04/11/09 23:50:55 (15 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

do seting of framents on first write

File:
1 edited

Legend:

Unmodified
Added
Removed
  • roard/driver_oss.c

    r1518 r1521  
    3232 int blocksize; 
    3333 struct roar_audio_info info; 
     34 int need_reopen; 
     35 int need_config; 
    3436}; 
    3537 
     
    222224 } 
    223225 
     226 // latency things: 
     227#ifdef SNDCTL_DSP_SETFRAGMENT 
     228 
     229 // defaults 
     230 if ( self->blocksize < 1 ) 
     231  self->blocksize = 2048; 
     232 if ( self->blocks < 1 ) 
     233  self->blocks    =    4; 
     234 
     235 tmp  = 11; 
     236 
     237 tmp |= self->blocks << 16; 
     238 if ( ioctl(fh, SNDCTL_DSP_SETFRAGMENT, &tmp) == -1 ) { 
     239  ROAR_WARN("driver_oss_ctl(*): Can not set fragment size, sorry :("); 
     240 } 
     241#endif 
     242 
     243 self->need_config = 0; 
     244 
    224245 return 0; 
    225246} 
     
    253274 } 
    254275 
     276 self->need_config = 1; 
     277 
     278/* 
    255279 if ( driver_oss_config_device(self) == -1 ) { 
    256280  ROAR_ERR("driver_oss_open(*): Can not configure audio device"); 
    257281  er(); 
    258282 } 
     283*/ 
    259284 
    260285 tmp32 = 4; 
     
    302327 
    303328int driver_oss_ctl(struct roar_vio_calls * vio, int cmd, void * data) { 
     329 struct driver_oss * self = vio->inst; 
    304330 int d; 
     331 
     332 ROAR_WARN("driver_oss_ctl(vio=%p, cmd=%i, data=%p) = ?", vio, cmd, data); 
    305333 
    306334 if ( vio == NULL ) 
     
    322350  case ROAR_VIO_CTL_SET_DBLOCKS: 
    323351#ifdef SNDCTL_DSP_SETFRAGMENT 
    324     d = (*(uint_least32_t *)data) << 16 | 11; // (*data) fragements of 2048 Bytes. 
    325     if ( ioctl(_get(vio,fh), SNDCTL_DSP_SETFRAGMENT, &d) == -1 ) { 
    326      ROAR_WARN("driver_oss_ctl(*): Can not set fragment size, sorry :("); 
    327     } 
     352    if ( !self->need_config ) { 
     353     ROAR_WARN("driver_oss_ctl(*): possible late ROAR_VIO_CTL_SET_DBLOCKS, setting anyway."); 
     354    } 
     355 
     356    self->blocks    = *(uint_least32_t *)data; 
    328357#else 
    329358    return -1; 
    330359#endif 
    331360   break; 
     361  case ROAR_VIO_CTL_SET_DBLKSIZE: 
     362#ifdef SNDCTL_DSP_SETFRAGMENT 
     363    if ( !self->need_config ) { 
     364     ROAR_WARN("driver_oss_ctl(*): possible late ROAR_VIO_CTL_SET_DBLKSIZE, setting anyway."); 
     365    } 
     366 
     367    self->blocksize = *(uint_least32_t *)data; 
     368#else 
     369    return -1; 
     370#endif 
     371   break; 
    332372  case ROAR_VIO_CTL_GET_DBLKSIZE: 
    333     *(uint_least32_t *)data = 2048; 
     373    if ( !self->blocksize ) 
     374     return -1; 
     375 
     376    *(uint_least32_t *)data = self->blocksize; 
    334377    return 0; 
    335378   break; 
     
    342385 
    343386ssize_t driver_oss_write   (struct roar_vio_calls * vio, void *buf, size_t count) { 
     387 if ( _get(vio,need_config) ) { 
     388  if ( driver_oss_config_device(vio->inst) == -1 ) { 
     389   return -1; 
     390  } 
     391 } 
     392 
    344393 return write(_get(vio,fh), buf, count); 
    345394} 
Note: See TracChangeset for help on using the changeset viewer.