diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-06-26 01:21:21 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-06-26 17:04:31 +0100 |
| commit | 09a9ac376db005a40a351736bcff4077f098825d (patch) | |
| tree | 64ea69741155d15d114ad96daf0f90e24b3abe28 /src/lib/player.h | |
| parent | 46cd0fe7b5b514f0d9456b25f670679cc584a218 (diff) | |
Another try at sorting out the thorny question of timing.
Diffstat (limited to 'src/lib/player.h')
| -rw-r--r-- | src/lib/player.h | 47 |
1 files changed, 31 insertions, 16 deletions
diff --git a/src/lib/player.h b/src/lib/player.h index e4fb83220..bbdb14ec2 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -23,24 +23,23 @@ #include <list> #include <boost/shared_ptr.hpp> #include <boost/enable_shared_from_this.hpp> -#include "video_source.h" -#include "audio_source.h" -#include "video_sink.h" -#include "audio_sink.h" #include "playlist.h" #include "audio_buffers.h" +#include "content.h" class Job; class Film; class Playlist; class AudioContent; class Piece; +class Image; +class Resampler; /** @class Player * @brief A class which can `play' a Playlist; emitting its audio and video. */ -class Player : public VideoSource, public AudioSource, public boost::enable_shared_from_this<Player> +class Player : public boost::enable_shared_from_this<Player> { public: Player (boost::shared_ptr<const Film>, boost::shared_ptr<const Playlist>); @@ -51,26 +50,35 @@ public: bool pass (); void seek (Time); void seek_back (); - void seek_forward (); - /** @return position that we are at; ie the time of the next thing we will emit on pass() */ - Time position () const { - return _position; + Time video_position () const { + return _video_position; } void set_video_container_size (libdcp::Size); + /** Emitted when a video frame is ready. + * First parameter is the video image. + * Second parameter is true if the image is the same as the last one that was emitted. + * Third parameter is the time. + */ + boost::signals2::signal<void (boost::shared_ptr<const Image>, bool, Time)> Video; + + /** Emitted when some audio data is ready */ + boost::signals2::signal<void (boost::shared_ptr<const AudioBuffers>, Time)> Audio; + private: - void process_video (boost::weak_ptr<Content>, boost::shared_ptr<const Image>, bool, Time); - void process_audio (boost::weak_ptr<Content>, boost::shared_ptr<const AudioBuffers>, Time); + void process_video (boost::weak_ptr<Piece>, boost::shared_ptr<const Image>, bool, VideoContent::Frame); + void process_audio (boost::weak_ptr<Piece>, boost::shared_ptr<const AudioBuffers>, AudioContent::Frame); void setup_pieces (); void playlist_changed (); void content_changed (boost::weak_ptr<Content>, int); void do_seek (Time, bool); - void add_black_piece (Time, Time); - void add_silent_piece (Time, Time); void flush (); + void emit_black (); + void emit_silence (OutputAudioFrame); + boost::shared_ptr<Resampler> resampler (boost::shared_ptr<AudioContent>); boost::shared_ptr<const Film> _film; boost::shared_ptr<const Playlist> _playlist; @@ -81,10 +89,17 @@ private: /** Our pieces are ready to go; if this is false the pieces must be (re-)created before they are used */ bool _have_valid_pieces; std::list<boost::shared_ptr<Piece> > _pieces; - Time _position; + + /** The time after the last video that we emitted */ + Time _video_position; + /** The time after the last audio that we emitted */ + Time _audio_position; + AudioBuffers _audio_buffers; - Time _next_audio; - boost::optional<libdcp::Size> _video_container_size; + + libdcp::Size _video_container_size; + boost::shared_ptr<Image> _black_frame; + std::map<boost::shared_ptr<AudioContent>, boost::shared_ptr<Resampler> > _resamplers; }; #endif |
