Changeset 5615:980750396d94 in roaraudio


Ignore:
Timestamp:
08/08/12 16:26:00 (12 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

Allow passing of extra parameters to cdrivers (Closes: #290)

Files:
3 edited

Legend:

Unmodified
Added
Removed
  • ChangeLog

    r5614 r5615  
    11v. 1.0beta5 - ? 
    22        * Fixed pa_xfree() (Closes: #293) 
     3        * Allow passing of extra parameters to cdrivers (Closes: #290) 
    34 
    45v. 1.0beta4 - Mon Aug 06 2012 16:43 CEST 
  • include/libroareio/driver.h

    r5381 r5615  
    4646int roar_cdriver_open(struct roar_vio_calls * calls, const char * name, const char * dev, struct roar_audio_info * info, int dir); 
    4747 
     48int roar_cdriver_open2(struct roar_vio_calls * calls, const char * name, const char * dev, struct roar_audio_info * info, int dir, struct roar_keyval * para, ssize_t paralen); 
     49 
     50ssize_t roar_cdriver_list   (const char ** list, size_t len, size_t offset) _LIBROAR_STREAM_STDATTRS; 
     51 
    4852// driver prototypes: 
    4953int roar_cdriver_oss (struct roar_vio_calls * calls, const char * name, const char * dev, struct roar_audio_info * info, int dir); 
  • libroareio/driver.c

    r5388 r5615  
    3232#endif 
    3333 
    34 int roar_cdriver_null(struct roar_vio_calls * calls, const char * name, const char * dev, struct roar_audio_info * info, int dir) { 
     34static int roar_cdriver_null(struct roar_vio_calls * calls, const char * name, const char * dev, struct roar_audio_info * info, int dir, struct roar_keyval * para, ssize_t paralen) { 
    3535 ROAR_DBG("roar_cdriver_null(calls=%p, name='%s', dev='%s', info=%p{...}, dir=%i(?)) = ?", calls, name, dev, info, dir); 
    3636 
    37  (void)name, (void)dev, (void)info, (void)dir; 
     37 (void)name, (void)dev, (void)info, (void)dir, (void)para, (void)paralen; 
    3838 
    3939 memset(calls, 0, sizeof(struct roar_vio_calls)); 
     
    4747} 
    4848 
    49 struct roar_cdriver _g_roar_cdriver[] = { 
    50  {"null", roar_cdriver_null}, 
    51  {"roar", roar_cdriver_roar}, 
     49struct { 
     50 const char * name; 
     51 int  (*open)(struct roar_vio_calls * calls, const char * name, const char * dev, struct roar_audio_info * info, int dir); 
     52 int  (*open2)(struct roar_vio_calls * calls, const char * name, const char * dev, struct roar_audio_info * info, int dir, struct roar_keyval * para, ssize_t paralen); 
     53} _g_roar_cdriver[] = { 
     54 {"null", NULL, roar_cdriver_null}, 
     55 {"roar", roar_cdriver_roar, NULL}, 
    5256#if defined(ROAR_HAVE_OSS_BSD) || defined(ROAR_HAVE_OSS) 
    53  {"oss",  roar_cdriver_oss}, 
     57 {"oss",  roar_cdriver_oss, NULL}, 
    5458#endif 
    5559#ifdef ROAR_HAVE_AD_ESDFW 
    5660#include "driver_esdfw.c" 
    5761#endif 
    58  {NULL, NULL} 
     62 {NULL, NULL, NULL} 
    5963}; 
    6064 
    6165 
    62 static int roar_cdriver_open_default(struct roar_vio_calls * calls, const char * dev, struct roar_audio_info * info, int dir) { 
     66static int roar_cdriver_open_default(struct roar_vio_calls * calls, const char * dev, struct roar_audio_info * info, int dir, struct roar_keyval * para, ssize_t paralen) { 
    6367 const char * names[] = { 
    6468  // native APIs: 
     
    7781 
    7882 for (i = 0; i < (sizeof(names)/sizeof(*names)); i++) { 
    79   ret = roar_cdriver_open(calls, names[i], dev, info, dir); 
     83  ret = roar_cdriver_open2(calls, names[i], dev, info, dir, para, paralen); 
    8084  if ( ret != -1 ) 
    8185   return ret; 
    8286 } 
    8387 
     88 // roar_error is still set to the error of the last tested driver. 
    8489 return -1; 
    8590} 
    8691 
    87 int roar_cdriver_open(struct roar_vio_calls * calls, const char * name, const char * dev, struct roar_audio_info * info, int dir) { 
     92int roar_cdriver_open2(struct roar_vio_calls * calls, const char * name, const char * dev, struct roar_audio_info * info, int 
     93 dir, struct roar_keyval * para, ssize_t paralen) { 
    8894 int i; 
    8995 char *delm; 
    9096 
    9197 if ( name == NULL ) 
    92   return roar_cdriver_open_default(calls, dev, info, dir); 
     98  return roar_cdriver_open_default(calls, dev, info, dir, para, paralen); 
    9399 
    94100 for (i = 0; _g_roar_cdriver[i].name != NULL; i++) { 
    95101  ROAR_DBG("roar_cdriver_open(*): _g_roar_cdriver[i].name='%s' <cmp> name='%s'", _g_roar_cdriver[i].name, name); 
    96102 
    97   if ( !strcmp(_g_roar_cdriver[i].name, name) ) 
    98    return _g_roar_cdriver[i].open(calls, name, dev, info, dir); 
     103  if ( !strcmp(_g_roar_cdriver[i].name, name) ) { 
     104   if ( _g_roar_cdriver[i].open2 != NULL ) 
     105    return _g_roar_cdriver[i].open2(calls, name, dev, info, dir, para, paralen); 
     106   if ( _g_roar_cdriver[i].open != NULL ) 
     107    return _g_roar_cdriver[i].open(calls, name, dev, info, dir); 
     108  } 
    99109 
    100110  if ( (delm = strstr(_g_roar_cdriver[i].name, ":")) != NULL ) { 
    101111   ROAR_DBG("roar_cdriver_open(*): delm+1='%s' <cmp> name='%s'", delm+1, name); 
    102    if ( !strcmp(delm+1, name) ) 
    103     return _g_roar_cdriver[i].open(calls, name, dev, info, dir); 
     112   if ( !strcmp(delm+1, name) ) { 
     113    if ( _g_roar_cdriver[i].open2 != NULL ) 
     114     return _g_roar_cdriver[i].open2(calls, name, dev, info, dir, para, paralen); 
     115    if ( _g_roar_cdriver[i].open != NULL ) 
     116     return _g_roar_cdriver[i].open(calls, name, dev, info, dir); 
     117   } 
    104118  } 
    105119 
    106120 } 
    107121 
     122 roar_err_set(ROAR_ERROR_NOENT); 
    108123 return -1; 
    109124} 
    110125 
     126ssize_t   roar_profiles_list   (const char ** list, size_t len, size_t offset) { 
     127 size_t i; 
     128 size_t idx = 0; 
     129 
     130 if ( list == NULL ) { 
     131  roar_err_set(ROAR_ERROR_FAULT); 
     132  return -1; 
     133 } 
     134 
     135 if ( len == 0 ) 
     136  return 0; 
     137 
     138 if ( offset >= (sizeof(_g_roar_cdriver)/sizeof(*_g_roar_cdriver)) ) 
     139  return 0; 
     140 
     141 for (i = offset; _g_roar_cdriver[i].name != NULL; i++) { 
     142  list[idx++] = _g_roar_cdriver[i].name; 
     143 } 
     144 
     145 return idx; 
     146} 
     147 
     148int roar_cdriver_open(struct roar_vio_calls * calls, const char * name, const char * dev, struct roar_audio_info * info, int dir) { 
     149 return roar_cdriver_open2(calls, name, dev, info, dir, NULL, -1);  
     150} 
     151 
    111152//ll 
Note: See TracChangeset for help on using the changeset viewer.