1
//=========================================================
4
// $Id: confmport.cpp,v 1.2 2002/02/28 09:02:25 muse Exp $
6
// (C) Copyright 2000 Werner Schweer (ws@seh.de)
7
//=========================================================
12
#include <qlistview.h>
14
#include <qpushbutton.h>
15
#include <qlineedit.h>
16
#include <qcombobox.h>
18
#include <qbuttongroup.h>
20
#include <qpopupmenu.h>
21
#include <qgroupbox.h>
22
#include <qradiobutton.h>
24
#include <qcheckbox.h>
25
#include <qsignalmapper.h>
27
#include <qfiledialog.h>
28
#include <qtoolbutton.h>
30
#include "confmport.h"
34
#include "transport.h"
39
#include "driver/mididev.h"
40
#include "driver/midiserial.h"
42
#include "midisyncimpl.h"
43
#include "midifilterimpl.h"
44
#include "ctrlcombo.h"
45
#include "minstrument.h"
47
#include "midithread.h"
49
enum { DEVCOL_NO = 0, DEVCOL_GUI, DEVCOL_REC, DEVCOL_INSTR, DEVCOL_NAME,
52
//---------------------------------------------------------
54
//---------------------------------------------------------
56
static int speed2int(const QString& s)
67
//---------------------------------------------------------
69
//---------------------------------------------------------
71
static int speed2idx(const QString& s)
82
//---------------------------------------------------------
84
//---------------------------------------------------------
86
static QString speed2str(int s)
89
case B9600: return "9600";
90
case B19200: return "19200";
91
case B38400: return "38400";
97
//---------------------------------------------------------
99
//---------------------------------------------------------
101
static int handshaking2int(const QString& s)
112
//---------------------------------------------------------
114
//---------------------------------------------------------
116
static QString handshaking2str(int v)
119
case 0: return "None";
120
case 1: return "RTS/CTS";
121
case 2: return "Xon/Xoff";
126
//---------------------------------------------------------
128
//---------------------------------------------------------
130
static int type2int(const QString& s)
132
if (s == "Raw Device")
134
if (s == "Serial Port")
141
//---------------------------------------------------------
143
//---------------------------------------------------------
145
static QString type2str(int t)
148
case 0: return "Raw Device";
149
case 1: return "Serial Port";
150
case 2: return "Pipe";
155
//---------------------------------------------------------
156
// MidiRawDeviceDialog
157
//---------------------------------------------------------
159
MidiRawDeviceDialog::MidiRawDeviceDialog(QWidget* parent=0, const char* name = 0,
160
bool modal = false, WFlags fl = 0)
161
: MidiRawDeviceDialogBase(parent, name, modal, fl)
163
connect(buttonDeviceNew, SIGNAL(clicked()), SLOT(deviceNew()));
164
connect(buttonDeviceDelete, SIGNAL(clicked()), SLOT(deviceDelete()));
165
connect(buttonDevicePath, SIGNAL(clicked()), SLOT(devicePath()));
166
connect(editName, SIGNAL(textChanged(const QString&)), SLOT(editNameChanged(const QString&)));
167
connect(editPath, SIGNAL(textChanged(const QString&)), SLOT(editPathChanged(const QString&)));
168
connect(virtPorts, SIGNAL(valueChanged(int)), SLOT(virtPortsChanged(int)));
169
connect(speed, SIGNAL(activated(const QString&)), SLOT(speedChanged(const QString&)));
170
connect(handshaking, SIGNAL(activated(const QString&)), SLOT(handshakingChanged(const QString&)));
171
connect(type, SIGNAL(activated(const QString&)), SLOT(typeChanged(const QString&)));
172
connect(listDevices, SIGNAL(selectionChanged(QListViewItem*)),
173
SLOT(devicesSelectionChanged(QListViewItem*)));
174
listDevices->setColumnAlignment(3, AlignHCenter);
177
//---------------------------------------------------------
179
//---------------------------------------------------------
181
void MidiRawDeviceDialog::populate()
185
listDevices->clear();
186
for (iSerialDevice i = serialDevices.begin(); i != serialDevices.end(); ++i) {
187
vp.setNum((*i)->vports());
188
new QListViewItem(listDevices,
191
type2str((*i)->type()),
193
speed2str((*i)->speed()),
194
handshaking2str((*i)->handshaking())
197
listDevices->setCurrentItem(listDevices->firstChild());
198
if (listDevices->childCount() == 0) {
199
buttonDeviceDelete->setEnabled(false);
200
editName->setEnabled(false);
201
editPath->setEnabled(false);
202
virtPorts->setEnabled(false);
203
speed->setEnabled(false);
204
handshaking->setEnabled(false);
205
type->setEnabled(false);
209
//---------------------------------------------------------
210
// deviceSelectionChanged
211
//---------------------------------------------------------
213
void MidiRawDeviceDialog::devicesSelectionChanged(QListViewItem* item)
216
editName->setText(item->text(0));
217
editPath->setText(item->text(1));
218
virtPorts->setValue(item->text(3).toInt());
219
speed->setCurrentItem(speed2idx(item->text(4)));
220
handshaking->setCurrentItem(handshaking2int(item->text(5)));
221
type->setCurrentItem(type2int(item->text(2)));
224
editName->setText("");
225
editPath->setText("");
226
virtPorts->setValue(0);
227
speed->setCurrentItem(2);
228
handshaking->setCurrentItem(0);
229
type->setCurrentItem(1);
231
if (item->text(2) == "Serial Port") {
232
speed->setEnabled(true);
233
handshaking->setEnabled(true);
236
speed->setEnabled(false);
237
handshaking->setEnabled(false);
241
//---------------------------------------------------------
243
//---------------------------------------------------------
245
void MidiRawDeviceDialog::editNameChanged(const QString& text)
247
QListViewItem* item = listDevices->currentItem();
250
item->setText(0, text);
253
//---------------------------------------------------------
255
//---------------------------------------------------------
257
void MidiRawDeviceDialog::editPathChanged(const QString& text)
259
QListViewItem* item = listDevices->currentItem();
262
item->setText(1, text);
265
//---------------------------------------------------------
267
//---------------------------------------------------------
269
void MidiRawDeviceDialog::typeChanged(const QString& text)
271
QListViewItem* item = listDevices->currentItem();
274
if (text == "Serial Port") {
275
speed->setEnabled(true);
276
item->setText(4, speed->currentText());
277
handshaking->setEnabled(true);
278
item->setText(5, handshaking->currentText());
281
speed->setEnabled(false);
282
item->setText(4, "---");
283
handshaking->setEnabled(false);
284
item->setText(5, "---");
286
item->setText(2, text);
289
//---------------------------------------------------------
291
//---------------------------------------------------------
293
void MidiRawDeviceDialog::virtPortsChanged(int val)
295
QListViewItem* item = listDevices->currentItem();
303
//---------------------------------------------------------
305
//---------------------------------------------------------
307
void MidiRawDeviceDialog::speedChanged(const QString& text)
309
QListViewItem* item = listDevices->currentItem();
312
item->setText(4, text);
315
//---------------------------------------------------------
316
// handshakingChanged
317
//---------------------------------------------------------
319
void MidiRawDeviceDialog::handshakingChanged(const QString& text)
321
QListViewItem* item = listDevices->currentItem();
324
item->setText(5, text);
327
//---------------------------------------------------------
329
//---------------------------------------------------------
331
void MidiRawDeviceDialog::deviceNew()
333
QListViewItem* item = new QListViewItem(listDevices, "", "", "Serial Port", "1", "38400", "None");
334
listDevices->setCurrentItem(item);
335
editName->setText("");
336
editPath->setText("");
337
virtPorts->setValue(0);
338
speed->setCurrentItem(2);
339
handshaking->setCurrentItem(0);
340
type->setCurrentItem(1);
342
buttonDeviceDelete->setEnabled(true);
343
editName->setEnabled(true);
344
editPath->setEnabled(true);
345
virtPorts->setEnabled(true);
346
speed->setEnabled(true);
347
handshaking->setEnabled(true);
348
type->setEnabled(true);
351
//---------------------------------------------------------
353
//---------------------------------------------------------
355
void MidiRawDeviceDialog::deviceDelete()
357
QListViewItem* item = listDevices->currentItem();
360
if (deleteSerialDevice(item->text(1))) {
361
printf("CANNOT DELETE DEVICE<%s>: device busy\n",
362
item->text(0).latin1());
367
if (listDevices->childCount() == 0) {
368
buttonDeviceDelete->setEnabled(false);
369
editName->setEnabled(false);
370
editPath->setEnabled(false);
371
virtPorts->setEnabled(false);
372
speed->setEnabled(false);
373
handshaking->setEnabled(false);
374
type->setEnabled(false);
378
//---------------------------------------------------------
380
//---------------------------------------------------------
382
void MidiRawDeviceDialog::accept()
384
QListViewItem* item = listDevices->firstChild();
388
for (i = serialDevices.begin(); i != serialDevices.end(); ++i) {
389
if ((*i)->path() == item->text(1)) {
393
if (i != serialDevices.end()) {
394
(*i)->setName(item->text(0));
395
(*i)->setType(SerialType(type2int(item->text(2))));
396
(*i)->setVports(item->text(3).toInt());
397
(*i)->setSpeed(speed2int(item->text(4)));
398
(*i)->setHandshaking(handshaking2int(item->text(5)));
401
SerialDevice* port = new SerialDevice;
402
port->setName(item->text(0));
403
port->setPath(item->text(1));
404
port->setType(SerialType(type2int(item->text(2))));
405
port->setVports(item->text(3).toInt());
406
port->setSpeed(speed2int(item->text(4)));
407
port->setHandshaking(handshaking2int(item->text(5)));
408
serialDevices.push_back(port);
409
for (int i = 0; i < port->vports(); ++i) {
410
QString name = port->name();
411
if (port->vports() > 1) {
416
MidiSerialDevice* dev = new MidiSerialDevice(port, i, name);
417
dev->setrwFlags(0x3);
418
midiDevices.add(dev);
421
item = item->nextSibling();
426
//---------------------------------------------------------
428
//---------------------------------------------------------
430
void MidiRawDeviceDialog::devicePath()
433
if (editName->text().isEmpty())
436
s = editName->text();
437
s = QFileDialog::getOpenFileName(s, 0, this, "midiRawDevicePathDialog");
439
editName->setText(s);
442
//---------------------------------------------------------
444
//---------------------------------------------------------
446
void MPConfig::rbClicked(QListViewItem* item, const QPoint&, int col)
450
QString id = item->text(DEVCOL_NO);
451
int no = atoi(id.latin1()) - 1;
452
if (no < 0 || no >= MIDI_PORTS)
456
MidiPort* port = &midiPorts[no];
457
int flags = port->rwFlags();
458
MidiDevice* dev = port->device();
459
QListView* listView = item->listView();
460
QPoint ppt = listView->itemRect(item).bottomLeft();
461
ppt += QPoint(listView->header()->sectionPos(col), listView->header()->height());
462
ppt = listView->mapToGlobal(ppt);
468
if (port->hasGui()) {
469
port->showGui(!port->guiVisible());
470
item->setPixmap(DEVCOL_GUI, port->guiVisible() ? *dotIcon : *dothIcon);
478
port->setrwFlags(flags);
479
item->setPixmap(DEVCOL_REC, (port->rwFlags() & 0x2) ? *dotIcon : QPixmap());
480
midiThread->setMidiDevice(port, dev);
485
popup = new QPopupMenu(this);
487
popup->insertItem(tr("none"), 0);
489
for (iMidiDevice i = midiDevices.begin(); i != midiDevices.end(); ++i) {
490
const QString s = (*i)->name();
491
popup->insertItem(s, id);
492
for (int k = 0; k < MIDI_PORTS; ++k) {
493
MidiDevice* dev = midiPorts[k].device();
494
if (dev && s == dev->name()) {
495
popup->setItemEnabled(id, false);
501
popup->insertItem(tr("other raw ..."), 999);
502
n = popup->exec(ppt, 0);
506
//-------------------------------------------
508
//-------------------------------------------
510
rdDialog = new MidiRawDeviceDialog();
512
rdDialog->populate();
516
QString s = popup->text(n);
517
item->setText(DEVCOL_NAME, s);
519
MidiDevice* dev = midiDevices.find(s);
521
port->setrwFlags(dev->rwFlags());
522
item->setPixmap(DEVCOL_REC, (port->rwFlags() & 0x2) ? *dotIcon : QPixmap());
523
item->setText(DEVCOL_STATE, port->state());
525
midiThread->setMidiDevice(port, dev);
527
for (ii = synthiInstances.begin(); ii != synthiInstances.end(); ++ii) {
528
if ((*ii)->iname() == dev->name()) {
529
// midiInstruments.push_back(*ii);
530
port->setInstrument(*ii);
531
(*ii)->setDevice(dev);
532
printf("set Device midi %p\n", dev);
538
midiThread->setMidiDevice(port, 0);
539
item->setPixmap(DEVCOL_REC, QPixmap());
541
item->setText(DEVCOL_STATE, port->state());
549
instrPopup = new QPopupMenu(this);
551
for (iMidiInstrument i = midiInstruments.begin(); i
552
!= midiInstruments.end(); ++i) {
553
instrPopup->insertItem((*i)->iname());
555
n = instrPopup->exec(ppt, 0);
558
QString s = instrPopup->text(n);
559
item->setText(DEVCOL_INSTR, s);
560
for (iMidiInstrument i = midiInstruments.begin(); i
561
!= midiInstruments.end(); ++i) {
562
if ((*i)->iname() == s) {
563
port->setInstrument(*i);
574
//---------------------------------------------------------
576
//---------------------------------------------------------
578
QString MPWhatsThis::text(const QPoint& pos)
580
int n = header->cellAt(pos.x());
583
switch (header->mapToLogical(n)) {
585
return header->tr("Port Number");
587
return header->tr("enable gui for device");
589
return header->tr("enables recording from the device");
591
return header->tr("Name of the midi device associated with"
592
" this port number");
594
return header->tr("Instrument connected to port");
596
return header->tr("State: result of opening the device");
603
//---------------------------------------------------------
606
//---------------------------------------------------------
609
: QWidget(0, "midiPortTable",
610
WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_ContextHelp)
616
setCaption(tr("MusE: Midi Port Table"));
617
QVBoxLayout* box = new QVBoxLayout(this);
618
mdevView = new QListView(this);
619
mdevView->setSorting(-1);
620
mdevView->setAllColumnsShowFocus(true);
621
mdevView->addColumn("Port", 40);
622
mdevView->addColumn("GUI", 40);
623
mdevView->addColumn("Rec", 40);
624
mdevView->addColumn("Instrument", 110);
625
mdevView->addColumn("Device Name", 110);
626
mdevView->addColumn("State");
627
mdevView->setColumnWidthMode(3, QListView::Maximum);
628
mdevView->setColumnAlignment(0, AlignCenter);
629
mdevView->setFocusPolicy(NoFocus);
631
mdevView->setColumnAlignment(DEVCOL_NO, AlignRight);
632
mdevView->setColumnAlignment(DEVCOL_GUI, AlignCenter);
633
mdevView->setColumnAlignment(DEVCOL_REC, AlignCenter);
634
mdevView->header()->setResizeEnabled(false, DEVCOL_NO);
635
mdevView->header()->setResizeEnabled(false, DEVCOL_REC);
636
mdevView->header()->setResizeEnabled(false, DEVCOL_GUI);
637
mdevView->setResizeMode(QListView::LastColumn);
639
new MPWhatsThis(mdevView, mdevView->header());
643
box->addWidget(mdevView, 10);
644
connect(mdevView, SIGNAL(pressed(QListViewItem*,const QPoint&,int)),
645
this, SLOT(rbClicked(QListViewItem*,const QPoint&,int)));
646
connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
649
//---------------------------------------------------------
651
//---------------------------------------------------------
653
void MPConfig::songChanged(int)
656
for (int i = MIDI_PORTS-1; i >= 0; --i) {
657
MidiPort* port = &midiPorts[i];
658
MidiDevice* dev = port->device();
661
QListViewItem* item = new QListViewItem(mdevView);
662
item->setText(DEVCOL_NO, s);
663
item->setText(DEVCOL_STATE, port->state());
664
if (port->instrument())
665
item->setText(DEVCOL_INSTR, port->instrument()->iname());
667
item->setText(DEVCOL_INSTR, "unknown");
669
item->setText(DEVCOL_NAME, dev->name());
670
if (port->rwFlags() & 0x2)
671
item->setPixmap(DEVCOL_REC, *dotIcon);
674
item->setText(DEVCOL_NAME, "none");
675
item->setPixmap(DEVCOL_GUI, *dothIcon);
677
if (port->hasGui()) {
678
item->setPixmap(DEVCOL_GUI, port->guiVisible() ? *dotIcon : *dothIcon);
681
item->setPixmap(DEVCOL_GUI, QPixmap());
683
item->setPixmap(DEVCOL_INSTR, *buttondownIcon);
684
item->setPixmap(DEVCOL_NAME, *buttondownIcon);
685
mdevView->insertItem(item);
689
//---------------------------------------------------------
691
//---------------------------------------------------------
693
void MusE::configMidiPorts()
696
midiPortConfig = new MPConfig();
697
midiPortConfig->show();