diff --git a/docs/lms-audio.xlm b/docs/lms-audio.xlm
index 4274267..b2ea7ed 100644
--- a/docs/lms-audio.xlm
+++ b/docs/lms-audio.xlm
@@ -1,8 +1,8 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/src/defines.h b/src/defines.h
index 2355059..a885485 100644
--- a/src/defines.h
+++ b/src/defines.h
@@ -14,6 +14,7 @@ struct dmxSetting {
int address;
unsigned int universe;
int layer;
+ int audioDevice;
};
enum Status
diff --git a/src/libremediaserver-audio.cpp b/src/libremediaserver-audio.cpp
index 8f16ebc..10cef51 100644
--- a/src/libremediaserver-audio.cpp
+++ b/src/libremediaserver-audio.cpp
@@ -26,6 +26,7 @@ libreMediaServerAudio::libreMediaServerAudio()
m_settings = Settings::getInstance();
m_settings->readFile();
m_ui = m_settings->getShowUi();
+ m_dmxSettings = m_settings->getDmxSettings();
m_mediaLibrary = new MediaLibrary;
m_mediaLibrary->initMediaLibrary();
for (int i = 0; i < MAX_LAYERS; i++) {
@@ -42,7 +43,10 @@ libreMediaServerAudio::libreMediaServerAudio()
Q_CHECK_PTR(m_ola);
m_ola->blockSignals(true);
m_ola->registerUniverse();
- m_mae.startEngine(m_settings->getAudioDeviceId());
+ m_mae.startEngine();
+ uint *audioDevList = m_settings->getAudioDeviceId();
+ for (uint i = 0; i < m_settings->getAudioDeviceQty(); i++)
+ m_mae.startDevice(audioDevList[i], i);
qDebug("Core init Complete. Start reading DMX.");
m_ola->blockSignals(false);
#ifdef NOGUI
@@ -62,7 +66,7 @@ void libreMediaServerAudio::loadMedia(int layer, int folder, int file)
if (strcmp(mediaFile.toLatin1().constData(), m_currentMedia[layer].toLatin1().constData()) == 0)
return;
if (QFile::exists(mediaFile)){
- m_mae.loadMedia(layer, mediaFile.toLatin1().data());
+ m_mae.loadMedia(layer, mediaFile.toLatin1().data(), m_dmxSettings.at(layer).audioDevice);
m_currentMedia[layer] = mediaFile;
#ifndef NOGUI
if (m_ui)
@@ -247,7 +251,7 @@ void libreMediaServerAudio::uiLoadMedia(int layer, QString mediaFile)
if (strcmp(mediaFile.toLatin1().constData(), m_currentMedia[layer].toLatin1().constData()) == 0)
return;
- result = m_mae.loadMedia(layer, mediaFile.toLatin1().data());
+ result = m_mae.loadMedia(layer, mediaFile.toLatin1().data(), m_dmxSettings[layer].audioDevice);
if (result == MA_SUCCESS) {
m_currentMedia[layer] = mediaFile;
m_lmsUi->m_aw->mediaLoaded(layer, mediaFile, m_mae.getDuration(layer));
diff --git a/src/miniaudioengine.cpp b/src/miniaudioengine.cpp
index 264871b..6051105 100644
--- a/src/miniaudioengine.cpp
+++ b/src/miniaudioengine.cpp
@@ -21,60 +21,57 @@ void MiniAudioEngine::audioDataCallback(ma_device* pDevice, void* pOutput, const
void MiniAudioEngine::stopEngine()
{
- ma_engine_uninit(&engine);
- ma_device_uninit(&device);
+ ma_engine_uninit(&engine[0]);
+ ma_device_uninit(&device[0]);
ma_context_uninit(&context);
ma_resource_manager_uninit(&resourceManager);
}
-bool MiniAudioEngine::startEngine(uint n)
+bool MiniAudioEngine::startEngine()
{
ma_result result;
result = this->startContext();
if (result != MA_SUCCESS) return result;
result = this->getAllAudioDevices();
- if (result != MA_SUCCESS) return result;
- result = this->startDevice(n);
return result;
}
-ma_result MiniAudioEngine::startDevice(uint id)
+ma_result MiniAudioEngine::startDevice(uint systemId, uint internalId)
{
ma_result result;
ma_device_config deviceConfig;
ma_engine_config engineConfig;
- if (id >= playbackDeviceCount)
- id = playbackDeviceCount - 1;
+ if (systemId >= playbackDeviceCount)
+ systemId = playbackDeviceCount - 1;
deviceConfig = ma_device_config_init(ma_device_type_playback);
- deviceConfig.playback.pDeviceID = &pPlaybackDeviceInfos[id].id;
+ deviceConfig.playback.pDeviceID = &pPlaybackDeviceInfos[systemId].id;
deviceConfig.playback.format = resourceManager.config.decodedFormat;
deviceConfig.playback.channels = 0;
deviceConfig.sampleRate = resourceManager.config.decodedSampleRate;
deviceConfig.dataCallback = audioDataCallback;
- deviceConfig.pUserData = &engine;
- result = ma_device_init(&context, &deviceConfig, &device);
+ deviceConfig.pUserData = &engine[internalId];
+ result = ma_device_init(&context, &deviceConfig, &device[internalId]);
if (result != MA_SUCCESS) {
- qCritical("Failed to initialize audio device %s.", pPlaybackDeviceInfos[id].name);
+ qCritical("Failed to initialize audio device %s.", pPlaybackDeviceInfos[systemId].name);
return result;
}
engineConfig = ma_engine_config_init();
- engineConfig.pDevice = &device;
+ engineConfig.pDevice = &device[internalId];
engineConfig.pResourceManager = &resourceManager;
engineConfig.noAutoStart = MA_TRUE;
- result = ma_engine_init(NULL, &engine);
+ result = ma_engine_init(NULL, &engine[internalId]);
if (result != MA_SUCCESS) {
qCritical("Failed to initialize audio engine.");
return result;
}
- result = ma_engine_start(&engine);
+ result = ma_engine_start(&engine[internalId]);
if (result != MA_SUCCESS) {
- qCritical("Failed to start audio engine %i.", id);
+ qCritical("Failed to start audio engine %i.", systemId);
return result;
}
- iChosenDevice = id;
- qInfo("Initialized audio device %d : %s", id, pPlaybackDeviceInfos[id].name);
+ qInfo("Initialized audio device internal: %ui system: %d %s", internalId, systemId, pPlaybackDeviceInfos[systemId].name);
return result;
}
@@ -117,7 +114,7 @@ ma_result MiniAudioEngine::getAllAudioDevices()
return result;
}
-ma_result MiniAudioEngine::loadMedia(int layer, char *file)
+ma_result MiniAudioEngine::loadMedia(int layer, char *file, uint audioDevice)
{
ma_result result;
@@ -126,7 +123,7 @@ ma_result MiniAudioEngine::loadMedia(int layer, char *file)
ma_sound_uninit(&m_currentSound[layer]);
m_mediaLoaded[layer] = false;
}
- result = ma_sound_init_from_file(&engine, file, \
+ result = ma_sound_init_from_file(&engine[audioDevice], file, \
MA_SOUND_FLAG_NO_SPATIALIZATION \
| MA_SOUND_FLAG_DECODE \
| MA_SOUND_FLAG_STREAM \
diff --git a/src/miniaudioengine.h b/src/miniaudioengine.h
index 103126e..b91d718 100644
--- a/src/miniaudioengine.h
+++ b/src/miniaudioengine.h
@@ -18,11 +18,12 @@ class MiniAudioEngine
public:
MiniAudioEngine();
void stopEngine();
- bool startEngine(uint id);
+ bool startEngine();
+ ma_result startDevice(uint id, uint internalId);
static void audioDataCallback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount);
protected:
- ma_result loadMedia(int layer, char *media );
+ ma_result loadMedia(int layer, char *media, uint audioDevice);
void volChanged(int layer, float vol);
void panChanged(int layer, float pan);
void pitchChanged(int layer, float pitch);
@@ -42,15 +43,14 @@ private:
ma_device_info* pPlaybackDeviceInfos;
ma_uint32 playbackDeviceCount;
ma_uint32 iChosenDevice;
- ma_engine engine;
- ma_device device;
+ ma_engine engine[MAX_AUDIODEVICES];
+ ma_device device[MAX_AUDIODEVICES];
ma_context context;
ma_sound m_currentSound[MAX_LAYERS];
ma_bool8 m_mediaLoaded[MAX_LAYERS];
layerData m_currentLayerValues[MAX_LAYERS];
ma_result getAllAudioDevices();
- ma_result startDevice(uint id);
ma_result startContext();
void refreshValues(int layer);
ma_result seekToCursor(int layer, int cursor);
diff --git a/src/settings.cpp b/src/settings.cpp
index 9d06394..6527bcb 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -51,16 +51,14 @@ void Settings::readFromFile(QString file) {
if(xmlReader->name() == "audioDevice") {
m_audioDeviceQty = xmlReader->attributes().value("devicesNumber").toLocal8Bit().toInt();
for (uint i = 0; i < m_audioDeviceQty; i++)
- {
m_audioDeviceId[i] = xmlReader->attributes().value(QString("id%1").arg(i)).toLocal8Bit().toInt();
- }
-
}
if(xmlReader->name() == "layer") {
dmxSetting temp;
temp.address = xmlReader->attributes().value("dmx").toLocal8Bit().toInt() - 1;
temp.universe = xmlReader->attributes().value("universe").toLocal8Bit().toInt();
temp.layer = xmlReader->attributes().value("id").toLocal8Bit().toInt();
+ temp.audioDevice = xmlReader->attributes().value("audioDevice").toLocal8Bit().toInt();
m_settings.append(temp);
if (!m_universe.contains(temp.universe)) {
m_universe.insert(temp.universe);
diff --git a/src/settings.h b/src/settings.h
index f27da6a..6e51d14 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -22,7 +22,8 @@ public:
inline QString getPathMedia() { return m_pathmedia; }
inline QList getDmxSettings() { return m_settings; }
inline int getLayersNumber() { return m_layersNumber; }
- inline int getAudioDeviceId() { return m_audioDeviceId[0]; }
+ inline uint *getAudioDeviceId() { return m_audioDeviceId; }
+ inline uint getAudioDeviceQty() { return m_audioDeviceQty; }
inline bool getShowUi() { return m_ui; }
void readFile();
void readFromFile(QString file);