diff --git a/docs/roadmap.txt b/docs/roadmap.txt index 94081f4..0771257 100644 --- a/docs/roadmap.txt +++ b/docs/roadmap.txt @@ -51,5 +51,4 @@ v 0.2.1 - Tests: errors on wrong conf file. v0.2.0: -- BUGFIX: crash at startup and no dmx signal. - Vumeter or indicator about audio output in layer and master, add to sliderGroup. diff --git a/src/defines.h b/src/defines.h index a9c92b8..ff299c1 100644 --- a/src/defines.h +++ b/src/defines.h @@ -22,7 +22,10 @@ enum Status Paused, PlayingOnce, PlayingLoop, - Iddle + Iddle, + PlayingFolder, + PlayingFolderLoop, + PlayingFolderRandom }; static const char* StatusStr[] = @@ -30,8 +33,11 @@ static const char* StatusStr[] = "Stop", "Pause", "Playing One", - "Playing Loop", + "Playing One Loop", "Iddle", + "Playing Folder", + "Playing Folder Loop", + "Playing Folder Random", 0x0 }; @@ -52,5 +58,8 @@ struct layerData { int pan; int pitch; float duration; + int address; + unsigned int universe; + int device; }; #endif // DEFINES_H diff --git a/src/libremediaserver-audio.cpp b/src/libremediaserver-audio.cpp index 2ea3266..a9868fd 100644 --- a/src/libremediaserver-audio.cpp +++ b/src/libremediaserver-audio.cpp @@ -70,6 +70,14 @@ void libreMediaServerAudio::loadMedia(int layer, int folder, int file) #endif 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) @@ -102,6 +110,12 @@ void libreMediaServerAudio::dmxInput(int layer, int channel, int value) s = Status::Paused; else if (aux == 3) 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_currentStatus[layer] = s; qInfo() << "Layer" << layer << StatusStr[s]; @@ -131,10 +145,58 @@ void libreMediaServerAudio::refreshUi() { } if (m_updateUi[i][3] >= 0 \ || 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_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); + } + } } } diff --git a/src/libremediaserver-audio.h b/src/libremediaserver-audio.h index 1af37df..d83446a 100644 --- a/src/libremediaserver-audio.h +++ b/src/libremediaserver-audio.h @@ -52,6 +52,7 @@ private: Status m_currentStatus[MAX_LAYERS]; QList m_dmxSettings; bool m_ui; + QList m_played; #ifndef NOGUI QTimer *m_refreshUi; libreMediaServerAudioUi *m_lmsUi; diff --git a/src/medialibrary.h b/src/medialibrary.h index 8c2eb07..ea92bca 100644 --- a/src/medialibrary.h +++ b/src/medialibrary.h @@ -29,6 +29,9 @@ public: MediaLibrary(QObject *parent = 0); QString requestNewFile(int folder, int layer); void initMediaLibrary(); + inline uint getMediaFolderCount(int folder) { + return m_media->at(folder).m_ElementCount; + } private: QList *m_media; diff --git a/src/miniaudioengine.cpp b/src/miniaudioengine.cpp index d1040b9..9204636 100644 --- a/src/miniaudioengine.cpp +++ b/src/miniaudioengine.cpp @@ -247,6 +247,9 @@ ma_result MiniAudioEngine::playbackChanged(int layer, Status status) result = ma_sound_start(&m_currentSound[layer]); break; 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_looping(&m_currentSound[layer], false); result = ma_sound_start(&m_currentSound[layer]); diff --git a/src/miniaudioengine.h b/src/miniaudioengine.h index 6d0ea19..6e1393c 100644 --- a/src/miniaudioengine.h +++ b/src/miniaudioengine.h @@ -5,6 +5,7 @@ #include "miniaudio.h" #include "defines.h" // MAX_LAYERS #include // prints messages +#define MA_DEBUG_OUTPUT class MiniAudioEngine { @@ -29,6 +30,7 @@ protected: Status getStatus(int layer); inline float getVol(int layer) { return ma_sound_get_volume(&m_currentSound[layer]); } + inline bool getAtEnd(int layer) { return m_currentSound[layer].atEnd; } private: ma_resource_manager_config resourceManagerConfig;