X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fsound_asset.h;h=1e3553a0f48338af33fcf1fd08bbdf0a79c63f91;hb=27e74ac5cf717233914fd017eb9ca67ee7c4af96;hp=4fbec895f874001677e9b675d2ea80c65848219f;hpb=fe3476307bead95b72efc7d47a2ce3da31c35d88;p=libdcp.git diff --git a/src/sound_asset.h b/src/sound_asset.h index 4fbec895..1e3553a0 100644 --- a/src/sound_asset.h +++ b/src/sound_asset.h @@ -21,75 +21,136 @@ #define LIBDCP_SOUND_ASSET_H /** @file src/sound_asset.h - * @brief An asset made up of WAV files + * @brief An asset made up of PCM audio data files */ -#include "asset.h" +#include "mxf_asset.h" #include "types.h" +#include "metadata.h" namespace libdcp { +class SoundFrame; +class SoundAsset; + +class SoundAssetWriter +{ +public: + ~SoundAssetWriter (); + + void write (float const * const *, int); + void finalize (); + +private: + friend class SoundAsset; + + SoundAssetWriter (SoundAsset *, MXFMetadata const &); + + /* no copy construction */ + SoundAssetWriter (SoundAssetWriter const &); + SoundAssetWriter& operator= (SoundAssetWriter const &); + + void write_current_frame (); + + /* do this with an opaque pointer so we don't have to include + ASDCP headers + */ + + struct ASDCPState; + boost::shared_ptr _state; + + SoundAsset* _asset; + bool _finalized; + int _frames_written; + int _frame_buffer_offset; + MXFMetadata _metadata; +}; + /** @brief An asset made up of WAV files */ -class SoundAsset : public Asset +class SoundAsset : public MXFAsset { public: - /** Construct a SoundAsset, generating the MXF from the WAV files. + /** Construct a SoundAsset, generating the MXF from some WAV files. * This may take some time; progress is indicated by emission of the Progress signal. * @param files Pathnames of sound files, in the order Left, Right, Centre, Lfe (sub), Left surround, Right surround. * @param directory Directory in which to create MXF file. * @param mxf_name Name of MXF file to create. * @param progress Signal to inform of progress. * @param fps Frames per second. - * @param length Length in frames. + * @param intrinsic_duration Length of the whole asset in frames. + * Note that this is different to entry_point in that the asset will contain no data before start_frame. */ SoundAsset ( std::vector const & files, std::string directory, std::string mxf_name, - sigc::signal1* progress, + boost::signals2::signal* progress, int fps, - int length + int intrinsic_duration, + MXFMetadata const & metadata = MXFMetadata () ); - /** Construct a SoundAsset, generating the MXF from the WAV files. + /** Construct a SoundAsset, generating the MXF from some WAV files. * This may take some time; progress is indicated by emission of the Progress signal. * @param get_path Functor which returns a WAV file path for a given channel. * @param directory Directory in which to create MXF file. * @param mxf_name Name of MXF file to create. * @param progress Signal to inform of progress. * @param fps Frames per second. - * @param length Length in frames. + * @param intrinsic_duration Length of the whole asset in frames. * @param channels Number of audio channels. */ SoundAsset ( - sigc::slot get_path, + boost::function get_path, std::string directory, std::string mxf_name, - sigc::signal1* progress, + boost::signals2::signal* progress, int fps, - int length, - int channels + int intrinsic_duration, + int channels, + MXFMetadata const & metadata = MXFMetadata () + ); + + SoundAsset ( + std::string directory, + std::string mxf_name ); SoundAsset ( std::string directory, std::string mxf_name, int fps, - int length + int channels, + int sampling_rate ); + + boost::shared_ptr start_write (MXFMetadata const & metadata = MXFMetadata ()); - /** Write details of this asset to a CPL stream. - * @param s Stream. + /** Write details of this asset to a CPL XML node. + * @param node Node. */ - void write_to_cpl (std::ostream& s) const; + void write_to_cpl (xmlpp::Node* node) const; + + bool equals (boost::shared_ptr other, EqualityOptions opt, boost::function note) const; + + boost::shared_ptr get_frame (int n) const; + + int channels () const { + return _channels; + } + + int sampling_rate () const { + return _sampling_rate; + } private: - void construct (sigc::slot get_path); + void construct (boost::function get_path, MXFMetadata const &); std::string path_from_channel (Channel channel, std::vector const & files); /** Number of channels in the asset */ int _channels; + int _sampling_rate; }; }