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