diff options
| author | Carl Hetherington <cth@carlh.net> | 2024-07-26 11:47:24 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2024-07-26 11:47:24 +0200 |
| commit | 95abcc7d18997c1391423d15506bf03ab20997e6 (patch) | |
| tree | 64fc82bdb7b45275436e1216d81847087ffb1788 /src/wx/film_viewer.cc | |
| parent | 4d721e683b584fe48e7905e44ab3da23afe76145 (diff) | |
| parent | 98b7a493933a5a47c6e1abb21ef2710ad2730a0e (diff) | |
Merge branch 'main' into v2.17.x
Diffstat (limited to 'src/wx/film_viewer.cc')
| -rw-r--r-- | src/wx/film_viewer.cc | 126 |
1 files changed, 49 insertions, 77 deletions
diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index 50c3010d0..13bc5b579 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -24,6 +24,7 @@ */ +#include "audio_backend.h" #include "closed_captions_dialog.h" #include "film_viewer.h" #include "gl_video_view.h" @@ -87,12 +88,7 @@ rtaudio_callback (void* out, void *, unsigned int frames, double, RtAudioStreamS FilmViewer::FilmViewer (wxWindow* p) -#if (RTAUDIO_VERSION_MAJOR >= 6) - : _audio(DCPOMATIC_RTAUDIO_API, boost::bind(&FilmViewer::rtaudio_error_callback, this, _2)) -#else - : _audio (DCPOMATIC_RTAUDIO_API) -#endif - , _closed_captions_dialog (new ClosedCaptionsDialog(p, this)) + : _closed_captions_dialog (new ClosedCaptionsDialog(p, this)) { #if wxCHECK_VERSION(3, 1, 0) switch (Config::instance()->video_view_type()) { @@ -243,6 +239,8 @@ FilmViewer::create_butler() DCPOMATIC_ASSERT(_player); + auto& audio = AudioBackend::instance()->rtaudio(); + _butler = std::make_shared<Butler>( _film, *_player, @@ -253,7 +251,7 @@ FilmViewer::create_butler() (opengl && _optimisation != Optimisation::NONE) ? Image::Alignment::COMPACT : Image::Alignment::PADDED, true, opengl && _optimisation == Optimisation::JPEG2000, - (Config::instance()->sound() && _audio.isStreamOpen()) ? Butler::Audio::ENABLED : Butler::Audio::DISABLED + (Config::instance()->sound() && audio.isStreamOpen()) ? Butler::Audio::ENABLED : Butler::Audio::DISABLED ); _closed_captions_dialog->set_butler (_butler); @@ -345,36 +343,25 @@ void FilmViewer::suspend () { ++_suspended; - if (_audio.isStreamRunning()) { - _audio.abortStream(); - } + AudioBackend::instance()->abort_stream_if_running(); } void FilmViewer::start_audio_stream_if_open () { - if (_audio.isStreamOpen()) { - _audio.setStreamTime (_video_view->position().seconds()); -#if (RTAUDIO_VERSION_MAJOR >= 6) - if (_audio.startStream() != RTAUDIO_NO_ERROR) { + auto& audio = AudioBackend::instance()->rtaudio(); + + if (audio.isStreamOpen()) { + audio.setStreamTime(_video_view->position().seconds()); + auto error = AudioBackend::instance()->start_stream(); + if (error) { _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(last_rtaudio_error()) + _("There was a problem starting audio playback. Please try another audio output device in Preferences."), std_to_wx(*error) ); } -#else - 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()) - ); - } -#endif } } @@ -429,10 +416,7 @@ FilmViewer::start () bool FilmViewer::stop () { - if (_audio.isStreamRunning()) { - /* stop stream and discard any remaining queued samples */ - _audio.abortStream (); - } + AudioBackend::instance()->abort_stream_if_running(); if (!_playing) { return false; @@ -619,16 +603,18 @@ FilmViewer::config_changed (Config::Property p) return; } - if (_audio.isStreamOpen ()) { - _audio.closeStream (); + auto& audio = AudioBackend::instance()->rtaudio(); + + if (audio.isStreamOpen()) { + audio.closeStream(); } - if (Config::instance()->sound() && _audio.getDeviceCount() > 0) { + if (Config::instance()->sound() && audio.getDeviceCount() > 0) { optional<unsigned int> chosen_device_id; #if (RTAUDIO_VERSION_MAJOR >= 6) if (Config::instance()->sound_output()) { - for (auto device_id: _audio.getDeviceIds()) { - if (_audio.getDeviceInfo(device_id).name == Config::instance()->sound_output().get()) { + for (auto device_id: audio.getDeviceIds()) { + if (audio.getDeviceInfo(device_id).name == Config::instance()->sound_output().get()) { chosen_device_id = device_id; break; } @@ -636,26 +622,26 @@ FilmViewer::config_changed (Config::Property p) } if (!chosen_device_id) { - chosen_device_id = _audio.getDefaultOutputDevice(); + chosen_device_id = audio.getDefaultOutputDevice(); } - _audio_channels = _audio.getDeviceInfo(*chosen_device_id).outputChannels; + _audio_channels = audio.getDeviceInfo(*chosen_device_id).outputChannels; RtAudio::StreamParameters sp; sp.deviceId = *chosen_device_id; sp.nChannels = _audio_channels; sp.firstChannel = 0; - if (_audio.openStream(&sp, 0, RTAUDIO_FLOAT32, 48000, &_audio_block_size, &rtaudio_callback, this) != RTAUDIO_NO_ERROR) { + if (audio.openStream(&sp, 0, RTAUDIO_FLOAT32, 48000, &_audio_block_size, &rtaudio_callback, this) != RTAUDIO_NO_ERROR) { _audio_channels = 0; error_dialog( _video_view->get(), - _("Could not set up audio output. There will be no audio during the preview."), std_to_wx(last_rtaudio_error()) + _("Could not set up audio output. There will be no audio during the preview."), std_to_wx(audio.last_rtaudio_error()) ); } #else unsigned int st = 0; if (Config::instance()->sound_output()) { - while (st < _audio.getDeviceCount()) { + while (st < audio.getDeviceCount()) { try { - if (_audio.getDeviceInfo(st).name == Config::instance()->sound_output().get()) { + if (audio.getDeviceInfo(st).name == Config::instance()->sound_output().get()) { break; } } catch (RtAudioError&) { @@ -663,28 +649,28 @@ FilmViewer::config_changed (Config::Property p) } ++st; } - if (st == _audio.getDeviceCount()) { + if (st == audio.getDeviceCount()) { try { - st = _audio.getDefaultOutputDevice(); + st = audio.getDefaultOutputDevice(); } catch (RtAudioError&) { /* Something went wrong with that device so we don't want to use it anyway */ } } } else { try { - st = _audio.getDefaultOutputDevice(); + st = audio.getDefaultOutputDevice(); } catch (RtAudioError&) { /* Something went wrong with that device so we don't want to use it anyway */ } } try { - _audio_channels = _audio.getDeviceInfo(st).outputChannels; + _audio_channels = audio.getDeviceInfo(st).outputChannels; RtAudio::StreamParameters sp; sp.deviceId = st; sp.nChannels = _audio_channels; sp.firstChannel = 0; - _audio.openStream (&sp, 0, RTAUDIO_FLOAT32, 48000, &_audio_block_size, &rtaudio_callback, this); + audio.openStream(&sp, 0, RTAUDIO_FLOAT32, 48000, &_audio_block_size, &rtaudio_callback, this); } catch (RtAudioError& e) { _audio_channels = 0; error_dialog ( @@ -705,8 +691,10 @@ FilmViewer::config_changed (Config::Property p) DCPTime FilmViewer::uncorrected_time () const { - if (_audio.isStreamRunning()) { - return DCPTime::from_seconds (const_cast<RtAudio*>(&_audio)->getStreamTime()); + auto& audio = AudioBackend::instance()->rtaudio(); + + if (audio.isStreamRunning()) { + return DCPTime::from_seconds(audio.getStreamTime()); } return _video_view->position(); @@ -716,11 +704,13 @@ FilmViewer::uncorrected_time () const optional<DCPTime> FilmViewer::audio_time () const { - if (!_audio.isStreamRunning()) { + auto& audio = AudioBackend::instance()->rtaudio(); + + if (!audio.isStreamRunning()) { return {}; } - return DCPTime::from_seconds (const_cast<RtAudio*>(&_audio)->getStreamTime ()) - + return DCPTime::from_seconds(audio.getStreamTime()) - DCPTime::from_frames (average_latency(), _film->audio_frame_rate()); } @@ -744,13 +734,15 @@ FilmViewer::audio_callback (void* out_p, unsigned int frames) /* The audio we just got was (very) late; drop it and get some more. */ } - boost::mutex::scoped_lock lm (_latency_history_mutex, boost::try_to_lock); - if (lm) { - _latency_history.push_back (_audio.getStreamLatency ()); - if (_latency_history.size() > static_cast<size_t> (_latency_history_count)) { - _latency_history.pop_front (); - } - } + auto& audio = AudioBackend::instance()->rtaudio(); + + boost::mutex::scoped_lock lm (_latency_history_mutex, boost::try_to_lock); + if (lm) { + _latency_history.push_back(audio.getStreamLatency()); + if (_latency_history.size() > static_cast<size_t> (_latency_history_count)) { + _latency_history.pop_front (); + } + } return 0; } @@ -900,7 +892,6 @@ FilmViewer::unset_crop_guess () _video_view->update (); } - shared_ptr<DCPContent> FilmViewer::dcp() const { @@ -913,22 +904,3 @@ FilmViewer::dcp() const return {}; } - - -#if (RTAUDIO_VERSION_MAJOR >= 6) -void -FilmViewer::rtaudio_error_callback(string const& error) -{ - boost::mutex::scoped_lock lm(_last_rtaudio_error_mutex); - _last_rtaudio_error = error; -} - - -string -FilmViewer::last_rtaudio_error() const -{ - boost::mutex::scoped_lock lm(_last_rtaudio_error_mutex); - return _last_rtaudio_error; -} -#endif - |
