_sound_output_details->SetFont (font);
RtAudio audio (DCPOMATIC_RTAUDIO_API);
+#if (RTAUDIO_VERSION_MAJOR >= 6)
+ for (auto device_id: audio.getDeviceIds()) {
+ auto dev = audio.getDeviceInfo(device_id);
+ if (dev.outputChannels > 0) {
+ _sound_output->Append(std_to_wx(dev.name));
+ }
+ }
+#else
for (unsigned int i = 0; i < audio.getDeviceCount(); ++i) {
try {
auto dev = audio.getDeviceInfo (i);
/* Something went wrong so let's just ignore that device */
}
}
+#endif
_sound->bind(&SoundPage::sound_changed, this);
_sound_output->Bind (wxEVT_CHOICE, bind(&SoundPage::sound_output_changed, this));
RtAudio audio (DCPOMATIC_RTAUDIO_API);
auto const so = get_sound_output();
string default_device;
+#if (RTAUDIO_VERSION_MAJOR >= 6)
+ default_device = audio.getDeviceInfo(audio.getDefaultOutputDevice()).name;
+#else
try {
default_device = audio.getDeviceInfo(audio.getDefaultOutputDevice()).name;
} catch (RtAudioError&) {
/* Never mind */
}
+#endif
if (!so || *so == default_device) {
Config::instance()->unset_sound_output ();
} else {
} else {
/* No configured output means we should use the default */
RtAudio audio (DCPOMATIC_RTAUDIO_API);
+#if (RTAUDIO_VERSION_MAJOR >= 6)
+ configured_so = audio.getDeviceInfo(audio.getDefaultOutputDevice()).name;
+#else
try {
configured_so = audio.getDeviceInfo(audio.getDefaultOutputDevice()).name;
} catch (RtAudioError&) {
/* Probably no audio devices at all */
}
+#endif
}
if (configured_so && current_so != configured_so) {
int channels = 0;
if (configured_so) {
+#if (RTAUDIO_VERSION_MAJOR >= 6)
+ for (auto device_id: audio.getDeviceIds()) {
+ auto info = audio.getDeviceInfo(device_id);
+ if (info.name == *configured_so && info.outputChannels > 0) {
+ channels = info.outputChannels;
+ }
+ }
+#else
for (unsigned int i = 0; i < audio.getDeviceCount(); ++i) {
try {
auto info = audio.getDeviceInfo(i);
/* Never mind */
}
}
+#endif
}
_sound_output_details->SetLabel (
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)
{
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) {
_("There was a problem starting audio playback. Please try another audio output device in Preferences."), std_to_wx(e.what())
);
}
+#endif
}
}
}
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()) {
_("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 {
_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
+