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