summaryrefslogtreecommitdiffhomepage
path: root/StarsEx/MusicDirector.h
blob: 8fc68120711f03367b27e5dfe1dce58173eded98 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/*  Starshatter: The Open Source Project
    Copyright (c) 2021-2022, Starshatter: The Open Source Project Contributors
    Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors
    Copyright (c) 1997-2006, Destroyer Studios LLC.

    AUTHOR:       John DiCamillo


    OVERVIEW
    ========
    Music Director class to manage selection, setup, and playback
    of background music tracks for both menu and game modes
*/


#ifndef MusicDirector_h
#define MusicDirector_h

#include <mutex>

#include "Types.h"
#include "List.h"
#include "Text.h"

// +-------------------------------------------------------------------+

class MusicTrack;

// +-------------------------------------------------------------------+

class MusicDirector
{
public:
    enum MODES {
        NONE,

        // menu modes:

        MENU,
        INTRO,
        BRIEFING,
        DEBRIEFING,
        PROMOTION,
        VICTORY,
        DEFEAT,
        CREDITS,

        // in game modes:

        FLIGHT,
        COMBAT,
        LAUNCH,
        RECOVERY,

        // special modes:
        SHUTDOWN
    };

    enum TRANSITIONS {
        CUT,
        FADE_OUT,
        FADE_IN,
        FADE_BOTH,
        CROSS_FADE
    };

    MusicDirector();
    ~MusicDirector();

    // Operations:
    void                    ExecFrame();
    void                    ScanTracks();

    int                     CheckMode(int mode);
    int                     GetMode()   const { return mode; }

    static void             Initialize();
    static void             Close();
    static MusicDirector*   GetInstance();
    static void             SetMode(int mode);
    static const char*      GetModeName(int mode);
    static bool             IsNoMusic();

protected:
    void                    StartThread();
    void                    StopThread();
    void                    GetNextTrack(int index);
    void                    ShuffleTracks();

    int               mode;
    int               transition;

    MusicTrack*       track;
    MusicTrack*       next_track;

    List<Text>        menu_tracks;
    List<Text>        intro_tracks;
    List<Text>        brief_tracks;
    List<Text>        debrief_tracks;
    List<Text>        promote_tracks;
    List<Text>        flight_tracks;
    List<Text>        combat_tracks;
    List<Text>        launch_tracks;
    List<Text>        recovery_tracks;
    List<Text>        victory_tracks;
    List<Text>        defeat_tracks;
    List<Text>        credit_tracks;

    bool              no_music;

    HANDLE            hproc;
    std::mutex        sync;
};

#endif  // MusicDirector_h