Block until image data is sent to Hyperion.
This prevents the socket buffer to overflow if the connection is too slow.
This commit is contained in:
parent
7d9b6e8b6c
commit
ed7ba36704
17
hgx11.cpp
17
hgx11.cpp
@ -48,7 +48,7 @@ hgx11::hgx11(QHash<QString, QString> opts)
|
|||||||
|
|
||||||
_grabber_p = new hgx11grab(_display_p, scale);
|
_grabber_p = new hgx11grab(_display_p, scale);
|
||||||
_hclient_p = new hgx11net(addr, port);
|
_hclient_p = new hgx11net(addr, port);
|
||||||
_damage_p = new hgx11damage(frameskip);
|
_damage_p = new hgx11damage(&_grabbed_m, frameskip);
|
||||||
if (_inactiveXss_m) {
|
if (_inactiveXss_m) {
|
||||||
_screensaver_p = new hgx11screensaver(_display_p);
|
_screensaver_p = new hgx11screensaver(_display_p);
|
||||||
_inactiveTimeXss_m = ulong(_inactiveTime_m);
|
_inactiveTimeXss_m = ulong(_inactiveTime_m);
|
||||||
@ -57,9 +57,7 @@ hgx11::hgx11(QHash<QString, QString> opts)
|
|||||||
_setImgSize();
|
_setImgSize();
|
||||||
_hclient_p->ledAdjustments(redAdjust, greenAdjust, blueAdjust, temperature, threshold, transform);
|
_hclient_p->ledAdjustments(redAdjust, greenAdjust, blueAdjust, temperature, threshold, transform);
|
||||||
|
|
||||||
_damage_p->start();
|
connect(_damage_p, SIGNAL(damageDetected()), this, SLOT(_grabImage()));
|
||||||
|
|
||||||
connect(_damage_p, SIGNAL(damageDetected()), _grabber_p, SLOT(grabFrame()));
|
|
||||||
connect(_grabber_p, SIGNAL(scaleChanged()), this, SLOT(_setImgSize()));
|
connect(_grabber_p, SIGNAL(scaleChanged()), this, SLOT(_setImgSize()));
|
||||||
connect(_grabber_p, SIGNAL(imageCreated()), this, SLOT(_sendImage()));
|
connect(_grabber_p, SIGNAL(imageCreated()), this, SLOT(_sendImage()));
|
||||||
_grabActive_m = true;
|
_grabActive_m = true;
|
||||||
@ -75,10 +73,13 @@ hgx11::hgx11(QHash<QString, QString> opts)
|
|||||||
_timer_p->start(1000);
|
_timer_p->start(1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_damage_p->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
hgx11::~hgx11()
|
hgx11::~hgx11()
|
||||||
{
|
{
|
||||||
|
_grabbed_m.wakeAll();
|
||||||
_timer_p->stop();
|
_timer_p->stop();
|
||||||
disconnect(_damage_p, SIGNAL(damageDetected()), _grabber_p, SLOT(grabFrame()));
|
disconnect(_damage_p, SIGNAL(damageDetected()), _grabber_p, SLOT(grabFrame()));
|
||||||
disconnect(_grabber_p, SIGNAL(scaleChanged()), this, SLOT(_setImgSize()));
|
disconnect(_grabber_p, SIGNAL(scaleChanged()), this, SLOT(_setImgSize()));
|
||||||
@ -128,9 +129,15 @@ QString hgx11::_parseColorArr(QString value, bool isInt)
|
|||||||
|
|
||||||
// private slots
|
// private slots
|
||||||
|
|
||||||
|
void hgx11::_grabImage()
|
||||||
|
{
|
||||||
|
_grabber_p->grabFrame();
|
||||||
|
_grabbed_m.wakeAll();
|
||||||
|
}
|
||||||
|
|
||||||
void hgx11::_sendImage()
|
void hgx11::_sendImage()
|
||||||
{
|
{
|
||||||
_hclient_p->sendImage(&_grabber_p->imgdata_m);
|
_hclient_p->sendImage(_grabber_p->imgdata_m);
|
||||||
}
|
}
|
||||||
|
|
||||||
void hgx11::_inActivity()
|
void hgx11::_inActivity()
|
||||||
|
|||||||
2
hgx11.h
2
hgx11.h
@ -18,6 +18,7 @@ public:
|
|||||||
~hgx11();
|
~hgx11();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
QWaitCondition _grabbed_m;
|
||||||
Display *_display_p;
|
Display *_display_p;
|
||||||
hgx11damage *_damage_p;
|
hgx11damage *_damage_p;
|
||||||
hgx11grab *_grabber_p;
|
hgx11grab *_grabber_p;
|
||||||
@ -33,6 +34,7 @@ private:
|
|||||||
QString _parseColorArr(QString, bool);
|
QString _parseColorArr(QString, bool);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
void _grabImage();
|
||||||
void _sendImage();
|
void _sendImage();
|
||||||
void _inActivity();
|
void _inActivity();
|
||||||
void _activity();
|
void _activity();
|
||||||
|
|||||||
@ -2,8 +2,9 @@
|
|||||||
|
|
||||||
// public
|
// public
|
||||||
|
|
||||||
hgx11damage::hgx11damage(unsigned short frameSkip)
|
hgx11damage::hgx11damage(QWaitCondition * grabbed, unsigned short frameSkip)
|
||||||
{
|
{
|
||||||
|
_grabbed_p = grabbed;
|
||||||
_frameSkip_m = frameSkip;
|
_frameSkip_m = frameSkip;
|
||||||
_display_p = XOpenDisplay(nullptr);
|
_display_p = XOpenDisplay(nullptr);
|
||||||
if(_display_p == nullptr){
|
if(_display_p == nullptr){
|
||||||
@ -34,7 +35,10 @@ void hgx11damage::_monitor()
|
|||||||
XDamageSubtract(_display_p ,_damage_m, None, None);
|
XDamageSubtract(_display_p ,_damage_m, None, None);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
_mutex_m.lock();
|
||||||
emit damageDetected();
|
emit damageDetected();
|
||||||
|
_grabbed_p->wait(&_mutex_m);
|
||||||
|
_mutex_m.unlock();
|
||||||
XDamageSubtract(_display_p ,_damage_m, None, None);
|
XDamageSubtract(_display_p ,_damage_m, None, None);
|
||||||
_frameCount_m = 0;
|
_frameCount_m = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,6 +2,8 @@
|
|||||||
#define HGX11DAMAGE_H
|
#define HGX11DAMAGE_H
|
||||||
|
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
|
#include <QMutex>
|
||||||
|
#include <QWaitCondition>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <X11/extensions/Xdamage.h>
|
#include <X11/extensions/Xdamage.h>
|
||||||
|
|
||||||
@ -9,13 +11,17 @@ class hgx11damage : public QThread
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
hgx11damage(unsigned short);
|
|
||||||
|
hgx11damage(QWaitCondition *, unsigned short);
|
||||||
~hgx11damage();
|
~hgx11damage();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
QWaitCondition * _grabbed_p;
|
||||||
|
QMutex _mutex_m;
|
||||||
Display *_display_p;
|
Display *_display_p;
|
||||||
XEvent _event_m;
|
XEvent _event_m;
|
||||||
Damage _damage_m;
|
Damage _damage_m;
|
||||||
|
|
||||||
bool _loop_m = true;
|
bool _loop_m = true;
|
||||||
ushort _frameCount_m = 255;
|
ushort _frameCount_m = 255;
|
||||||
ushort _frameSkip_m = 0;
|
ushort _frameSkip_m = 0;
|
||||||
|
|||||||
@ -140,7 +140,7 @@ void hgx11grab::grabFrame()
|
|||||||
_srcPicture_m = XRenderCreatePicture(_display_p, _window_m, _srcFormat_p, CPRepeat, &_pictAttr_m);
|
_srcPicture_m = XRenderCreatePicture(_display_p, _window_m, _srcFormat_p, CPRepeat, &_pictAttr_m);
|
||||||
_dstPicture_m = XRenderCreatePicture(_display_p, _pixmap_m, _dstFormat_p, CPRepeat, &_pictAttr_m);
|
_dstPicture_m = XRenderCreatePicture(_display_p, _pixmap_m, _dstFormat_p, CPRepeat, &_pictAttr_m);
|
||||||
|
|
||||||
XRenderSetPictureFilter(_display_p, _srcPicture_m, FilterBilinear, nullptr, 0);
|
XRenderSetPictureFilter(_display_p, _srcPicture_m, FilterFast, nullptr, 0);
|
||||||
XRenderSetPictureTransform(_display_p, _srcPicture_m, &_mTransform_m);
|
XRenderSetPictureTransform(_display_p, _srcPicture_m, &_mTransform_m);
|
||||||
|
|
||||||
XRenderComposite(
|
XRenderComposite(
|
||||||
@ -170,7 +170,7 @@ void hgx11grab::grabFrame()
|
|||||||
|
|
||||||
QImage qimg(reinterpret_cast<const uchar *>(_xImage_p->data), _destWidth_m, _destHeight_m, _xImage_p->bytes_per_line, QImage::Format_ARGB32);
|
QImage qimg(reinterpret_cast<const uchar *>(_xImage_p->data), _destWidth_m, _destHeight_m, _xImage_p->bytes_per_line, QImage::Format_ARGB32);
|
||||||
qimg = qimg.convertToFormat(QImage::Format_RGB888);
|
qimg = qimg.convertToFormat(QImage::Format_RGB888);
|
||||||
imgdata_m = QByteArray::fromRawData(reinterpret_cast<const char *>(qimg.bits()), qimg.byteCount());
|
imgdata_m = QByteArray::fromRawData(reinterpret_cast<const char *>(qimg.bits()), qimg.byteCount()).toBase64().data();
|
||||||
|
|
||||||
_freeResources();
|
_freeResources();
|
||||||
|
|
||||||
|
|||||||
@ -12,7 +12,7 @@ class hgx11grab : public QObject
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
QByteArray imgdata_m;
|
QString imgdata_m;
|
||||||
|
|
||||||
hgx11grab(Display *, unsigned short);
|
hgx11grab(Display *, unsigned short);
|
||||||
~hgx11grab();
|
~hgx11grab();
|
||||||
|
|||||||
@ -5,6 +5,7 @@
|
|||||||
hgx11net::hgx11net(QString host, ushort port)
|
hgx11net::hgx11net(QString host, ushort port)
|
||||||
{
|
{
|
||||||
_sock_p = new QTcpSocket(this);
|
_sock_p = new QTcpSocket(this);
|
||||||
|
_sock_p->setReadBufferSize(1);
|
||||||
_host_m = host;
|
_host_m = host;
|
||||||
_port_m = port;
|
_port_m = port;
|
||||||
_connectHost();
|
_connectHost();
|
||||||
@ -80,6 +81,9 @@ void hgx11net::_sendCommand()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_sock_p->write(_cmd_m);
|
_sock_p->write(_cmd_m);
|
||||||
|
while (_sock_p->bytesToWrite()) {
|
||||||
|
_sock_p->waitForBytesWritten();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void hgx11net::_ledAdjustments()
|
void hgx11net::_ledAdjustments()
|
||||||
@ -169,10 +173,10 @@ void hgx11net::_temperatureAdjustment()
|
|||||||
|
|
||||||
// public slots
|
// public slots
|
||||||
|
|
||||||
void hgx11net::sendImage(QByteArray *imgdata)
|
void hgx11net::sendImage(QString imgdata)
|
||||||
{
|
{
|
||||||
_cmd_m = imgCmdBuf;
|
_cmd_m = imgCmdBuf;
|
||||||
_cmd_m.append(imgdata->toBase64());
|
_cmd_m.append(imgdata);
|
||||||
_cmd_m.append("\"}\n");
|
_cmd_m.append("\"}\n");
|
||||||
_sendCommand();
|
_sendCommand();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -44,7 +44,7 @@ private:
|
|||||||
void _temperatureAdjustment();
|
void _temperatureAdjustment();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void sendImage(QByteArray *);
|
void sendImage(QString);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // HGX11NET_H
|
#endif // HGX11NET_H
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user