LEAP Documentation 40220
Documentation for the LEAP project
MusicPlayer.h
Go to the documentation of this file.
1// Copyright Blue Isle Studios Inc 2018. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "GameFramework/Actor.h"
7#include "MusicPlayer.generated.h"
8
9#define MAX_FADE_TIME_SECONDS 10.0f
10#define MIN_CLIP_LENGTH_SECONDS 2.0f
11
12class USoundBase;
13class UAudioComponent;
14class USoundWave;
15
16USTRUCT(Blueprintable)
18{
19 GENERATED_USTRUCT_BODY()
20
21 /* The track to play */
22 UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
23 USoundBase* Track = nullptr;
24 /* Time taken to fade in this track */
25 UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, meta = (ClampMin = "0.0", ClampMax = "10.0"))
26 float FadeInTime = 1.0f;
27 /* If a track is currently playing, this is the time taken to fade it out */
28 UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, meta = (ClampMin = "0.0", ClampMax = "10.0"))
29 float FadeOutOldTrackTime = 1.0f;
30 /* Volume to play this track at */
31 UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, meta = (ClampMin = "0.0", ClampMax = "1.0"))
32 float Volume = 1.0f;
33 /* The music player will begin playing music from it's tracklist (if there are any in its list) after this track completes. This will also prevent queued tracks from playing if false */
34 UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
35 bool bPlayTrackListAfterTrackCompletion = true;
36 /* Should we wait after playing this track before playing the next? */
37 UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, meta = (EditCondition="bPlayTrackListAfterTrackCompletion"))
38 FVector2D PostTrackDelay = FVector2D(0.0f, 0.0f);
39 /* The music player will wait for the current track to finish playing before this track begins. */
40 UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
41 bool bQueueTrack = true;
42 /* Should we keep this track in the tracklist after playing or is this a one-shot? Be aware that SetTrackList clobbers this. */
43 UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
44 bool bDiscardTrackAfterPlay = false;
45
46 float CalculatedPostTrackDelay = 0.0f;
47
48 void operator=(const FTrackPlayInfo& Other)
49 {
50 Track = Other.Track;
51 FadeInTime = Other.FadeInTime;
52 FadeOutOldTrackTime = Other.FadeOutOldTrackTime;
53 Volume = Other.Volume;
54 bPlayTrackListAfterTrackCompletion = Other.bPlayTrackListAfterTrackCompletion;
55 bQueueTrack = Other.bQueueTrack;
56 bDiscardTrackAfterPlay = Other.bDiscardTrackAfterPlay;
57 PostTrackDelay = Other.PostTrackDelay;
58 }
59
60 bool IsValid() const;
61
62};
63
64UCLASS()
65class PROJECTX_API AMusicPlayer : public AActor
66{
67 GENERATED_BODY()
68
69public:
71
72 UFUNCTION(BlueprintPure, meta = (WorldContext = "WorldContextObject"))
73 static AMusicPlayer* GetMusicPlayer(const UObject* WorldContextObject);
74 /* Play the specified track using the following settings */
75 UFUNCTION(BlueprintCallable)
76 void Play(const FTrackPlayInfo& Track);
77 /* Stop Playing Music */
78 UFUNCTION(BlueprintCallable)
79 void Stop(float FadeOutTime = 1.0f);
80 UFUNCTION(BlueprintCallable)
81 void Resume(float FadeInTime = 1.0f);
82 /* Modifies the tracklist and controls whether to immediately switch to a new tracklist or wait for the current track to complete. Use bShuffleTracks to determine whether to shuffle or play in sequence. */
83 UFUNCTION(BlueprintCallable)
84 void SetTrackList(const TArray<FTrackPlayInfo>& ListOfTracks, bool bShuffleTracks = true, bool bPlayTrack = true, bool bWaitForTrackToCompleteBeforeSwitching = true);
85 UFUNCTION(BlueprintCallable)
86 void PlayNextTrack();
87
88 FString GetCurrentTrackInfo() const;
89
90protected:
91 virtual void BeginPlay() override;
92 virtual void Tick(float DeltaSeconds) override;
93 virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
94
95 UFUNCTION()
96 void OnTrack1PlaybackPercentChanged(const class USoundWave* PlayingSoundWave, const float PlaybackPercent);
97 UFUNCTION()
98 void OnTrack2PlaybackPercentChanged(const class USoundWave* PlayingSoundWave, const float PlaybackPercent);
99
100 /* The singleton is stored as map because when testing in editor you could have multiple worlds and players.
101 This ensures it all runs cleanly per client */
102 static TMap<UWorld*, AMusicPlayer*> Singleton;
103
104 float GetRemainingTimeForTrack(UAudioComponent* const AudioComponent) const;
105 float GetCurrentPlayTimeForTrack(UAudioComponent* const AudioComponent) const;
106 float GetDurationForTrack(UAudioComponent* const AudioComponent) const;
107 UAudioComponent* GetInactiveAudioComponent() const;
108 UAudioComponent* GetActiveAudioComponent() const;
109
110 UPROPERTY()
111 UAudioComponent* MusicTrack1 = nullptr;
112 UPROPERTY()
113 UAudioComponent* MusicTrack2 = nullptr;
114
115 UAudioComponent* ActiveAudioComponent = nullptr;
116
117 bool bShuffle = true;
118 int32 CurrentTrackIndex = 0;
119 TArray<FTrackPlayInfo> Tracklist;
120 FTrackPlayInfo CurrentTrack; //Specifically not a reference incase the tracklist gets clobbered
121
122 float Track1CurrentPlaybackTime = 0.0f;
123 float Track1CurrentTrackLength = 0.0f;
124 float Track2CurrentPlaybackTime = 0.0f;
125 float Track2CurrentTrackLength = 0.0f;
126};
Definition: MusicPlayer.h:66
static TMap< UWorld *, AMusicPlayer * > Singleton
Definition: MusicPlayer.h:102
Definition: MusicPlayer.h:18
USoundBase * Track
Definition: MusicPlayer.h:23