]> git.tdb.fi Git - libs/al.git/blob - source/source.cpp
ff04adfba0b51949d64ef369438a4aa63349194a
[libs/al.git] / source / source.cpp
1 /* $Id$
2
3 This file is part of libmspal
4 Copyright © 2008 Mikko Rasa, Mikkosoft Productions
5 Distributed under the LGPL
6 */
7
8 #include "buffer.h"
9 #include "source.h"
10
11 using namespace std;
12
13 namespace Msp {
14 namespace AL {
15
16 Source::Source()
17 {
18         alGenSources(1, &id);
19 }
20
21 Source::~Source()
22 {
23         alDeleteSources(1, &id);
24 }
25
26 void Source::attribute(ALenum attr, int v)
27 {
28         alSourcei(id, attr, v);
29 }
30
31 void Source::attribute(ALenum attr, float v)
32 {
33         alSourcef(id, attr, v);
34 }
35
36 void Source::attribute(ALenum attr, float v0, float v1, float v2)
37 {
38         alSource3f(id, attr, v0, v1, v2);
39 }
40
41 void Source::attribute(ALenum attr, const float *v)
42 {
43         alSourcefv(id, attr, v);
44 }
45
46 void Source::get_attribute(ALenum attr, int *v) const
47 {
48         alGetSourcei(id, attr, v);
49 }
50
51 void Source::get_attribute(ALenum attr, float *v) const
52 {
53         alGetSourcef(id, attr, v);
54 }
55
56 SourceState Source::get_state() const
57 {
58         int state;
59         get_attribute(AL_SOURCE_STATE, &state);
60         return static_cast<SourceState>(state);
61 }
62
63 void Source::set_position(float x, float y, float z)
64 {
65         attribute(AL_POSITION, x, y, z);
66 }
67
68 void Source::set_looping(bool l)
69 {
70         attribute(AL_LOOPING, l);
71 }
72
73 void Source::set_gain(float g)
74 {
75         attribute(AL_GAIN, g);
76 }
77
78 void Source::set_rolloff_factor(float f)
79 {
80         attribute(AL_ROLLOFF_FACTOR, f);
81 }
82
83 void Source::set_buffer(const Buffer &buffer)
84 {
85         attribute(AL_BUFFER, static_cast<int>(buffer.get_id()));
86 }
87
88 void Source::queue_buffers(const vector<const Buffer *> &buffers)
89 {
90         vector<uint> ids;
91         ids.reserve(buffers.size());
92         for(vector<const Buffer *>::const_iterator i=buffers.begin(); i!=buffers.end(); ++i)
93                 ids.push_back((*i)->get_id());
94         alSourceQueueBuffers(id, ids.size(), &ids.front());
95 }
96
97 void Source::queue_buffer(const Buffer &buffer)
98 {
99         uint bid=buffer.get_id();
100         alSourceQueueBuffers(id, 1, &bid);
101 }
102
103 void Source::unqueue_buffers(const vector<const Buffer *> &buffers)
104 {
105         vector<uint> ids;
106         ids.reserve(buffers.size());
107         for(vector<const Buffer *>::const_iterator i=buffers.begin(); i!=buffers.end(); ++i)
108                 ids.push_back((*i)->get_id());
109         alSourceUnqueueBuffers(id, ids.size(), &ids.front());
110 }
111
112 void Source::unqueue_buffer(const Buffer &buffer)
113 {
114         uint bid=buffer.get_id();
115         alSourceUnqueueBuffers(id, 1, &bid);
116 }
117
118 void Source::clear_buffers()
119 {
120         attribute(AL_BUFFER, AL_NONE);
121 }
122
123 unsigned Source::get_buffers_queued() const
124 {
125         int n;
126         get_attribute(AL_BUFFERS_QUEUED, &n);
127         return n;
128 }
129
130 unsigned Source::get_buffers_processed() const
131 {
132         int n;
133         get_attribute(AL_BUFFERS_PROCESSED, &n);
134         return n;
135 }
136
137 void Source::play()
138 {
139         alSourcePlay(id);
140 }
141
142 void Source::pause()
143 {
144         alSourcePause(id);
145 }
146
147 void Source::stop()
148 {
149         alSourceStop(id);
150 }
151
152 void Source::rewind()
153 {
154         alSourceRewind(id);
155 }
156
157 } // namespace AL
158 } // namespace Msp