| /* |
| * 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; |
| } |