projects
/
dcpomatic.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Update dialog layout fixes.
[dcpomatic.git]
/
src
/
wx
/
film_viewer.cc
diff --git
a/src/wx/film_viewer.cc
b/src/wx/film_viewer.cc
index cc18d634d3963b2a583880a973163bc2aa72b176..4ea2a8b006b4a1fee6cac30e4c04fda735d00d52 100644
(file)
--- a/
src/wx/film_viewer.cc
+++ b/
src/wx/film_viewer.cc
@@
-59,17
+59,19
@@
extern "C" {
#include <iostream>
#include <iomanip>
#include <iostream>
#include <iomanip>
-using std::string;
-using std::pair;
-using std::min;
-using std::max;
+
+using std::bad_alloc;
using std::cout;
using std::cout;
+using std::dynamic_pointer_cast;
+using std::exception;
using std::list;
using std::list;
-using std::bad_alloc;
using std::make_pair;
using std::make_pair;
-using std::exception;
+using std::make_shared;
+using std::max;
+using std::min;
+using std::pair;
using std::shared_ptr;
using std::shared_ptr;
-using std::
dynamic_pointer_cast
;
+using std::
string
;
using std::vector;
using std::weak_ptr;
using boost::optional;
using std::vector;
using std::weak_ptr;
using boost::optional;
@@
-79,6
+81,7
@@
using namespace boost::placeholders;
using dcp::Size;
using namespace dcpomatic;
using dcp::Size;
using namespace dcpomatic;
+
static
int
rtaudio_callback (void* out, void *, unsigned int frames, double, RtAudioStreamStatus, void* data)
static
int
rtaudio_callback (void* out, void *, unsigned int frames, double, RtAudioStreamStatus, void* data)
@@
-86,18
+89,10
@@
rtaudio_callback (void* out, void *, unsigned int frames, double, RtAudioStreamS
return reinterpret_cast<FilmViewer*>(data)->audio_callback (out, frames);
}
return reinterpret_cast<FilmViewer*>(data)->audio_callback (out, frames);
}
+
FilmViewer::FilmViewer (wxWindow* p)
FilmViewer::FilmViewer (wxWindow* p)
- : _coalesce_player_changes (false)
- , _audio (DCPOMATIC_RTAUDIO_API)
- , _audio_channels (0)
- , _audio_block_size (1024)
- , _playing (false)
- , _suspended (0)
- , _latency_history_count (0)
+ : _audio (DCPOMATIC_RTAUDIO_API)
, _closed_captions_dialog (new ClosedCaptionsDialog(p, this))
, _closed_captions_dialog (new ClosedCaptionsDialog(p, this))
- , _outline_content (false)
- , _pad_black (false)
- , _idle_get (false)
{
switch (Config::instance()->video_view_type()) {
case Config::VIDEO_VIEW_OPENGL:
{
switch (Config::instance()->video_view_type()) {
case Config::VIDEO_VIEW_OPENGL:
@@
-111,17
+106,19
@@
FilmViewer::FilmViewer (wxWindow* p)
_video_view->Sized.connect (boost::bind(&FilmViewer::video_view_sized, this));
_video_view->TooManyDropped.connect (boost::bind(&FilmViewer::too_many_frames_dropped, this));
_video_view->Sized.connect (boost::bind(&FilmViewer::video_view_sized, this));
_video_view->TooManyDropped.connect (boost::bind(&FilmViewer::too_many_frames_dropped, this));
- set_film (shared_ptr<Film>
());
+ set_film (shared_ptr<Film>());
- _config_changed_connection = Config::instance()->Changed.connect
(bind
(&FilmViewer::config_changed, this, _1));
+ _config_changed_connection = Config::instance()->Changed.connect
(bind
(&FilmViewer::config_changed, this, _1));
config_changed (Config::SOUND_OUTPUT);
}
config_changed (Config::SOUND_OUTPUT);
}
+
FilmViewer::~FilmViewer ()
{
stop ();
}
FilmViewer::~FilmViewer ()
{
stop ();
}
+
/** Ask for ::get() to be called next time we are idle */
void
FilmViewer::request_idle_display_next_frame ()
/** Ask for ::get() to be called next time we are idle */
void
FilmViewer::request_idle_display_next_frame ()
@@
-135,6
+132,7
@@
FilmViewer::request_idle_display_next_frame ()
signal_manager->when_idle (boost::bind(&FilmViewer::idle_handler, this));
}
signal_manager->when_idle (boost::bind(&FilmViewer::idle_handler, this));
}
+
void
FilmViewer::idle_handler ()
{
void
FilmViewer::idle_handler ()
{
@@
-150,6
+148,7
@@
FilmViewer::idle_handler ()
}
}
}
}
+
void
FilmViewer::set_film (shared_ptr<Film> film)
{
void
FilmViewer::set_film (shared_ptr<Film> film)
{
@@
-170,7
+169,7
@@
FilmViewer::set_film (shared_ptr<Film> film)
}
try {
}
try {
- _player
.reset (new Player(_film)
);
+ _player
= make_shared<Player>(_film
);
_player->set_fast ();
if (_dcp_decode_reduction) {
_player->set_dcp_decode_reduction (_dcp_decode_reduction);
_player->set_fast ();
if (_dcp_decode_reduction) {
_player->set_dcp_decode_reduction (_dcp_decode_reduction);
@@
-203,6
+202,7
@@
FilmViewer::set_film (shared_ptr<Film> film)
slow_refresh ();
}
slow_refresh ();
}
+
void
FilmViewer::recreate_butler ()
{
void
FilmViewer::recreate_butler ()
{
@@
-214,17
+214,15
@@
FilmViewer::recreate_butler ()
return;
}
return;
}
- _butler.reset(
- new Butler(
- _film,
- _player,
- Config::instance()->audio_mapping(_audio_channels),
- _audio_channels,
- bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24),
- VideoRange::FULL,
- false,
- true
- )
+ _butler = std::make_shared<Butler>(
+ _film,
+ _player,
+ Config::instance()->audio_mapping(_audio_channels),
+ _audio_channels,
+ bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24),
+ VideoRange::FULL,
+ false,
+ true
);
if (!Config::instance()->sound() && !_audio.isStreamOpen()) {
);
if (!Config::instance()->sound() && !_audio.isStreamOpen()) {
@@
-236,6
+234,7
@@
FilmViewer::recreate_butler ()
resume ();
}
resume ();
}
+
void
FilmViewer::set_outline_content (bool o)
{
void
FilmViewer::set_outline_content (bool o)
{
@@
-245,7
+244,7
@@
FilmViewer::set_outline_content (bool o)
void
void
-FilmViewer::set_outline_subtitles (optional<dcpomatic::Rect<double>
> rect)
+FilmViewer::set_outline_subtitles (optional<dcpomatic::Rect<double>> rect)
{
_outline_subtitles = rect;
_video_view->update ();
{
_outline_subtitles = rect;
_video_view->update ();
@@
-259,6
+258,7
@@
FilmViewer::set_eyes (Eyes e)
slow_refresh ();
}
slow_refresh ();
}
+
void
FilmViewer::video_view_sized ()
{
void
FilmViewer::video_view_sized ()
{
@@
-268,6
+268,7
@@
FilmViewer::video_view_sized ()
}
}
}
}
+
void
FilmViewer::calculate_sizes ()
{
void
FilmViewer::calculate_sizes ()
{
@@
-275,10
+276,10
@@
FilmViewer::calculate_sizes ()
return;
}
return;
}
-
Ratio const *
container = _film->container ();
+
auto const
container = _film->container ();
-
float
const view_ratio = float(_video_view->get()->GetSize().x) / _video_view->get()->GetSize().y;
-
float
const film_ratio = container ? container->ratio () : 1.78;
+
auto
const view_ratio = float(_video_view->get()->GetSize().x) / _video_view->get()->GetSize().y;
+
auto
const film_ratio = container ? container->ratio () : 1.78;
if (view_ratio < film_ratio) {
/* panel is less widscreen than the film; clamp width */
if (view_ratio < film_ratio) {
/* panel is less widscreen than the film; clamp width */
@@
-297,6
+298,7
@@
FilmViewer::calculate_sizes ()
_player->set_video_container_size (_out_size);
}
_player->set_video_container_size (_out_size);
}
+
void
FilmViewer::suspend ()
{
void
FilmViewer::suspend ()
{
@@
-306,6
+308,7
@@
FilmViewer::suspend ()
}
}
}
}
+
void
FilmViewer::resume ()
{
void
FilmViewer::resume ()
{
@@
-320,6
+323,7
@@
FilmViewer::resume ()
}
}
}
}
+
void
FilmViewer::start ()
{
void
FilmViewer::start ()
{
@@
-327,7
+331,7
@@
FilmViewer::start ()
return;
}
return;
}
-
optional<bool>
v = PlaybackPermitted ();
+
auto
v = PlaybackPermitted ();
if (v && !*v) {
/* Computer says no */
return;
if (v && !*v) {
/* Computer says no */
return;
@@
-346,7
+350,15
@@
FilmViewer::start ()
*/
if (_audio.isStreamOpen()) {
_audio.setStreamTime (_video_view->position().seconds());
*/
if (_audio.isStreamOpen()) {
_audio.setStreamTime (_video_view->position().seconds());
- _audio.startStream ();
+ try {
+ _audio.startStream ();
+ } catch (RtAudioError& e) {
+ _audio_channels = 0;
+ error_dialog (
+ _video_view->get(),
+ _("There was a problem starting audio playback. Please try another audio output device in Preferences."), std_to_wx(e.what())
+ );
+ }
}
_playing = true;
}
_playing = true;
@@
-357,6
+369,7
@@
FilmViewer::start ()
_video_view->start ();
}
_video_view->start ();
}
+
bool
FilmViewer::stop ()
{
bool
FilmViewer::stop ()
{
@@
-377,6
+390,7
@@
FilmViewer::stop ()
return true;
}
return true;
}
+
void
FilmViewer::player_change (ChangeType type, int property, bool frequent)
{
void
FilmViewer::player_change (ChangeType type, int property, bool frequent)
{
@@
-392,6
+406,7
@@
FilmViewer::player_change (ChangeType type, int property, bool frequent)
player_change ({property});
}
player_change ({property});
}
+
void
FilmViewer::player_change (vector<int> properties)
{
void
FilmViewer::player_change (vector<int> properties)
{
@@
-427,6
+442,7
@@
FilmViewer::player_change (vector<int> properties)
}
}
}
}
+
void
FilmViewer::film_change (ChangeType type, Film::Property p)
{
void
FilmViewer::film_change (ChangeType type, Film::Property p)
{
@@
-445,12
+461,14
@@
FilmViewer::film_change (ChangeType type, Film::Property p)
}
}
}
}
+
void
FilmViewer::film_length_change ()
{
_video_view->set_length (_film->length());
}
void
FilmViewer::film_length_change ()
{
_video_view->set_length (_film->length());
}
+
/** Re-get the current frame slowly by seeking */
void
FilmViewer::slow_refresh ()
/** Re-get the current frame slowly by seeking */
void
FilmViewer::slow_refresh ()
@@
-458,6
+476,7
@@
FilmViewer::slow_refresh ()
seek (_video_view->position(), true);
}
seek (_video_view->position(), true);
}
+
/** Try to re-get the current frame quickly by resetting the metadata
* in the PlayerVideo that we used last time.
* @return true if this was possible, false if not.
/** Try to re-get the current frame quickly by resetting the metadata
* in the PlayerVideo that we used last time.
* @return true if this was possible, false if not.
@@
-471,15
+490,17
@@
FilmViewer::quick_refresh ()
return _video_view->reset_metadata (_film, _player->video_container_size());
}
return _video_view->reset_metadata (_film, _player->video_container_size());
}
+
void
FilmViewer::seek (shared_ptr<Content> content, ContentTime t, bool accurate)
{
void
FilmViewer::seek (shared_ptr<Content> content, ContentTime t, bool accurate)
{
-
optional<DCPTime>
dt = _player->content_time_to_dcp (content, t);
+
auto
dt = _player->content_time_to_dcp (content, t);
if (dt) {
seek (*dt, accurate);
}
}
if (dt) {
seek (*dt, accurate);
}
}
+
void
FilmViewer::set_coalesce_player_changes (bool c)
{
void
FilmViewer::set_coalesce_player_changes (bool c)
{
@@
-491,6
+512,7
@@
FilmViewer::set_coalesce_player_changes (bool c)
}
}
}
}
+
void
FilmViewer::seek (DCPTime t, bool accurate)
{
void
FilmViewer::seek (DCPTime t, bool accurate)
{
@@
-498,11
+520,11
@@
FilmViewer::seek (DCPTime t, bool accurate)
return;
}
return;
}
- if (t < DCPTime
()) {
+ if (t < DCPTime()) {
t = DCPTime ();
}
t = DCPTime ();
}
- if (t >= _film->length
()) {
+ if (t >= _film->length()) {
t = _film->length() - one_video_frame();
}
t = _film->length() - one_video_frame();
}
@@
-526,6
+548,7
@@
FilmViewer::seek (DCPTime t, bool accurate)
resume ();
}
resume ();
}
+
void
FilmViewer::config_changed (Config::Property p)
{
void
FilmViewer::config_changed (Config::Property p)
{
@@
-584,38
+607,42
@@
FilmViewer::config_changed (Config::Property p)
}
}
}
}
+
DCPTime
FilmViewer::uncorrected_time () const
{
DCPTime
FilmViewer::uncorrected_time () const
{
- if (_audio.isStreamRunning
()) {
+ if (_audio.isStreamRunning()) {
return DCPTime::from_seconds (const_cast<RtAudio*>(&_audio)->getStreamTime());
}
return _video_view->position();
}
return DCPTime::from_seconds (const_cast<RtAudio*>(&_audio)->getStreamTime());
}
return _video_view->position();
}
+
optional<DCPTime>
FilmViewer::audio_time () const
{
if (!_audio.isStreamRunning()) {
optional<DCPTime>
FilmViewer::audio_time () const
{
if (!_audio.isStreamRunning()) {
- return
optional<DCPTime>()
;
+ return
{}
;
}
return DCPTime::from_seconds (const_cast<RtAudio*>(&_audio)->getStreamTime ()) -
DCPTime::from_frames (average_latency(), _film->audio_frame_rate());
}
}
return DCPTime::from_seconds (const_cast<RtAudio*>(&_audio)->getStreamTime ()) -
DCPTime::from_frames (average_latency(), _film->audio_frame_rate());
}
+
DCPTime
FilmViewer::time () const
{
return audio_time().get_value_or(_video_view->position());
}
DCPTime
FilmViewer::time () const
{
return audio_time().get_value_or(_video_view->position());
}
+
int
FilmViewer::audio_callback (void* out_p, unsigned int frames)
{
while (true) {
int
FilmViewer::audio_callback (void* out_p, unsigned int frames)
{
while (true) {
-
optional<DCPTime>
t = _butler->get_audio (reinterpret_cast<float*> (out_p), frames);
+
auto
t = _butler->get_audio (reinterpret_cast<float*> (out_p), frames);
if (!t || DCPTime(uncorrected_time() - *t) < one_video_frame()) {
/* There was an underrun or this audio is on time; carry on */
break;
if (!t || DCPTime(uncorrected_time() - *t) < one_video_frame()) {
/* There was an underrun or this audio is on time; carry on */
break;
@@
-634,6
+661,7
@@
FilmViewer::audio_callback (void* out_p, unsigned int frames)
return 0;
}
return 0;
}
+
Frame
FilmViewer::average_latency () const
{
Frame
FilmViewer::average_latency () const
{
@@
-650,6
+678,7
@@
FilmViewer::average_latency () const
return total / _latency_history.size();
}
return total / _latency_history.size();
}
+
void
FilmViewer::set_dcp_decode_reduction (optional<int> reduction)
{
void
FilmViewer::set_dcp_decode_reduction (optional<int> reduction)
{
@@
-659,18
+688,21
@@
FilmViewer::set_dcp_decode_reduction (optional<int> reduction)
}
}
}
}
+
optional<int>
FilmViewer::dcp_decode_reduction () const
{
return _dcp_decode_reduction;
}
optional<int>
FilmViewer::dcp_decode_reduction () const
{
return _dcp_decode_reduction;
}
+
DCPTime
FilmViewer::one_video_frame () const
{
return DCPTime::from_frames (1, _film ? _film->video_frame_rate() : 24);
}
DCPTime
FilmViewer::one_video_frame () const
{
return DCPTime::from_frames (1, _film ? _film->video_frame_rate() : 24);
}
+
/** Open a dialog box showing our film's closed captions */
void
FilmViewer::show_closed_captions ()
/** Open a dialog box showing our film's closed captions */
void
FilmViewer::show_closed_captions ()
@@
-678,18
+710,21
@@
FilmViewer::show_closed_captions ()
_closed_captions_dialog->Show();
}
_closed_captions_dialog->Show();
}
+
void
FilmViewer::seek_by (DCPTime by, bool accurate)
{
seek (_video_view->position() + by, accurate);
}
void
FilmViewer::seek_by (DCPTime by, bool accurate)
{
seek (_video_view->position() + by, accurate);
}
+
void
FilmViewer::set_pad_black (bool p)
{
_pad_black = p;
}
void
FilmViewer::set_pad_black (bool p)
{
_pad_black = p;
}
+
/** Called when a player has finished the current film.
* May be called from a non-UI thread.
*/
/** Called when a player has finished the current film.
* May be called from a non-UI thread.
*/
@@
-699,6
+734,7
@@
FilmViewer::finished ()
emit (boost::bind(&FilmViewer::ui_finished, this));
}
emit (boost::bind(&FilmViewer::ui_finished, this));
}
+
/** Called by finished() in the UI thread */
void
FilmViewer::ui_finished ()
/** Called by finished() in the UI thread */
void
FilmViewer::ui_finished ()
@@
-707,6
+743,7
@@
FilmViewer::ui_finished ()
Finished ();
}
Finished ();
}
+
int
FilmViewer::dropped () const
{
int
FilmViewer::dropped () const
{