Changeset 5920


Ignore:
Timestamp:
Dec 12, 2018 7:16:46 AM (5 years ago)
Author:
nanang
Message:

Close #2168: Added media event for audio device error.

Location:
pjproject/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/include/pjmedia/event.h

    r5843 r5920  
    8888     * RTCP-FB has been received. 
    8989     */ 
    90     PJMEDIA_EVENT_RX_RTCP_FB = PJMEDIA_FOURCC('R', 'T', 'F', 'B') 
     90    PJMEDIA_EVENT_RX_RTCP_FB = PJMEDIA_FOURCC('R', 'T', 'F', 'B'), 
     91 
     92    /** 
     93     * Audio device stopped on error. 
     94     */ 
     95    PJMEDIA_EVENT_AUD_DEV_ERROR = PJMEDIA_FOURCC('A', 'E', 'R', 'R') 
    9196 
    9297} pjmedia_event_type; 
     
    134139    pj_bool_t           cancel; 
    135140} pjmedia_event_wnd_closing_data; 
     141 
     142/** 
     143 * Additional data/parameters for audio device error event. 
     144 */ 
     145typedef struct pjmedia_event_aud_dev_err_data 
     146{ 
     147    /** The media direction that fails */ 
     148    pjmedia_dir              dir; 
     149 
     150    /** The audio device ID */ 
     151    pjmedia_aud_dev_index    id; 
     152 
     153    /** The error code */ 
     154    pj_status_t              status; 
     155} pjmedia_event_aud_dev_err_data; 
    136156 
    137157/** Additional parameters for window changed event. */ 
     
    216236        /** Keyframe missing event data */ 
    217237        pjmedia_event_keyframe_missing_data     keyframe_missing; 
     238 
     239        /** Audio device error event data */ 
     240        pjmedia_event_aud_dev_err_data          aud_dev_err; 
    218241 
    219242        /** Storage for user event data */ 
  • pjproject/trunk/pjmedia/src/pjmedia-audiodev/wmme_dev.c

    r5035 r5920  
    2424#include <pj/string.h> 
    2525#include <pj/unicode.h> 
     26#include <pjmedia/event.h> 
    2627 
    2728#if PJMEDIA_AUDIO_DEV_HAS_WMME 
     
    894895    static unsigned rec_cnt, play_cnt; 
    895896    enum { MAX_BURST = 1000 }; 
     897    pjmedia_dir signalled_dir = PJMEDIA_DIR_NONE; 
    896898 
    897899    /* Suppress compile warning for unused debugging vars */ 
     
    928930 
    929931        DWORD rc; 
    930         pjmedia_dir signalled_dir; 
    931932 
    932933        /* Swap hWaveIn and hWaveOut to get equal opportunity for both */ 
     
    10471048                if (mr != MMSYSERR_NOERROR) { 
    10481049                    status = PJMEDIA_AUDIODEV_ERRNO_FROM_WMME_OUT(mr); 
     1050                    PJ_PERROR(3, (THIS_FILE, status, 
     1051                                  "Failed to write audio frame for playback")); 
    10491052                    break; 
    10501053                } 
     
    11491152                if (mr != MMSYSERR_NOERROR) { 
    11501153                    status = PJMEDIA_AUDIODEV_ERRNO_FROM_WMME_IN(mr); 
     1154                    PJ_PERROR(3, (THIS_FILE, status, 
     1155                                  "Failed to add recording buffer")); 
    11511156                    break; 
    11521157                } 
     
    11691174 
    11701175    PJ_LOG(5,(THIS_FILE, "WMME: thread stopping..")); 
     1176     
     1177    if (status != PJ_SUCCESS) { 
     1178        pjmedia_event e; 
     1179        pj_timestamp *ts; 
     1180        pjmedia_aud_param param; 
     1181 
     1182        PJ_PERROR(3, (THIS_FILE, status, "WMME thread stopped due to error")); 
     1183 
     1184        /* Broadcast WMME error */ 
     1185        pj_assert(signalled_dir != PJMEDIA_DIR_NONE); 
     1186        ts = (signalled_dir==PJMEDIA_DIR_PLAYBACK)? 
     1187             &strm->play_strm.timestamp : &strm->rec_strm.timestamp; 
     1188        pjmedia_event_init(&e, PJMEDIA_EVENT_AUD_DEV_ERROR, ts, &strm->base); 
     1189        e.data.aud_dev_err.dir = signalled_dir; 
     1190        e.data.aud_dev_err.status = status; 
     1191        e.data.aud_dev_err.id = PJMEDIA_AUD_INVALID_DEV; 
     1192        if (pjmedia_aud_stream_get_param(&strm->base, &param) == PJ_SUCCESS) { 
     1193            e.data.aud_dev_err.id = (signalled_dir==PJMEDIA_DIR_PLAYBACK)? 
     1194                                    param.play_id : param.rec_id; 
     1195        } 
     1196 
     1197        pjmedia_event_publish(NULL, &strm->base, &e, 
     1198                              PJMEDIA_EVENT_PUBLISH_DEFAULT); 
     1199    } 
     1200 
    11711201    return 0; 
    11721202} 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_aud.c

    r5918 r5920  
    19481948    pjsua_var.snd_is_on = PJ_TRUE; 
    19491949 
     1950    /* Subscribe to audio device events */ 
     1951    pjmedia_event_subscribe(NULL, &call_media_on_event, NULL, 
     1952                    pjmedia_snd_port_get_snd_stream(pjsua_var.snd_port)); 
     1953 
    19501954    pj_log_pop_indent(); 
    19511955    return PJ_SUCCESS; 
     
    19841988                             "%s sound capture device", 
    19851989                             play_info.name, cap_info.name)); 
     1990 
     1991        /* Unsubscribe from audio device events */ 
     1992        pjmedia_event_unsubscribe(NULL, &call_media_on_event, NULL, strm); 
    19861993 
    19871994        pjmedia_snd_port_disconnect(pjsua_var.snd_port); 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_media.c

    r5918 r5920  
    14271427{ 
    14281428    pjsua_call_media *call_med = (pjsua_call_media*)user_data; 
    1429     pjsua_call *call = call_med->call; 
     1429    pjsua_call *call = call_med? call_med->call : NULL; 
    14301430    pj_status_t status = PJ_SUCCESS; 
    14311431   
     
    14711471    } 
    14721472 
    1473     if (pjsua_var.ua_cfg.cb.on_call_media_event && call) { 
    1474         (*pjsua_var.ua_cfg.cb.on_call_media_event)(call->index, 
    1475                                                    call_med->idx, event); 
     1473    if (pjsua_var.ua_cfg.cb.on_call_media_event) { 
     1474        if (call) { 
     1475            (*pjsua_var.ua_cfg.cb.on_call_media_event)(call->index, 
     1476                                                       call_med->idx, event); 
     1477        } else { 
     1478            /* Also deliver non call events such as audio device error */ 
     1479            (*pjsua_var.ua_cfg.cb.on_call_media_event)(PJSUA_INVALID_ID, 
     1480                                                       0, event); 
     1481        } 
    14761482    } 
    14771483 
Note: See TracChangeset for help on using the changeset viewer.