- Log file and minor changes.

- PD Video uses noaudio option to avoid blocking the device
This commit is contained in:
Santi Noreña 2013-02-20 16:55:00 +01:00
parent d7d9559e9f
commit c2af0c91ab
12 changed files with 194 additions and 180 deletions

View file

@ -1,6 +1,6 @@
/*
Pure Media Server - A Media Server Sotfware for stage and performing
v0.01-2
v0.03-1
Copyright (C) 2012-2013 Santi Noreña libremediaserver@gmail.com
This program is free software: you can redistribute it and/or modify
@ -30,6 +30,8 @@
#include <QFileInfo>
#include <QFileDialog>
#include <QLocalServer>
#include <QFile>
#include <QTextStream>
// Esto habrá que cambiarlo para poder utilizar varias instancias
#define PDPORTW 9195
@ -104,25 +106,31 @@ bool audioCheck;
///////////////////////////////////////////////////////////////////
libreMediaServer::libreMediaServer(QWidget *parent)
: QMainWindow(parent)
: QMainWindow(parent),
m_startvideo(0),
m_startaudio(0),
m_pd_video(NULL),
m_pd_audio(NULL),
m_pd_write_video(NULL),
m_pd_write_audio(NULL),
m_pd_read_audio(NULL),
m_tcpsocket_audio(NULL)
{
qDebug() << "******************************************************************************************************";
qDebug() << QDate::currentDate() << QTime::currentTime();
// 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
// Unix Local Sockets
QFile socket(SOCKET);
socket.remove();
if (socket.exists())
{
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");
qErrnoWarning("Init: Can not listen on unix local server");
}
connect(m_server_vid, SIGNAL(newConnection()),this, SLOT(newPeer()));
// Start preview Timer
@ -160,10 +168,6 @@ libreMediaServer::~libreMediaServer()
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;
@ -172,13 +176,21 @@ libreMediaServer::~libreMediaServer()
{
disconnect(m_pd_video, SIGNAL(finished(int)), this, SLOT(pdrestart()));
m_pd_video->terminate();
delete m_pd_video;
if (m_pd_video->waitForFinished(30000))
{
delete m_pd_video;
}
}
m_ola->close();
delete m_ola;
if (m_pd_audio != NULL)
{
disconnect(m_pd_audio, SIGNAL(finished(int)), this, SLOT( pdrestart_audio()));
m_pd_audio->terminate();
if (m_pd_audio->waitForFinished(30000))
{
delete m_pd_audio;
}
}
if (m_pd_write_audio != NULL)
{
@ -190,6 +202,10 @@ libreMediaServer::~libreMediaServer()
m_pd_read_audio->close();
delete m_pd_read_audio;
}
socket.remove();
qDebug() << "PD Video starts: " << m_startvideo << " PD Audio starts: " << m_startaudio;
qDebug() << "Date: " << QDate::currentDate() << "Time: "<< QTime::currentTime();
qDebug() << "******************************************************************************************************";
return;
}
@ -836,17 +852,19 @@ void libreMediaServer::pdstart()
{
return;
}
qDebug()<<"Starting PD Video:" << ++m_startvideo;
// 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 0 -stderr -nogui -nostdpath lms-video.pd");
m_pd_video->start("./pd -noaudio -lib Gem -stderr -nostdpath -path ./externals/ lms-video.pd");
if (m_pd_video->waitForStarted(3000)){
ui.textEdit->appendPlainText("Video Engine started.");
}
else
{
qFatal("PD Video can not start") ;
ui.textEdit->appendPlainText("Video Engine can not start!");
return;
}
@ -856,78 +874,6 @@ void libreMediaServer::pdstart()
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 with signal finished of QProcess
void libreMediaServer::pdrestart()
@ -937,10 +883,10 @@ void libreMediaServer::pdrestart()
return;
}
save_finish();
qDebug()<<"Restarting PD";
ui.textEdit->appendPlainText("PD Video Restarting.");
disconnect(m_pd_video, SIGNAL(finished(int)), this, SLOT(pdrestart()));
pdstart();
}
// New conexion on TCP Server
@ -1418,6 +1364,7 @@ void libreMediaServer::pdstart_audio()
{
return;
}
qDebug()<<"Starting PD Audio:" << ++m_startaudio;
// Creamos los sockets para la conexión a Pure Data
m_pd_write_audio = new QTcpSocket(this);
Q_CHECK_PTR(m_pd_write_audio);
@ -1434,7 +1381,7 @@ void libreMediaServer::pdstart_audio()
qDebug()<<"error listening tcpServer";
}
// Arrancamos el proceso Pure Data
m_pd_audio->start("./pd -channels 2 -audiodev 1 -stderr -nostdpath -nogui lms-audio.pd");
m_pd_audio->start("./pd -alsa -channels 2 -audiodev 1 -stderr -nostdpath -path ./externals/ lms-audio.pd");
if (m_pd_audio->waitForStarted(3000)){
ui.textEdit->appendPlainText("PD Audio started.");
}
@ -1447,27 +1394,12 @@ void libreMediaServer::pdstart_audio()
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_finish();
qDebug()<<"Restarting PD audio";
ui.textEdit->appendPlainText("PD audio Restarting...");
int state = m_pd_audio->state();
if (state != 0)
if (m_pd_audio->state())
{
return;
}
@ -1488,7 +1420,6 @@ void libreMediaServer::pdrestart_audio()
}
// New conexion on TCP Server
void libreMediaServer::newPeer_audio()
{
m_tcpsocket_audio = m_pd_read_audio->nextPendingConnection();
@ -1497,7 +1428,6 @@ void libreMediaServer::newPeer_audio()
}
// New message in a TCP socket stablished connection
void libreMediaServer::newmessage_audio()
{
if (m_tcpsocket_audio == NULL)
@ -1581,7 +1511,6 @@ void libreMediaServer::newconexion_audio()
}
// Sends packets to Pure Data audio
bool libreMediaServer::sendPacket_audio(const char *buffer, int bufferLen)
{
if (m_pd_write_audio == NULL) {
@ -1599,7 +1528,6 @@ bool libreMediaServer::sendPacket_audio(const char *buffer, int bufferLen)
}
// Function error sending packets to PD audio
void libreMediaServer::errorsending_audio() {
if (ui.audio->checkState())
{
@ -1612,6 +1540,7 @@ void libreMediaServer::errorsending_audio() {
// Previews
//
///////////////////////////////////////////////////////////////////
// GUI
void libreMediaServer::previewMaster()
{
@ -1675,3 +1604,91 @@ void libreMediaServer::sendFrame()
}
m_msex->n_timer->start();
}
///////////////////////////////////////////////////////////////////
//
// Terminal and Log
//
///////////////////////////////////////////////////////////////////
// Sacamos la salida de Pure Data Audio en la terminal
void libreMediaServer::stdout_audio() {
QString out = m_pd_audio->readAllStandardError();
out.chop(1);
if (!out.isEmpty())
{
qDebug() << "PD Audio: " << out;
}
}
// Sacamos la salida de Pure Data Video en la terminal
void libreMediaServer::stdout() {
QByteArray out = m_pd_video->readAllStandardError();
if (out.size() < 7) {return;}
out.chop(1);
qDebug() << "PD Video: " << 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 cookie received"<<out;
break;
}
}
}