From e412564a57a5898a8f5f49c42bede37e76f0c41c Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 12 Jan 2013 19:26:57 +0000 Subject: [PATCH 1/1] Add simple support for generating audio MXFs from part of a WAV file (for multi-reel DCP generation). --- examples/make_dcp.cc | 2 +- run-tests.sh | 3 +++ src/dcp.cc | 4 +--- src/reel.cc | 3 +++ src/sound_asset.cc | 22 +++++++++++++++++++--- src/sound_asset.h | 7 ++++++- test/tests.cc | 3 ++- 7 files changed, 35 insertions(+), 9 deletions(-) diff --git a/examples/make_dcp.cc b/examples/make_dcp.cc index e1d8353b..68e3f4f9 100644 --- a/examples/make_dcp.cc +++ b/examples/make_dcp.cc @@ -93,7 +93,7 @@ main () /* Now we can create the sound asset using these files */ boost::shared_ptr sound_asset ( - new libdcp::SoundAsset (sound_files, "My Film DCP", "audio.mxf", 0, 24, 48) + new libdcp::SoundAsset (sound_files, "My Film DCP", "audio.mxf", 0, 24, 48, 0) ); /* Now that we have the assets, we can create a Reel to put them in and add it to the CPL */ diff --git a/run-tests.sh b/run-tests.sh index 3c92dae0..7e464329 100755 --- a/run-tests.sh +++ b/run-tests.sh @@ -10,6 +10,9 @@ if [ "$1" == "--debug" ]; then shift LD_LIBRARY_PATH=build/src:build/asdcplib/src gdb --args build/test/tests +elif [ "$1" == "--valgrind" ]; then + shift + LD_LIBRARY_PATH=build/src:build/asdcplib/src valgrind --tool="memcheck" build/test/tests else LD_LIBRARY_PATH=build/src:build/asdcplib/src build/test/tests fi diff --git a/src/dcp.cc b/src/dcp.cc index a5e21d9f..03c1cdc2 100644 --- a/src/dcp.cc +++ b/src/dcp.cc @@ -457,9 +457,7 @@ CPL::write_xml () const (*i)->write_to_cpl (os); } - os << " \n" - << " \n" - << " \n" + os << " \n" << "\n"; os.close (); diff --git a/src/reel.cc b/src/reel.cc index 52a4f0fb..8995f874 100644 --- a/src/reel.cc +++ b/src/reel.cc @@ -44,6 +44,9 @@ Reel::write_to_cpl (ostream& s) const if (_main_subtitle) { _main_subtitle->write_to_cpl (s); } + + s << " \n" + << " \n"; } bool diff --git a/src/sound_asset.cc b/src/sound_asset.cc index e987239a..98266b28 100644 --- a/src/sound_asset.cc +++ b/src/sound_asset.cc @@ -42,12 +42,15 @@ using boost::lexical_cast; using namespace libdcp; SoundAsset::SoundAsset ( - vector const & files, string directory, string mxf_name, boost::signals2::signal* progress, int fps, int length + vector const & files, string directory, string mxf_name, boost::signals2::signal* progress, int fps, int length, int start_frame ) : MXFAsset (directory, mxf_name, progress, fps, 0, length) , _channels (files.size ()) , _sampling_rate (0) + , _start_frame (start_frame) { + assert (_channels); + construct (boost::bind (&SoundAsset::path_from_channel, this, _1, files)); } @@ -56,18 +59,22 @@ SoundAsset::SoundAsset ( string directory, string mxf_name, boost::signals2::signal* progress, - int fps, int length, int channels + int fps, int length, int start_frame, int channels ) : MXFAsset (directory, mxf_name, progress, fps, 0, length) , _channels (channels) , _sampling_rate (0) + , _start_frame (start_frame) { + assert (_channels); + construct (get_path); } 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) + , _start_frame (0) { ASDCP::PCM::MXFReader reader; if (ASDCP_FAILURE (reader.OpenRead (path().string().c_str()))) { @@ -96,7 +103,7 @@ void SoundAsset::construct (boost::function get_path) { ASDCP::Rational asdcp_fps (_fps, 1); - + ASDCP::PCM::WAVParser pcm_parser_channel[_channels]; if (pcm_parser_channel[0].OpenRead (get_path(LEFT).c_str(), asdcp_fps)) { throw FileError ("could not open WAV file for reading", get_path(LEFT)); @@ -153,6 +160,15 @@ SoundAsset::construct (boost::function get_path) throw FileError ("could not open audio MXF for writing", path().string()); } + /* Skip through up to our _start_frame; this is pretty inefficient... */ + for (int i = 0; i < _start_frame; ++i) { + for (int j = 0; j < _channels; ++j) { + if (ASDCP_FAILURE (pcm_parser_channel[j].ReadFrame (frame_buffer_channel[j]))) { + throw MiscError ("could not read audio frame"); + } + } + } + for (int i = 0; i < _length; ++i) { for (int j = 0; j < _channels; ++j) { diff --git a/src/sound_asset.h b/src/sound_asset.h index 3189c067..9fb1d60b 100644 --- a/src/sound_asset.h +++ b/src/sound_asset.h @@ -44,6 +44,7 @@ public: * @param progress Signal to inform of progress. * @param fps Frames per second. * @param length Length in frames. + * @param start_frame Frame in the source to start writing from. */ SoundAsset ( std::vector const & files, @@ -51,7 +52,8 @@ public: std::string mxf_name, boost::signals2::signal* progress, int fps, - int length + int length, + int start_frame ); /** Construct a SoundAsset, generating the MXF from some WAV files. @@ -62,6 +64,7 @@ public: * @param progress Signal to inform of progress. * @param fps Frames per second. * @param length Length in frames. + * @param start_frame Frame in the source to start writing from. * @param channels Number of audio channels. */ SoundAsset ( @@ -71,6 +74,7 @@ public: boost::signals2::signal* progress, int fps, int length, + int start_frame, int channels ); @@ -106,6 +110,7 @@ private: /** Number of channels in the asset */ int _channels; int _sampling_rate; + int _start_frame; }; } diff --git a/test/tests.cc b/test/tests.cc index ef25b7c8..be960699 100644 --- a/test/tests.cc +++ b/test/tests.cc @@ -86,6 +86,7 @@ BOOST_AUTO_TEST_CASE (dcp_test) &(d.Progress), 24, 24, + 0, 2 )); @@ -102,7 +103,7 @@ BOOST_AUTO_TEST_CASE (error_test) p.push_back ("frobozz"); BOOST_CHECK_THROW (new libdcp::MonoPictureAsset (p, "build/test/bar", "video.mxf", &d.Progress, 24, 24, 32, 32), libdcp::FileError); - BOOST_CHECK_THROW (new libdcp::SoundAsset (p, "build/test/bar", "audio.mxf", &d.Progress, 24, 24), libdcp::FileError); + BOOST_CHECK_THROW (new libdcp::SoundAsset (p, "build/test/bar", "audio.mxf", &d.Progress, 24, 24, 0), libdcp::FileError); } BOOST_AUTO_TEST_CASE (read_dcp) -- 2.30.2