audio_fill_towards += DCPTime::from_seconds (earliest->content->audio->delay() / 1000.0);
}
- if (audio_fill_from && audio_fill_from < audio_fill_towards) {
+ if (audio_fill_from && audio_fill_from < audio_fill_towards && ((audio_fill_towards - *audio_fill_from) >= one_video_frame())) {
DCPTimePeriod period (*audio_fill_from, audio_fill_towards);
if (period.duration() > one_video_frame()) {
period.to = period.from + one_video_frame();
Player::emit_audio (shared_ptr<AudioBuffers> data, DCPTime time)
{
Audio (data, time);
- _last_audio_time = time + DCPTime::from_frames (data->frames(), _film->audio_frame_rate ());
+ _last_audio_time = time + DCPTime::from_frames (data->frames(), _film->audio_frame_rate());
}
void
checked_set (_preview_sound, config->preview_sound());
optional<string> const current_so = get_preview_sound_output ();
- string configured_so;
+ optional<string> configured_so;
if (config->preview_sound_output()) {
configured_so = config->preview_sound_output().get();
} else {
/* No configured output means we should use the default */
RtAudio audio (DCPOMATIC_RTAUDIO_API);
- configured_so = audio.getDeviceInfo(audio.getDefaultOutputDevice()).name;
+ try {
+ configured_so = audio.getDeviceInfo(audio.getDefaultOutputDevice()).name;
+ } catch (RtAudioError& e) {
+ /* Probably no audio devices at all */
+ }
}
- if (!current_so || *current_so != configured_so) {
+ if (configured_so && current_so != configured_so) {
/* Update _preview_sound_output with the configured value */
unsigned int i = 0;
while (i < _preview_sound_output->GetCount()) {
- if (_preview_sound_output->GetString(i) == std_to_wx(configured_so)) {
+ if (_preview_sound_output->GetString(i) == std_to_wx(*configured_so)) {
_preview_sound_output->SetSelection (i);
break;
}