From 89be545b70773303bdd183478906ae81e095b9fe Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Fri, 2 Jul 2021 23:17:35 +0200
Subject: [PATCH] DOCUMENT & MISC: Add the AudioContext to the AudioSubDocument
 and create the Lib folder to store all the code that is not a UI code but can
 be included by all other src's sub-folders

---
 CMakeLists.txt                    | 36 ++++++++++++++++---------------
 src/Ass/AssFactory.hh             |  2 +-
 src/AudioUtils.cc                 |  1 -
 src/Document/CRTPSubDocument.hh   | 35 +++++++++++++++++++++---------
 src/Document/VivyDocument.cc      |  2 +-
 src/Document/VivyDocument.hh      |  2 +-
 src/Document/VivyDocumentStore.hh |  2 +-
 src/{ => Lib}/Audio.cc            |  0
 src/{ => Lib}/Audio.hh            |  0
 src/{ => Lib}/Utils.cc            |  0
 src/{ => Lib}/Utils.hh            |  0
 src/UI/MainWindow.cc              |  2 +-
 src/UI/MainWindow.hh              |  2 +-
 src/UI/TimingScene.cc             |  2 +-
 src/UI/TimingScene.hh             |  2 +-
 src/UI/TimingView.hh              |  2 +-
 16 files changed, 53 insertions(+), 37 deletions(-)
 rename src/{ => Lib}/Audio.cc (100%)
 rename src/{ => Lib}/Audio.hh (100%)
 rename src/{ => Lib}/Utils.cc (100%)
 rename src/{ => Lib}/Utils.hh (100%)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index b6ee0dc3..2a90b008 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,6 @@
 cmake_minimum_required(VERSION 3.5)
 
-project(Vivy VERSION 0.1)
+project(Vivy VERSION 0.1 LANGUAGES CXX)
 
 set(CMAKE_INCLUDE_CURRENT_DIR ON)
 cmake_policy(SET CMP0100 NEW) # Let cmake use moc and uic for .hh files
@@ -28,16 +28,16 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
 # Grab all files
 file(GLOB Vivy_SRC
     "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cc"
-    "${CMAKE_CURRENT_SOURCE_DIR}/src/*.c"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/Document/*.cc"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/Ass/*.cc"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/Lib/*.cc"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/UI/*.cc"
 )
 file(GLOB Vivy_INC
-    "${CMAKE_CURRENT_SOURCE_DIR}/src/*.h"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/*.hh"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/Document/*.hh"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/Ass/*.hh"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/Lib/*.hh"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/UI/*.hh"
 )
 set(PROJECT_SOURCES
@@ -70,22 +70,24 @@ target_link_libraries(Vivy PRIVATE ${AVFORMAT_LIBRARY})
 target_include_directories(Vivy PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/inc)
 target_precompile_headers(Vivy PRIVATE
     # ASS headers
-    "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/Ass/Ass.hh>"
-    "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/Ass/Line.hh>"
-    "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/Ass/Syl.hh>"
-    "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/Ass/Style.hh>"
-    "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/Ass/AssFactory.hh>"
-    "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/Ass/Char.hh>"
-
-    # Utils
-    "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/Utils.hh>"
-    "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/AudioUtils.hh>"
-    "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/Audio.hh>"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/Ass/Ass.hh"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/Ass/Line.hh"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/Ass/Syl.hh"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/Ass/Style.hh"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/Ass/AssFactory.hh"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/Ass/Char.hh"
+
+    # Utils & Misc, will disapear
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/AudioUtils.hh"
+
+    # Libs
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/Lib/Utils.hh"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/Lib/Audio.hh"
 
     # Document headers
-    "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/Document/VivyDocument.hh>"
-    "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/Document/VivyDocumentStore.hh>"
-    "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/Document/CRTPSubDocument.hh>"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/Document/VivyDocument.hh"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/Document/VivyDocumentStore.hh"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/Document/CRTPSubDocument.hh"
 )
 
 # More options and warnings
diff --git a/src/Ass/AssFactory.hh b/src/Ass/AssFactory.hh
index 48f849b0..e5343ec9 100644
--- a/src/Ass/AssFactory.hh
+++ b/src/Ass/AssFactory.hh
@@ -1,7 +1,7 @@
 #ifndef VIVY_ASS_FACTORY_H
 #define VIVY_ASS_FACTORY_H
 
-#include "../Utils.hh"
+#include "../Lib/Utils.hh"
 #include "Style.hh"
 #include "Line.hh"
 
diff --git a/src/AudioUtils.cc b/src/AudioUtils.cc
index fde8a4cc..cab709b2 100644
--- a/src/AudioUtils.cc
+++ b/src/AudioUtils.cc
@@ -1,5 +1,4 @@
 #include "AudioUtils.hh"
-#include "Audio.hh" // Will be renamed into AudioUtils.hh ...
 
 #define MAXPIXVALUE 7 /* Some magix AV magic stuff */
 
diff --git a/src/Document/CRTPSubDocument.hh b/src/Document/CRTPSubDocument.hh
index 7d1dcebd..a624698b 100644
--- a/src/Document/CRTPSubDocument.hh
+++ b/src/Document/CRTPSubDocument.hh
@@ -5,12 +5,13 @@
 #error "This is a C++ header"
 #endif
 
-#include "../Utils.hh"
+#include "../Lib/Utils.hh"
+#include "../Lib/Audio.hh"
 #include "../Ass/Ass.hh"
 #include <QString>
 #include <memory>
 
-/* Types for the different documents */
+// Types for the different documents
 
 namespace Vivy
 {
@@ -29,7 +30,7 @@ enum class AssDocumentType : quint64 {
     ASS = Vivy::Utils::to_underlying(Vivy::Utils::DocumentType::ASS),
 };
 
-/* The Big CRTP class for all common things to all the subdocuments */
+// The Big CRTP class for all common things to all the subdocuments
 template <class CRTPSubDocumentType, class Document> class CRTPSubDocument {
 public:
     using Type = CRTPSubDocumentType;
@@ -53,7 +54,14 @@ public:
         qDebug() << "Init document from file " << path;
         auto ret      = std::unique_ptr<Document>(new Document());
         ret->filePath = path;
-        ret->initFromPath(path);
+
+        try {
+            ret->initFromPath(path); // May throw
+        } catch (const std::runtime_error &e) {
+            qDebug() << "Failed to init document from file" << path;
+            ret.reset();
+        }
+
         return ret;
     }
 
@@ -68,26 +76,33 @@ public:
     }
 };
 
-/* Audio document */
+// Audio document
 class AudioSubDocument final : public CRTPSubDocument<AudioDocumentType, AudioSubDocument> {
 private:
     const QStringList &suffixList = Vivy::Utils::audioFileSuffix;
 
-    inline void initFromPath([[maybe_unused]] const QString &path) noexcept
+    inline void initFromPath(const QString &path)
     {
+        if (contextPtr)
+            qDebug() << "Replacing the audio contetx by a new one for file" << path;
+        contextPtr.reset(new AudioContext(path)); // May throw
+
         qDebug() << "Audio OK for" << path;
     }
 
     explicit AudioSubDocument() = default;
     friend CRTPSubDocument<AudioDocumentType, AudioSubDocument>;
+
+private:
+    std::unique_ptr<AudioContext> contextPtr;
 };
 
-/* Video document */
+// Video document
 class VideoSubDocument final : public CRTPSubDocument<VideoDocumentType, VideoSubDocument> {
 private:
     const QStringList &suffixList = Vivy::Utils::videoFileSuffix;
 
-    inline void initFromPath([[maybe_unused]] const QString &path) noexcept
+    inline void initFromPath([[maybe_unused]] const QString &path)
     {
     }
 
@@ -95,11 +110,11 @@ private:
     friend CRTPSubDocument<VideoDocumentType, VideoSubDocument>;
 };
 
-/* ASS document */
+// ASS document
 class AssSubDocument final : public CRTPSubDocument<AssDocumentType, AssSubDocument> {
     const QStringList &suffixList = Vivy::Utils::assFileSuffix;
 
-    inline void initFromPath([[maybe_unused]] const QString &path) noexcept
+    inline void initFromPath([[maybe_unused]] const QString &path)
     {
         Ass::AssFactory factory(path);
         factory.getStyles(styles);
diff --git a/src/Document/VivyDocument.cc b/src/Document/VivyDocument.cc
index 74ec47a3..53dd53d9 100644
--- a/src/Document/VivyDocument.cc
+++ b/src/Document/VivyDocument.cc
@@ -1,5 +1,5 @@
 #include "VivyDocument.hh"
-#include "../Utils.hh"
+#include "../Lib/Utils.hh"
 
 #include <QFileInfo>
 #include <QString>
diff --git a/src/Document/VivyDocument.hh b/src/Document/VivyDocument.hh
index 16bef9dc..4d7fa9e4 100644
--- a/src/Document/VivyDocument.hh
+++ b/src/Document/VivyDocument.hh
@@ -5,7 +5,7 @@
 #error "This is a C++ header"
 #endif
 
-#include "../Utils.hh"
+#include "../Lib/Utils.hh"
 #include "CRTPSubDocument.hh"
 
 #include <memory>
diff --git a/src/Document/VivyDocumentStore.hh b/src/Document/VivyDocumentStore.hh
index f25fd3f7..047a49ab 100644
--- a/src/Document/VivyDocumentStore.hh
+++ b/src/Document/VivyDocumentStore.hh
@@ -2,7 +2,7 @@
 #define VIVY_DOCUMENTSTORE_H
 
 #include "VivyDocument.hh"
-#include "../Utils.hh"
+#include "../Lib/Utils.hh"
 
 #include <QMap>
 #include <QString>
diff --git a/src/Audio.cc b/src/Lib/Audio.cc
similarity index 100%
rename from src/Audio.cc
rename to src/Lib/Audio.cc
diff --git a/src/Audio.hh b/src/Lib/Audio.hh
similarity index 100%
rename from src/Audio.hh
rename to src/Lib/Audio.hh
diff --git a/src/Utils.cc b/src/Lib/Utils.cc
similarity index 100%
rename from src/Utils.cc
rename to src/Lib/Utils.cc
diff --git a/src/Utils.hh b/src/Lib/Utils.hh
similarity index 100%
rename from src/Utils.hh
rename to src/Lib/Utils.hh
diff --git a/src/UI/MainWindow.cc b/src/UI/MainWindow.cc
index 92965929..212abaf9 100644
--- a/src/UI/MainWindow.cc
+++ b/src/UI/MainWindow.cc
@@ -1,7 +1,7 @@
 #include "MainWindow.hh"
 #include "DialogHelp.hh"
 #include "VivyDocumentView.hh"
-#include "../Utils.hh"
+#include "../Lib/Utils.hh"
 #include "../VivyApplication.hh"
 
 #include <functional>
diff --git a/src/UI/MainWindow.hh b/src/UI/MainWindow.hh
index 7947e04a..fc3e60ea 100644
--- a/src/UI/MainWindow.hh
+++ b/src/UI/MainWindow.hh
@@ -5,7 +5,7 @@
 #error "This is a C++ header"
 #endif
 
-#include "../Utils.hh"
+#include "../Lib/Utils.hh"
 #include "AudioVisualizer.hh"
 #include "../Document/VivyDocumentStore.hh"
 #include "VivyDocumentView.hh"
diff --git a/src/UI/TimingScene.cc b/src/UI/TimingScene.cc
index 042149bd..7d2e2115 100644
--- a/src/UI/TimingScene.cc
+++ b/src/UI/TimingScene.cc
@@ -1,5 +1,5 @@
 #include "TimingScene.hh"
-#include "../Utils.hh"
+#include "../Lib/Utils.hh"
 
 #include <QGraphicsLineItem>
 #include <QGraphicsPixmapItem>
diff --git a/src/UI/TimingScene.hh b/src/UI/TimingScene.hh
index ed6742f9..860acecb 100644
--- a/src/UI/TimingScene.hh
+++ b/src/UI/TimingScene.hh
@@ -1,7 +1,7 @@
 #ifndef VIVY_TIMING_SCENE_H
 #define VIVY_TIMING_SCENE_H
 
-#include "../Utils.hh"
+#include "../Lib/Utils.hh"
 #include "../Ass/Ass.hh"
 #include "TimingBar.hh"
 
diff --git a/src/UI/TimingView.hh b/src/UI/TimingView.hh
index 3358226c..b2f11f79 100644
--- a/src/UI/TimingView.hh
+++ b/src/UI/TimingView.hh
@@ -5,7 +5,7 @@
 #error "This is a C++ header"
 #endif
 
-#include "../Utils.hh"
+#include "../Lib/Utils.hh"
 #include "TimingBar.hh"
 #include "TimingScene.hh"
 
-- 
GitLab