Changeset 3726


Ignore:
Timestamp:
Aug 26, 2011 4:30:18 AM (9 years ago)
Author:
nanang
Message:

Re #1327:

  • Vidgui UI updates on Qt must be done in the UI thread, implemented this with Qt signal-slot mechanism.
  • VidWin::show() better be called internally by VidWin? class instead of MainWin?.
  • Fix QString to const char* issue, keeping the pointer returned by "QString::to*()::data()" won't work, the pointer actually points to a temporary data (lifetime issue).
  • Minor: cleaning up unused lines in vidgui.
Location:
pjproject/trunk/pjsip-apps/src/vidgui
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip-apps/src/vidgui/vidgui.cpp

    r3724 r3726  
    5151 
    5252    initLayout(); 
    53     onCallReleased(); 
     53    emit signalCallReleased(); 
    5454} 
    5555 
     
    102102    connect(quitButton_, SIGNAL(clicked()), this, SLOT(quit())); 
    103103    //connect(this, SIGNAL(close()), this, SLOT(quit())); 
     104 
     105    // UI updates must be done in the UI thread! 
     106    connect(this, SIGNAL(signalNewCall(int, bool)), 
     107            this, SLOT(onNewCall(int, bool))); 
     108    connect(this, SIGNAL(signalCallReleased()), 
     109            this, SLOT(onCallReleased())); 
     110    connect(this, SIGNAL(signalInitVideoWindow()), 
     111            this, SLOT(initVideoWindow())); 
     112    connect(this, SIGNAL(signalShowStatus(const QString&)), 
     113            this, SLOT(doShowStatus(const QString&))); 
    104114} 
    105115 
    106116void MainWin::quit() 
    107117{ 
    108     //if (preview_on) 
    109         //preview(); 
    110  
    111118    delete video_prev_; 
    112119    video_prev_ = NULL; 
     
    120127void MainWin::showStatus(const char *msg) 
    121128{ 
     129    PJ_LOG(3,(THIS_FILE, "%s", msg)); 
     130 
     131    QString msg_ = QString::fromUtf8(msg); 
     132    emit signalShowStatus(msg_); 
     133} 
     134 
     135void MainWin::doShowStatus(const QString& msg) 
     136{ 
    122137    //statusBar_->showMessage(msg); 
    123138    statusBar_->setText(msg); 
    124     PJ_LOG(3,(THIS_FILE, "%s", msg)); 
    125139} 
    126140 
     
    135149} 
    136150 
    137 void MainWin::onNewCall(pjsua_call_id cid, bool incoming) 
     151void MainWin::onNewCall(int cid, bool incoming) 
    138152{ 
    139153    pjsua_call_info ci; 
     
    206220        //X11 Display 
    207221        //status = pjsua_vid_win_set_show(wid, PJ_TRUE); 
    208         video_prev_->show(); 
     222        //This is handled by VidWin now 
     223        //video_prev_->show(); 
    209224        showStatus("Preview started"); 
    210225 
     
    224239        pj_status_t status; 
    225240        QString dst = url_->text(); 
    226         const char *uri = dst.toAscii().data(); 
     241        char uri[256]; 
     242 
     243        pj_ansi_strncpy(uri, dst.toAscii().data(), sizeof(uri)); 
    227244        pj_str_t uri2 = pj_str((char*)uri); 
    228245 
     
    243260    //pjsua_call_hangup(currentCall_, PJSIP_SC_BUSY_HERE, NULL, NULL); 
    244261    pjsua_call_hangup_all(); 
    245     onCallReleased(); 
    246 } 
    247  
    248  
    249 void MainWin::init_video_window() 
     262    emit signalCallReleased(); 
     263} 
     264 
     265 
     266void MainWin::initVideoWindow() 
    250267{ 
    251268    pjsua_call_info ci; 
     
    311328 
    312329    if (currentCall_ == -1 && ci.state < PJSIP_INV_STATE_DISCONNECTED) { 
    313         onNewCall(call_id, false); 
     330        emit signalNewCall(call_id, false); 
    314331    } 
    315332 
     
    320337                 ci.last_status_text.ptr); 
    321338        showStatus(status); 
    322         onCallReleased(); 
     339        emit signalCallReleased(); 
    323340    } else { 
    324341        snprintf(status, sizeof(status), "Call is %s", pjsip_inv_state_name(ci.state)); 
     
    338355    } 
    339356 
    340     onNewCall(call_id, true); 
     357    emit signalNewCall(call_id, true); 
    341358 
    342359    pjsua_call_info ci; 
     
    366383            } 
    367384        } else if (ci.media[i].type == PJMEDIA_TYPE_VIDEO) { 
    368             init_video_window(); 
     385            emit signalInitVideoWindow(); 
    369386        } 
    370387    } 
  • pjproject/trunk/pjsip-apps/src/vidgui/vidgui.h

    r3686 r3726  
    4848    bool initStack(); 
    4949    void showError(const char *title, pj_status_t status); 
    50     void showStatus(const char *); 
     50    void showStatus(const char *msg); 
    5151 
    52 public: 
    5352    void on_reg_state(pjsua_acc_id acc_id); 
    5453    void on_call_state(pjsua_call_id call_id, pjsip_event *e); 
     
    5655    void on_call_media_state(pjsua_call_id call_id); 
    5756 
     57signals: 
     58    void signalNewCall(int, bool); 
     59    void signalCallReleased(); 
     60    void signalInitVideoWindow(); 
     61    void signalShowStatus(const QString&); 
     62     
    5863public slots: 
    5964    void preview(); 
     
    6267    void quit(); 
    6368 
     69    void onNewCall(int cid, bool incoming); 
     70    void onCallReleased(); 
     71    void initVideoWindow(); 
     72    void doShowStatus(const QString& msg); 
     73 
    6474private: 
    6575    static MainWin *theInstance_; 
     
    6777    pjsua_call_id currentCall_; 
    6878    bool preview_on; 
    69  
    70     void onNewCall(pjsua_call_id cid, bool incoming); 
    71     void onCallReleased(); 
    7279 
    7380private: 
     
    8693 
    8794    void initLayout(); 
    88     void init_video_window(); 
    8995}; 
    9096 
  • pjproject/trunk/pjsip-apps/src/vidgui/vidwin.cpp

    r3724 r3726  
    4747VidWin::~VidWin() 
    4848{ 
     49    show(false); 
    4950    detach(); 
    50     pj_bzero(&hwnd, sizeof(hwnd)); 
    51     size_hint = QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); 
    52     destroy(true, false); 
    5351} 
    5452 
     
    5654{ 
    5755    switch(e->type()) { 
     56 
    5857    case QEvent::Resize: 
    59         { 
    60             // revert to default size hint, make it resizable 
    61             setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); 
    62             // resize now 
    63             set_size(); 
    64         } 
    65         break; 
    66     case QEvent::ParentAboutToChange: 
     58        set_size(); 
     59        break; 
     60 
     61    case QEvent::ParentChange: 
    6762        get_size(); 
    68         setFixedSize(size_hint); 
    69         break; 
    70     case QEvent::ParentChange: 
    71         { 
    72             get_size(); 
    73             /* 
     63        if (0) { 
    7464            QRect qr = rect(); 
    7565            if (qr.width() > size_hint.width()) 
     
    7767            if (qr.height() > size_hint.height()) 
    7868                size_hint.setWidth(qr.height()); 
    79             */ 
    80             setFixedSize(size_hint); 
    81             attach(); 
    8269        } 
    83         break; 
     70        setFixedSize(size_hint); 
     71        attach(); 
     72        break; 
     73 
     74    case QEvent::Show: 
     75        show(true); 
     76        // revert to default size hint, make it resizable 
     77        setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); 
     78        break; 
     79 
     80    case QEvent::Hide: 
     81        show(false); 
     82        break; 
     83 
    8484    default: 
    8585        break; 
     
    103103    orig_parent = GetParent(w); 
    104104 
     105    SetWindowLong(w, GWL_STYLE, WS_CHILD); 
    105106    SetParent(w, new_parent); 
    106     SetWindowLong(w, GWL_STYLE, WS_CHILD); 
    107     ShowWindow(w, SW_SHOWNOACTIVATE); 
    108107    TRACE_("%p new parent handle = %p", w, new_parent); 
    109108} 
     
    114113 
    115114    HWND w = (HWND)hwnd.info.win.hwnd; 
    116     ShowWindow(w, SW_HIDE); 
    117115    SetParent(w, (HWND)orig_parent); 
    118116    TRACE_("%p revert parent handle to %p", w, orig_parent); 
     
    145143    if (!hwnd.info.win.hwnd) return; 
    146144 
    147     ShowWindow(hwnd.info.win.hwnd, visible ? SW_SHOW : SW_HIDE); 
     145    HWND w = (HWND)hwnd.info.win.hwnd; 
     146    ShowWindow(w, visible ? SW_SHOW : SW_HIDE); 
    148147} 
    149148 
  • pjproject/trunk/pjsip-apps/src/vidgui/vidwin.h

    r3724 r3726  
    3333    virtual ~VidWin(); 
    3434    QSize sizeHint() const { return size_hint; } 
    35     void show(bool visible=true); 
    3635 
    3736protected: 
     
    4746    void set_size(); 
    4847    void get_size(); 
     48    void show(bool visible=true); 
    4949}; 
    5050 
Note: See TracChangeset for help on using the changeset viewer.