Changeset 2464


Ignore:
Timestamp:
Feb 19, 2009 12:08:19 PM (10 years ago)
Author:
bennylp
Message:

Updated audio test

Location:
pjproject/branches/projects/aps-direct
Files:
3 edited

Legend:

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

    r2463 r2464  
    4545static struct aud_subsys 
    4646{ 
     47    unsigned         init_count; 
    4748    pj_pool_factory *pf; 
    4849    unsigned         factory_cnt; 
     
    6566    pj_status_t status = PJ_ENOMEM; 
    6667 
     68    /* Allow init() to be called multiple times as long as there is matching 
     69     * number of shutdown(). 
     70     */ 
     71    if (aud_subsys.init_count++ != 0) { 
     72        return PJ_SUCCESS; 
     73    } 
     74 
    6775    aud_subsys.pf = pf; 
    6876    aud_subsys.factory_cnt = 0; 
     
    101109{ 
    102110    unsigned i; 
     111 
     112    /* Allow shutdown() to be called multiple times as long as there is matching 
     113     * number of init(). 
     114     */ 
     115    if (aud_subsys.init_count == 0) { 
     116        return PJ_SUCCESS; 
     117    } 
     118    --aud_subsys.init_count; 
    103119 
    104120    for (i=0; i<aud_subsys.factory_cnt; ++i) { 
  • pjproject/branches/projects/aps-direct/pjmedia/src/pjmedia-audiodev/pa_dev.c

    r2459 r2464  
    686686    PaError err; 
    687687 
     688    PJ_ASSERT_RETURN(rec_cb && p_snd_strm, PJ_EINVAL); 
     689 
    688690    rec_id = param->rec_id; 
    689691    if (rec_id < 0) { 
     
    788790    unsigned paFrames, paRate, paLatency; 
    789791    PaError err; 
     792 
     793    PJ_ASSERT_RETURN(play_cb && p_snd_strm, PJ_EINVAL); 
    790794 
    791795    play_id = param->play_id; 
     
    898902    unsigned paFrames, paRate, paInputLatency, paOutputLatency; 
    899903    PaError err; 
     904 
     905    PJ_ASSERT_RETURN(play_cb && rec_cb && p_snd_strm, PJ_EINVAL); 
    900906 
    901907    rec_id = param->rec_id; 
  • pjproject/branches/projects/aps-direct/pjsip-apps/src/samples/auddemo.c

    r2463 r2464  
    2626#define THIS_FILE       "auddemo.c" 
    2727#define MAX_DEVICES     64 
     28#define WAV_FILE        "auddemo.wav" 
    2829 
    2930 
     
    167168            char bitrate[32]; 
    168169 
    169             switch (info.ext_fmt[i].fmt_id) { 
     170            switch (info.ext_fmt[i].id) { 
    170171            case PJMEDIA_FORMAT_L16: 
    171172                strcat(formats, "L16/"); 
     
    273274        } 
    274275    } 
     276} 
     277 
     278 
     279static pj_status_t wav_rec_cb(void *user_data, pjmedia_frame *frame) 
     280{ 
     281    return pjmedia_port_put_frame((pjmedia_port*)user_data, frame); 
     282} 
     283 
     284static void record(unsigned rec_index, const char *filename) 
     285{ 
     286    pj_pool_t *pool = NULL; 
     287    pjmedia_port *wav = NULL; 
     288    pjmedia_aud_dev_param param; 
     289    pjmedia_aud_stream *strm = NULL; 
     290    char line[10]; 
     291    pj_status_t status; 
     292 
     293    if (filename == NULL) 
     294        filename = WAV_FILE; 
     295 
     296    pool = pj_pool_create(pjmedia_aud_subsys_get_pool_factory(), "wav", 
     297                          1000, 1000, NULL); 
     298 
     299    status = pjmedia_wav_writer_port_create(pool, filename, 16000,  
     300                                            1, 320, 16, 0, 0, &wav); 
     301    if (status != PJ_SUCCESS) { 
     302        app_perror("Error creating WAV file", status); 
     303        goto on_return; 
     304    } 
     305 
     306    status = pjmedia_aud_dev_default_param(dev_id[rec_index], &param); 
     307    if (status != PJ_SUCCESS) { 
     308        app_perror("pjmedia_aud_dev_default_param()", status); 
     309        goto on_return; 
     310    } 
     311 
     312    param.dir = PJMEDIA_DIR_CAPTURE; 
     313    param.clock_rate = wav->info.clock_rate; 
     314    param.samples_per_frame = wav->info.samples_per_frame; 
     315    param.channel_count = wav->info.channel_count; 
     316    param.bits_per_sample = wav->info.bits_per_sample; 
     317 
     318    status = pjmedia_aud_stream_create(&param, &wav_rec_cb, NULL, wav, 
     319                                       &strm); 
     320    if (status != PJ_SUCCESS) { 
     321        app_perror("Error opening the sound device", status); 
     322        goto on_return; 
     323    } 
     324 
     325    status = pjmedia_aud_stream_start(strm); 
     326    if (status != PJ_SUCCESS) { 
     327        app_perror("Error starting the sound device", status); 
     328        goto on_return; 
     329    } 
     330 
     331    PJ_LOG(3,(THIS_FILE, "Recording started, press ENTER to stop")); 
     332    fgets(line, sizeof(line), stdin); 
     333 
     334on_return: 
     335    if (strm) { 
     336        pjmedia_aud_stream_stop(strm); 
     337        pjmedia_aud_stream_destroy(strm); 
     338    } 
     339    if (wav) 
     340        pjmedia_port_destroy(wav); 
     341    if (pool) 
     342        pj_pool_release(pool); 
     343} 
     344 
     345 
     346static pj_status_t wav_play_cb(void *user_data, pjmedia_frame *frame) 
     347{ 
     348    return pjmedia_port_get_frame((pjmedia_port*)user_data, frame); 
     349} 
     350 
     351 
     352static void play_file(unsigned play_index, const char *filename) 
     353{ 
     354    pj_pool_t *pool = NULL; 
     355    pjmedia_port *wav = NULL; 
     356    pjmedia_aud_dev_param param; 
     357    pjmedia_aud_stream *strm = NULL; 
     358    char line[10]; 
     359    pj_status_t status; 
     360 
     361    if (filename == NULL) 
     362        filename = WAV_FILE; 
     363 
     364    pool = pj_pool_create(pjmedia_aud_subsys_get_pool_factory(), "wav", 
     365                          1000, 1000, NULL); 
     366 
     367    status = pjmedia_wav_player_port_create(pool, filename, 20, 0, 0, &wav); 
     368    if (status != PJ_SUCCESS) { 
     369        app_perror("Error opening WAV file", status); 
     370        goto on_return; 
     371    } 
     372 
     373    status = pjmedia_aud_dev_default_param(dev_id[play_index], &param); 
     374    if (status != PJ_SUCCESS) { 
     375        app_perror("pjmedia_aud_dev_default_param()", status); 
     376        goto on_return; 
     377    } 
     378 
     379    param.dir = PJMEDIA_DIR_PLAYBACK; 
     380    param.clock_rate = wav->info.clock_rate; 
     381    param.samples_per_frame = wav->info.samples_per_frame; 
     382    param.channel_count = wav->info.channel_count; 
     383    param.bits_per_sample = wav->info.bits_per_sample; 
     384 
     385    status = pjmedia_aud_stream_create(&param, NULL, &wav_play_cb, wav, 
     386                                       &strm); 
     387    if (status != PJ_SUCCESS) { 
     388        app_perror("Error opening the sound device", status); 
     389        goto on_return; 
     390    } 
     391 
     392    status = pjmedia_aud_stream_start(strm); 
     393    if (status != PJ_SUCCESS) { 
     394        app_perror("Error starting the sound device", status); 
     395        goto on_return; 
     396    } 
     397 
     398    PJ_LOG(3,(THIS_FILE, "Playback started, press ENTER to stop")); 
     399    fgets(line, sizeof(line), stdin); 
     400 
     401on_return: 
     402    if (strm) { 
     403        pjmedia_aud_stream_stop(strm); 
     404        pjmedia_aud_stream_destroy(strm); 
     405    } 
     406    if (wav) 
     407        pjmedia_port_destroy(wav); 
     408    if (pool) 
     409        pj_pool_release(pool); 
    275410} 
    276411 
     
    289424    puts("                             PTIM: ptime in ms"); 
    290425    puts("                             CH:   # of channels"); 
     426    puts("  r RID [FILE]             Record capture device RID to WAV file"); 
     427    puts("  p PID [FILE]             Playback WAV file to device ID PID"); 
    291428    puts("  v                        Toggle log verbosity"); 
    292429    puts("  q                        Quit"); 
     
    392529            break; 
    393530 
     531        case 'r': 
     532            /* record */ 
     533            { 
     534                int index; 
     535                char filename[80]; 
     536                int count; 
     537 
     538                count = sscanf(line+2, "%d %s", &index, filename); 
     539                if (count==1) 
     540                    record(index, NULL); 
     541                else if (count==2) 
     542                    record(index, filename); 
     543                else 
     544                    puts("error: invalid command syntax"); 
     545            } 
     546            break; 
     547 
     548        case 'p': 
     549            /* playback */ 
     550            { 
     551                int index; 
     552                char filename[80]; 
     553                int count; 
     554 
     555                count = sscanf(line+2, "%d %s", &index, filename); 
     556                if (count==1) 
     557                    play_file(index, NULL); 
     558                else if (count==2) 
     559                    play_file(index, filename); 
     560                else 
     561                    puts("error: invalid command syntax"); 
     562            } 
     563            break; 
     564 
    394565        case 'v': 
    395566            if (pj_log_get_level() <= 3) { 
Note: See TracChangeset for help on using the changeset viewer.