Changeset 3147:f287dc06c28a in roaraudio


Ignore:
Timestamp:
01/15/10 14:04:03 (10 years ago)
Author:
phi
Branch:
default
Message:

implemnted some basic ioctl()s on streams

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroaross/libroaross.c

    r3146 r3147  
    324324 
    325325// ------------------------------------- 
     326// function to parse format: 
     327// ------------------------------------- 
     328 
     329static int _ioctl_stream_format (struct handle * handle, int format) { 
     330 struct roar_audio_info * info = &(handle->stream.info); 
     331 
     332 switch (format) { 
     333  case AFMT_S8: 
     334    info->bits  = 8; 
     335    info->codec = ROAR_CODEC_PCM_S_LE; 
     336   break; 
     337  case AFMT_U8: 
     338    info->bits  = 8; 
     339    info->codec = ROAR_CODEC_PCM_U_LE; 
     340   break; 
     341  case AFMT_S16_BE: 
     342    info->bits  = 16; 
     343    info->codec = ROAR_CODEC_PCM_S_BE; 
     344   break; 
     345  case AFMT_S16_LE: 
     346    info->bits  = 16; 
     347    info->codec = ROAR_CODEC_PCM_S_LE; 
     348   break; 
     349  case AFMT_U16_BE: 
     350    info->bits  = 16; 
     351    info->codec = ROAR_CODEC_PCM_U_BE; 
     352   break; 
     353  case AFMT_U16_LE: 
     354    info->bits  = 16; 
     355    info->codec = ROAR_CODEC_PCM_U_LE; 
     356   break; 
     357#ifdef AFMT_S32_BE 
     358  case AFMT_S32_BE: 
     359    info->bits  = 32; 
     360    info->codec = ROAR_CODEC_PCM_S_BE; 
     361   break; 
     362#endif 
     363#ifdef AFMT_S32_LE 
     364  case AFMT_S32_LE: 
     365    info->bits  = 32; 
     366    info->codec = ROAR_CODEC_PCM_S_LE; 
     367   break; 
     368#endif 
     369  case AFMT_A_LAW: 
     370    info->bits  = 8; 
     371    info->codec = ROAR_CODEC_ALAW; 
     372   break; 
     373  case AFMT_MU_LAW: 
     374    info->bits  = 8; 
     375    info->codec = ROAR_CODEC_MULAW; 
     376   break; 
     377#ifdef AFMT_VORBIS 
     378  case AFMT_VORBIS: 
     379    info->codec = ROAR_CODEC_OGG_VORBIS; 
     380   break; 
     381#endif 
     382 } 
     383 
     384 errno = ENOSYS; 
     385 return -1; 
     386} 
     387 
     388// ------------------------------------- 
    326389// emulated functions follow: 
    327390// ------------------------------------- 
     
    415478 
    416479extern int ioctl (int __fd, unsigned long int __request, ...) { 
     480 struct pointer * pointer; 
     481 struct handle  * handle; 
    417482 va_list args; 
    418483 void *argp; 
     484 int * ip = NULL; 
    419485 
    420486 _init(); 
     
    424490 va_end (args); 
    425491 
     492 if ( (pointer = _get_pointer_by_fh(__fd)) != NULL ) { 
     493  switch ((handle = pointer->handle)->type) { 
     494   ip = argp; 
     495   case HT_STREAM: 
     496     switch (__request) { 
     497      case SNDCTL_DSP_RESET: 
     498      case SNDCTL_DSP_POST: 
     499       break; 
     500      case SNDCTL_DSP_SPEED: 
     501        handle->stream.info.rate = *ip; 
     502        return 0; 
     503       break; 
     504      case SNDCTL_DSP_CHANNELS: 
     505        handle->stream.info.channels = *ip; 
     506        return 0; 
     507       break; 
     508      case SNDCTL_DSP_SETFMT: 
     509        return _ioctl_stream_format(handle, *ip); 
     510       break; 
     511      default: 
     512        errno = ENOSYS; 
     513        return -1; 
     514     } 
     515    break; 
     516   case HT_MIXER: 
     517     errno = ENOSYS; 
     518     return -1; 
     519    break; 
     520   default: 
     521     errno = EINVAL; 
     522     return -1; 
     523    break; 
     524  } 
     525 } 
     526 
    426527 return _os.ioctl(__fd, __request, argp); 
    427528} 
Note: See TracChangeset for help on using the changeset viewer.