1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci* Copyright 2020 Google Inc. 3cb93a386Sopenharmony_ci* 4cb93a386Sopenharmony_ci* Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci* found in the LICENSE file. 6cb93a386Sopenharmony_ci*/ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/core/SkData.h" 9cb93a386Sopenharmony_ci#include "modules/audioplayer/SkAudioPlayer.h" 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include <SFML/Audio.hpp> 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_cinamespace { 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_ciclass SFMLAudioPlayer final : public SkAudioPlayer { 16cb93a386Sopenharmony_cipublic: 17cb93a386Sopenharmony_ci explicit SFMLAudioPlayer(sk_sp<SkData> data) 18cb93a386Sopenharmony_ci : fData(std::move(data)) 19cb93a386Sopenharmony_ci { 20cb93a386Sopenharmony_ci fMusic.openFromMemory(fData->data(), fData->size()); 21cb93a386Sopenharmony_ci } 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ciprivate: 24cb93a386Sopenharmony_ci double onGetDuration() const override { 25cb93a386Sopenharmony_ci return static_cast<double>(fMusic.getDuration().asSeconds()); 26cb93a386Sopenharmony_ci } 27cb93a386Sopenharmony_ci 28cb93a386Sopenharmony_ci double onGetTime() const override { 29cb93a386Sopenharmony_ci return static_cast<double>(fMusic.getPlayingOffset().asSeconds()); 30cb93a386Sopenharmony_ci } 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_ci double onSetTime(double t) override { 33cb93a386Sopenharmony_ci fMusic.setPlayingOffset(sf::seconds(static_cast<float>(t))); 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ci return this->onGetTime(); 36cb93a386Sopenharmony_ci } 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_ci State onSetState(State state) override { 39cb93a386Sopenharmony_ci switch (state) { 40cb93a386Sopenharmony_ci case State::kPlaying: fMusic.play(); break; 41cb93a386Sopenharmony_ci case State::kStopped: fMusic.stop(); break; 42cb93a386Sopenharmony_ci case State::kPaused : fMusic.pause(); break; 43cb93a386Sopenharmony_ci } 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ci return state; 46cb93a386Sopenharmony_ci } 47cb93a386Sopenharmony_ci 48cb93a386Sopenharmony_ci float onSetRate(float r) override { 49cb93a386Sopenharmony_ci fMusic.setPitch(r); 50cb93a386Sopenharmony_ci return r; 51cb93a386Sopenharmony_ci } 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ci float onSetVolume(float v) override { 54cb93a386Sopenharmony_ci fMusic.setVolume(v * 100); 55cb93a386Sopenharmony_ci return v; 56cb93a386Sopenharmony_ci } 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ci const sk_sp<SkData> fData; 59cb93a386Sopenharmony_ci sf::Music fMusic; 60cb93a386Sopenharmony_ci}; 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ci} // namespace 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_cistd::unique_ptr<SkAudioPlayer> SkAudioPlayer::Make(sk_sp<SkData> src) { 65cb93a386Sopenharmony_ci auto player = std::make_unique<SFMLAudioPlayer>(std::move(src)); 66cb93a386Sopenharmony_ci 67cb93a386Sopenharmony_ci return player->duration() > 0 ? std::move(player) : nullptr; 68cb93a386Sopenharmony_ci} 69