Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit cc01311

Browse files
fmalitaSkia Commit-Bot
authored andcommitted
[skottie] Add audio track support to viewer
Based on SkAudioPlayer, Mac-only for now. Change-Id: Ic4b0e2814aa341586634cbd270d7afd90e32716b Reviewed-on: https://skia-review.googlesource.com/c/skia/+/310056 Commit-Queue: Florin Malita <fmalita@chromium.org> Commit-Queue: Florin Malita <fmalita@google.com> Reviewed-by: Mike Reed <reed@google.com>
1 parent 3637440 commit cc01311

File tree

1 file changed

+55
-1
lines changed

1 file changed

+55
-1
lines changed

tools/viewer/SkottieSlide.cpp

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "include/core/SkCanvas.h"
1313
#include "include/core/SkFont.h"
1414
#include "include/core/SkTime.h"
15+
#include "include/ports/SkAudioPlayer.h"
1516
#include "modules/skottie/include/Skottie.h"
1617
#include "modules/skottie/utils/SkottieUtils.h"
1718
#include "modules/skresources/include/SkResources.h"
@@ -22,6 +23,58 @@
2223

2324
#include "imgui.h"
2425

26+
namespace {
27+
28+
class Track final : public skresources::ExternalTrackAsset {
29+
public:
30+
explicit Track(std::unique_ptr<SkAudioPlayer> player) : fPlayer(std::move(player)) {}
31+
32+
private:
33+
void seek(float t) override {
34+
if (fPlayer->isStopped() && t >=0) {
35+
fPlayer->play();
36+
}
37+
38+
if (fPlayer->isPlaying()) {
39+
if (t < 0) {
40+
fPlayer->stop();
41+
} else {
42+
static constexpr float kTolerance = 0.075f;
43+
const auto player_pos = fPlayer->time();
44+
45+
if (std::abs(player_pos - t) > kTolerance) {
46+
fPlayer->setTime(t);
47+
}
48+
}
49+
}
50+
}
51+
52+
const std::unique_ptr<SkAudioPlayer> fPlayer;
53+
};
54+
55+
class AudioProviderProxy final : public skresources::ResourceProviderProxyBase {
56+
public:
57+
explicit AudioProviderProxy(sk_sp<skresources::ResourceProvider> rp)
58+
: INHERITED(std::move(rp)) {}
59+
60+
private:
61+
sk_sp<skresources::ExternalTrackAsset> loadAudioAsset(const char path[],
62+
const char name[],
63+
const char[] /*id*/) override {
64+
if (auto data = this->load(path, name)) {
65+
if (auto player = SkAudioPlayer::Make(std::move(data))) {
66+
return sk_make_sp<Track>(std::move(player));
67+
}
68+
}
69+
70+
return nullptr;
71+
}
72+
73+
using INHERITED = skresources::ResourceProviderProxyBase;
74+
};
75+
76+
} // namespace
77+
2578
static void draw_stats_box(SkCanvas* canvas, const skottie::Animation::Builder::Stats& stats) {
2679
static constexpr SkRect kR = { 10, 10, 280, 120 };
2780
static constexpr SkScalar kTextSize = 20;
@@ -104,10 +157,11 @@ void SkottieSlide::load(SkScalar w, SkScalar h) {
104157
skottie::Animation::Builder builder(flags);
105158

106159
auto resource_provider =
160+
sk_make_sp<AudioProviderProxy>(
107161
skresources::DataURIResourceProviderProxy::Make(
108162
skresources::FileResourceProvider::Make(SkOSPath::Dirname(fPath.c_str()),
109163
/*predecode=*/true),
110-
/*predecode=*/true);
164+
/*predecode=*/true));
111165

112166
static constexpr char kInterceptPrefix[] = "__";
113167
auto precomp_interceptor =

0 commit comments

Comments
 (0)