Skip to content

Commit 5f2b423

Browse files
authored
Merge pull request #176 from kenmcgaugh/feature_custom_thumbnails
Feature to allow for custom thumbnail images.
2 parents bdbbdae + 6fe1a2e commit 5f2b423

File tree

5 files changed

+50
-17
lines changed

5 files changed

+50
-17
lines changed

include/xstudio/media/enums.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
namespace xstudio {
55
namespace media {
66

7-
typedef enum { MT_IMAGE = 0x1L, MT_AUDIO = 0x2L } MediaType;
7+
typedef enum { MT_IMAGE = 0x1L, MT_AUDIO = 0x2L, MT_THUMBNAIL = 0x3L } MediaType;
88
typedef enum {
99
MS_ONLINE = 0x0L,
1010
MS_MISSING = 0x01L,

include/xstudio/media/media.hpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ namespace media {
3636
case MT_AUDIO:
3737
str = "Audio";
3838
break;
39+
case MT_THUMBNAIL:
40+
str = "Thumbnail";
41+
break;
3942
}
4043
return str;
4144
}
@@ -403,7 +406,16 @@ namespace media {
403406
bool set_current(const utility::Uuid &uuid, const MediaType mt = MediaType::MT_IMAGE);
404407
[[nodiscard]] bool empty() const { return media_sources_.empty(); }
405408
[[nodiscard]] utility::Uuid current(const MediaType mt = MediaType::MT_IMAGE) const {
406-
return mt == MediaType::MT_IMAGE ? current_image_source_ : current_audio_source_;
409+
switch (mt) {
410+
case MediaType::MT_IMAGE:
411+
return current_image_source_;
412+
case MediaType::MT_AUDIO:
413+
return current_audio_source_;
414+
case MediaType::MT_THUMBNAIL:
415+
return current_thumbnail_source_;
416+
default:
417+
return utility::Uuid();
418+
}
407419
}
408420
[[nodiscard]] const std::list<utility::Uuid> &media_sources() const {
409421
return media_sources_;
@@ -419,6 +431,7 @@ namespace media {
419431
// will need extending.., tagging ?
420432
utility::Uuid current_image_source_;
421433
utility::Uuid current_audio_source_;
434+
utility::Uuid current_thumbnail_source_;
422435
std::string flag_{"#00000000"};
423436
std::string flag_text_{""};
424437
std::list<utility::Uuid> media_sources_;

src/media/src/media.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,17 +74,26 @@ void Media::remove_media_source(const Uuid &uuid) {
7474
else
7575
current_audio_source_ = Uuid();
7676
}
77+
if (uuid == current_thumbnail_source_)
78+
current_thumbnail_source_ = Uuid();
7779
}
7880

7981
bool Media::set_current(const Uuid &uuid, const MediaType mt) {
8082
if (std::find(media_sources_.begin(), media_sources_.end(), uuid) !=
8183
std::end(media_sources_)) {
82-
if (mt == MediaType::MT_IMAGE) {
84+
switch (mt) {
85+
case MediaType::MT_IMAGE:
8386
current_image_source_ = uuid;
84-
} else {
87+
return true;
88+
case MediaType::MT_AUDIO:
8589
current_audio_source_ = uuid;
90+
return true;
91+
case MediaType::MT_THUMBNAIL:
92+
current_thumbnail_source_ = uuid;
93+
return true;
94+
default:
95+
return false;
8696
}
87-
return true;
8897
}
8998
return false;
9099
}

src/media/src/media_actor.cpp

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -579,12 +579,15 @@ caf::message_handler MediaActor::message_handler() {
579579

580580
[=](media_reader::get_thumbnail_atom,
581581
float position) -> result<thumbnail::ThumbnailBufferPtr> {
582-
if (base_.empty() or not media_sources_.count(base_.current(MT_IMAGE)))
582+
auto tu = base_.current(MT_THUMBNAIL);
583+
if (not tu)
584+
tu = base_.current(MT_IMAGE);
585+
if (base_.empty() or not tu)
583586
return make_error(xstudio_error::error, "No MediaSources");
584587

585588
auto rp = make_response_promise<thumbnail::ThumbnailBufferPtr>();
586589
mail(media_reader::get_thumbnail_atom_v, position)
587-
.request(media_sources_.at(base_.current(media::MT_IMAGE)), infinite)
590+
.request(media_sources_.at(tu), infinite)
588591
.then(
589592
[=](thumbnail::ThumbnailBufferPtr &buf) mutable {
590593
rp.deliver(buf);
@@ -959,21 +962,22 @@ caf::message_handler MediaActor::message_handler() {
959962
auto rp =
960963
make_response_promise<std::vector<std::pair<utility::Uuid, std::string>>>();
961964

962-
// make a vector of our MediaSourceActor(s)
963-
auto sources = map_value_to_vec(media_sources_);
965+
// get the uuid of the current thumbnail, if set
966+
const auto tu = base_.current(MT_THUMBNAIL);
964967

965968
// here we remove sources that don't contain any streams matching 'mt'
966969
// i.e. mt = MT_IMAGE and a source only provides audio streams then
967970
// we exclude it from 'sources'
971+
auto sources = std::vector<caf::actor>();
972+
sources.reserve(media_sources_.size());
968973
caf::scoped_actor sys(system());
969-
auto p = sources.begin();
970-
while (p != sources.end()) {
974+
for (const auto &[u, a] : media_sources_) {
975+
if (u == tu)
976+
continue;
971977
auto stream_details = request_receive<std::vector<ContainerDetail>>(
972-
*sys, *p, utility::detail_atom_v, mt);
973-
if (stream_details.empty())
974-
p = sources.erase(p);
975-
else
976-
p++;
978+
*sys, a, utility::detail_atom_v, mt);
979+
if (not stream_details.empty() and u != tu)
980+
sources.push_back(a);
977981
}
978982

979983
if (sources.empty()) {
@@ -2071,6 +2075,8 @@ void MediaActor::duplicate(
20712075
for (const auto &i : base_.media_sources())
20722076
new_media_srcs.push_back(dmedia_srcs_map[i]);
20732077

2078+
auto tu = base_.current(MT_THUMBNAIL);
2079+
20742080
// bulk add srcs.
20752081
mail(add_media_source_atom_v, new_media_srcs)
20762082
.request(actor, infinite)
@@ -2087,6 +2093,10 @@ void MediaActor::duplicate(
20872093
.request(actor, infinite)
20882094
.then(
20892095
[=](const bool) mutable {
2096+
if (tu)
2097+
anon_mail(current_media_source_atom_v,
2098+
dmedia_srcs_map[tu].uuid(), MT_THUMBNAIL)
2099+
.send(actor);
20902100
auto uua =
20912101
UuidUuidActor(base_.uuid(), UuidActor(uuid, actor));
20922102

src/ui/qml/session/src/session_model_handler_ui.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,8 @@ void SessionModel::init(caf::actor_system &_system) {
616616
auto plindex = getPlaylistIndex(media_index);
617617

618618
// trigger model update.
619-
if (mt == media::MediaType::MT_IMAGE) {
619+
if (mt == media::MediaType::MT_IMAGE or
620+
mt == media::MediaType::MT_THUMBNAIL) {
620621
receivedData(
621622
json(src_str),
622623
actorRole,

0 commit comments

Comments
 (0)