1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2020 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker #pragma once 8*c8dee2aaSAndroid Build Coastguard Worker 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkData.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 11*c8dee2aaSAndroid Build Coastguard Worker 12*c8dee2aaSAndroid Build Coastguard Worker class SK_API SkAudioPlayer { 13*c8dee2aaSAndroid Build Coastguard Worker public: 14*c8dee2aaSAndroid Build Coastguard Worker virtual ~SkAudioPlayer(); 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker // Returns null on failure (possibly unknown format?) 17*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<SkAudioPlayer> Make(sk_sp<SkData>); 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker // in seconds duration()20*c8dee2aaSAndroid Build Coastguard Worker double duration() const { return this->onGetDuration(); } time()21*c8dee2aaSAndroid Build Coastguard Worker double time() const { return this->onGetTime(); } // 0...duration() 22*c8dee2aaSAndroid Build Coastguard Worker double setTime(double); // returns actual time 23*c8dee2aaSAndroid Build Coastguard Worker normalizedTime()24*c8dee2aaSAndroid Build Coastguard Worker double normalizedTime() const { return this->time() / this->duration(); } 25*c8dee2aaSAndroid Build Coastguard Worker double setNormalizedTime(double t); 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker enum class State { 28*c8dee2aaSAndroid Build Coastguard Worker kPlaying, 29*c8dee2aaSAndroid Build Coastguard Worker kStopped, 30*c8dee2aaSAndroid Build Coastguard Worker kPaused, 31*c8dee2aaSAndroid Build Coastguard Worker }; state()32*c8dee2aaSAndroid Build Coastguard Worker State state() const { return fState; } volume()33*c8dee2aaSAndroid Build Coastguard Worker float volume() const { return fVolume; } // 0...1 rate()34*c8dee2aaSAndroid Build Coastguard Worker float rate() const { return fRate; } // multiplier (e.g. 1.0 is default) 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker State setState(State); // returns actual State 37*c8dee2aaSAndroid Build Coastguard Worker float setRate(float); // returns actual rate 38*c8dee2aaSAndroid Build Coastguard Worker float setVolume(float); // returns actual volume 39*c8dee2aaSAndroid Build Coastguard Worker play()40*c8dee2aaSAndroid Build Coastguard Worker void play() { this->setState(State::kPlaying); } pause()41*c8dee2aaSAndroid Build Coastguard Worker void pause() { this->setState(State::kPaused); } stop()42*c8dee2aaSAndroid Build Coastguard Worker void stop() { this->setState(State::kStopped); } 43*c8dee2aaSAndroid Build Coastguard Worker isPlaying()44*c8dee2aaSAndroid Build Coastguard Worker bool isPlaying() const { return this->state() == State::kPlaying; } isPaused()45*c8dee2aaSAndroid Build Coastguard Worker bool isPaused() const { return this->state() == State::kPaused; } isStopped()46*c8dee2aaSAndroid Build Coastguard Worker bool isStopped() const { return this->state() == State::kStopped; } 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker protected: SkAudioPlayer()49*c8dee2aaSAndroid Build Coastguard Worker SkAudioPlayer() {} // only called by subclasses 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker virtual double onGetDuration() const = 0; 52*c8dee2aaSAndroid Build Coastguard Worker virtual double onGetTime() const = 0; 53*c8dee2aaSAndroid Build Coastguard Worker virtual double onSetTime(double) = 0; 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker virtual State onSetState(State) = 0; 56*c8dee2aaSAndroid Build Coastguard Worker virtual float onSetRate(float) = 0; 57*c8dee2aaSAndroid Build Coastguard Worker virtual float onSetVolume(float) = 0; 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker private: 60*c8dee2aaSAndroid Build Coastguard Worker State fState = State::kStopped; 61*c8dee2aaSAndroid Build Coastguard Worker float fRate = 1.0f; 62*c8dee2aaSAndroid Build Coastguard Worker float fVolume = 1.0f; 63*c8dee2aaSAndroid Build Coastguard Worker }; 64