X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Ffilm_viewer.cc;h=cd5b6e2eafd47d1576fa08584683d3e3b0c61fcf;hb=4f9314a311de379b105741273a15821da62a75cc;hp=0131aa294a66e9caa6fa5841eeb3003e929c268c;hpb=952084c4221c5708e02c783284cf0f7239c6b4c4;p=dcpomatic.git diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index 0131aa294..cd5b6e2ea 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -88,6 +88,7 @@ FilmViewer::FilmViewer (wxWindow* p) : _audio (DCPOMATIC_RTAUDIO_API) , _closed_captions_dialog (new ClosedCaptionsDialog(p, this)) { +#if wxCHECK_VERSION(3, 1, 0) switch (Config::instance()->video_view_type()) { case Config::VIDEO_VIEW_OPENGL: _video_view = std::make_shared(this, p); @@ -96,6 +97,9 @@ FilmViewer::FilmViewer (wxWindow* p) _video_view = std::make_shared(this, p); break; } +#else + _video_view = std::make_shared(this, p); +#endif _video_view->Sized.connect (boost::bind(&FilmViewer::video_view_sized, this)); _video_view->TooManyDropped.connect (boost::bind(boost::ref(TooManyDropped))); @@ -208,14 +212,18 @@ FilmViewer::recreate_butler () return; } +#if wxCHECK_VERSION(3, 1, 0) auto const j2k_gl_optimised = dynamic_pointer_cast(_video_view) && _optimise_for_j2k; +#else + auto const j2k_gl_optimised = false; +#endif _butler = std::make_shared( _film, _player, Config::instance()->audio_mapping(_audio_channels), _audio_channels, - bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), + boost::bind(&PlayerVideo::force, AV_PIX_FMT_RGB24), VideoRange::FULL, j2k_gl_optimised ? Image::Alignment::COMPACT : Image::Alignment::PADDED, true, @@ -275,17 +283,21 @@ FilmViewer::calculate_sizes () auto const container = _film->container (); - auto const view_ratio = float(_video_view->get()->GetSize().x) / _video_view->get()->GetSize().y; + auto const scale = dpi_scale_factor (_video_view->get()); + int const video_view_width = std::round(_video_view->get()->GetSize().x * scale); + int const video_view_height = std::round(_video_view->get()->GetSize().y * scale); + + auto const view_ratio = float(video_view_width) / video_view_height; auto const film_ratio = container ? container->ratio () : 1.78; dcp::Size out_size; if (view_ratio < film_ratio) { /* panel is less widscreen than the film; clamp width */ - out_size.width = _video_view->get()->GetSize().x; + out_size.width = video_view_width; out_size.height = lrintf (out_size.width / film_ratio); } else { /* panel is more widescreen than the film; clamp height */ - out_size.height = _video_view->get()->GetSize().y; + out_size.height = video_view_height; out_size.width = lrintf (out_size.height * film_ratio); } @@ -307,16 +319,31 @@ FilmViewer::suspend () } +void +FilmViewer::start_audio_stream_if_open () +{ + if (_audio.isStreamOpen()) { + _audio.setStreamTime (_video_view->position().seconds()); + 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()) + ); + } + } +} + + void FilmViewer::resume () { DCPOMATIC_ASSERT (_suspended > 0); --_suspended; if (_playing && !_suspended) { - if (_audio.isStreamOpen()) { - _audio.setStreamTime (_video_view->position().seconds()); - _audio.startStream (); - } + start_audio_stream_if_open (); _video_view->start (); } } @@ -346,24 +373,13 @@ FilmViewer::start () /* Take the video view's idea of position as our `playhead' and start the audio stream (which is the timing reference) there. */ - if (_audio.isStreamOpen()) { - _audio.setStreamTime (_video_view->position().seconds()); - 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()) - ); - } - } + start_audio_stream_if_open (); _playing = true; /* Calling start() below may directly result in Stopped being emitted, and if that * happens we want it to come after the Started signal, so do that first. */ - Started (position()); + Started (); _video_view->start (); } @@ -382,7 +398,7 @@ FilmViewer::stop () _playing = false; _video_view->stop (); - Stopped (position()); + Stopped (); _video_view->rethrow (); return true; @@ -641,7 +657,7 @@ int FilmViewer::audio_callback (void* out_p, unsigned int frames) { while (true) { - auto t = _butler->get_audio (reinterpret_cast (out_p), frames); + auto t = _butler->get_audio (Butler::Behaviour::NON_BLOCKING, reinterpret_cast (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;