Make sure we don't say some content has audio if none will be emitted.
authorCarl Hetherington <cth@carlh.net>
Fri, 17 May 2024 13:02:57 +0000 (15:02 +0200)
committerCarl Hetherington <cth@carlh.net>
Fri, 17 May 2024 13:02:57 +0000 (15:02 +0200)
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.

src/lib/player.cc
test/player_test.cc

index 91a51c67f305e31e6d39cd2fd0cc8d75b5a0458f..27c89a2fa2f63a1235c7982076bfb8c8a62b94db 100644 (file)
@@ -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();
 }
 
 
index 5120c018018e02c172ef59d5b5375409acf73a90..a13b50352733ffc15d485e46011a5929079d8f70 100644 (file)
@@ -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();
+}
+