xref: /aosp_15_r20/external/skia/tools/viewer/AudioSlide.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2020 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "include/core/SkCanvas.h"
9 #include "include/core/SkData.h"
10 #include "modules/audioplayer/SkAudioPlayer.h"
11 #include "src/base/SkUtils.h"
12 #include "tools/Resources.h"
13 #include "tools/viewer/ClickHandlerSlide.h"
14 
15 class AudioSlide : public ClickHandlerSlide {
16     std::unique_ptr<SkAudioPlayer> fPlayer;
17     SkRect                         fBar;
18 
19 public:
AudioSlide()20     AudioSlide() { fName = "Audio"; }
21 
load(SkScalar w,SkScalar h)22     void load(SkScalar w, SkScalar h) override {
23         auto data = SkData::MakeFromFileName("/Users/reed/skia/mp3/scott-joplin-peacherine-rag.mp3");
24         if (data) {
25             fPlayer = SkAudioPlayer::Make(data);
26 
27             SkDebugf("make: dur:%g time%g state:%d",
28                      fPlayer->duration(),
29                      fPlayer->time(),
30                      (int)fPlayer->state());
31         }
32 
33         fBar = { 10, 10, 510, 30 };
34     }
35 
draw(SkCanvas * canvas)36     void draw(SkCanvas* canvas) override {
37         if (!fPlayer) {
38             return;
39         }
40 
41         SkPaint p;
42         p.setColor(0xFFCCCCCC);
43         canvas->drawRect(fBar, p);
44 
45         p.setColor(fPlayer->isPlaying() ? SK_ColorBLUE : 0xFF8888FF);
46         SkRect r = fBar;
47         r.fRight = r.fLeft + (float)fPlayer->normalizedTime() * r.width();
48         canvas->drawRect(r, p);
49     }
50 
onChar(SkUnichar c)51     bool onChar(SkUnichar c) override {
52         if (c == ' ') {
53             switch (fPlayer->state()) {
54                 case SkAudioPlayer::State::kPlaying: fPlayer->pause(); break;
55                 case SkAudioPlayer::State::kPaused:  fPlayer->play(); break;
56                 case SkAudioPlayer::State::kStopped: fPlayer->play(); break;
57             }
58             return true;
59         }
60         return this->ClickHandlerSlide::onChar(c);
61     }
62 
onFindClickHandler(SkScalar x,SkScalar y,skui::ModifierKey)63     Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey) override {
64         if (fPlayer && fBar.contains(x, y)) {
65             bool wasPlaying = fPlayer->isPlaying();
66             if (wasPlaying) {
67                 fPlayer->pause();
68             }
69             return new Click([this, wasPlaying](Click* click) {
70                 if (fBar.contains(click->fCurr.fX, click->fCurr.fY)) {
71                     fPlayer->setNormalizedTime((click->fCurr.fX - fBar.fLeft) / fBar.width());
72                 }
73 
74                 if (click->fState == skui::InputState::kUp) {
75                     if (wasPlaying) {
76                         fPlayer->play();
77                     }
78                 }
79                 return true;
80             });
81         }
82         return nullptr;
83     }
84 
onClick(ClickHandlerSlide::Click *)85     bool onClick(ClickHandlerSlide::Click*) override { return false; }
86 
animate(double)87     bool animate(double /*nanos*/) override {
88         return true;
89     }
90 
91 };
92 
93 DEF_SLIDE( return new AudioSlide; )
94