Ignore:
Timestamp:
Dec 28, 2016 3:40:07 AM (7 years ago)
Author:
nanang
Message:

Re #1900: More merged from trunk (r5512 mistakenly contains merged changes in third-party dir only).

Location:
pjproject/branches/projects/uwp
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/projects/uwp

  • pjproject/branches/projects/uwp/pjmedia/src/pjmedia-audiodev/android_jni_dev.c

    r5157 r5513  
    6060    pjmedia_dir         dir; 
    6161    pjmedia_aud_param   param; 
    62      
     62 
    6363    int                 bytes_per_sample; 
    6464    pj_uint32_t         samples_per_sec; 
     
    7777    pj_thread_t        *rec_thread; 
    7878    pj_sem_t           *rec_sem; 
    79     pj_timestamp        rec_timestamp; 
    80      
     79    pj_timestamp        rec_timestamp;     
     80 
    8181    /* Track */ 
    8282    jobject             track; 
     
    8787    pj_thread_t        *play_thread; 
    8888    pj_sem_t           *play_sem; 
    89     pj_timestamp        play_timestamp; 
     89    pj_timestamp        play_timestamp; 
    9090}; 
    9191 
     
    484484    pj_ansi_strcpy(info->name, "Android JNI"); 
    485485    info->default_samples_per_sec = 8000; 
    486     info->caps = PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING; 
     486    info->caps = PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING | 
     487                 PJMEDIA_AUD_DEV_CAP_INPUT_SOURCE; 
    487488    info->input_count = 1; 
    488489    info->output_count = 1; 
     490    info->routes = PJMEDIA_AUD_DEV_ROUTE_CUSTOM; 
    489491     
    490492    return PJ_SUCCESS; 
     
    566568    stream->pool = pool; 
    567569    pj_strdup2_with_null(pool, &stream->name, "JNI stream"); 
    568     stream->dir = PJMEDIA_DIR_CAPTURE_PLAYBACK; 
     570    stream->dir = param->dir; 
    569571    pj_memcpy(&stream->param, param, sizeof(*param)); 
    570572    stream->user_data = user_data; 
     
    664666    if (stream->dir & PJMEDIA_DIR_CAPTURE) { 
    665667        jthrowable exc; 
     668        jobject record_obj; 
    666669        int mic_source = 0; /* DEFAULT: default audio source */ 
     670 
     671        if ((param->flags & PJMEDIA_AUD_DEV_CAP_INPUT_SOURCE) && 
     672            (param->input_route & PJMEDIA_AUD_DEV_ROUTE_CUSTOM)) 
     673        { 
     674            mic_source = param->input_route & ~PJMEDIA_AUD_DEV_ROUTE_CUSTOM; 
     675        } 
    667676 
    668677        /* Get pointer to the constructor */ 
     
    695704         
    696705        do { 
    697             stream->record =  (*jni_env)->NewObject(jni_env, 
    698                                                     stream->record_class, 
    699                                                     constructor_method, 
    700                                                     mic_source,  
    701                                                     param->clock_rate, 
    702                                                     channelInCfg, 
    703                                                     sampleFormat, 
    704                                                     inputBuffSizeRec); 
    705             if (stream->record == 0) { 
     706            record_obj =  (*jni_env)->NewObject(jni_env, 
     707                                                stream->record_class, 
     708                                                constructor_method, 
     709                                                mic_source,  
     710                                                param->clock_rate, 
     711                                                channelInCfg, 
     712                                                sampleFormat, 
     713                                                inputBuffSizeRec); 
     714            if (record_obj == 0) { 
    706715                PJ_LOG(3, (THIS_FILE, "Unable to create audio record object")); 
    707716                status = PJMEDIA_EAUD_INIT; 
     
    732741                goto on_error; 
    733742            } 
    734             state = (*jni_env)->CallIntMethod(jni_env, stream->record, 
    735                                               method_id); 
     743            state = (*jni_env)->CallIntMethod(jni_env, record_obj, method_id); 
    736744            if (state == 0) { /* STATE_UNINITIALIZED */ 
    737745                PJ_LOG(3, (THIS_FILE, "Failure in initializing audio record.")); 
     
    745753        } while (state == 0); 
    746754         
    747         stream->record = (*jni_env)->NewGlobalRef(jni_env, stream->record); 
     755        stream->record = (*jni_env)->NewGlobalRef(jni_env, record_obj); 
    748756        if (stream->record == 0) { 
    749             PJ_LOG(3, (THIS_FILE, "Unable to create audio record global ref.")); 
     757            jmethodID release_method=0; 
     758             
     759            PJ_LOG(3, (THIS_FILE, "Unable to create audio record global ref."));             
     760            release_method = (*jni_env)->GetMethodID(jni_env,  
     761                                                     stream->record_class, 
     762                                                     "release", "()V"); 
     763            (*jni_env)->CallVoidMethod(jni_env, record_obj, release_method); 
     764             
    750765            status = PJMEDIA_EAUD_INIT; 
    751766            goto on_error; 
     
    767782    if (stream->dir & PJMEDIA_DIR_PLAYBACK) { 
    768783        jthrowable exc; 
     784        jobject track_obj; 
    769785         
    770786        /* Get pointer to the constructor */ 
     
    778794        } 
    779795         
    780         stream->track = (*jni_env)->NewObject(jni_env, 
    781                                               stream->track_class, 
    782                                               constructor_method, 
    783                                               0, /* STREAM_VOICE_CALL */ 
    784                                               param->clock_rate, 
    785                                               channelOutCfg, 
    786                                               sampleFormat, 
    787                                               inputBuffSizePlay, 
    788                                               1 /* MODE_STREAM */); 
    789         if (stream->track == 0) { 
     796        track_obj = (*jni_env)->NewObject(jni_env, 
     797                                          stream->track_class, 
     798                                          constructor_method, 
     799                                          0, /* STREAM_VOICE_CALL */ 
     800                                          param->clock_rate, 
     801                                          channelOutCfg, 
     802                                          sampleFormat, 
     803                                          inputBuffSizePlay, 
     804                                          1 /* MODE_STREAM */); 
     805        if (track_obj == 0) { 
    790806            PJ_LOG(3, (THIS_FILE, "Unable to create audio track object.")); 
    791807            status = PJMEDIA_EAUD_INIT; 
     
    802818        } 
    803819         
    804         stream->track = (*jni_env)->NewGlobalRef(jni_env, stream->track); 
     820        stream->track = (*jni_env)->NewGlobalRef(jni_env, track_obj); 
    805821        if (stream->track == 0) { 
     822            jmethodID release_method=0; 
     823                 
     824            release_method = (*jni_env)->GetMethodID(jni_env,  
     825                                                     stream->track_class, 
     826                                                     "release", "()V"); 
     827            (*jni_env)->CallVoidMethod(jni_env, track_obj, release_method); 
     828             
    806829            PJ_LOG(3, (THIS_FILE, "Unable to create audio track's global ref")); 
    807830            status = PJMEDIA_EAUD_INIT; 
     
    973996     
    974997    PJ_LOG(4,(THIS_FILE, "Destroying Android JNI stream...")); 
    975      
     998 
    976999    stream->quit_flag = PJ_TRUE; 
    9771000     
     
    9801003     
    9811004    attached = attach_jvm(&jni_env); 
    982      
     1005 
    9831006    if (stream->record){ 
    9841007        if (stream->rec_thread) { 
     
    9931016            stream->rec_sem = NULL; 
    9941017        } 
    995          
    996         release_method = (*jni_env)->GetMethodID(jni_env, stream->record_class, 
    997                                                  "release", "()V"); 
    998         (*jni_env)->CallVoidMethod(jni_env, stream->record, release_method); 
    999          
     1018        if (stream->record_class) { 
     1019            release_method = (*jni_env)->GetMethodID(jni_env,  
     1020                                                     stream->record_class, 
     1021                                                     "release", "()V"); 
     1022            (*jni_env)->CallVoidMethod(jni_env, stream->record, 
     1023                                       release_method); 
     1024        } 
    10001025        (*jni_env)->DeleteGlobalRef(jni_env, stream->record); 
    1001         (*jni_env)->DeleteGlobalRef(jni_env, stream->record_class); 
    10021026        stream->record = NULL; 
    1003         stream->record_class = NULL; 
    10041027        PJ_LOG(4, (THIS_FILE, "Audio record released")); 
     1028    } 
     1029    if (stream->record_class) { 
     1030        (*jni_env)->DeleteGlobalRef(jni_env, stream->record_class); 
     1031        stream->record_class = NULL; 
    10051032    } 
    10061033     
     
    10171044            stream->play_sem = NULL; 
    10181045        } 
    1019          
    1020         release_method = (*jni_env)->GetMethodID(jni_env, stream->track_class, 
    1021                                                  "release", "()V"); 
    1022         (*jni_env)->CallVoidMethod(jni_env, stream->track, release_method); 
    1023          
     1046        if (stream->track_class) { 
     1047            release_method = (*jni_env)->GetMethodID(jni_env,  
     1048                                                     stream->track_class, 
     1049                                                     "release", "()V"); 
     1050            (*jni_env)->CallVoidMethod(jni_env, stream->track,  
     1051                                       release_method); 
     1052        } 
    10241053        (*jni_env)->DeleteGlobalRef(jni_env, stream->track); 
    1025         (*jni_env)->DeleteGlobalRef(jni_env, stream->track_class); 
    1026         stream->track = NULL; 
    1027         stream->track_class = NULL; 
    1028         PJ_LOG(3, (THIS_FILE, "Audio track released")); 
     1054        stream->track = NULL;         
     1055        PJ_LOG(4, (THIS_FILE, "Audio track released")); 
     1056    } 
     1057    if (stream->track_class) { 
     1058        (*jni_env)->DeleteGlobalRef(jni_env, stream->track_class); 
     1059        stream->track_class = NULL; 
    10291060    } 
    10301061 
Note: See TracChangeset for help on using the changeset viewer.