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#if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ci#ifdef SK_BUILD_FOR_MAC 14cb93a386Sopenharmony_ci#include <AVFoundation/AVFoundation.h> 15cb93a386Sopenharmony_ci#endif 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_ci#ifdef SK_BUILD_FOR_IOS 18cb93a386Sopenharmony_ci// ??? 19cb93a386Sopenharmony_ci#endif 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_ciclass SkAudioPlayer_Mac : public SkAudioPlayer { 22cb93a386Sopenharmony_cipublic: 23cb93a386Sopenharmony_ci SkAudioPlayer_Mac(AVAudioPlayer* player, sk_sp<SkData> data) 24cb93a386Sopenharmony_ci : fPlayer(player) 25cb93a386Sopenharmony_ci , fData(std::move(data)) 26cb93a386Sopenharmony_ci { 27cb93a386Sopenharmony_ci fPlayer.enableRate = YES; 28cb93a386Sopenharmony_ci [fPlayer prepareToPlay]; 29cb93a386Sopenharmony_ci } 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ci ~SkAudioPlayer_Mac() override { 32cb93a386Sopenharmony_ci // [fPlayer release]; 33cb93a386Sopenharmony_ci } 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ci double onGetDuration() const override { return [fPlayer duration]; } 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ci double onGetTime() const override { return fPlayer.currentTime; } 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ci double onSetTime(double t) override { 40cb93a386Sopenharmony_ci bool wasPlaying = this->isPlaying(); 41cb93a386Sopenharmony_ci if (wasPlaying) { 42cb93a386Sopenharmony_ci [fPlayer pause]; 43cb93a386Sopenharmony_ci } 44cb93a386Sopenharmony_ci fPlayer.currentTime = t; 45cb93a386Sopenharmony_ci if (wasPlaying) { 46cb93a386Sopenharmony_ci [fPlayer play]; 47cb93a386Sopenharmony_ci } 48cb93a386Sopenharmony_ci return fPlayer.currentTime; 49cb93a386Sopenharmony_ci } 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ci 52cb93a386Sopenharmony_ci State onSetState(State state) override { 53cb93a386Sopenharmony_ci switch (state) { 54cb93a386Sopenharmony_ci case State::kPlaying: [fPlayer play]; break; 55cb93a386Sopenharmony_ci case State::kStopped: [fPlayer stop]; break; 56cb93a386Sopenharmony_ci case State::kPaused: [fPlayer pause]; break; 57cb93a386Sopenharmony_ci } 58cb93a386Sopenharmony_ci return state; 59cb93a386Sopenharmony_ci } 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ci float onSetRate(float r) override { fPlayer.rate = r; return r; } 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ci float onSetVolume(float v) override { fPlayer.volume = v; return v; } 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ciprivate: 66cb93a386Sopenharmony_ci AVAudioPlayer* fPlayer; 67cb93a386Sopenharmony_ci sk_sp<SkData> fData; // we hold this onbehalf of the player's NSData 68cb93a386Sopenharmony_ci}; 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_cistd::unique_ptr<SkAudioPlayer> SkAudioPlayer::Make(sk_sp<SkData> src) { 71cb93a386Sopenharmony_ci // The NSData does not own the actual buffer (src), but our subclass will 72cb93a386Sopenharmony_ci 73cb93a386Sopenharmony_ci NSData* data = [[NSData alloc] initWithBytesNoCopy:(void*)src->data() length:src->size()]; 74cb93a386Sopenharmony_ci AVAudioPlayer* player = [[AVAudioPlayer alloc] initWithData:data error:nil]; 75cb93a386Sopenharmony_ci [data release]; 76cb93a386Sopenharmony_ci 77cb93a386Sopenharmony_ci if (player) { 78cb93a386Sopenharmony_ci return std::unique_ptr<SkAudioPlayer>(new SkAudioPlayer_Mac(player, std::move(src))); 79cb93a386Sopenharmony_ci } 80cb93a386Sopenharmony_ci return nullptr; 81cb93a386Sopenharmony_ci} 82cb93a386Sopenharmony_ci 83cb93a386Sopenharmony_ci#endif 84