You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
1.9 KiB

/*
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#pragma once
#include "include/core/SkData.h"
#include <memory>
class SK_API SkAudioPlayer {
public:
virtual ~SkAudioPlayer();
// Returns null on failure (possibly unknown format?)
static std::unique_ptr<SkAudioPlayer> Make(sk_sp<SkData>);
// in seconds
double duration() const { return this->onGetDuration(); }
double time() const { return this->onGetTime(); } // 0...duration()
double setTime(double); // returns actual time
double normalizedTime() const { return this->time() / this->duration(); }
double setNormalizedTime(double t);
enum class State {
kPlaying,
kStopped,
kPaused,
};
State state() const { return fState; }
float volume() const { return fVolume; } // 0...1
float rate() const { return fRate; } // multiplier (e.g. 1.0 is default)
State setState(State); // returns actual State
float setRate(float); // returns actual rate
float setVolume(float); // returns actual volume
void play() { this->setState(State::kPlaying); }
void pause() { this->setState(State::kPaused); }
void stop() { this->setState(State::kStopped); }
bool isPlaying() const { return this->state() == State::kPlaying; }
bool isPaused() const { return this->state() == State::kPaused; }
bool isStopped() const { return this->state() == State::kStopped; }
protected:
SkAudioPlayer() {} // only called by subclasses
virtual double onGetDuration() const = 0;
virtual double onGetTime() const = 0;
virtual double onSetTime(double) = 0;
virtual State onSetState(State) = 0;
virtual float onSetRate(float) = 0;
virtual float onSetVolume(float) = 0;
private:
State fState = State::kStopped;
float fRate = 1.0f;
float fVolume = 1.0f;
};