1 |
// qsamplerMainForm.cpp |
// qsamplerMainForm.cpp |
2 |
// |
// |
3 |
/**************************************************************************** |
/**************************************************************************** |
4 |
Copyright (C) 2004-2017, rncbc aka Rui Nuno Capela. All rights reserved. |
Copyright (C) 2004-2018, rncbc aka Rui Nuno Capela. All rights reserved. |
5 |
Copyright (C) 2007,2008,2015 Christian Schoenebeck |
Copyright (C) 2007,2008,2015 Christian Schoenebeck |
6 |
|
|
7 |
This program is free software; you can redistribute it and/or |
This program is free software; you can redistribute it and/or |
866 |
// Enforce .lscp extension... |
// Enforce .lscp extension... |
867 |
if (QFileInfo(sFilename).suffix().isEmpty()) |
if (QFileInfo(sFilename).suffix().isEmpty()) |
868 |
sFilename += ".lscp"; |
sFilename += ".lscp"; |
869 |
|
#if 0 |
870 |
// Check if already exists... |
// Check if already exists... |
871 |
if (sFilename != m_sFilename && QFileInfo(sFilename).exists()) { |
if (sFilename != m_sFilename && QFileInfo(sFilename).exists()) { |
872 |
if (QMessageBox::warning(this, |
if (QMessageBox::warning(this, |
879 |
== QMessageBox::No) |
== QMessageBox::No) |
880 |
return false; |
return false; |
881 |
} |
} |
882 |
|
#endif |
883 |
} |
} |
884 |
|
|
885 |
// Save it right away. |
// Save it right away. |
1062 |
// It is assumed that this new kind of device+session file |
// It is assumed that this new kind of device+session file |
1063 |
// will be loaded from a complete initialized server... |
// will be loaded from a complete initialized server... |
1064 |
int *piDeviceIDs; |
int *piDeviceIDs; |
1065 |
int iDevice; |
int i, iDevice; |
1066 |
ts << "RESET" << endl; |
ts << "RESET" << endl; |
1067 |
|
|
1068 |
// Audio device mapping. |
// Audio device mapping. |
1069 |
QMap<int, int> audioDeviceMap; |
QMap<int, int> audioDeviceMap; iDevice = 0; |
1070 |
piDeviceIDs = Device::getDevices(m_pClient, Device::Audio); |
piDeviceIDs = Device::getDevices(m_pClient, Device::Audio); |
1071 |
for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) { |
for (i = 0; piDeviceIDs && piDeviceIDs[i] >= 0; ++i) { |
1072 |
ts << endl; |
Device device(Device::Audio, piDeviceIDs[i]); |
1073 |
Device device(Device::Audio, piDeviceIDs[iDevice]); |
// Avoid plug-in driver devices... |
1074 |
|
if (device.driverName().toUpper() == "PLUGIN") |
1075 |
|
continue; |
1076 |
// Audio device specification... |
// Audio device specification... |
1077 |
|
ts << endl; |
1078 |
ts << "# " << device.deviceTypeName() << " " << device.driverName() |
ts << "# " << device.deviceTypeName() << " " << device.driverName() |
1079 |
<< " " << tr("Device") << " " << iDevice << endl; |
<< " " << tr("Device") << " " << iDevice << endl; |
1080 |
ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName(); |
ts << "CREATE AUDIO_OUTPUT_DEVICE " << device.driverName(); |
1105 |
iPort++; |
iPort++; |
1106 |
} |
} |
1107 |
// Audio device index/id mapping. |
// Audio device index/id mapping. |
1108 |
audioDeviceMap[device.deviceID()] = iDevice; |
audioDeviceMap.insert(device.deviceID(), iDevice++); |
1109 |
// Try to keep it snappy :) |
// Try to keep it snappy :) |
1110 |
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); |
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); |
1111 |
} |
} |
1112 |
|
|
1113 |
// MIDI device mapping. |
// MIDI device mapping. |
1114 |
QMap<int, int> midiDeviceMap; |
QMap<int, int> midiDeviceMap; iDevice = 0; |
1115 |
piDeviceIDs = Device::getDevices(m_pClient, Device::Midi); |
piDeviceIDs = Device::getDevices(m_pClient, Device::Midi); |
1116 |
for (iDevice = 0; piDeviceIDs && piDeviceIDs[iDevice] >= 0; iDevice++) { |
for (i = 0; piDeviceIDs && piDeviceIDs[i] >= 0; ++i) { |
1117 |
ts << endl; |
Device device(Device::Midi, piDeviceIDs[i]); |
1118 |
Device device(Device::Midi, piDeviceIDs[iDevice]); |
// Avoid plug-in driver devices... |
1119 |
|
if (device.driverName().toUpper() == "PLUGIN") |
1120 |
|
continue; |
1121 |
// MIDI device specification... |
// MIDI device specification... |
1122 |
|
ts << endl; |
1123 |
ts << "# " << device.deviceTypeName() << " " << device.driverName() |
ts << "# " << device.deviceTypeName() << " " << device.driverName() |
1124 |
<< " " << tr("Device") << " " << iDevice << endl; |
<< " " << tr("Device") << " " << iDevice << endl; |
1125 |
ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName(); |
ts << "CREATE MIDI_INPUT_DEVICE " << device.driverName(); |
1150 |
iPort++; |
iPort++; |
1151 |
} |
} |
1152 |
// MIDI device index/id mapping. |
// MIDI device index/id mapping. |
1153 |
midiDeviceMap[device.deviceID()] = iDevice; |
midiDeviceMap.insert(device.deviceID(), iDevice++); |
1154 |
// Try to keep it snappy :) |
// Try to keep it snappy :) |
1155 |
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); |
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); |
1156 |
} |
} |
1218 |
iErrors++; |
iErrors++; |
1219 |
} |
} |
1220 |
// MIDI strument index/id mapping. |
// MIDI strument index/id mapping. |
1221 |
midiInstrumentMap[iMidiMap] = iMap; |
midiInstrumentMap.insert(iMidiMap, iMap); |
1222 |
} |
} |
1223 |
// Check for errors... |
// Check for errors... |
1224 |
if (piMaps == NULL && ::lscp_client_get_errno(m_pClient)) { |
if (piMaps == NULL && ::lscp_client_get_errno(m_pClient)) { |
1227 |
} |
} |
1228 |
#endif // CONFIG_MIDI_INSTRUMENT |
#endif // CONFIG_MIDI_INSTRUMENT |
1229 |
|
|
1230 |
// Sampler channel mapping. |
// Sampler channel mapping... |
1231 |
|
int iChannelID = 0; |
1232 |
const QList<QMdiSubWindow *>& wlist |
const QList<QMdiSubWindow *>& wlist |
1233 |
= m_pWorkspace->subWindowList(); |
= m_pWorkspace->subWindowList(); |
1234 |
const int iStripCount = wlist.count(); |
const int iStripCount = wlist.count(); |
1240 |
if (pChannelStrip) { |
if (pChannelStrip) { |
1241 |
Channel *pChannel = pChannelStrip->channel(); |
Channel *pChannel = pChannelStrip->channel(); |
1242 |
if (pChannel) { |
if (pChannel) { |
1243 |
const int iChannelID = pChannel->channelID(); |
// Avoid "artifial" plug-in devices... |
1244 |
|
const int iAudioDevice = pChannel->audioDevice(); |
1245 |
|
if (!audioDeviceMap.contains(iAudioDevice)) |
1246 |
|
continue; |
1247 |
|
const int iMidiDevice = pChannel->midiDevice(); |
1248 |
|
if (!midiDeviceMap.contains(iMidiDevice)) |
1249 |
|
continue; |
1250 |
|
// Go for regular, canonical devices... |
1251 |
ts << "# " << tr("Channel") << " " << iChannelID << endl; |
ts << "# " << tr("Channel") << " " << iChannelID << endl; |
1252 |
ts << "ADD CHANNEL" << endl; |
ts << "ADD CHANNEL" << endl; |
1253 |
if (audioDeviceMap.isEmpty()) { |
if (audioDeviceMap.isEmpty()) { |
1255 |
<< " " << pChannel->audioDriver() << endl; |
<< " " << pChannel->audioDriver() << endl; |
1256 |
} else { |
} else { |
1257 |
ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannelID |
ts << "SET CHANNEL AUDIO_OUTPUT_DEVICE " << iChannelID |
1258 |
<< " " << audioDeviceMap[pChannel->audioDevice()] << endl; |
<< " " << audioDeviceMap.value(iAudioDevice) << endl; |
1259 |
} |
} |
1260 |
if (midiDeviceMap.isEmpty()) { |
if (midiDeviceMap.isEmpty()) { |
1261 |
ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannelID |
ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannelID |
1262 |
<< " " << pChannel->midiDriver() << endl; |
<< " " << pChannel->midiDriver() << endl; |
1263 |
} else { |
} else { |
1264 |
ts << "SET CHANNEL MIDI_INPUT_DEVICE " << iChannelID |
ts << "SET CHANNEL MIDI_INPUT_DEVICE " << iChannelID |
1265 |
<< " " << midiDeviceMap[pChannel->midiDevice()] << endl; |
<< " " << midiDeviceMap.value(iMidiDevice) << endl; |
1266 |
} |
} |
1267 |
ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannelID |
ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannelID |
1268 |
<< " " << pChannel->midiPort() << endl; |
<< " " << pChannel->midiPort() << endl; |
1293 |
if (pChannel->channelSolo()) |
if (pChannel->channelSolo()) |
1294 |
ts << "SET CHANNEL SOLO " << iChannelID << " 1" << endl; |
ts << "SET CHANNEL SOLO " << iChannelID << " 1" << endl; |
1295 |
#ifdef CONFIG_MIDI_INSTRUMENT |
#ifdef CONFIG_MIDI_INSTRUMENT |
1296 |
if (pChannel->midiMap() >= 0) { |
const int iMidiMap = pChannel->midiMap(); |
1297 |
|
if (midiInstrumentMap.contains(iMidiMap)) { |
1298 |
ts << "SET CHANNEL MIDI_INSTRUMENT_MAP " << iChannelID |
ts << "SET CHANNEL MIDI_INSTRUMENT_MAP " << iChannelID |
1299 |
<< " " << midiInstrumentMap[pChannel->midiMap()] << endl; |
<< " " << midiInstrumentMap.value(iMidiMap) << endl; |
1300 |
} |
} |
1301 |
#endif |
#endif |
1302 |
#ifdef CONFIG_FXSEND |
#ifdef CONFIG_FXSEND |
1335 |
} |
} |
1336 |
#endif |
#endif |
1337 |
ts << endl; |
ts << endl; |
1338 |
|
// Go for next channel... |
1339 |
|
++iChannelID; |
1340 |
} |
} |
1341 |
} |
} |
1342 |
// Try to keep it snappy :) |
// Try to keep it snappy :) |