lms-video/libremediaserver/libremediaserver.cpp
Santi Noreña 801c29865a First git import from SVN PureMediaServer rev 166
On branch master
 Initial commit
	new file:   libremediaserver/CITPDefines.h
	new file:   libremediaserver/MSEXDefines.h
	new file:   libremediaserver/PacketCreator.cpp
	new file:   libremediaserver/PacketCreator.h
	new file:   libremediaserver/PeerInformationSocket.cpp
	new file:   libremediaserver/PeerInformationSocket.h
	new file:   libremediaserver/citp-lib.cpp
	new file:   libremediaserver/citp-lib.h
	new file:   libremediaserver/doc/LICENSE.txt
	new file:   libremediaserver/doc/changelog.txt
	new file:   libremediaserver/doc/instalacion.txt
	new file:   libremediaserver/doc/install.txt
	new file:   libremediaserver/doc/leeme.txt
	new file:   libremediaserver/doc/manual.txt
	new file:   libremediaserver/doc/manual_en.txt
	new file:   libremediaserver/doc/manual_es.txt
	new file:   libremediaserver/doc/readme.txt
	new file:   libremediaserver/doc/todo.txt
	new file:   libremediaserver/externals/artnetin/ChangeLog.txt
	new file:   libremediaserver/externals/artnetin/LICENSE.txt
	new file:   libremediaserver/externals/artnetin/Makefile
	new file:   libremediaserver/externals/artnetin/README.txt
	new file:   libremediaserver/externals/artnetin/artnet.h
	new file:   libremediaserver/externals/artnetin/artnetin-help.pd
	new file:   libremediaserver/externals/artnetin/artnetin-meta.pd
	new file:   libremediaserver/externals/artnetin/artnetin.c
	new file:   libremediaserver/externals/artnetin/examples/artnetin.pd
	new file:   libremediaserver/externals/artnetin/m_pd.h
	new file:   libremediaserver/externals/artnetin/manual/manual.txt
	new file:   libremediaserver/externals/ola2pd/LICENSE.txt
	new file:   libremediaserver/externals/ola2pd/leeme.txt
	new file:   libremediaserver/externals/ola2pd/main.cpp
	new file:   libremediaserver/externals/ola2pd/ola2pd.pd_linux
	new file:   libremediaserver/externals/ola2pd/ola2pd_help.pd
	new file:   libremediaserver/externals/ola2pd/package.txt
	new file:   libremediaserver/externals/ola2pd/readme.txt
	new file:   libremediaserver/externals/pix2jpg/LICENSE.txt
	new file:   libremediaserver/externals/pix2jpg/Makefile
	new file:   libremediaserver/externals/pix2jpg/Makefile.am
	new file:   libremediaserver/externals/pix2jpg/Makefile.in
	new file:   libremediaserver/externals/pix2jpg/pix2jpg-help.pd
	new file:   libremediaserver/externals/pix2jpg/pix2jpg.cpp
	new file:   libremediaserver/externals/pix2jpg/pix2jpg.h
	new file:   libremediaserver/externals/pix2jpg/pix2jpg.pd_linux
	new file:   libremediaserver/layer.pd
	new file:   libremediaserver/layer_audio.pd
	new file:   libremediaserver/libremediaserver.cpp
	new file:   libremediaserver/libremediaserver.h
	new file:   libremediaserver/libremediaserver.pro
	new file:   libremediaserver/libremediaserver.ui
	new file:   libremediaserver/main.cpp
	new file:   libremediaserver/msex.cpp
	new file:   libremediaserver/msex.h
	new file:   libremediaserver/pms-audio.pd
	new file:   libremediaserver/pms-video.pd
	new file:   libremediaserver/recursos/LMS.shw
	new file:   libremediaserver/recursos/LibreMediaServer_Audio.hed
	new file:   libremediaserver/recursos/LibreMediaServer_Video.hed
	new file:   libremediaserver/scripts/extended_desktop.sh
	new file:   libremediaserver/scripts/install_precise.sh
	new file:   libremediaserver/scripts/install_squeeze.sh
	new file:   libremediaserver/scripts/install_wheezy.sh
	new file:   libremediaserver/scripts/make_thumbs.sh
	new file:   libremediaserver/scripts/single_desktop.sh
	new file:   libremediaserver/text.txt
2013-01-08 16:23:25 +01:00

1633 lines
46 KiB
C++

/*
Pure Media Server - A Media Server Sotfware for stage and performing
Copyright (C) 2012-2013 Santi Noreña libremediaserver@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "libremediaserver.h"
#include "CITPDefines.h"
#include "MSEXDefines.h"
#include "msex.h"
#include <QObject>
#include <QApplication>
#include <QDesktopWidget>
#include <QtDebug>
#include <QtNetwork>
#include <QFileInfo>
#include <QFileDialog>
#include <QLocalServer>
//#include <sys/socket.h>
//#include <sys/types.h>
//#include <sys/un.h>
// Esto habrá que cambiarlo para poder utilizar varias instancias
#define PDPORTW 9195
//#define PDPORTR 9196 ya no hace falta
#define PDPORTW_AUDIO 9197
#define PDPORTR_AUDIO 9198
#define SOCKET "/tmp/pmspipe"
///////////////////////////////////////////////////////////////////
// Struct for the configuration files
///////////////////////////////////////////////////////////////////
struct conf
{
// Video configuration
bool window;
quint16 winpositionx;
quint16 winpositiony;
quint16 winsizex;
quint16 winsizey;
quint16 layer1Add;
bool layer1Check;
quint16 layer2Add;
bool layer2Check;
quint16 layer3Add;
bool layer3Check;
quint16 layer4Add;
bool layer4Check;
quint16 layer5Add;
bool layer5Check;
quint16 layer6Add;
bool layer6Check;
quint16 layer7Add;
bool layer7Check;
quint16 layer8Add;
bool layer8Check;
bool dmx;
quint8 universe;
quint8 ipadd1;
quint8 ipadd2;
quint8 ipadd3;
quint8 ipadd4;
bool videoCheck;
// Audio Configuration
quint16 layer1Add_audio;
bool layer1Check_audio;
quint16 layer2Add_audio;
bool layer2Check_audio;
quint16 layer3Add_audio;
bool layer3Check_audio;
quint16 layer4Add_audio;
bool layer4Check_audio;
quint16 layer5Add_audio;
bool layer5Check_audio;
quint16 layer6Add_audio;
bool layer6Check_audio;
quint16 layer7Add_audio;
bool layer7Check_audio;
quint16 layer8Add_audio;
bool layer8Check_audio;
bool dmx_audio;
quint8 universe_audio;
bool audioCheck;
// Path to Media Files
QString path;
};
// Constructor
///////////////////////////////////////////////////////////////////
libreMediaServer::libreMediaServer(QWidget *parent)
: QMainWindow(parent)
{
// Iniciamos el User Interface
ui.setupUi(this);
// Iniciamos los punteros NULL
m_pd_write_video = NULL;
m_pd_video = NULL;
m_tcpsocket_audio = NULL;
m_pd_read_audio = NULL;
m_pd_write_audio = NULL;
m_pd_audio = NULL;
// Unix Local Sockets
QFile socket(SOCKET);
socket.remove();
m_server_vid = new QLocalServer(this);
Q_CHECK_PTR(m_server_vid);
if (!m_server_vid->listen(SOCKET))
{
qErrnoWarning("Can not listen on unix local server");
}
connect(m_server_vid, SIGNAL(newConnection()),this, SLOT(newPeer()));
// Start preview Timer
m_preview = new QTimer(this);
Q_CHECK_PTR(m_preview);
m_preview->start(500);
connect(m_preview, SIGNAL(timeout()) ,this, SLOT(previewMaster()));
// The mediaserver object: CITP/MSEx
m_msex = new msex(this);
Q_CHECK_PTR(m_msex);
// Iniciamos olad
m_ola = new QProcess(this);
olastart();
// Conectamos los menus
connect(ui.actionOpen_conf, SIGNAL(triggered()), this, SLOT(open()));
connect(ui.actionSave_conf, SIGNAL(triggered()), this, SLOT(save()));
// Load the configuration
open();
connect(m_msex,SIGNAL(frameRequest()), this, SLOT(sendFrame()));
}
// Destructor
///////////////////////////////////////////////////////////////////
libreMediaServer::~libreMediaServer()
{
save();
QFile socket(SOCKET);
socket.remove();
if (m_pd_write_video != NULL) {
m_pd_write_video->abort();
delete m_pd_write_video;
}
// if (m_read_vid->isOpen()) {
// m_read_vid->close();;
// delete m_read_vid;
// }
if (m_server_vid->isListening()) {
m_server_vid->close();
delete m_server_vid;
}
if (m_pd_video != NULL)
{
disconnect(m_pd_video, SIGNAL(finished(int)), this, SLOT(pdrestart()));
m_pd_video->close();
delete m_pd_video;
}
m_ola->close();
delete m_ola;
}
///////////////////////////////////////////////////////////////////
// File Configuration Stuff
///////////////////////////////////////////////////////////////////
// Load the last configuration from the file pms.conf
void libreMediaServer::open()
{
QFile file("pms.conf");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
qDebug()<<("Can not find the conf file");
return;
}
unsigned char * fileconf = new unsigned char[file.size()];
memset(fileconf, 0, file.size());
fileconf = file.map(0x00, file.size());
if (fileconf == 0){
qDebug()<<("Cannot map the file");
return;
}
conf *packet = (conf *)fileconf;
// Video configuration
ui.window->setChecked(packet->window);
ui.winpositionx->setValue(packet->winpositionx);
ui.winpositiony->setValue(packet->winpositiony);
ui.winsizex->setValue(packet->winsizex);
ui.winsizey->setValue(packet->winsizey);
ui.layer1Add->setValue(packet->layer1Add);
ui.layer1Check->setChecked(packet->layer1Check);
ui.layer2Add->setValue(packet->layer2Add);
ui.layer2Check->setChecked(packet->layer2Check);
ui.layer3Add->setValue(packet->layer3Add);
ui.layer3Check->setChecked(packet->layer3Check);
ui.layer4Add->setValue(packet->layer4Add);
ui.layer4Check->setChecked(packet->layer4Check);
ui.layer5Add->setValue(packet->layer5Add);
ui.layer5Check->setChecked(packet->layer5Check);
ui.layer6Add->setValue(packet->layer6Add);
ui.layer6Check->setChecked(packet->layer6Check);
ui.layer7Add->setValue(packet->layer7Add);
ui.layer7Check->setChecked(packet->layer7Check);
ui.layer8Add->setValue(packet->layer8Add);
ui.layer8Check->setChecked(packet->layer8Check);
ui.readDMX->setChecked(packet->dmx);
ui.universe->setValue(packet->universe);
ui.ipAddress1->setValue(packet->ipadd1);
ui.ipAddress2->setValue(packet->ipadd2);
ui.ipAddress3->setValue(packet->ipadd3);
ui.ipAddress4->setValue(packet->ipadd4);
ui.video->setChecked(packet->videoCheck);
// Audio Configuration
ui.layer1Add_audio->setValue(packet->layer1Add_audio);
ui.layer1Check_audio->setChecked(packet->layer1Check_audio);
ui.layer2Add_audio->setValue(packet->layer2Add_audio);
ui.layer2Check_audio->setChecked(packet->layer2Check_audio);
ui.layer3Add_audio->setValue(packet->layer3Add_audio);
ui.layer3Check_audio->setChecked(packet->layer3Check_audio);
ui.layer4Add_audio->setValue(packet->layer4Add_audio);
ui.layer4Check_audio->setChecked(packet->layer4Check_audio);
ui.layer5Add_audio->setValue(packet->layer5Add_audio);
ui.layer5Check_audio->setChecked(packet->layer5Check_audio);
ui.layer6Add_audio->setValue(packet->layer6Add_audio);
ui.layer6Check_audio->setChecked(packet->layer6Check_audio);
ui.layer7Add_audio->setValue(packet->layer7Add_audio);
ui.layer7Check_audio->setChecked(packet->layer7Check_audio);
ui.layer8Add_audio->setValue(packet->layer8Add_audio);
ui.layer8Check_audio->setChecked(packet->layer8Check_audio);
ui.readDMX_audio->setChecked(packet->dmx_audio);
ui.universe_audio->setValue(packet->universe_audio);
ui.audio->setChecked(packet->audioCheck);
// Path to media
int offset = sizeof(struct conf) - 4;
int size = file.size() - offset;
char * buffer = new char[size];
memset(buffer, 0, size);
memcpy(buffer, fileconf+offset, size);
m_pathmedia = buffer;
QString desc = tr("Media Path Changed to: %1").arg(m_pathmedia);
qDebug()<<(desc);
file.close();
}
// Save the configuration to pms.conf file
void libreMediaServer::save()
{
int bufferLen = sizeof(struct conf) + m_pathmedia.size();
unsigned char *buffer = new unsigned char[bufferLen];
memset(buffer, 0, bufferLen);
conf *packet = (conf *)buffer;
// Video Configuration
packet->window = ui.window->checkState();
packet->winpositionx = ui.winpositionx->value();
packet->winpositiony = ui.winpositiony->value();
packet->winsizex = ui.winsizex->value();
packet->winsizey = ui.winsizey->value();
packet->layer1Add = ui.layer1Add->value();
packet->layer1Check = ui.layer1Check->checkState();
packet->layer2Add = ui.layer2Add->value();
packet->layer2Check = ui.layer2Check->checkState();
packet->layer3Add = ui.layer3Add->value();
packet->layer3Check = ui.layer3Check->checkState();
packet->layer4Add = ui.layer4Add->value();
packet->layer4Check = ui.layer4Check->checkState();
packet->layer5Add = ui.layer5Add->value();
packet->layer5Check = ui.layer5Check->checkState();
packet->layer6Add = ui.layer6Add->value();
packet->layer6Check = ui.layer6Check->checkState();
packet->layer7Add = ui.layer7Add->value();
packet->layer7Check = ui.layer7Check->checkState();
packet->layer8Add = ui.layer8Add->value();
packet->layer8Check = ui.layer8Check->checkState();
packet->dmx = ui.readDMX->checkState();
packet->universe = ui.universe->value();
packet->ipadd1 = ui.ipAddress1->value();
packet->ipadd2 = ui.ipAddress2->value();
packet->ipadd3 = ui.ipAddress3->value();
packet->ipadd4 = ui.ipAddress4->value();
packet->videoCheck = ui.video->checkState();
// Audio Configuration
packet->layer1Add_audio = ui.layer1Add_audio->value();
packet->layer1Check_audio = ui.layer1Check_audio->checkState();
packet->layer2Add_audio = ui.layer2Add_audio->value();
packet->layer2Check_audio = ui.layer2Check_audio->checkState();
packet->layer3Add_audio = ui.layer3Add_audio->value();
packet->layer3Check_audio = ui.layer3Check_audio->checkState();
packet->layer4Add_audio = ui.layer4Add_audio->value();
packet->layer4Check_audio = ui.layer4Check_audio->checkState();
packet->layer5Add_audio = ui.layer5Add_audio->value();
packet->layer5Check_audio = ui.layer5Check_audio->checkState();
packet->layer6Add_audio = ui.layer6Add_audio->value();
packet->layer6Check_audio = ui.layer6Check_audio->checkState();
packet->layer7Add_audio = ui.layer7Add_audio->value();
packet->layer7Check_audio = ui.layer7Check_audio->checkState();
packet->layer8Add_audio = ui.layer8Add_audio->value();
packet->layer8Check_audio = ui.layer8Check_audio->checkState();
packet->dmx_audio = ui.readDMX_audio->checkState();
packet->universe_audio = ui.universe_audio->value();
packet->audioCheck = ui.audio->checkState();
// Path to media
int offset = sizeof (struct conf) - 4;
memcpy(buffer+offset, m_pathmedia.toAscii().constData(), m_pathmedia.size());
QFile file("pms.conf");
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
qDebug()<<("Can not open file pms.conf");
return;
}
int error = file.write((const char *)buffer, bufferLen);
QString errorstring = tr("Bytes Write to file %1").arg(error);
qDebug()<<"Saved file complete:"<<(errorstring);
file.close();
delete buffer;
}
///////////////////////////////////////////////////////////////////
// OLA Stuff
///////////////////////////////////////////////////////////////////
void libreMediaServer::olastart()
{
qDebug()<<("Starting OLA");
m_ola->start("olad", QStringList()<< "-l 3");
// connect(ola, SIGNAL(finished(int)), this, SLOT(olastart()));
}
/*
* User Interface Stuff
*/
///////////////////////////////////////////////////////////////////
// Global Controls
///////////////////////////////////////////////////////////////////
// Change Media path
void libreMediaServer::on_ChangePath_clicked()
{
QFileDialog dialog(this);
dialog.setFileMode(QFileDialog::Directory);
QStringList fileNames;
if (!dialog.exec())
return;
fileNames = dialog.selectedFiles();
QString file = fileNames.at(0);
m_pathmedia = file;
QString desc = tr("0000 0000 %1;").arg(file);
if (ui.video->checkState())
{
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
}
if (ui.audio->checkState())
{
if (!sendPacket_audio(desc.toAscii().constData(),desc.size()))
{
errorsending_audio();
}
}
desc = tr("Media Path Changed to: %1").arg(m_pathmedia);
ui.textEdit->appendPlainText(desc.toAscii());
}
///////////////////////////////////////////////////////////////////
// Video Controls
///////////////////////////////////////////////////////////////////
// Init the CITP/MSEx protocol.
// Begins the CITP/MSEx protocol
// ToDo: Include thumbs generation here
void libreMediaServer::on_updateButton_clicked()
{
// Chequeamos si existe el path a los medias
QDir dir(m_pathmedia);
if (!dir.exists())
{
qDebug()<<("Cannot find the media directory");
ui.textEdit->appendPlainText("Can not find the media directory in the path given");
return;
}
m_msex->setpath(m_pathmedia);
if (!m_msex->updatemedia())
{
qDebug()<<("Cannot explore the media");
ui.textEdit->appendPlainText("Can not explore the media in the path given");
return;
}
// Creamos el objeto CITP y el peer information socket
quint32 ipadd = 0x00000000;
quint32 i;
i = ui.ipAddress1->value();
ipadd = ipadd + (i * 0x1000000);
i =ui.ipAddress2->value();
ipadd = ipadd + (i * 0x10000);
i = ui.ipAddress3->value();
ipadd = ipadd + (i * 0x100);
i = ui.ipAddress4->value();
ipadd = ipadd + i;
m_msex->startCitp(ipadd);
}
// Window Configuration
void libreMediaServer::on_window_stateChanged(int state)
{
if ((state == 2)) {
QString desc("0001 0001;");
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
}
if ((state == 0)) {
QString desc("0001 0000;");
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
}
}
void libreMediaServer::on_winpositionx_valueChanged()
{
int x = ui.winpositionx->value();
QString desc = tr("0002 %1;").arg(x);
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
}
void libreMediaServer::on_winpositiony_valueChanged()
{
int x = ui.winpositiony->value();
QString desc = tr("3 %1;").arg(x);
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
}
void libreMediaServer::on_winsizex_valueChanged()
{
int x = ui.winsizex->value();
QString desc = tr("4 %1;").arg(x);
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
}
void libreMediaServer::on_winsizey_valueChanged()
{
int x = ui.winsizey->value();
QString desc = tr("5 %1;").arg(x);
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
}
// DMX address configuration
void libreMediaServer::on_layer1Check_stateChanged (int state)
{
if ((state == 0))
{
QString desc("0011 0000;");
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
return;
}
if ((state == 2))
{
on_layer1Add_valueChanged();
}
}
void libreMediaServer::on_layer1Add_valueChanged()
{
if (ui.layer1Check->isChecked()){
int x = ui.layer1Add->value();
QString desc = tr("0011 %1;").arg(x);
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
}
}
void libreMediaServer::on_layer2Check_stateChanged (int state)
{
if ((state == 0))
{
QString desc("0012 0000;");
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
return;
}
if ((state == 2))
{
on_layer2Add_valueChanged();
}
}
void libreMediaServer::on_layer2Add_valueChanged()
{
if (ui.layer2Check->isChecked()){
int x = ui.layer2Add->value();
QString desc = tr("0012 %1;").arg(x);
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
}
}
void libreMediaServer::on_layer3Check_stateChanged (int state)
{
if ((state == 0))
{
QString desc("0013 0000;");
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
return;
}
if ((state == 2))
{
on_layer3Add_valueChanged();
}
}
void libreMediaServer::on_layer3Add_valueChanged()
{
if (ui.layer3Check->isChecked()){
int x = ui.layer3Add->value();
QString desc = tr("0013 %1;").arg(x);
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
}
}
void libreMediaServer::on_layer4Check_stateChanged (int state)
{
if ((state == 0))
{
QString desc("0014 0000;");
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
return;
}
if ((state == 2))
{
on_layer4Add_valueChanged();
}
}
void libreMediaServer::on_layer4Add_valueChanged()
{
if (ui.layer4Check->isChecked()){
int x = ui.layer4Add->value();
QString desc = tr("0014 %1;").arg(x);
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
}
}
void libreMediaServer::on_layer5Check_stateChanged (int state)
{
if ((state == 0))
{
QString desc("0015 0000;");
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
return;
}
if ((state == 2))
{
on_layer5Add_valueChanged();
}
}
void libreMediaServer::on_layer5Add_valueChanged()
{
if (ui.layer5Check->isChecked()){
int x = ui.layer5Add->value();
QString desc = tr("0015 %1;").arg(x);
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
}
}
void libreMediaServer::on_layer6Check_stateChanged (int state)
{
if ((state == 0))
{
QString desc("0016 0000;");
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
return;
}
if ((state == 2))
{
on_layer6Add_valueChanged();
}
}
void libreMediaServer::on_layer6Add_valueChanged()
{
if (ui.layer6Check->isChecked()){
int x = ui.layer6Add->value();
QString desc = tr("0016 %1;").arg(x);
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
}
}
void libreMediaServer::on_layer7Check_stateChanged (int state)
{
if ((state == 0))
{
QString desc("0017 0000;");
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
return;
}
if ((state == 2))
{
on_layer7Add_valueChanged();
}
}
void libreMediaServer::on_layer7Add_valueChanged()
{
if (ui.layer7Check->isChecked()){
int x = ui.layer7Add->value();
QString desc = tr("0017 %1;").arg(x);
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
}
}
void libreMediaServer::on_layer8Check_stateChanged (int state)
{
if ((state == 0))
{
QString desc("0018 0000;");
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
return;
}
if ((state == 2))
{
on_layer8Add_valueChanged();
}
}
void libreMediaServer::on_layer8Add_valueChanged()
{
if (ui.layer8Check->isChecked()){
int x = ui.layer8Add->value();
QString desc = tr("0018 %1;").arg(x);
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
}
}
// Open the connection with OLA and start reading DMX
void libreMediaServer::on_readDMX_stateChanged(int state)
{
if ((state == 0)) {
QString desc("0020 0000;");
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
}
if ((state == 2))
{
int x = ui.universe->value();
QString desc = tr("0021 %1;").arg(x);
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
desc = tr("0020 0001;");
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
errorsending();
}
}
}
// Open the video process
void libreMediaServer::on_video_stateChanged(int state)
{
if ((state == 0))
{
disconnect(m_pd_video, SIGNAL(readyReadStandardError()), this, SLOT(stdout()));
disconnect(m_pd_video, SIGNAL(finished(int)), this, SLOT(pdrestart()));
m_pd_video->terminate();
m_pd_video = NULL;
delete m_pd_video;
}
if ((state == 2))
{
// Iniciamos Pure Data
m_pd_video = new QProcess(this);
pdstart();
}
}
///////////////////////////////////////////////////////////////////
/*
* Pure Data Video Stuff
*/
///////////////////////////////////////////////////////////////////
// Start the PD Process, open the ports and connects stdout de Pure Data.
void libreMediaServer::pdstart()
{
if (m_pd_video->state() != 0)
{
return;
}
// Creamos los sockets para la conexión a Pure Data
m_pd_write_video = new QTcpSocket(this);
Q_CHECK_PTR(m_pd_write_video);
connect(m_pd_write_video, SIGNAL(connected()),this, SLOT(newconexion()));
// Arrancamos el proceso Pure Data
m_pd_video->start("pd -lib Gem -d 1 -nogui pms-video.pd");
if (m_pd_video->waitForStarted(3000)){
ui.textEdit->appendPlainText("Video Engine started.");
}
else
{
ui.textEdit->appendPlainText("Video Engine can not start!");
return;
}
// Connect the output fropm PD Video to stdout slot to process it
connect(m_pd_video, SIGNAL(readyReadStandardError()), this, SLOT(stdout()));
// Restart PD Video if crash
connect(m_pd_video, SIGNAL(finished(int)), this, SLOT(pdrestart()));
}
// Sacamos la salida de Pure Data en la terminal
void libreMediaServer::stdout() {
QByteArray out = m_pd_video->readAllStandardError();
if (out.size() < 7) {return;}
out.chop(1);
qDebug() << out;
if (out.indexOf("ola2pd: Can not read DMX!",0) != -1)
{
ui.textEdit->appendPlainText("Can not read DMX data.");
}
if (out.indexOf("watchdog",0) != -1)
{
ui.textEdit->appendPlainText("PD video watchdog detected.");
}
int j = out.indexOf("togui: ",0);
if ((j >= 0) && (out.size() > (j+7)))
{
int i = m_pathmedia.size() + 16;
out.remove(0,j);
switch (out.at(7)) {
case '0':
qDebug()<<"Loadbang Video";
ui.textEdit->appendPlainText("LoadBang Video received.");
newconexion();
break;
case '1':
out.remove(0, i);
out.prepend("Layer 1 playing:");
ui.textEdit->appendPlainText(out);
break;
case '2':
out.remove(0, i);
out.prepend("Layer 2 playing:");
ui.textEdit->appendPlainText(out);
break;
case '3':
out.remove(0,i);
out.prepend("Layer 3 playing:");
ui.textEdit->appendPlainText(out);
break;
case '4':
out.remove(0,i);
out.prepend("Layer 4 playing:");
ui.textEdit->appendPlainText(out);
break;
case '5':
out.remove(0,i);
out.prepend("Layer 5 playing:");
ui.textEdit->appendPlainText(out);
break;
case '6':
out.remove(0,i);
out.prepend("Layer 6 playing:");
ui.textEdit->appendPlainText(out);
break;
case '7':
out.remove(0,i);
out.prepend("Layer 7 playing:");
ui.textEdit->appendPlainText(out);
break;
case '8':
out.remove(0,i);
out.prepend("Layer 8 playing:");
ui.textEdit->appendPlainText(out);
break;
default:
qDebug()<<"stdout:Invalid cooki received"<<out;
break;
}
}
}
// Restart the Pure Data process if crash. Connected wit signal finished of QProcess
void libreMediaServer::pdrestart()
{
if (m_pd_video->state())
{
return;
}
save();
qDebug()<<"Restarting PD";
ui.textEdit->appendPlainText("PD Restarting...");
disconnect(m_pd_video, SIGNAL(finished(int)), this, SLOT(pdrestart()));
pdstart();
}
// New conexion on TCP Server
void libreMediaServer::newPeer()
{
m_read_vid = m_server_vid->nextPendingConnection();
connect(m_read_vid, SIGNAL(readyRead()),
this, SLOT(newmessage()));
}
// New message in a TCP socket stablished connection
void libreMediaServer::newmessage()
{
if (m_read_vid == NULL)
{
qDebug()<<("Local Socket not created");
newPeer();
return;
}
QByteArray byteArray;
byteArray.resize(m_read_vid->bytesAvailable());
byteArray = m_read_vid->readAll();
if (byteArray == NULL)
{
return;
}
QPixmap frame;
switch (byteArray.at(0)) {
case 11:
byteArray.remove(0,2);
if (!frame.loadFromData((byteArray))) {
qDebug()<<"Layer 1 Convert byte Array to frame failed ";
}
ui.layer1Preview->setPixmap(frame);
break;
case 12:
byteArray.remove(0,2);
if (!frame.loadFromData((byteArray))) {
qDebug()<<"Layer 2 Convert byte Array to frame failed ";
}
ui.layer2Preview->setPixmap(frame);
break;
case 13:
byteArray.remove(0,2);
if (!frame.loadFromData((byteArray))) {
qDebug()<<"Layer 3 Convert byte Array to frame failed ";
break;
}
ui.layer3Preview->setPixmap(frame);
break;
case 14:
byteArray.remove(0,2);
if (!frame.loadFromData(byteArray)) {
qDebug()<<"Layer 4 Convert byte Array to frame failed ";
break;
}
ui.layer4Preview->setPixmap(frame);
break;
case 15:
byteArray.remove(0,2);
if (!frame.loadFromData(byteArray)) {
qDebug()<<"Layer 5 Convert byte Array to frame failed ";
break;
}
ui.layer5Preview->setPixmap(frame);
break;
case 16:
byteArray.remove(0,2);
if (!frame.loadFromData(byteArray)) {
qDebug()<<"Layer 6 Convert byte Array to frame failed ";
break;
}
ui.layer6Preview->setPixmap(frame);
break;
case 17:
byteArray.remove(0,2);
if (!frame.loadFromData(byteArray)) {
qDebug()<<"Layer 7 Convert byte Array to frame failed ";
break;
}
ui.layer7Preview->setPixmap(frame);
break;
case 18:
byteArray.remove(0,2);
if (!frame.loadFromData(byteArray)) {
qDebug()<<"Layer 8 Convert byte Array to frame failed ";
break;
}
ui.layer8Preview->setPixmap(frame);
break;
default:
qDebug()<<"newmessage: Message received but can not identify the cooki";
break;
}
}
// Send the configuration to PD
void libreMediaServer::newconexion()
{
// Iniciamos el socket
m_pd_write_video->connectToHost(QHostAddress::LocalHost, PDPORTW);
m_pd_write_video->waitForConnected(300000);
if (!(m_pd_write_video->isOpen())){
qErrnoWarning("newconexion:pd write socket not open!:");
return;
}
//Mandamos el path
QString desc = tr("0000 0000 %1;").arg(m_pathmedia);
if (!sendPacket(desc.toAscii().constData(),desc.size()))
{
ui.textEdit->appendPlainText("newconexion: Can not send the path to PD Video");
return;
}
// send the layer adress
on_layer1Check_stateChanged (ui.layer1Check->checkState());
on_layer2Check_stateChanged (ui.layer2Check->checkState());
on_layer3Check_stateChanged (ui.layer3Check->checkState());
on_layer4Check_stateChanged (ui.layer4Check->checkState());
on_layer5Check_stateChanged (ui.layer5Check->checkState());
on_layer6Check_stateChanged (ui.layer6Check->checkState());
on_layer7Check_stateChanged (ui.layer7Check->checkState());
on_layer8Check_stateChanged (ui.layer8Check->checkState());
// send the dmx on/off
on_readDMX_stateChanged(ui.readDMX->checkState());
// send the windows info
on_winpositionx_valueChanged();
on_winpositiony_valueChanged();
on_winsizex_valueChanged();
on_winsizey_valueChanged();
on_window_stateChanged(ui.window->checkState());
}
// Sends packets to Pure Data video
bool libreMediaServer::sendPacket(const char *buffer, int bufferLen)
{
if (m_pd_write_video == NULL) {
qErrnoWarning("sendPacket:Socket not initialized:");
return false;
}
if (QAbstractSocket::ConnectedState != m_pd_write_video->state())
{
qErrnoWarning("sendPacket:Socket not conected:");
return false;
}
if (bufferLen != m_pd_write_video->write((const char*)buffer, bufferLen))
{
qErrnoWarning("sendPacket:Can not write to socket::");
return false;
}
return true;
}
// Function error sending packets to PD video
void libreMediaServer::errorsending() {
if (ui.video->checkState())
{
qErrnoWarning("errorsending: Can not talk to Pure Data Video!");
ui.textEdit->appendPlainText("errorsending: Can not send packets to PD Video");
}
}
///////////////////////////////////////////////////////////////////
// Audio Controls
///////////////////////////////////////////////////////////////////
void libreMediaServer::on_layer1Check_audio_stateChanged (int state)
{
if ((state == 0))
{
QString desc("0011 0000;");
if (!sendPacket_audio(desc.toAscii().constData(),desc.size()))
{
errorsending_audio();
}
return;
}
if ((state == 2))
{
on_layer1Add_audio_valueChanged();
}
}
void libreMediaServer::on_layer1Add_audio_valueChanged()
{
if (ui.layer1Check_audio->isChecked()){
int x = ui.layer1Add_audio->value();
QString desc = tr("0011 %1;").arg(x);
if (!sendPacket_audio(desc.toAscii().constData(),desc.size()))
{
errorsending_audio();
}
}
}
void libreMediaServer::on_layer2Check_audio_stateChanged (int state)
{
if ((state == 0))
{
QString desc("0012 0000;");
if (!sendPacket_audio(desc.toAscii().constData(),desc.size()))
{
errorsending_audio();
}
return;
}
if ((state == 2))
{
on_layer2Add_audio_valueChanged();
}
}
void libreMediaServer::on_layer2Add_audio_valueChanged()
{
if (ui.layer2Check_audio->isChecked()){
int x = ui.layer2Add_audio->value();
QString desc = tr("0012 %1;").arg(x);
if (!sendPacket_audio(desc.toAscii().constData(),desc.size()))
{
errorsending_audio();
}
}
}
void libreMediaServer::on_layer3Check_audio_stateChanged (int state)
{
if ((state == 0))
{
QString desc("0013 0000;");
if (!sendPacket_audio(desc.toAscii().constData(),desc.size()))
{
errorsending_audio();
}
return;
}
if ((state == 2))
{
on_layer3Add_audio_valueChanged();
}
}
void libreMediaServer::on_layer3Add_audio_valueChanged()
{
if (ui.layer3Check_audio->isChecked()){
int x = ui.layer3Add_audio->value();
QString desc = tr("0013 %1;").arg(x);
if (!sendPacket_audio(desc.toAscii().constData(),desc.size()))
{
errorsending_audio();
}
}
}
void libreMediaServer::on_layer4Check_audio_stateChanged (int state)
{
if ((state == 0))
{
QString desc("0014 0000;");
if (!sendPacket_audio(desc.toAscii().constData(),desc.size()))
{
errorsending_audio();
}
return;
}
if ((state == 2))
{
on_layer4Add_audio_valueChanged();
}
}
void libreMediaServer::on_layer4Add_audio_valueChanged()
{
if (ui.layer4Check_audio->isChecked()){
int x = ui.layer4Add_audio->value();
QString desc = tr("0014 %1;").arg(x);
if (!sendPacket_audio(desc.toAscii().constData(),desc.size()))
{
errorsending_audio();
}
}
}
void libreMediaServer::on_layer5Check_audio_stateChanged (int state)
{
if ((state == 0))
{
QString desc("0015 0000;");
if (!sendPacket_audio(desc.toAscii().constData(),desc.size()))
{
errorsending_audio();
}
return;
}
if ((state == 2))
{
on_layer5Add_audio_valueChanged();
}
}
void libreMediaServer::on_layer5Add_audio_valueChanged()
{
if (ui.layer5Check_audio->isChecked()){
int x = ui.layer5Add_audio->value();
QString desc = tr("0015 %1;").arg(x);
if (!sendPacket_audio(desc.toAscii().constData(),desc.size()))
{
errorsending_audio();
}
}
}
void libreMediaServer::on_layer6Check_audio_stateChanged (int state)
{
if ((state == 0))
{
QString desc("0016 0000;");
if (!sendPacket_audio(desc.toAscii().constData(),desc.size()))
{
errorsending_audio();
}
return;
}
if ((state == 2))
{
on_layer6Add_audio_valueChanged();
}
}
void libreMediaServer::on_layer6Add_audio_valueChanged()
{
if (ui.layer6Check_audio->isChecked()){
int x = ui.layer6Add_audio->value();
QString desc = tr("0016 %1;").arg(x);
if (!sendPacket_audio(desc.toAscii().constData(),desc.size()))
{
errorsending_audio();
}
}
}
void libreMediaServer::on_layer7Check_audio_stateChanged (int state)
{
if ((state == 0))
{
QString desc("0017 0000;");
if (!sendPacket_audio(desc.toAscii().constData(),desc.size()))
{
errorsending_audio();
}
return;
}
if ((state == 2))
{
on_layer7Add_audio_valueChanged();
}
}
void libreMediaServer::on_layer7Add_audio_valueChanged()
{
if (ui.layer7Check_audio->isChecked()){
int x = ui.layer7Add_audio->value();
QString desc = tr("0017 %1;").arg(x);
if (!sendPacket_audio(desc.toAscii().constData(),desc.size()))
{
errorsending_audio();
}
}
}
void libreMediaServer::on_layer8Check_audio_stateChanged (int state)
{
if ((state == 0))
{
QString desc("0018 0000;");
if (!sendPacket_audio(desc.toAscii().constData(),desc.size()))
{
errorsending_audio();
}
return;
}
if ((state == 2))
{
on_layer8Add_audio_valueChanged();
}
}
void libreMediaServer::on_layer8Add_audio_valueChanged()
{
if (ui.layer8Check_audio->isChecked()){
int x = ui.layer8Add_audio->value();
QString desc = tr("0018 %1;").arg(x);
if (!sendPacket_audio(desc.toAscii().constData(),desc.size()))
{
errorsending_audio();
}
}
}
// Open the connection with OLA and start reading DMX
void libreMediaServer::on_readDMX_audio_stateChanged(int state)
{
if ((state == 0)) {
QString desc("0020 0000;");
if (!sendPacket_audio(desc.toAscii().constData(),desc.size()))
{
errorsending_audio();
}
}
if ((state == 2))
{
int x = ui.universe_audio->value();
QString desc = tr("0021 %1;").arg(x);
if (!sendPacket_audio(desc.toAscii().constData(),desc.size()))
{
errorsending_audio();
}
desc = tr("0020 0001;");
if (!sendPacket_audio(desc.toAscii().constData(),desc.size()))
{
errorsending_audio();
}
}
}
// Open the audio process
void libreMediaServer::on_audio_stateChanged(int state)
{
if ((state == 0))
{
if (m_pd_write_audio != NULL)
{
m_pd_write_audio->close();
disconnect(m_pd_write_audio, SIGNAL(connected()),this, SLOT(newconexion_audio()));
m_pd_write_audio == NULL;
}
if (m_pd_read_audio != NULL)
{
disconnect(m_pd_read_audio, SIGNAL(newConnection()),this, SLOT(newPeer_audio()));
m_pd_read_audio->close();
m_pd_read_audio == NULL;
}
if (m_tcpsocket_audio != NULL)
{
m_tcpsocket_audio->close();
m_tcpsocket_audio == NULL;
}
disconnect(m_pd_audio, SIGNAL(finished(int)), this, SLOT(pdrestart_audio()));
m_pd_audio->terminate();
m_pd_audio = NULL;
}
if ((state == 2))
{
// Iniciamos Pure Data
m_pd_read_audio = NULL;
m_pd_write_audio = NULL;
m_pd_audio = new QProcess(this);
pdstart_audio();
}
}
///////////////////////////////////////////////////////////////////
/*
* Pure Data Audio Stuff
*/
///////////////////////////////////////////////////////////////////
// Start the PD Process, open the ports and connects stdout de Pure Data.
void libreMediaServer::pdstart_audio()
{
if (m_pd_audio->state() != 0)
{
return;
}
// Creamos los sockets para la conexión a Pure Data
m_pd_write_audio = new QTcpSocket(this);
Q_CHECK_PTR(m_pd_write_audio);
connect(m_pd_write_audio, SIGNAL(connected()),this, SLOT(newconexion_audio()));
m_pd_read_audio = new QTcpServer(this);
Q_CHECK_PTR(m_pd_read_audio);
connect(m_pd_read_audio, SIGNAL(newConnection()),this, SLOT(newPeer_audio()));
if (!m_pd_read_audio)
{
qDebug()<<("error TCP Server no creado");
}
if (!m_pd_read_audio->listen(QHostAddress::LocalHost, PDPORTR_AUDIO))
{
qDebug()<<"error listening tcpServer";
}
// Arrancamos el proceso Pure Data
m_pd_audio->start("pd -path /usr/lib/pd/extra/pdogg -path /usr/lib/pd/extra/pan pms-audio.pd");
if (m_pd_audio->waitForStarted(3000)){
ui.textEdit->appendPlainText("PD Audio started.");
}
else
{
ui.textEdit->appendPlainText("PD Audio not started!");
return;
}
connect(m_pd_audio, SIGNAL(readyReadStandardError()), this, SLOT(stdout_audio()));
}
// Sacamos la salida de Pure Data en la terminal
void libreMediaServer::stdout_audio() {
QString out = m_pd_audio->readAllStandardError();
out.chop(1);
if (!out.isEmpty())
{
qDebug() << out;
// ui.textEdit->appendPlainText(out);
}
}
// Restart the Pure Data process if crash. Connected wit signal finished of QProcess
void libreMediaServer::pdrestart_audio()
{
save();
qDebug()<<"Restarting PD audio";
ui.textEdit->appendPlainText("PD audio Restarting...");
int state = m_pd_audio->state();
if (state != 0)
{
return;
}
if (m_pd_write_audio != NULL)
{
m_pd_write_audio->close();
disconnect(m_pd_write_audio, SIGNAL(connected()),this, SLOT(newconexion_audio()));
delete m_pd_write_audio;
}
if (m_pd_read_audio != NULL)
{
disconnect(m_pd_read_audio, SIGNAL(newConnection()),this, SLOT(newPeer_audio()));
m_pd_read_audio->close();
delete m_pd_read_audio;
}
disconnect(m_pd_audio, SIGNAL(finished(int)), this, SLOT(pdrestart_audio()));
pdstart_audio();
}
// New conexion on TCP Server
void libreMediaServer::newPeer_audio()
{
m_tcpsocket_audio = m_pd_read_audio->nextPendingConnection();
connect(m_tcpsocket_audio, SIGNAL(readyRead()),
this, SLOT(newmessage_audio()));
}
// New message in a TCP socket stablished connection
void libreMediaServer::newmessage_audio()
{
if (m_tcpsocket_audio == NULL)
{
qDebug()<<("tcpsocket audio not created");
newPeer_audio();
return;
}
QByteArray byteArray = m_tcpsocket_audio->readAll();
QString string(byteArray);
if (byteArray.at(0) == 0)
{
return;
}
QChar layer = string.at(0);
int i = 9 + m_pathmedia.size();
string.remove(0,i);
string.chop(2);
int val = layer.digitValue();
switch (val) {
case 0:
ui.textEdit->appendPlainText("Loadbang from PD Audio received...");
// Conectamos a Pure Data para escribir
m_pd_write_audio->connectToHost(QHostAddress::LocalHost, PDPORTW_AUDIO);
// Conectamos para reiniciar si PD crash
connect(m_pd_audio, SIGNAL(finished(int)), this, SLOT(pdrestart_audio()));
// Mandamos Configuración
m_pd_write_audio->waitForConnected(30000);
newconexion_audio();
case 1:
ui.layer1_audio->setText(string);
break;
case 2:
ui.layer2_audio->setText(string);
break;
case 3:
ui.layer3_audio->setText(string);
break;
case 4:
ui.layer4_audio->setText(string);
break;
case 5:
ui.layer5_audio->setText(string);
break;
case 6:
ui.layer6_audio->setText(string);
break;
case 7:
ui.layer7_audio->setText(string);
break;
case 8:
ui.layer8_audio->setText(string);
break;
}
}
// Send the configuration to PD
void libreMediaServer::newconexion_audio()
{
if (!(m_pd_write_audio->isOpen())){
errorsending_audio();
return;
}
qDebug() << "Sending conf to PD Audio";
QString desc = tr("0000 0000 %1;").arg(m_pathmedia);
if (!sendPacket_audio(desc.toAscii().constData(),desc.size()))
{
errorsending_audio();
return;
}
on_layer1Check_audio_stateChanged (ui.layer1Check_audio->checkState());
on_layer2Check_audio_stateChanged (ui.layer2Check_audio->checkState());
on_layer3Check_audio_stateChanged (ui.layer3Check_audio->checkState());
on_layer4Check_audio_stateChanged (ui.layer4Check_audio->checkState());
on_layer5Check_audio_stateChanged (ui.layer5Check_audio->checkState());
on_layer6Check_audio_stateChanged (ui.layer6Check_audio->checkState());
on_layer7Check_audio_stateChanged (ui.layer7Check_audio->checkState());
on_layer8Check_audio_stateChanged (ui.layer8Check_audio->checkState());
on_readDMX_audio_stateChanged(ui.readDMX_audio->checkState());
}
// Sends packets to Pure Data audio
bool libreMediaServer::sendPacket_audio(const char *buffer, int bufferLen)
{
if (m_pd_write_audio == NULL) {
return false;
}
if (QAbstractSocket::ConnectedState != m_pd_write_audio->state())
{
return false;
}
if (bufferLen != m_pd_write_audio->write((const char*)buffer, bufferLen))
{
return false;
}
return true;
}
// Function error sending packets to PD audio
void libreMediaServer::errorsending_audio() {
if (ui.audio->checkState())
{
ui.textEdit->appendPlainText("Can not send packets to PD Video");
}
}
///////////////////////////////////////////////////////////////////
//
// Previews
//
///////////////////////////////////////////////////////////////////
// GUI
void libreMediaServer::previewMaster()
{
QPixmap preview = QPixmap::grabWindow(QApplication::desktop()->winId(), ui.winpositionx->value() , ui.winpositiony->value(),ui.winsizex->value(),ui.winsizey->value());
ui.masterPreview->setPixmap(preview);
}
// CITP/MSEx 1.0
void libreMediaServer::sendFrame()
{
m_msex->n_timer->stop();
QPixmap frame = QPixmap::grabWindow(QApplication::desktop()->winId(), ui.winpositionx->value() , ui.winpositiony->value(),ui.winsizex->value(),ui.winsizey->value());
if (!frame) {
qDebug()<<"sendFrame: Can not take frame";
return;
}
QImage image = QImage(frame.toImage());
if (!image.byteCount()) {
qDebug()<<"sendFrame: Can not convert screen capture to image";
return;
}
image = image.scaledToWidth(88);
image = image.convertToFormat(QImage::Format_RGB888);
int bufferLen = image.byteCount();
int bufferLenTot = sizeof(struct CITP_MSEX_10_StFr ) + bufferLen;
uchar * buffer = new uchar[bufferLenTot];
memset(buffer, 0, bufferLenTot);
CITP_MSEX_10_StFr *packet = (CITP_MSEX_10_StFr *)buffer;
// CITP header
packet->CITPMSEXHeader.CITPHeader.Cookie = COOKIE_CITP;
packet->CITPMSEXHeader.CITPHeader.VersionMajor = 0x01;
packet->CITPMSEXHeader.CITPHeader.VersionMinor = 0x00;
packet->CITPMSEXHeader.CITPHeader.Reserved[0] = 0x00;
packet->CITPMSEXHeader.CITPHeader.Reserved[1] = 0x00;
packet->CITPMSEXHeader.CITPHeader.MessageSize = bufferLenTot;
packet->CITPMSEXHeader.CITPHeader.MessagePartCount = 0x01;
packet->CITPMSEXHeader.CITPHeader.MessagePart = 0x00; // XXX - doc says 0-based?
packet->CITPMSEXHeader.CITPHeader.ContentType = COOKIE_MSEX;
// MSEX header
packet->CITPMSEXHeader.ContentType = COOKIE_MSEX_STFR;
packet->CITPMSEXHeader.VersionMajor = 0x01;
packet->CITPMSEXHeader.VersionMinor = 0x00;
//STFR Content
packet->FrameBufferSize = bufferLen;
packet->FrameFormat = 943867730;
packet->FrameHeight = 64;
packet->FrameWidth = 88;
packet->SourceIdentifier = 0x0001;
// Copiamos los datos del thumbnail
int offset = sizeof(struct CITP_MSEX_10_StFr);
memcpy((buffer+offset), image.bits(), bufferLen);
if (!buffer)
{
qDebug() << "sendFrame:create Frame failed";
return;
}
// Mandamos el paquete
if (!m_msex->sendPacket(buffer, bufferLenTot))
{
qDebug() << "sendFrame: transmitFrame failed";
return;
}
m_msex->n_timer->start();
}