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