summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2024-05-17 15:02:57 +0200
committerCarl Hetherington <cth@carlh.net>2024-05-17 15:02:57 +0200
commitafd18ea6b14373b2078b6d6dbc74c836e6843757 (patch)
tree199edfd0ec9aa4353f64b0f7313ec8f7cf70a7b4
parent7a9cadc6fe86c74035dd971685b1acdc8f32d3fc (diff)
Make sure we don't say some content has audio if none will be emitted.
In the FFmpeg (and shortly DCP) case we don't emit any audio if none is mapped, so we must take this into account in the player.
-rw-r--r--src/lib/player.cc2
-rw-r--r--test/player_test.cc19
2 files changed, 20 insertions, 1 deletions
diff --git a/src/lib/player.cc b/src/lib/player.cc
index 91a51c67f..27c89a2fa 100644
--- a/src/lib/player.cc
+++ b/src/lib/player.cc
@@ -251,7 +251,7 @@ have_video (shared_ptr<const Content> content)
bool
have_audio (shared_ptr<const Content> content)
{
- return static_cast<bool>(content->audio) && content->can_be_played();
+ return static_cast<bool>(content->audio) && !content->audio->mapping().mapped_output_channels().empty() && content->can_be_played();
}
diff --git a/test/player_test.cc b/test/player_test.cc
index 5120c0180..a13b50352 100644
--- a/test/player_test.cc
+++ b/test/player_test.cc
@@ -30,6 +30,7 @@
#include "lib/butler.h"
#include "lib/compose.hpp"
#include "lib/config.h"
+#include "lib/constants.h"
#include "lib/content_factory.h"
#include "lib/cross.h"
#include "lib/dcp_content.h"
@@ -710,3 +711,21 @@ BOOST_AUTO_TEST_CASE(three_d_in_two_d_chooses_left)
while (!player->pass()) {}
}
+
+BOOST_AUTO_TEST_CASE(unmapped_audio_does_not_raise_buffer_error)
+{
+ auto content = content_factory(TestPaths::private_data() / "arrietty_JP-EN.mkv")[0];
+ auto film = new_test_film2("unmapped_audio_does_not_raise_buffer_error", { content });
+
+ content->audio->set_mapping(AudioMapping(6 * 2, MAX_DCP_AUDIO_CHANNELS));
+
+ Player player(film, Image::Alignment::COMPACT);
+ Butler butler(film, player, AudioMapping(), 2, bind(PlayerVideo::force, AV_PIX_FMT_RGB24), VideoRange::FULL, Image::Alignment::PADDED, true, false, Butler::Audio::ENABLED);
+
+ /* Wait for the butler thread to run for a while; in the case under test it will throw an exception because
+ * the video buffers are filled but no audio comes.
+ */
+ dcpomatic_sleep_seconds(10);
+ butler.rethrow();
+}
+