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);
|
||||
_hclient_p = new hgx11net(addr, port);
|
||||
_damage_p = new hgx11damage(frameskip);
|
||||
_damage_p = new hgx11damage(&_grabbed_m, frameskip);
|
||||
if (_inactiveXss_m) {
|
||||
_screensaver_p = new hgx11screensaver(_display_p);
|
||||
_inactiveTimeXss_m = ulong(_inactiveTime_m);
|
||||
@ -57,9 +57,7 @@ hgx11::hgx11(QHash<QString, QString> opts)
|
||||
_setImgSize();
|
||||
_hclient_p->ledAdjustments(redAdjust, greenAdjust, blueAdjust, temperature, threshold, transform);
|
||||
|
||||
_damage_p->start();
|
||||
|
||||
connect(_damage_p, SIGNAL(damageDetected()), _grabber_p, SLOT(grabFrame()));
|
||||
connect(_damage_p, SIGNAL(damageDetected()), this, SLOT(_grabImage()));
|
||||
connect(_grabber_p, SIGNAL(scaleChanged()), this, SLOT(_setImgSize()));
|
||||
connect(_grabber_p, SIGNAL(imageCreated()), this, SLOT(_sendImage()));
|
||||
_grabActive_m = true;
|
||||
@ -75,10 +73,13 @@ hgx11::hgx11(QHash<QString, QString> opts)
|
||||
_timer_p->start(1000);
|
||||
}
|
||||
}
|
||||
|
||||
_damage_p->start();
|
||||
}
|
||||
|
||||
hgx11::~hgx11()
|
||||
{
|
||||
_grabbed_m.wakeAll();
|
||||
_timer_p->stop();
|
||||
disconnect(_damage_p, SIGNAL(damageDetected()), _grabber_p, SLOT(grabFrame()));
|
||||
disconnect(_grabber_p, SIGNAL(scaleChanged()), this, SLOT(_setImgSize()));
|
||||
@ -128,9 +129,15 @@ QString hgx11::_parseColorArr(QString value, bool isInt)
|
||||
|
||||
// private slots
|
||||
|
||||
void hgx11::_grabImage()
|
||||
{
|
||||
_grabber_p->grabFrame();
|
||||
_grabbed_m.wakeAll();
|
||||
}
|
||||
|
||||
void hgx11::_sendImage()
|
||||
{
|
||||
_hclient_p->sendImage(&_grabber_p->imgdata_m);
|
||||
_hclient_p->sendImage(_grabber_p->imgdata_m);
|
||||
}
|
||||
|
||||
void hgx11::_inActivity()
|
||||
|
||||
2
hgx11.h
2
hgx11.h
@ -18,6 +18,7 @@ public:
|
||||
~hgx11();
|
||||
|
||||
private:
|
||||
QWaitCondition _grabbed_m;
|
||||
Display *_display_p;
|
||||
hgx11damage *_damage_p;
|
||||
hgx11grab *_grabber_p;
|
||||
@ -33,6 +34,7 @@ private:
|
||||
QString _parseColorArr(QString, bool);
|
||||
|
||||
private slots:
|
||||
void _grabImage();
|
||||
void _sendImage();
|
||||
void _inActivity();
|
||||
void _activity();
|
||||
|
||||
@ -2,8 +2,9 @@
|
||||
|
||||
// public
|
||||
|
||||
hgx11damage::hgx11damage(unsigned short frameSkip)
|
||||
hgx11damage::hgx11damage(QWaitCondition * grabbed, unsigned short frameSkip)
|
||||
{
|
||||
_grabbed_p = grabbed;
|
||||
_frameSkip_m = frameSkip;
|
||||
_display_p = XOpenDisplay(nullptr);
|
||||
if(_display_p == nullptr){
|
||||
@ -34,7 +35,10 @@ void hgx11damage::_monitor()
|
||||
XDamageSubtract(_display_p ,_damage_m, None, None);
|
||||
continue;
|
||||
}
|
||||
_mutex_m.lock();
|
||||
emit damageDetected();
|
||||
_grabbed_p->wait(&_mutex_m);
|
||||
_mutex_m.unlock();
|
||||
XDamageSubtract(_display_p ,_damage_m, None, None);
|
||||
_frameCount_m = 0;
|
||||
}
|
||||
|
||||
@ -2,6 +2,8 @@
|
||||
#define HGX11DAMAGE_H
|
||||
|
||||
#include <QThread>
|
||||
#include <QMutex>
|
||||
#include <QWaitCondition>
|
||||
#include <QDebug>
|
||||
#include <X11/extensions/Xdamage.h>
|
||||
|
||||
@ -9,13 +11,17 @@ class hgx11damage : public QThread
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
hgx11damage(unsigned short);
|
||||
|
||||
hgx11damage(QWaitCondition *, unsigned short);
|
||||
~hgx11damage();
|
||||
|
||||
private:
|
||||
QWaitCondition * _grabbed_p;
|
||||
QMutex _mutex_m;
|
||||
Display *_display_p;
|
||||
XEvent _event_m;
|
||||
Damage _damage_m;
|
||||
|
||||
bool _loop_m = true;
|
||||
ushort _frameCount_m = 255;
|
||||
ushort _frameSkip_m = 0;
|
||||
|
||||
@ -140,7 +140,7 @@ void hgx11grab::grabFrame()
|
||||
_srcPicture_m = XRenderCreatePicture(_display_p, _window_m, _srcFormat_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);
|
||||
|
||||
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);
|
||||
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();
|
||||
|
||||
|
||||
@ -12,7 +12,7 @@ class hgx11grab : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
QByteArray imgdata_m;
|
||||
QString imgdata_m;
|
||||
|
||||
hgx11grab(Display *, unsigned short);
|
||||
~hgx11grab();
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
hgx11net::hgx11net(QString host, ushort port)
|
||||
{
|
||||
_sock_p = new QTcpSocket(this);
|
||||
_sock_p->setReadBufferSize(1);
|
||||
_host_m = host;
|
||||
_port_m = port;
|
||||
_connectHost();
|
||||
@ -80,6 +81,9 @@ void hgx11net::_sendCommand()
|
||||
return;
|
||||
}
|
||||
_sock_p->write(_cmd_m);
|
||||
while (_sock_p->bytesToWrite()) {
|
||||
_sock_p->waitForBytesWritten();
|
||||
}
|
||||
}
|
||||
|
||||
void hgx11net::_ledAdjustments()
|
||||
@ -169,10 +173,10 @@ void hgx11net::_temperatureAdjustment()
|
||||
|
||||
// public slots
|
||||
|
||||
void hgx11net::sendImage(QByteArray *imgdata)
|
||||
void hgx11net::sendImage(QString imgdata)
|
||||
{
|
||||
_cmd_m = imgCmdBuf;
|
||||
_cmd_m.append(imgdata->toBase64());
|
||||
_cmd_m.append(imgdata);
|
||||
_cmd_m.append("\"}\n");
|
||||
_sendCommand();
|
||||
}
|
||||
|
||||
@ -44,7 +44,7 @@ private:
|
||||
void _temperatureAdjustment();
|
||||
|
||||
public slots:
|
||||
void sendImage(QByteArray *);
|
||||
void sendImage(QString);
|
||||
};
|
||||
|
||||
#endif // HGX11NET_H
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user