summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2011-08-26 04:30:18 +0000
committerNanang Izzuddin <nanang@teluu.com>2011-08-26 04:30:18 +0000
commit39519e800c7e9c861bd6a7972868e48d4f473bb0 (patch)
tree6f4bc7f6c7ae526167f5008698720ce784e06c50
parent1803d15673fed4c7a349f05712d272aeb7499891 (diff)
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. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3726 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjsip-apps/src/vidgui/vidgui.cpp45
-rw-r--r--pjsip-apps/src/vidgui/vidgui.h18
-rw-r--r--pjsip-apps/src/vidgui/vidwin.cpp45
-rw-r--r--pjsip-apps/src/vidgui/vidwin.h2
4 files changed, 66 insertions, 44 deletions
diff --git a/pjsip-apps/src/vidgui/vidgui.cpp b/pjsip-apps/src/vidgui/vidgui.cpp
index f59911b4..5a1e5903 100644
--- a/pjsip-apps/src/vidgui/vidgui.cpp
+++ b/pjsip-apps/src/vidgui/vidgui.cpp
@@ -50,7 +50,7 @@ MainWin::MainWin(QWidget *parent)
theInstance_ = this;
initLayout();
- onCallReleased();
+ emit signalCallReleased();
}
MainWin::~MainWin()
@@ -101,13 +101,20 @@ void MainWin::initLayout()
connect(hangupButton_, SIGNAL(clicked()), this, SLOT(hangup()));
connect(quitButton_, SIGNAL(clicked()), this, SLOT(quit()));
//connect(this, SIGNAL(close()), this, SLOT(quit()));
+
+ // UI updates must be done in the UI thread!
+ connect(this, SIGNAL(signalNewCall(int, bool)),
+ this, SLOT(onNewCall(int, bool)));
+ connect(this, SIGNAL(signalCallReleased()),
+ this, SLOT(onCallReleased()));
+ connect(this, SIGNAL(signalInitVideoWindow()),
+ this, SLOT(initVideoWindow()));
+ connect(this, SIGNAL(signalShowStatus(const QString&)),
+ this, SLOT(doShowStatus(const QString&)));
}
void MainWin::quit()
{
- //if (preview_on)
- //preview();
-
delete video_prev_;
video_prev_ = NULL;
delete video_;
@@ -119,9 +126,16 @@ void MainWin::quit()
void MainWin::showStatus(const char *msg)
{
+ PJ_LOG(3,(THIS_FILE, "%s", msg));
+
+ QString msg_ = QString::fromUtf8(msg);
+ emit signalShowStatus(msg_);
+}
+
+void MainWin::doShowStatus(const QString& msg)
+{
//statusBar_->showMessage(msg);
statusBar_->setText(msg);
- PJ_LOG(3,(THIS_FILE, "%s", msg));
}
void MainWin::showError(const char *title, pj_status_t status)
@@ -134,7 +148,7 @@ void MainWin::showError(const char *title, pj_status_t status)
showStatus(errline);
}
-void MainWin::onNewCall(pjsua_call_id cid, bool incoming)
+void MainWin::onNewCall(int cid, bool incoming)
{
pjsua_call_info ci;
@@ -205,7 +219,8 @@ void MainWin::preview()
//screen sometimes, probably because it's using different
//X11 Display
//status = pjsua_vid_win_set_show(wid, PJ_TRUE);
- video_prev_->show();
+ //This is handled by VidWin now
+ //video_prev_->show();
showStatus("Preview started");
previewButton_->setText(tr("Stop &Preview"));
@@ -223,7 +238,9 @@ void MainWin::call()
} else {
pj_status_t status;
QString dst = url_->text();
- const char *uri = dst.toAscii().data();
+ char uri[256];
+
+ pj_ansi_strncpy(uri, dst.toAscii().data(), sizeof(uri));
pj_str_t uri2 = pj_str((char*)uri);
pj_assert(currentCall_ == -1);
@@ -242,11 +259,11 @@ void MainWin::hangup()
pj_assert(currentCall_ != -1);
//pjsua_call_hangup(currentCall_, PJSIP_SC_BUSY_HERE, NULL, NULL);
pjsua_call_hangup_all();
- onCallReleased();
+ emit signalCallReleased();
}
-void MainWin::init_video_window()
+void MainWin::initVideoWindow()
{
pjsua_call_info ci;
unsigned i;
@@ -310,7 +327,7 @@ void MainWin::on_call_state(pjsua_call_id call_id, pjsip_event *e)
pjsua_call_get_info(call_id, &ci);
if (currentCall_ == -1 && ci.state < PJSIP_INV_STATE_DISCONNECTED) {
- onNewCall(call_id, false);
+ emit signalNewCall(call_id, false);
}
char status[80];
@@ -319,7 +336,7 @@ void MainWin::on_call_state(pjsua_call_id call_id, pjsip_event *e)
ci.state_text.ptr,
ci.last_status_text.ptr);
showStatus(status);
- onCallReleased();
+ emit signalCallReleased();
} else {
snprintf(status, sizeof(status), "Call is %s", pjsip_inv_state_name(ci.state));
showStatus(status);
@@ -337,7 +354,7 @@ void MainWin::on_incoming_call(pjsua_acc_id acc_id, pjsua_call_id call_id,
return;
}
- onNewCall(call_id, true);
+ emit signalNewCall(call_id, true);
pjsua_call_info ci;
char status[80];
@@ -365,7 +382,7 @@ void MainWin::on_call_media_state(pjsua_call_id call_id)
break;
}
} else if (ci.media[i].type == PJMEDIA_TYPE_VIDEO) {
- init_video_window();
+ emit signalInitVideoWindow();
}
}
}
diff --git a/pjsip-apps/src/vidgui/vidgui.h b/pjsip-apps/src/vidgui/vidgui.h
index 7d53e18a..a7c2a507 100644
--- a/pjsip-apps/src/vidgui/vidgui.h
+++ b/pjsip-apps/src/vidgui/vidgui.h
@@ -47,29 +47,36 @@ public:
bool initStack();
void showError(const char *title, pj_status_t status);
- void showStatus(const char *);
+ void showStatus(const char *msg);
-public:
void on_reg_state(pjsua_acc_id acc_id);
void on_call_state(pjsua_call_id call_id, pjsip_event *e);
void on_incoming_call(pjsua_acc_id acc_id, pjsua_call_id call_id, pjsip_rx_data *rdata);
void on_call_media_state(pjsua_call_id call_id);
+signals:
+ void signalNewCall(int, bool);
+ void signalCallReleased();
+ void signalInitVideoWindow();
+ void signalShowStatus(const QString&);
+
public slots:
void preview();
void call();
void hangup();
void quit();
+ void onNewCall(int cid, bool incoming);
+ void onCallReleased();
+ void initVideoWindow();
+ void doShowStatus(const QString& msg);
+
private:
static MainWin *theInstance_;
pjsua_acc_id accountId_;
pjsua_call_id currentCall_;
bool preview_on;
- void onNewCall(pjsua_call_id cid, bool incoming);
- void onCallReleased();
-
private:
QPushButton *callButton_,
*hangupButton_,
@@ -85,7 +92,6 @@ private:
QVBoxLayout *vbox_left;
void initLayout();
- void init_video_window();
};
diff --git a/pjsip-apps/src/vidgui/vidwin.cpp b/pjsip-apps/src/vidgui/vidwin.cpp
index cc97b821..fd941415 100644
--- a/pjsip-apps/src/vidgui/vidwin.cpp
+++ b/pjsip-apps/src/vidgui/vidwin.cpp
@@ -46,41 +46,41 @@ VidWin::VidWin(const pjmedia_vid_dev_hwnd *hwnd_,
VidWin::~VidWin()
{
+ show(false);
detach();
- pj_bzero(&hwnd, sizeof(hwnd));
- size_hint = QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
- destroy(true, false);
}
bool VidWin::event(QEvent *e)
{
switch(e->type()) {
+
case QEvent::Resize:
- {
- // revert to default size hint, make it resizable
- setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
- // resize now
- set_size();
- }
- break;
- case QEvent::ParentAboutToChange:
- get_size();
- setFixedSize(size_hint);
+ set_size();
break;
+
case QEvent::ParentChange:
- {
- get_size();
- /*
+ get_size();
+ if (0) {
QRect qr = rect();
if (qr.width() > size_hint.width())
size_hint.setWidth(qr.width());
if (qr.height() > size_hint.height())
size_hint.setWidth(qr.height());
- */
- setFixedSize(size_hint);
- attach();
}
+ setFixedSize(size_hint);
+ attach();
break;
+
+ case QEvent::Show:
+ show(true);
+ // revert to default size hint, make it resizable
+ setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
+ break;
+
+ case QEvent::Hide:
+ show(false);
+ break;
+
default:
break;
}
@@ -102,9 +102,8 @@ void VidWin::attach()
HWND new_parent = (HWND)winId();
orig_parent = GetParent(w);
- SetParent(w, new_parent);
SetWindowLong(w, GWL_STYLE, WS_CHILD);
- ShowWindow(w, SW_SHOWNOACTIVATE);
+ SetParent(w, new_parent);
TRACE_("%p new parent handle = %p", w, new_parent);
}
@@ -113,7 +112,6 @@ void VidWin::detach()
if (!hwnd.info.win.hwnd) return;
HWND w = (HWND)hwnd.info.win.hwnd;
- ShowWindow(w, SW_HIDE);
SetParent(w, (HWND)orig_parent);
TRACE_("%p revert parent handle to %p", w, orig_parent);
}
@@ -144,7 +142,8 @@ void VidWin::show(bool visible)
{
if (!hwnd.info.win.hwnd) return;
- ShowWindow(hwnd.info.win.hwnd, visible ? SW_SHOW : SW_HIDE);
+ HWND w = (HWND)hwnd.info.win.hwnd;
+ ShowWindow(w, visible ? SW_SHOW : SW_HIDE);
}
#elif defined(__APPLE__)
diff --git a/pjsip-apps/src/vidgui/vidwin.h b/pjsip-apps/src/vidgui/vidwin.h
index 8a18785f..3602da94 100644
--- a/pjsip-apps/src/vidgui/vidwin.h
+++ b/pjsip-apps/src/vidgui/vidwin.h
@@ -32,7 +32,6 @@ public:
Qt::WindowFlags f = 0);
virtual ~VidWin();
QSize sizeHint() const { return size_hint; }
- void show(bool visible=true);
protected:
virtual bool event(QEvent *e);
@@ -46,6 +45,7 @@ private:
void detach();
void set_size();
void get_size();
+ void show(bool visible=true);
};
#endif