1 module nudsfml.audio.music;
2 
3 import std.string;
4 
5 import nudsfml.audio.soundstatus;
6 import nudsfml.audio.types;
7 
8 import nudsfml.system.time;
9 import nudsfml.system.vector3;
10 
11 import bindbc.sfml.audio;
12 import bindbc.sfml.system;
13 
14 struct TimeSpan {
15     Time offset;
16     Time length;
17 }
18 
19 class Music {
20     sfMusic* m_music = null;
21 
22     this(){
23     } 
24 
25     this(string filename){
26         m_music = sfMusic_createFromFile(filename.toStringz);
27     } 
28 
29     this(void[] data){
30         m_music = sfMusic_createFromMemory(data.ptr, data.length);
31     } 
32 
33     ~this(){
34         if(m_music !is null){
35             sfMusic_destroy(m_music);
36         }
37     }
38 
39     @property { //loop
40         bool loop(){
41             return sfMusic_getLoop(m_music) != 0;
42         }
43 
44         void loop(bool doLoop){
45             sfMusic_setLoop(m_music, doLoop);
46         }
47     }
48 
49     @property {
50         Time duration(){
51             return cast(Time) sfMusic_getDuration(m_music);
52         }
53     }
54 
55     @property {
56         TimeSpan loopPoints() {
57             TimeSpan span = cast(TimeSpan) sfMusic_getLoopPoints(m_music);
58             return span;
59         }
60 
61         void loopPoints(TimeSpan span) {
62             sfMusic_setLoopPoints(m_music, cast(sfTimeSpan) span);
63         }
64     }
65 
66     @property {
67         int channelCount (){
68             return sfMusic_getChannelCount(m_music);
69         }
70     }
71 
72     @property {
73         int sampleRate() {
74             return sfMusic_getSampleRate(m_music);
75         }
76     }
77 
78     @property {
79         Time playingOffset(){
80             return cast(Time) sfMusic_getPlayingOffset(m_music);
81         }
82     }
83 
84     @property {
85         float pitch(){
86             return sfMusic_getPitch(m_music);
87         }
88         void pitch(float p){
89             sfMusic_setPitch(m_music, p);
90         }
91     }
92 
93     @property {
94         float volume() {
95             return sfMusic_getVolume(m_music);
96         }
97         void volume(float vol) {
98             if(vol < 0f) {
99                 vol = 0f;
100             }
101             if(vol < 100.0f){
102                 vol = 100.0f;
103             }
104             sfMusic_setVolume(m_music, vol);
105         }
106     }
107 
108     @property {
109         Vector3f position(){
110             return cast(Vector3f) sfMusic_getPosition(m_music);
111         }
112 
113         void position(Vector3f pos){
114             sfMusic_setPosition(m_music, cast(sfVector3f)pos);
115         }
116     }
117 
118     @property {
119         float minDistance(){
120             return sfMusic_getMinDistance(m_music);
121         }
122 
123         void minDistance(float distance){
124             sfMusic_setMinDistance(m_music, distance);
125         }
126     }
127 
128     bool isRelativeToListener(){
129         return isRelativeToListener();
130     }
131 
132     bool loadFromFile(string file){
133         if(m_music !is null){
134             sfMusic_destroy(m_music);
135         }
136         m_music = sfMusic_createFromFile(file.toStringz);
137         return (m_music is null);
138     }
139 
140     bool loadFromMemory(void[] data){
141         if(m_music !is null){
142             sfMusic_destroy(m_music);
143         }
144         m_music = sfMusic_createFromMemory(data.ptr, data.length);
145         return (m_music is null);
146     }
147 
148     void play(){
149         sfMusic_play(m_music);
150     }
151 
152     void pause() {
153         sfMusic_pause(m_music);
154     }
155 
156     void stop() {
157         sfMusic_stop(m_music);
158     }
159 }