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#pragma once 8cb93a386Sopenharmony_ci 9cb93a386Sopenharmony_ci#include "include/core/SkData.h" 10cb93a386Sopenharmony_ci#include <memory> 11cb93a386Sopenharmony_ci 12cb93a386Sopenharmony_ciclass SK_API SkAudioPlayer { 13cb93a386Sopenharmony_cipublic: 14cb93a386Sopenharmony_ci virtual ~SkAudioPlayer(); 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_ci // Returns null on failure (possibly unknown format?) 17cb93a386Sopenharmony_ci static std::unique_ptr<SkAudioPlayer> Make(sk_sp<SkData>); 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_ci // in seconds 20cb93a386Sopenharmony_ci double duration() const { return this->onGetDuration(); } 21cb93a386Sopenharmony_ci double time() const { return this->onGetTime(); } // 0...duration() 22cb93a386Sopenharmony_ci double setTime(double); // returns actual time 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_ci double normalizedTime() const { return this->time() / this->duration(); } 25cb93a386Sopenharmony_ci double setNormalizedTime(double t); 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ci enum class State { 28cb93a386Sopenharmony_ci kPlaying, 29cb93a386Sopenharmony_ci kStopped, 30cb93a386Sopenharmony_ci kPaused, 31cb93a386Sopenharmony_ci }; 32cb93a386Sopenharmony_ci State state() const { return fState; } 33cb93a386Sopenharmony_ci float volume() const { return fVolume; } // 0...1 34cb93a386Sopenharmony_ci float rate() const { return fRate; } // multiplier (e.g. 1.0 is default) 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_ci State setState(State); // returns actual State 37cb93a386Sopenharmony_ci float setRate(float); // returns actual rate 38cb93a386Sopenharmony_ci float setVolume(float); // returns actual volume 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci void play() { this->setState(State::kPlaying); } 41cb93a386Sopenharmony_ci void pause() { this->setState(State::kPaused); } 42cb93a386Sopenharmony_ci void stop() { this->setState(State::kStopped); } 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ci bool isPlaying() const { return this->state() == State::kPlaying; } 45cb93a386Sopenharmony_ci bool isPaused() const { return this->state() == State::kPaused; } 46cb93a386Sopenharmony_ci bool isStopped() const { return this->state() == State::kStopped; } 47cb93a386Sopenharmony_ci 48cb93a386Sopenharmony_ciprotected: 49cb93a386Sopenharmony_ci SkAudioPlayer() {} // only called by subclasses 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ci virtual double onGetDuration() const = 0; 52cb93a386Sopenharmony_ci virtual double onGetTime() const = 0; 53cb93a386Sopenharmony_ci virtual double onSetTime(double) = 0; 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ci virtual State onSetState(State) = 0; 56cb93a386Sopenharmony_ci virtual float onSetRate(float) = 0; 57cb93a386Sopenharmony_ci virtual float onSetVolume(float) = 0; 58cb93a386Sopenharmony_ci 59cb93a386Sopenharmony_ciprivate: 60cb93a386Sopenharmony_ci State fState = State::kStopped; 61cb93a386Sopenharmony_ci float fRate = 1.0f; 62cb93a386Sopenharmony_ci float fVolume = 1.0f; 63cb93a386Sopenharmony_ci}; 64