| /* | |
| * Copyright 2020 Google LLC | |
| * | |
| * 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; | |
| } |