Tidying.
[libdcp.git] / src / asset_reader.h
index 859c88f3ef99dd442a3a2e9d15cd3c0368f5fb35..2da67bd82fb4531e3a48996e69aeb47fe4f783d0 100644 (file)
 */
 
 
+/** @file  src/asset_reader.h
+ *  @brief AssetReader class
+ */
+
+
 #ifndef LIBDCP_ASSET_READER_H
 #define LIBDCP_ASSET_READER_H
 
 namespace dcp {
 
 
+class AtmosAsset;
+class MonoPictureAsset;
+class SoundAsset;
+class StereoPictureAsset;
+
+
 template <class R, class F>
 class AssetReader
 {
 public:
-       explicit AssetReader (Asset const * asset, boost::optional<Key> key, Standard standard)
-               : _crypto_context (new DecryptionContext(key, standard))
-       {
-               _reader = new R ();
-               DCP_ASSERT (asset->file());
-               auto const r = _reader->OpenRead (asset->file()->string().c_str());
-               if (ASDCP_FAILURE(r)) {
-                       delete _reader;
-                       boost::throw_exception (FileError("could not open MXF file for reading", asset->file().get(), r));
-               }
-       }
-
        AssetReader (AssetReader const&) = delete;
        AssetReader& operator== (AssetReader const&) = delete;
 
@@ -72,6 +71,7 @@ public:
 
        std::shared_ptr<const F> get_frame (int n) const
        {
+               /* Can't use make_shared here as the constructor is private */
                return std::shared_ptr<const F> (new F(_reader, n, _crypto_context));
        }
 
@@ -82,6 +82,24 @@ public:
 protected:
        R* _reader = nullptr;
        std::shared_ptr<DecryptionContext> _crypto_context;
+
+private:
+       friend class AtmosAsset;
+       friend class MonoPictureAsset;
+       friend class SoundAsset;
+       friend class StereoPictureAsset;
+
+       explicit AssetReader (Asset const * asset, boost::optional<Key> key, Standard standard)
+               : _crypto_context (new DecryptionContext(key, standard))
+       {
+               _reader = new R ();
+               DCP_ASSERT (asset->file());
+               auto const r = _reader->OpenRead (asset->file()->string().c_str());
+               if (ASDCP_FAILURE(r)) {
+                       delete _reader;
+                       boost::throw_exception (FileError("could not open MXF file for reading", asset->file().get(), r));
+               }
+       }
 };