Antigona Release #1

Merged
snt merged 49 commits from filters into main 2024-05-26 12:42:53 +00:00
7 changed files with 38 additions and 37 deletions
Showing only changes of commit 8c69da5f9d - Show all commits

View file

@ -1,8 +1,8 @@
<?xml version='1.0' encoding='UTF-8'?>
<lmsAudio ui="1" layersNumber="4" path="../media/sound" >
<audioDevice devicesNumber="2" id0="3" id1="4" />
<layer id="0" dmx="1" universe="1" />
<layer id="1" dmx="17" universe="1" />
<layer id="2" dmx="33" universe="1" />
<layer id="3" dmx="49" universe="1" />
<audioDevice devicesNumber="2" id0="3" id1="4"/>
<layer id="0" dmx="1" universe="1" audioDevice="0" />
<layer id="1" dmx="17" universe="1" audioDevice="0" />
<layer id="2" dmx="33" universe="1" audioDevice="1" />
<layer id="3" dmx="49" universe="1" audioDevice="1"/>
</lmsAudio>

View file

@ -14,6 +14,7 @@ struct dmxSetting {
int address;
unsigned int universe;
int layer;
int audioDevice;
};
enum Status

View file

@ -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));

View file

@ -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 \

View file

@ -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);

View file

@ -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);

View file

@ -22,7 +22,8 @@ public:
inline QString getPathMedia() { return m_pathmedia; }
inline QList<dmxSetting> 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);