xref: /aosp_15_r20/external/skia/modules/audioplayer/SkAudioPlayer_sfml.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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 Worker std::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