- Added option -gui in comamd line to show the Pure Data GUI's
- Bugfix in initiatializinng the text subpatch
This commit is contained in:
parent
d1c4295692
commit
b877185c0d
8 changed files with 97 additions and 50 deletions
|
@ -244,7 +244,7 @@ En los modos auto el inicio y fin de loop no son aplicables, se reproduce la pel
|
||||||
25-49: Video
|
25-49: Video
|
||||||
50-75: Imagenes
|
50-75: Imagenes
|
||||||
75-99: Texto
|
75-99: Texto
|
||||||
9 Modos de Reproduccion (Sólo aplicable si canal 5 < 245)/Text File:
|
9 Modos de Reproduccion (Sólo aplicable si canal 5 < 245):
|
||||||
00-24 Normal loop
|
00-24 Normal loop
|
||||||
25-49 Back loop
|
25-49 Back loop
|
||||||
50-74 Ping-pong loop
|
50-74 Ping-pong loop
|
||||||
|
@ -253,7 +253,7 @@ En los modos auto el inicio y fin de loop no son aplicables, se reproduce la pel
|
||||||
125-149 Ping-Pong una vez
|
125-149 Ping-Pong una vez
|
||||||
150-174 Stop/pause
|
150-174 Stop/pause
|
||||||
175-200 Continue/Play
|
175-200 Continue/Play
|
||||||
10 Inicio loop (0 principio peli- 255 final) (0)
|
10 Inicio loop (0 principio peli- 255 final)/Text File (0)
|
||||||
11 Final Loop (0 principio peli - 255 final) (255)
|
11 Final Loop (0 principio peli - 255 final) (255)
|
||||||
12 Rotate X (0)
|
12 Rotate X (0)
|
||||||
13 Rotate Y (0)
|
13 Rotate Y (0)
|
||||||
|
|
|
@ -1759,7 +1759,7 @@ f f f f f f f f f;
|
||||||
#X connect 111 0 108 0;
|
#X connect 111 0 108 0;
|
||||||
#X connect 113 0 102 0;
|
#X connect 113 0 102 0;
|
||||||
#X restore 579 -65 pd video_render;
|
#X restore 579 -65 pd video_render;
|
||||||
#N canvas 66 90 951 649 texto 0;
|
#N canvas 48 90 951 649 texto 0;
|
||||||
#X obj 421 -381 gemhead;
|
#X obj 421 -381 gemhead;
|
||||||
#X msg 252 -31 font \$1;
|
#X msg 252 -31 font \$1;
|
||||||
#X obj 421 -307 rotateXYZ;
|
#X obj 421 -307 rotateXYZ;
|
||||||
|
@ -1816,21 +1816,22 @@ f f f f f f f f f;
|
||||||
#X obj 659 -115 - 128;
|
#X obj 659 -115 - 128;
|
||||||
#X obj 659 -78 * 0.125;
|
#X obj 659 -78 * 0.125;
|
||||||
#X obj 776 -29 pack f f 1;
|
#X obj 776 -29 pack f f 1;
|
||||||
#X obj 980 -203 loadbang;
|
#X obj 856 18 coll;
|
||||||
#X obj 856 8 coll;
|
|
||||||
#C restore;
|
#C restore;
|
||||||
#X obj 856 34 prepend text;
|
#X obj 856 44 prepend text;
|
||||||
#X msg 932 -70 read \$1;
|
#X msg 932 -74 read \$1;
|
||||||
#X obj 932 -100 fileselector;
|
#X obj 932 -100 fileselector;
|
||||||
#X msg 980 -181 type 257;
|
#X msg 1017 -157 type 257;
|
||||||
#X msg 1057 -182 file \$1;
|
#X msg 1128 -160 file \$1;
|
||||||
#X obj 1057 -205 r \$0-c9;
|
#X obj 932 -219 r path;
|
||||||
#X obj 921 -202 r path;
|
#X msg 932 -155 set \$1;
|
||||||
#X msg 921 -180 set \$1;
|
#X obj 1196 -120 b;
|
||||||
#X obj 1149 -143 b;
|
|
||||||
#X text 857 -68 Texto;
|
#X text 857 -68 Texto;
|
||||||
#X obj 856 -20 float;
|
#X obj 969 -48 b;
|
||||||
#X obj 946 -48 b;
|
#X obj 1128 -189 float 0;
|
||||||
|
#X obj 1019 -199 t b b;
|
||||||
|
#X obj 856 -10 float 0;
|
||||||
|
#X obj 1128 -222 r \$0-c10;
|
||||||
#X connect 0 0 4 0;
|
#X connect 0 0 4 0;
|
||||||
#X connect 1 0 3 0;
|
#X connect 1 0 3 0;
|
||||||
#X connect 2 0 5 0;
|
#X connect 2 0 5 0;
|
||||||
|
@ -1846,7 +1847,7 @@ f f f f f f f f f;
|
||||||
#X connect 11 0 8 1;
|
#X connect 11 0 8 1;
|
||||||
#X connect 12 0 11 0;
|
#X connect 12 0 11 0;
|
||||||
#X connect 12 1 10 0;
|
#X connect 12 1 10 0;
|
||||||
#X connect 23 0 68 0;
|
#X connect 23 0 69 0;
|
||||||
#X connect 24 0 36 0;
|
#X connect 24 0 36 0;
|
||||||
#X connect 25 0 37 0;
|
#X connect 25 0 37 0;
|
||||||
#X connect 26 0 38 0;
|
#X connect 26 0 38 0;
|
||||||
|
@ -1880,21 +1881,24 @@ f f f f f f f f f;
|
||||||
#X connect 53 0 54 0;
|
#X connect 53 0 54 0;
|
||||||
#X connect 54 0 6 3;
|
#X connect 54 0 6 3;
|
||||||
#X connect 55 0 51 2;
|
#X connect 55 0 51 2;
|
||||||
#X connect 56 0 61 0;
|
#X connect 56 0 57 0;
|
||||||
#X connect 57 0 58 0;
|
#X connect 57 0 3 0;
|
||||||
#X connect 58 0 3 0;
|
#X connect 58 0 56 0;
|
||||||
#X connect 59 0 57 0;
|
#X connect 58 0 66 0;
|
||||||
#X connect 59 0 69 0;
|
#X connect 59 0 58 0;
|
||||||
#X connect 60 0 59 0;
|
#X connect 60 0 59 0;
|
||||||
#X connect 61 0 60 0;
|
#X connect 61 0 59 0;
|
||||||
#X connect 62 0 60 0;
|
#X connect 61 0 64 0;
|
||||||
#X connect 62 0 66 0;
|
#X connect 62 0 63 0;
|
||||||
#X connect 63 0 62 0;
|
#X connect 62 0 68 0;
|
||||||
#X connect 64 0 65 0;
|
#X connect 63 0 59 0;
|
||||||
#X connect 65 0 60 0;
|
#X connect 64 0 59 0;
|
||||||
#X connect 66 0 60 0;
|
#X connect 66 0 69 0;
|
||||||
#X connect 68 0 57 0;
|
#X connect 67 0 61 0;
|
||||||
#X connect 69 0 68 0;
|
#X connect 68 0 60 0;
|
||||||
|
#X connect 68 1 67 0;
|
||||||
|
#X connect 69 0 56 0;
|
||||||
|
#X connect 70 0 67 0;
|
||||||
#X restore 742 -97 pd texto;
|
#X restore 742 -97 pd texto;
|
||||||
#X obj 450 350 t b;
|
#X obj 450 350 t b;
|
||||||
#X obj 397 349 t b;
|
#X obj 397 349 t b;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#N canvas 572 196 611 318 10;
|
#N canvas 570 206 611 318 10;
|
||||||
#N canvas 315 169 952 599 dmx 0;
|
#N canvas 315 169 952 599 dmx 0;
|
||||||
#X obj -7 437 list split;
|
#X obj -7 437 list split;
|
||||||
#X obj 99 444 list split;
|
#X obj 99 444 list split;
|
||||||
|
@ -600,7 +600,7 @@
|
||||||
#X connect 16 0 13 0;
|
#X connect 16 0 13 0;
|
||||||
#X connect 16 1 3 0;
|
#X connect 16 1 3 0;
|
||||||
#X restore -396 -379 pd layer_2;
|
#X restore -396 -379 pd layer_2;
|
||||||
#N canvas 382 150 450 300 layer_1 0;
|
#N canvas 380 160 450 300 layer_1 0;
|
||||||
#X obj -253 -28 layer;
|
#X obj -253 -28 layer;
|
||||||
#X msg -124 -32 1;
|
#X msg -124 -32 1;
|
||||||
#X msg -177 -33 0;
|
#X msg -177 -33 0;
|
||||||
|
|
|
@ -93,7 +93,7 @@ bool audioCheck;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
libreMediaServer::libreMediaServer(QWidget *parent)
|
libreMediaServer::libreMediaServer(QStringList args, QWidget *parent)
|
||||||
: QMainWindow(parent),
|
: QMainWindow(parent),
|
||||||
m_startvideo(0),
|
m_startvideo(0),
|
||||||
m_startaudio(0),
|
m_startaudio(0),
|
||||||
|
@ -102,10 +102,17 @@ libreMediaServer::libreMediaServer(QWidget *parent)
|
||||||
m_pd_write_video(NULL),
|
m_pd_write_video(NULL),
|
||||||
m_pd_write_audio(NULL),
|
m_pd_write_audio(NULL),
|
||||||
m_pd_read_audio(NULL),
|
m_pd_read_audio(NULL),
|
||||||
m_tcpsocket_audio(NULL)
|
m_tcpsocket_audio(NULL),
|
||||||
|
m_gui(FALSE)
|
||||||
{
|
{
|
||||||
qDebug() << "******************************************************************************************************";
|
qDebug() << "******************************************************************************************************";
|
||||||
qDebug() << QDate::currentDate() << QTime::currentTime();
|
qDebug() << QDate::currentDate() << QTime::currentTime();
|
||||||
|
qDebug() << "Parsing the command line";
|
||||||
|
if (args.contains("-gui"))
|
||||||
|
{
|
||||||
|
qDebug()<< "libremediaserver Constructor option GUI detected";
|
||||||
|
m_gui = true;
|
||||||
|
}
|
||||||
// Iniciamos el User Interface
|
// Iniciamos el User Interface
|
||||||
ui.setupUi(this);
|
ui.setupUi(this);
|
||||||
// Unix Local Sockets
|
// Unix Local Sockets
|
||||||
|
@ -844,7 +851,11 @@ void libreMediaServer::pdstart()
|
||||||
Q_CHECK_PTR(m_pd_write_video);
|
Q_CHECK_PTR(m_pd_write_video);
|
||||||
connect(m_pd_write_video, SIGNAL(connected()),this, SLOT(newconexion()));
|
connect(m_pd_write_video, SIGNAL(connected()),this, SLOT(newconexion()));
|
||||||
// Arrancamos el proceso Pure Data
|
// Arrancamos el proceso Pure Data
|
||||||
m_pd_video->start("./pd -noaudio -lib Gem -stderr -nostdpath -path ./externals/ ./patches/lms-video.pd");
|
QString arguments;
|
||||||
|
arguments.append("./pd -noaudio -lib Gem -stderr -nostdpath -path ./externals/ -open ./patches/lms-video.pd ");
|
||||||
|
if (!m_gui)
|
||||||
|
arguments.append("-nogui");
|
||||||
|
m_pd_video->start(arguments);
|
||||||
if (m_pd_video->waitForStarted(3000)){
|
if (m_pd_video->waitForStarted(3000)){
|
||||||
ui.textEdit->appendPlainText("Video Engine started.");
|
ui.textEdit->appendPlainText("Video Engine started.");
|
||||||
}
|
}
|
||||||
|
@ -869,7 +880,7 @@ void libreMediaServer::pdrestart()
|
||||||
}
|
}
|
||||||
save_finish();
|
save_finish();
|
||||||
qDebug()<<"**************************************************************************";
|
qDebug()<<"**************************************************************************";
|
||||||
qDebug()<<"Starting PD Video:" << ++m_startvideo;
|
qDebug()<<"PD Video Restarts:" << ++m_startvideo;
|
||||||
ui.textEdit->appendPlainText("PD Video Restarting.");
|
ui.textEdit->appendPlainText("PD Video Restarting.");
|
||||||
disconnect(m_pd_video, SIGNAL(finished(int)), this, SLOT(pdrestart()));
|
disconnect(m_pd_video, SIGNAL(finished(int)), this, SLOT(pdrestart()));
|
||||||
pdstart();
|
pdstart();
|
||||||
|
@ -1363,7 +1374,11 @@ void libreMediaServer::pdstart_audio()
|
||||||
qDebug()<<"error listening tcpServer";
|
qDebug()<<"error listening tcpServer";
|
||||||
}
|
}
|
||||||
// Arrancamos el proceso Pure Data
|
// Arrancamos el proceso Pure Data
|
||||||
m_pd_audio->start("./pd -alsa -channels 2 -audiodev 1 -stderr -nostdpath -path ./externals/ ./patches/lms-audio.pd");
|
QString arguments;
|
||||||
|
arguments.append("./pd -alsa -channels 2 -audiodev 1 -stderr -nostdpath -path ./externals/ ./patches/lms-audio.pd ");
|
||||||
|
if (!m_gui)
|
||||||
|
arguments.append("-nogui");
|
||||||
|
m_pd_audio->start(arguments);
|
||||||
if (m_pd_audio->waitForStarted(3000)){
|
if (m_pd_audio->waitForStarted(3000)){
|
||||||
ui.textEdit->appendPlainText("PD Audio started.");
|
ui.textEdit->appendPlainText("PD Audio started.");
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,7 +47,7 @@ class libreMediaServer : public QMainWindow
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
libreMediaServer (QWidget *parent = 0);
|
libreMediaServer (QStringList args, QWidget *parent = 0);
|
||||||
virtual ~libreMediaServer();
|
virtual ~libreMediaServer();
|
||||||
|
|
||||||
Ui::LibreMediaServer ui;
|
Ui::LibreMediaServer ui;
|
||||||
|
@ -72,6 +72,7 @@ protected:
|
||||||
QTimer *m_preview; // Timer for the preview screen
|
QTimer *m_preview; // Timer for the preview screen
|
||||||
int m_startvideo; // Counter starts video engine. Debugging purpose
|
int m_startvideo; // Counter starts video engine. Debugging purpose
|
||||||
int m_startaudio; // Counter starts audio engine. Debugging purpose
|
int m_startaudio; // Counter starts audio engine. Debugging purpose
|
||||||
|
bool m_gui;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE QtCreatorProject>
|
<!DOCTYPE QtCreatorProject>
|
||||||
<!-- Written by Qt Creator 2.5.0, 2013-03-01T18:09:52. -->
|
<!-- Written by Qt Creator 2.5.0, 2013-03-01T20:59:13. -->
|
||||||
<qtcreator>
|
<qtcreator>
|
||||||
<data>
|
<data>
|
||||||
<variable>ProjectExplorer.Project.ActiveTarget</variable>
|
<variable>ProjectExplorer.Project.ActiveTarget</variable>
|
||||||
|
@ -213,7 +213,7 @@
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration</value>
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration</value>
|
||||||
<value type="int" key="Qt4ProjectManager.Qt4RunConfiguration.BaseEnvironmentBase">2</value>
|
<value type="int" key="Qt4ProjectManager.Qt4RunConfiguration.BaseEnvironmentBase">2</value>
|
||||||
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value>
|
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments">-gui</value>
|
||||||
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">libremediaserver.pro</value>
|
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">libremediaserver.pro</value>
|
||||||
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
|
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
|
||||||
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseTerminal">false</value>
|
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseTerminal">false</value>
|
||||||
|
|
23
src/main.cpp
23
src/main.cpp
|
@ -19,6 +19,8 @@
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include "libremediaserver.h"
|
#include "libremediaserver.h"
|
||||||
|
|
||||||
|
#define VERSION "0.03-1";
|
||||||
|
|
||||||
// Handler for pipe the stderr to a log file
|
// Handler for pipe the stderr to a log file
|
||||||
|
|
||||||
bool initMessageHandler = 0;
|
bool initMessageHandler = 0;
|
||||||
|
@ -73,8 +75,27 @@ void MessageHandler(QtMsgType type, const char *msg)
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
QApplication app(argc, argv);
|
QApplication app(argc, argv);
|
||||||
|
QStringList args = app.arguments();
|
||||||
|
if (args.size() > 1)
|
||||||
|
{
|
||||||
|
if (args.contains("-v") > 0)
|
||||||
|
{
|
||||||
|
qDebug() << "LibreMediaServer Version" << VERSION;
|
||||||
|
app.exit();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (args.contains("-h") > 0)
|
||||||
|
{
|
||||||
|
qDebug() << "LibreMediaServer Version" << VERSION;
|
||||||
|
qDebug() << "Help";
|
||||||
|
qDebug() << "-v Show the version and exits";
|
||||||
|
qDebug() << "-gui show the Pure Data GUI's.";
|
||||||
|
app.exit();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
qInstallMsgHandler(MessageHandler);
|
qInstallMsgHandler(MessageHandler);
|
||||||
libreMediaServer libreMediaServer;
|
libreMediaServer libreMediaServer(args);
|
||||||
libreMediaServer.show();
|
libreMediaServer.show();
|
||||||
return app.exec();
|
return app.exec();
|
||||||
}
|
}
|
||||||
|
|
22
todo.txt
22
todo.txt
|
@ -21,11 +21,11 @@ You should have received a copy of the GNU General Public License along with thi
|
||||||
v 0.03:
|
v 0.03:
|
||||||
+ Pure Data: Carpetas para imágenes
|
+ Pure Data: Carpetas para imágenes
|
||||||
+ Text: Diferentes ficheros de texto
|
+ Text: Diferentes ficheros de texto
|
||||||
|
+ GUI: Configuración para anular los previews y salvar tiempo de proceso
|
||||||
|
|
||||||
Próximas versiones:
|
Próximas versiones:
|
||||||
|
|
||||||
- Pure Data Video: Modularidad, sumar ventanas por instancias de PMS-video.
|
- Pure Data Video: Modularidad, sumar ventanas por instancias de LMS.
|
||||||
--> NO SE PUEDE POR USAR LOS MISMOS PUERTOS.
|
--> NO SE PUEDE POR USAR LOS MISMOS PUERTOS.
|
||||||
--> Opción de arranque?
|
--> Opción de arranque?
|
||||||
--> Blending entre proyectores.Mirar ejemplo Gem multiprojection.
|
--> Blending entre proyectores.Mirar ejemplo Gem multiprojection.
|
||||||
|
@ -33,7 +33,6 @@ Próximas versiones:
|
||||||
- Pure Data Video: Cambiar alpha por glgs.
|
- Pure Data Video: Cambiar alpha por glgs.
|
||||||
--> Mirar ejemplos en doc de Gem.
|
--> Mirar ejemplos en doc de Gem.
|
||||||
--> Mirar requerimientos de tarjetas gráficas
|
--> Mirar requerimientos de tarjetas gráficas
|
||||||
- GUI: Configuración para anular los previews y salvar tiempo de proceso
|
|
||||||
- Conectividad: CITP/MSEx 1.1. Thumbs y previews de imágenes
|
- Conectividad: CITP/MSEx 1.1. Thumbs y previews de imágenes
|
||||||
--> Esperar a 1.2 en MagicQ?
|
--> Esperar a 1.2 en MagicQ?
|
||||||
- Pure Data: sincronismo de audio con videos
|
- Pure Data: sincronismo de audio con videos
|
||||||
|
@ -42,7 +41,6 @@ Próximas versiones:
|
||||||
--> La opción de pdp2gem parece la más factible. Gem no soporta en absoluto el audio, habría que crear un backend para manejarlo y es una movida. ¿Hacerlo sólo en una capa?
|
--> La opción de pdp2gem parece la más factible. Gem no soporta en absoluto el audio, habría que crear un backend para manejarlo y es una movida. ¿Hacerlo sólo en una capa?
|
||||||
--> hay que adaptar todo el patch a pdp_player e incluir los externals de pdp y pdp2gem. Adaptar sólo el método auto en esta capa, sin la velocidad ni los modos
|
--> hay que adaptar todo el patch a pdp_player e incluir los externals de pdp y pdp2gem. Adaptar sólo el método auto en esta capa, sin la velocidad ni los modos
|
||||||
- Documentación en inglés
|
- Documentación en inglés
|
||||||
- Medidor de CPU en el GUI
|
|
||||||
- Incluir archivos en el ejecutable como recursos Qt
|
- Incluir archivos en el ejecutable como recursos Qt
|
||||||
--> Podrá leer Pure Data los .pd_linux?
|
--> Podrá leer Pure Data los .pd_linux?
|
||||||
--> Los externals empiezan a pesar demasiado y sería un ejecutable demasiado grande: Incluir sólo los patches.
|
--> Los externals empiezan a pesar demasiado y sería un ejecutable demasiado grande: Incluir sólo los patches.
|
||||||
|
@ -66,15 +64,23 @@ Próximas versiones:
|
||||||
|
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
Para considerar:
|
Para considerar/investigar:
|
||||||
|
|
||||||
- Necesidad de 16 bits en size, rotation, entry-end points, puntos de bezier?
|
- Necesidad de 16 bits en size, rotation, entry-end points, puntos de bezier?
|
||||||
- Más puntos de Bezier?
|
- Más puntos de Bezier?
|
||||||
- Hacer external con reproductor de pix_film --> Merece la pena codificarlo en C una vez hecho en PD? Ahorrará consumo de CPU?
|
- Hacer external con reproductor de pix_film
|
||||||
- GUI: PD Watchdog reinicia --> Puede que sea mejor que se reproduzca más lento a forzar un reinicio?
|
--> Merece la pena codificarlo en C una vez hecho en PD? Ahorrará consumo de CPU?
|
||||||
|
- GUI: PD Watchdog reinicia
|
||||||
|
--> Puede que sea mejor que se reproduzca más lento a forzar un reinicio?
|
||||||
|
--> Ahora estoy trabajando sin watchdog y no noto la diferencia.
|
||||||
|
- Medidor de CPU en el GUI
|
||||||
|
--> Mejor usar cualquier tipo de medidor externo. Lo ideal sería mostrar los fps a los que está trabajando Gem, pero no parece posible en este momento.
|
||||||
|
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
Descartados:
|
Descartados:
|
||||||
|
|
||||||
- Separar textos en otra personalidad --> No posible, al iniciar un nuevo proceso inicia una nueva ventana- Malo para textos, bueno para varios proyectores y blending!. Investigar soft edge.
|
- Separar textos en otra personalidad
|
||||||
|
--> No posible, al iniciar un nuevo proceso inicia una nueva ventana- Malo para textos, bueno para varios proyectores y blending
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue