diff options
| author | Carl Hetherington <cth@carlh.net> | 2023-11-30 22:15:46 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2023-11-30 22:15:48 +0100 |
| commit | 595d3ce932864fa5fb35cf9f52ac50178b8bd173 (patch) | |
| tree | ef15a89002c252f674a1a785708b516159d335dc /src/wx/film_viewer.cc | |
| parent | a467249e1eb0dd1c19be19d040b9ded2eee42ef9 (diff) | |
Support RtAudio >= 6.
There's an API break, mostly about removing the use of exceptions.
Diffstat (limited to 'src/wx/film_viewer.cc')
| -rw-r--r-- | src/wx/film_viewer.cc | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index 72193fbad..b6f8096e8 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -86,7 +86,11 @@ 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)) { #if wxCHECK_VERSION(3, 1, 0) @@ -351,6 +355,15 @@ 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) { + _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()) + ); + } +#else try { _audio.startStream (); } catch (RtAudioError& e) { @@ -360,6 +373,7 @@ FilmViewer::start_audio_stream_if_open () _("There was a problem starting audio playback. Please try another audio output device in Preferences."), std_to_wx(e.what()) ); } +#endif } } @@ -609,6 +623,33 @@ FilmViewer::config_changed (Config::Property p) } 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()) { + chosen_device_id = device_id; + break; + } + } + } + + if (!chosen_device_id) { + chosen_device_id = _audio.getDefaultOutputDevice(); + } + _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) { + _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()) + ); + } +#else unsigned int st = 0; if (Config::instance()->sound_output()) { while (st < _audio.getDeviceCount()) { @@ -650,6 +691,7 @@ FilmViewer::config_changed (Config::Property p) _("Could not set up audio output. There will be no audio during the preview."), std_to_wx(e.what()) ); } +#endif destroy_and_maybe_create_butler(); } else { @@ -856,3 +898,21 @@ FilmViewer::unset_crop_guess () _video_view->update (); } + +#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 + |
