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.

69 lines
1.6 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.
*/
#include "include/core/SkData.h"
#include "modules/audioplayer/SkAudioPlayer.h"
#include <SFML/Audio.hpp>
namespace {
class SFMLAudioPlayer final : public SkAudioPlayer {
public:
explicit SFMLAudioPlayer(sk_sp<SkData> data)
: fData(std::move(data))
{
fMusic.openFromMemory(fData->data(), fData->size());
}
private:
double onGetDuration() const override {
return static_cast<double>(fMusic.getDuration().asSeconds());
}
double onGetTime() const override {
return static_cast<double>(fMusic.getPlayingOffset().asSeconds());
}
double onSetTime(double t) override {
fMusic.setPlayingOffset(sf::seconds(static_cast<float>(t)));
return this->onGetTime();
}
State onSetState(State state) override {
switch (state) {
case State::kPlaying: fMusic.play(); break;
case State::kStopped: fMusic.stop(); break;
case State::kPaused : fMusic.pause(); break;
}
return state;
}
float onSetRate(float r) override {
fMusic.setPitch(r);
return r;
}
float onSetVolume(float v) override {
fMusic.setVolume(v * 100);
return v;
}
const sk_sp<SkData> fData;
sf::Music fMusic;
};
} // namespace
std::unique_ptr<SkAudioPlayer> SkAudioPlayer::Make(sk_sp<SkData> src) {
auto player = std::make_unique<SFMLAudioPlayer>(std::move(src));
return player->duration() > 0 ? std::move(player) : nullptr;
}