summaryrefslogtreecommitdiff
path: root/src/wx/film_viewer.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2024-07-26 11:47:24 +0200
committerCarl Hetherington <cth@carlh.net>2024-07-26 11:47:24 +0200
commit95abcc7d18997c1391423d15506bf03ab20997e6 (patch)
tree64fc82bdb7b45275436e1216d81847087ffb1788 /src/wx/film_viewer.cc
parent4d721e683b584fe48e7905e44ab3da23afe76145 (diff)
parent98b7a493933a5a47c6e1abb21ef2710ad2730a0e (diff)
Merge branch 'main' into v2.17.x
Diffstat (limited to 'src/wx/film_viewer.cc')
-rw-r--r--src/wx/film_viewer.cc126
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
-