|
12 | 12 | #include "include/core/SkCanvas.h" |
13 | 13 | #include "include/core/SkFont.h" |
14 | 14 | #include "include/core/SkTime.h" |
| 15 | +#include "include/ports/SkAudioPlayer.h" |
15 | 16 | #include "modules/skottie/include/Skottie.h" |
16 | 17 | #include "modules/skottie/utils/SkottieUtils.h" |
17 | 18 | #include "modules/skresources/include/SkResources.h" |
|
22 | 23 |
|
23 | 24 | #include "imgui.h" |
24 | 25 |
|
| 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 | + |
25 | 78 | static void draw_stats_box(SkCanvas* canvas, const skottie::Animation::Builder::Stats& stats) { |
26 | 79 | static constexpr SkRect kR = { 10, 10, 280, 120 }; |
27 | 80 | static constexpr SkScalar kTextSize = 20; |
@@ -104,10 +157,11 @@ void SkottieSlide::load(SkScalar w, SkScalar h) { |
104 | 157 | skottie::Animation::Builder builder(flags); |
105 | 158 |
|
106 | 159 | auto resource_provider = |
| 160 | + sk_make_sp<AudioProviderProxy>( |
107 | 161 | skresources::DataURIResourceProviderProxy::Make( |
108 | 162 | skresources::FileResourceProvider::Make(SkOSPath::Dirname(fPath.c_str()), |
109 | 163 | /*predecode=*/true), |
110 | | - /*predecode=*/true); |
| 164 | + /*predecode=*/true)); |
111 | 165 |
|
112 | 166 | static constexpr char kInterceptPrefix[] = "__"; |
113 | 167 | auto precomp_interceptor = |
|
0 commit comments