nuevos modos de reproducción: Play Folder, Play Folder Loop, Play Folder

Random.
This commit is contained in:
snt 2024-05-09 14:07:24 +02:00
parent cd0105c9f9
commit f67ad9b1e1
7 changed files with 83 additions and 4 deletions

View file

@ -51,5 +51,4 @@ v 0.2.1
- Tests: errors on wrong conf file. - Tests: errors on wrong conf file.
v0.2.0: v0.2.0:
- BUGFIX: crash at startup and no dmx signal.
- Vumeter or indicator about audio output in layer and master, add to sliderGroup. - Vumeter or indicator about audio output in layer and master, add to sliderGroup.

View file

@ -22,7 +22,10 @@ enum Status
Paused, Paused,
PlayingOnce, PlayingOnce,
PlayingLoop, PlayingLoop,
Iddle Iddle,
PlayingFolder,
PlayingFolderLoop,
PlayingFolderRandom
}; };
static const char* StatusStr[] = static const char* StatusStr[] =
@ -30,8 +33,11 @@ static const char* StatusStr[] =
"Stop", "Stop",
"Pause", "Pause",
"Playing One", "Playing One",
"Playing Loop", "Playing One Loop",
"Iddle", "Iddle",
"Playing Folder",
"Playing Folder Loop",
"Playing Folder Random",
0x0 0x0
}; };
@ -52,5 +58,8 @@ struct layerData {
int pan; int pan;
int pitch; int pitch;
float duration; float duration;
int address;
unsigned int universe;
int device;
}; };
#endif // DEFINES_H #endif // DEFINES_H

View file

@ -70,6 +70,14 @@ void libreMediaServerAudio::loadMedia(int layer, int folder, int file)
#endif #endif
m_mae.printFormatInfo(layer); m_mae.printFormatInfo(layer);
} }
if (m_currentStatus[layer] == Status::PlayingFolder \
|| (m_currentStatus[layer] == Status::PlayingFolderLoop)\
|| (m_currentStatus[layer] == Status::PlayingFolderRandom)) {
m_played.append(file);
} else if (m_currentStatus[layer] == Status::PlayingOnce \
|| m_currentStatus[layer] == Status::PlayingLoop) {
m_played.clear();
}
} }
void libreMediaServerAudio::dmxInput(int layer, int channel, int value) void libreMediaServerAudio::dmxInput(int layer, int channel, int value)
@ -102,6 +110,12 @@ void libreMediaServerAudio::dmxInput(int layer, int channel, int value)
s = Status::Paused; s = Status::Paused;
else if (aux == 3) else if (aux == 3)
s = Status::PlayingLoop; s = Status::PlayingLoop;
else if (aux == 4)
s = Status::PlayingFolder;
else if (aux == 5)
s = Status::PlayingFolderLoop;
else if (aux == 6)
s = Status::PlayingFolderRandom;
m_mae.playbackChanged(layer, s); m_mae.playbackChanged(layer, s);
m_currentStatus[layer] = s; m_currentStatus[layer] = s;
qInfo() << "Layer" << layer << StatusStr[s]; qInfo() << "Layer" << layer << StatusStr[s];
@ -131,10 +145,58 @@ void libreMediaServerAudio::refreshUi() {
} }
if (m_updateUi[i][3] >= 0 \ if (m_updateUi[i][3] >= 0 \
|| m_currentStatus[i] == Status::PlayingOnce\ || m_currentStatus[i] == Status::PlayingOnce\
|| m_currentStatus[i] == Status::PlayingLoop) { || m_currentStatus[i] == Status::PlayingLoop\
|| m_currentStatus[i] == Status::PlayingFolder\
|| m_currentStatus[i] == Status::PlayingFolderLoop
|| m_currentStatus[i] == Status::PlayingFolderRandom) {
m_lmsUi->m_aw->cursorChanged(i, m_mae.getCursor(i)); m_lmsUi->m_aw->cursorChanged(i, m_mae.getCursor(i));
m_updateUi[i][3] = -1; m_updateUi[i][3] = -1;
} }
if (m_mae.getAtEnd(i)) {
if (m_played.isEmpty())
m_played.append(m_ola->getValue(i, DMX_FILE));
if (m_currentStatus[i] == Status::PlayingOnce) {
m_currentStatus[i] = Status::Stopped;
}
if (m_currentStatus[i] == Status::PlayingFolder) {
uint last = m_played.last();
int folder = m_ola->getValue(i, DMX_FOLDER);
last++;
if (last < m_mediaLibrary->getMediaFolderCount(folder)) {
this->loadMedia(i, folder, last);
m_mae.playbackChanged(i, Status::PlayingFolder);
}
else {
m_currentStatus[i] = Status::Stopped;
m_lmsUi->m_aw->playbackChanged(i, Status::Stopped);
}
}
if (m_currentStatus[i] == Status::PlayingFolderLoop) {
uint last = m_played.last();
int folder = m_ola->getValue(i, DMX_FOLDER);
last++;
if (last >= m_mediaLibrary->getMediaFolderCount(folder)) {
this->loadMedia(i, folder, 0);
m_mae.playbackChanged(i, Status::PlayingFolderLoop);
} else {
this->loadMedia(i, folder, last);
m_mae.playbackChanged(i, Status::PlayingFolder);
}
}
if (m_currentStatus[i] == Status::PlayingFolderRandom) {
int last = -1;
int folder = m_ola->getValue(i, DMX_FOLDER);
if (uint(abs(m_played.size())) >= m_mediaLibrary->getMediaFolderCount(folder))
m_played.clear();
while (last == -1) {
last = rand() % m_mediaLibrary->getMediaFolderCount(folder);
if (m_played.contains(last))
last = -1;
}
this->loadMedia(i, folder, last);
m_mae.playbackChanged(i, Status::PlayingFolderRandom);
}
}
} }
} }

View file

@ -52,6 +52,7 @@ private:
Status m_currentStatus[MAX_LAYERS]; Status m_currentStatus[MAX_LAYERS];
QList<dmxSetting> m_dmxSettings; QList<dmxSetting> m_dmxSettings;
bool m_ui; bool m_ui;
QList<int> m_played;
#ifndef NOGUI #ifndef NOGUI
QTimer *m_refreshUi; QTimer *m_refreshUi;
libreMediaServerAudioUi *m_lmsUi; libreMediaServerAudioUi *m_lmsUi;

View file

@ -29,6 +29,9 @@ public:
MediaLibrary(QObject *parent = 0); MediaLibrary(QObject *parent = 0);
QString requestNewFile(int folder, int layer); QString requestNewFile(int folder, int layer);
void initMediaLibrary(); void initMediaLibrary();
inline uint getMediaFolderCount(int folder) {
return m_media->at(folder).m_ElementCount;
}
private: private:
QList<MediaFolder> *m_media; QList<MediaFolder> *m_media;

View file

@ -247,6 +247,9 @@ ma_result MiniAudioEngine::playbackChanged(int layer, Status status)
result = ma_sound_start(&m_currentSound[layer]); result = ma_sound_start(&m_currentSound[layer]);
break; break;
case Status::PlayingOnce: case Status::PlayingOnce:
case Status::PlayingFolder:
case Status::PlayingFolderLoop:
case Status::PlayingFolderRandom:
ma_sound_set_stop_time_in_milliseconds(&m_currentSound[layer], ~(ma_uint64)0); ma_sound_set_stop_time_in_milliseconds(&m_currentSound[layer], ~(ma_uint64)0);
ma_sound_set_looping(&m_currentSound[layer], false); ma_sound_set_looping(&m_currentSound[layer], false);
result = ma_sound_start(&m_currentSound[layer]); result = ma_sound_start(&m_currentSound[layer]);

View file

@ -5,6 +5,7 @@
#include "miniaudio.h" #include "miniaudio.h"
#include "defines.h" // MAX_LAYERS #include "defines.h" // MAX_LAYERS
#include <QDebug> // prints messages #include <QDebug> // prints messages
#define MA_DEBUG_OUTPUT
class MiniAudioEngine class MiniAudioEngine
{ {
@ -29,6 +30,7 @@ protected:
Status getStatus(int layer); Status getStatus(int layer);
inline float getVol(int layer) { inline float getVol(int layer) {
return ma_sound_get_volume(&m_currentSound[layer]); } return ma_sound_get_volume(&m_currentSound[layer]); }
inline bool getAtEnd(int layer) { return m_currentSound[layer].atEnd; }
private: private:
ma_resource_manager_config resourceManagerConfig; ma_resource_manager_config resourceManagerConfig;