Ignore:
Timestamp:
Feb 18, 2009 8:14:15 PM (16 years ago)
Author:
bennylp
Message:

Added audiotest and initial work on audio demo sample

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/projects/aps-direct/pjmedia/src/pjmedia-audiodev/audiodev.c

    r2459 r2463  
    3030 * At driver level, device ID is a 16bit unsigned integer index. 
    3131 */ 
    32 #define MAKE_DEV_ID(f_id, index)   (((f_id & 0xFFFF) << 16) & (index & 0xFFFF)) 
     32#define MAKE_DEV_ID(f_id, index)   (((f_id & 0xFFFF) << 16) | (index & 0xFFFF)) 
    3333#define GET_INDEX(dev_id)          ((dev_id) & 0xFFFF) 
    3434#define GET_FID(dev_id)            ((dev_id) >> 16) 
     
    4040pjmedia_aud_dev_factory* pjmedia_wmme_factory(pj_pool_factory *pf); 
    4141 
    42  
    43 /* Array of factories */ 
    44 static struct factory 
    45 { 
    46     pjmedia_aud_dev_factory*   (*create)(pj_pool_factory*); 
    47     pjmedia_aud_dev_factory     *f; 
    48  
    49 } factories[] =  
    50 { 
    51     /* WMME */ 
     42#define MAX_DRIVERS     16 
     43 
     44/* The audio subsystem */ 
     45static struct aud_subsys 
     46{ 
     47    pj_pool_factory *pf; 
     48    unsigned         factory_cnt; 
     49 
     50    struct factory 
    5251    { 
    53         &pjmedia_wmme_factory 
    54     }, 
    55     /* PortAudio: */ 
    56     { 
    57         &pjmedia_pa_factory 
    58     }, 
    59 }; 
    60 static unsigned factory_cnt; 
     52        pjmedia_aud_dev_factory*   (*create)(pj_pool_factory*); 
     53        pjmedia_aud_dev_factory     *f; 
     54 
     55    } factories[MAX_DRIVERS]; 
     56 
     57} aud_subsys; 
     58 
    6159 
    6260 
     
    6765    pj_status_t status = PJ_ENOMEM; 
    6866 
    69     factory_cnt = 0; 
    70  
    71     for (i=0; i<PJ_ARRAY_SIZE(factories); ++i) { 
    72         factories[i].f = (*factories[i].create)(pf); 
    73         if (!factories[i].f) 
    74             continue; 
    75  
    76         status = factories[i].f->op->init(factories[i].f); 
     67    aud_subsys.pf = pf; 
     68    aud_subsys.factory_cnt = 0; 
     69 
     70    aud_subsys.factories[aud_subsys.factory_cnt++].create = &pjmedia_pa_factory; 
     71    aud_subsys.factories[aud_subsys.factory_cnt++].create = &pjmedia_wmme_factory; 
     72 
     73    for (i=0; i<aud_subsys.factory_cnt; ++i) { 
     74        pjmedia_aud_dev_factory *f; 
     75 
     76        f = (*aud_subsys.factories[i].create)(pf); 
     77        if (!f) 
     78            continue; 
     79 
     80        status = f->op->init(f); 
    7781        if (status != PJ_SUCCESS) { 
    78             factories[i].f->op->destroy(factories[i].f); 
    79             factories[i].f = NULL; 
     82            f->op->destroy(f); 
     83            continue; 
    8084        } 
    8185 
    82         factories[i].f->internal.id = i; 
    83         ++factory_cnt; 
     86        aud_subsys.factories[i].f = f; 
     87        aud_subsys.factories[i].f->internal.id = i; 
    8488    } 
    8589 
    86     return factory_cnt ? PJ_SUCCESS : status; 
     90    return aud_subsys.factory_cnt ? PJ_SUCCESS : status; 
     91} 
     92 
     93/* API: get the pool factory registered to the audio subsystem. */ 
     94PJ_DEF(pj_pool_factory*) pjmedia_aud_subsys_get_pool_factory(void) 
     95{ 
     96    return aud_subsys.pf; 
    8797} 
    8898 
     
    92102    unsigned i; 
    93103 
    94     for (i=0; i<PJ_ARRAY_SIZE(factories); ++i) { 
    95         if (!factories[i].f) 
    96             continue; 
    97  
    98         factories[i].f->op->destroy(factories[i].f); 
    99         factories[i].f = NULL; 
     104    for (i=0; i<aud_subsys.factory_cnt; ++i) { 
     105        pjmedia_aud_dev_factory *f = aud_subsys.factories[i].f; 
     106 
     107        if (!f) 
     108            continue; 
     109 
     110        f->op->destroy(f); 
     111        aud_subsys.factories[i].f = NULL; 
    100112    } 
    101113 
     
    108120    unsigned i, count = 0; 
    109121 
    110     for (i=0; i<PJ_ARRAY_SIZE(factories); ++i) { 
    111         if (!factories[i].f) 
    112             continue; 
    113  
    114         count += factories[i].f->op->get_dev_count(factories[i].f); 
     122    for (i=0; i<aud_subsys.factory_cnt; ++i) { 
     123        pjmedia_aud_dev_factory *f = aud_subsys.factories[i].f; 
     124 
     125        if (!f) 
     126            continue; 
     127 
     128        count += f->op->get_dev_count(f); 
    115129    } 
    116130 
     
    124138    unsigned i, count = 0; 
    125139 
    126     for (i=0; i<PJ_ARRAY_SIZE(factories) && count < max_count; ++i) { 
     140    for (i=0; i<aud_subsys.factory_cnt && count < max_count; ++i) { 
     141        pjmedia_aud_dev_factory *f = aud_subsys.factories[i].f; 
    127142        unsigned j, fcount; 
    128143 
    129         if (!factories[i].f) 
    130             continue; 
    131  
    132         fcount = factories[i].f->op->get_dev_count(factories[i].f); 
     144        if (!f) 
     145            continue; 
     146 
     147        fcount = f->op->get_dev_count(f); 
    133148        for (j=0; j<fcount && count<max_count; ++j) { 
    134149            ids[count++] = MAKE_DEV_ID(i, j); 
     
    144159                                             pjmedia_aud_dev_info *info) 
    145160{ 
     161    pjmedia_aud_dev_factory *f; 
    146162    int f_id, index; 
    147163 
     
    152168    index = GET_INDEX(id); 
    153169 
    154     if (f_id < 0 || f_id >= PJ_ARRAY_SIZE(factories)) 
    155         return PJMEDIA_EAUD_INVDEV; 
    156  
    157     if (factories[f_id].f == NULL) 
    158         return PJMEDIA_EAUD_INVDEV; 
    159  
    160     return factories[f_id].f->op->get_dev_info(factories[f_id].f, 
    161                                               index, info); 
     170    if (f_id < 0 || f_id >= (int)aud_subsys.factory_cnt) 
     171        return PJMEDIA_EAUD_INVDEV; 
     172 
     173    f = aud_subsys.factories[f_id].f; 
     174    if (f == NULL) 
     175        return PJMEDIA_EAUD_INVDEV; 
     176 
     177    return f->op->get_dev_info(f, index, info); 
    162178} 
    163179 
     
    168184                                                  pjmedia_aud_dev_param *param) 
    169185{ 
     186    pjmedia_aud_dev_factory *f; 
    170187    int f_id, index; 
    171188    pj_status_t status; 
     
    177194    index = GET_INDEX(id); 
    178195 
    179     if (f_id < 0 || f_id >= PJ_ARRAY_SIZE(factories)) 
    180         return PJMEDIA_EAUD_INVDEV; 
    181  
    182     if (factories[f_id].f == NULL) 
    183         return PJMEDIA_EAUD_INVDEV; 
    184  
    185     status = factories[f_id].f->op->default_param(factories[f_id].f, 
    186                                                   index, param); 
     196    if (f_id < 0 || f_id >= (int)aud_subsys.factory_cnt) 
     197        return PJMEDIA_EAUD_INVDEV; 
     198 
     199    f = aud_subsys.factories[f_id].f; 
     200    if (f == NULL) 
     201        return PJMEDIA_EAUD_INVDEV; 
     202 
     203    status = f->op->default_param(f, index, param); 
    187204    if (status != PJ_SUCCESS) 
    188205        return status; 
     
    204221                                              pjmedia_aud_stream **p_aud_strm) 
    205222{ 
     223    pjmedia_aud_dev_factory *f; 
    206224    pjmedia_aud_dev_param param; 
    207225    int f_id; 
     
    222240        f_id = GET_FID(param.play_id); 
    223241 
    224     if (f_id < 0 || f_id >= PJ_ARRAY_SIZE(factories)) 
     242    if (f_id < 0 || f_id >= (int)aud_subsys.factory_cnt) 
    225243        return PJMEDIA_EAUD_INVDEV; 
    226244     
     
    229247    param.play_id = GET_INDEX(param.play_id); 
    230248 
    231     if (factories[f_id].f == NULL) 
    232         return PJMEDIA_EAUD_INVDEV; 
    233  
    234     status = factories[f_id].f->op->create_stream(factories[f_id].f, 
    235                                                   &param, rec_cb, play_cb, 
    236                                                   user_data, p_aud_strm); 
     249    f = aud_subsys.factories[f_id].f; 
     250    if (f == NULL) 
     251        return PJMEDIA_EAUD_INVDEV; 
     252 
     253    status = f->op->create_stream(f, &param, rec_cb, play_cb, 
     254                                  user_data, p_aud_strm); 
    237255    if (status != PJ_SUCCESS) 
    238256        return status; 
    239257 
    240     (*p_aud_strm)->factory = factories[f_id].f; 
     258    (*p_aud_strm)->factory = f; 
    241259    return PJ_SUCCESS; 
    242260} 
Note: See TracChangeset for help on using the changeset viewer.