Add basic example; tweak bits and pieces.
[libdcp.git] / src / sound_asset.cc
index a8b6372748c83069221fc95790bc5b8b36f6215e..732bb61029f8282492972b4c6575ab74e31ba83c 100644 (file)
@@ -30,6 +30,7 @@
 #include "sound_asset.h"
 #include "util.h"
 #include "exceptions.h"
+#include "sound_frame.h"
 
 using namespace std;
 using namespace boost;
@@ -38,8 +39,9 @@ using namespace libdcp;
 SoundAsset::SoundAsset (
        vector<string> const & files, string directory, string mxf_name, sigc::signal1<void, float>* progress, int fps, int length
        )
-       : Asset (directory, mxf_name, progress, fps, length)
+       : MXFAsset (directory, mxf_name, progress, fps, 0, length)
        , _channels (files.size ())
+       , _sampling_rate (0)
 {
        construct (sigc::bind (sigc::mem_fun (*this, &SoundAsset::path_from_channel), files));
 }
@@ -47,17 +49,30 @@ SoundAsset::SoundAsset (
 SoundAsset::SoundAsset (
        sigc::slot<string, Channel> get_path, string directory, string mxf_name, sigc::signal1<void, float>* progress, int fps, int length, int channels
        )
-       : Asset (directory, mxf_name, progress, fps, length)
+       : MXFAsset (directory, mxf_name, progress, fps, 0, length)
        , _channels (channels)
+       , _sampling_rate (0)
 {
        construct (get_path);
 }
 
-SoundAsset::SoundAsset (string directory, string mxf_name, int fps, int length)
-       : Asset (directory, mxf_name, 0, fps, length)
+SoundAsset::SoundAsset (string directory, string mxf_name, int fps, int entry_point, int length)
+       : MXFAsset (directory, mxf_name, 0, fps, entry_point, length)
        , _channels (0)
 {
+       ASDCP::PCM::MXFReader reader;
+       if (ASDCP_FAILURE (reader.OpenRead (path().string().c_str()))) {
+               throw FileError ("could not open MXF file for reading", path().string());
+       }
+
+       
+       ASDCP::PCM::AudioDescriptor desc;
+       if (ASDCP_FAILURE (reader.FillAudioDescriptor (desc))) {
+               throw DCPReadError ("could not read audio MXF information");
+       }
 
+       _sampling_rate = desc.AudioSamplingRate.Numerator / desc.AudioSamplingRate.Denominator;
+       _channels = desc.ChannelCount;
 }
 
 string
@@ -120,8 +135,8 @@ SoundAsset::construct (sigc::slot<string, Channel> get_path)
        fill_writer_info (&writer_info);
 
        ASDCP::PCM::MXFWriter mxf_writer;
-       if (ASDCP_FAILURE (mxf_writer.OpenWrite (mxf_path().string().c_str(), writer_info, audio_desc))) {
-               throw FileError ("could not open audio MXF for writing", mxf_path().string());
+       if (ASDCP_FAILURE (mxf_writer.OpenWrite (path().string().c_str(), writer_info, audio_desc))) {
+               throw FileError ("could not open audio MXF for writing", path().string());
        }
 
        for (int i = 0; i < _length; ++i) {
@@ -155,7 +170,9 @@ SoundAsset::construct (sigc::slot<string, Channel> get_path)
                        throw MiscError ("could not write audio MXF frame");
                }
 
-               (*_progress) (0.5 * float (i) / _length);
+               if (_progress) {
+                       (*_progress) (0.5 * float (i) / _length);
+               }
        }
 
        if (ASDCP_FAILURE (mxf_writer.Finalize())) {
@@ -168,7 +185,7 @@ SoundAsset::write_to_cpl (ostream& s) const
 {
        s << "        <MainSound>\n"
          << "          <Id>urn:uuid:" << _uuid << "</Id>\n"
-         << "          <AnnotationText>" << _mxf_name << "</AnnotationText>\n"
+         << "          <AnnotationText>" << _file_name << "</AnnotationText>\n"
          << "          <EditRate>" << _fps << " 1</EditRate>\n"
          << "          <IntrinsicDuration>" << _length << "</IntrinsicDuration>\n"
          << "          <EntryPoint>0</EntryPoint>\n"
@@ -179,19 +196,19 @@ SoundAsset::write_to_cpl (ostream& s) const
 list<string>
 SoundAsset::equals (shared_ptr<const Asset> other, EqualityOptions opt) const
 {
-       list<string> notes = Asset::equals (other, opt);
+       list<string> notes = MXFAsset::equals (other, opt);
                     
        if (opt.flags & MXF_INSPECT) {
                ASDCP::PCM::MXFReader reader_A;
-               if (ASDCP_FAILURE (reader_A.OpenRead (mxf_path().string().c_str()))) {
-                       cout << "failed " << mxf_path() << "\n";
-                       throw FileError ("could not open MXF file for reading", mxf_path().string());
+               if (ASDCP_FAILURE (reader_A.OpenRead (path().string().c_str()))) {
+                       cout << "failed " << path() << "\n";
+                       throw FileError ("could not open MXF file for reading", path().string());
                }
 
                ASDCP::PCM::MXFReader reader_B;
-               if (ASDCP_FAILURE (reader_B.OpenRead (other->mxf_path().string().c_str()))) {
-                       cout << "failed " << other->mxf_path() << "\n";
-                       throw FileError ("could not open MXF file for reading", mxf_path().string());
+               if (ASDCP_FAILURE (reader_B.OpenRead (other->path().string().c_str()))) {
+                       cout << "failed " << other->path() << "\n";
+                       throw FileError ("could not open MXF file for reading", path().string());
                }
 
                ASDCP::PCM::AudioDescriptor desc_A;
@@ -246,21 +263,8 @@ SoundAsset::equals (shared_ptr<const Asset> other, EqualityOptions opt) const
        return notes;
 }
 
-
-int
-SoundAsset::sampling_rate () const
+shared_ptr<const SoundFrame>
+SoundAsset::get_frame (int n) const
 {
-       ASDCP::PCM::MXFReader reader;
-       if (ASDCP_FAILURE (reader.OpenRead (mxf_path().string().c_str()))) {
-               throw FileError ("could not open MXF file for reading", mxf_path().string());
-       }
-
-       
-       ASDCP::PCM::AudioDescriptor desc;
-       if (ASDCP_FAILURE (reader.FillAudioDescriptor (desc))) {
-               throw DCPReadError ("could not read audio MXF information");
-       }
-
-       return desc.AudioSamplingRate.Numerator / desc.AudioSamplingRate.Denominator;
+       return shared_ptr<const SoundFrame> (new SoundFrame (path().string(), n + _entry_point));
 }
-