OALplus (0.52.0) a C++ wrapper for OpenAL

alut.hpp
Go to the documentation of this file.
1 
12 #pragma once
13 #ifndef OALPLUS_ALUT_1303201721_HPP
14 #define OALPLUS_ALUT_1303201721_HPP
15 
16 #include <oalplus/config.hpp>
17 #include <oalplus/fwd.hpp>
18 #include <oalplus/alfunc.hpp>
19 #include <oalplus/string.hpp>
20 #include <oalplus/error/alut.hpp>
21 
22 #include <oalplus/data_format.hpp>
23 
24 #include <oalplus/buffer.hpp>
25 
26 #include <vector>
27 
28 namespace oalplus {
29 
32 {
33 private:
34  bool _initialized;
36 
37  static bool _initialize(bool with_context, int argc, char** argv)
38  {
39  bool result = with_context
40  ?(OALPLUS_ALUTFUNC(Init)(&argc, argv) == AL_TRUE)
41  :(OALPLUS_ALUTFUNC(InitWithoutContext)(&argc, argv)==AL_TRUE);
42  OALPLUS_CHECK_SIMPLE_ALUT(Init);
43  return result;
44 
45  }
46 
47  static bool _initialize(bool with_context)
48  {
49  char buf[2] = {'\0'};
50  char* arg = buf;
51  return _initialize(with_context, 1, &arg);
52  }
53 public:
55 
60  ALUtilityToolkit(bool with_context, int argc, char** argv)
61  : _initialized(_initialize(with_context, argc, argv))
62  { }
63 
65 
70  ALUtilityToolkit(bool with_context)
71  : _initialized(_initialize(with_context))
72  { }
73 
76  : _initialized(tmp._initialized)
77  {
78  tmp._initialized = false;
79  }
80 
82 
87  {
88  if(_initialized)
89  {
90  OALPLUS_ALUTFUNC(Exit)();
91  }
92  }
93 
94 private:
95  static ALfloat _normalize_sample(ALubyte v)
96  {
97  return (ALfloat(v)-128.0f)/128.0f;
98  }
99 
100  static ALfloat _normalize_sample(ALshort v)
101  {
102  return ALfloat(v)/32768.0f;
103  }
104 
105  template <typename T>
106  void _do_load_mem_norm(
107  std::vector<ALfloat>& result,
108  T*,
109  ::ALvoid* raw_data,
110  ::ALsizei size
111  ) const
112  {
113  std::size_t n = size/sizeof(T);
114  result.resize(n);
115  T* data = static_cast<T*>(raw_data);
116  for(std::size_t i=0; i!=n; ++i)
117  {
118  result[i] = _normalize_sample(data[i]);
119  }
120  }
121 
122  struct _free_on_scope_exit
123  {
124  ::ALvoid* ptr;
125 
126  ~_free_on_scope_exit(void)
127  {
128  free(ptr);
129  }
130  };
131 
132  std::vector<ALfloat> _load_mem_norm(
133  ::ALvoid* raw_data,
134  ::ALenum format,
135  ::ALsizei size
136  ) const
137  {
138  std::vector<ALfloat> result;
139 
140  if(format == AL_FORMAT_MONO8)
141  {
142  _do_load_mem_norm(
143  result,
144  (::ALubyte*)nullptr,
145  raw_data,
146  size
147  );
148  }
149  else if(format == AL_FORMAT_MONO16)
150  {
151  _do_load_mem_norm(
152  result,
153  (::ALshort*)nullptr,
154  raw_data,
155  size
156  );
157  }
158  else if(format == AL_FORMAT_STEREO8)
159  {
160  _do_load_mem_norm(
161  result,
162  (::ALubyte*)nullptr,
163  raw_data,
164  size
165  );
166  }
167  else if(format == AL_FORMAT_STEREO16)
168  {
169  _do_load_mem_norm(
170  result,
171  (::ALshort*)nullptr,
172  raw_data,
173  size
174  );
175  }
176 
177  return std::move(result);
178  };
179 
180  std::vector<ALubyte> _load_memory(
181  ::ALvoid* raw_data,
182  ::ALsizei size
183  ) const
184  {
185  ::ALubyte* data = (::ALubyte*)raw_data;
186  return std::vector<ALubyte>(data, data+size);
187  }
188 public:
190 
197  {
198  assert(_initialized);
199  ALuint name = OALPLUS_ALUTFUNC(CreateBufferHelloWorld)();
200  OALPLUS_VERIFY_SIMPLE_ALUT(CreateBufferHelloWorld);
201  return Buffer::FromRawName(BufferName(name));
202  }
203 
205 
211  Buffer CreateBufferFromFile(const ALchar* file_path) const
212  {
213  assert(_initialized);
214  ALuint name = OALPLUS_ALUTFUNC(CreateBufferFromFile)(file_path);
215  OALPLUS_VERIFY_SIMPLE_ALUT(CreateBufferFromFile);
216  return Buffer::FromRawName(BufferName(name));
217  }
218 
220 
227  std::vector<ALfloat> LoadMemoryHelloWorldNormalized(
228  DataFormat* data_format,
229  ALfloat* frequency
230  ) const
231  {
232  ::ALenum format = 0;
233  ::ALsizei size = 0;
234  ::ALvoid* ptr = OALPLUS_ALUTFUNC(LoadMemoryHelloWorld)(
235  &format,
236  &size,
237  frequency
238  );
239  OALPLUS_CHECK_SIMPLE_ALUT(LoadMemoryHelloWorld);
240 
241  _free_on_scope_exit cleaner = { ptr };
242  OALPLUS_FAKE_USE(cleaner);
243 
244  if(data_format) *data_format = DataFormat(format);
245 
246  return _load_mem_norm(ptr, format, size);
247  }
248 
250 
258  std::vector<ALfloat> LoadMemoryFromFileNormalized(
259  const ALchar* file_path,
260  DataFormat* data_format,
261  ALfloat* frequency
262  ) const
263  {
264  ::ALenum format = 0;
265  ::ALsizei size = 0;
266  ::ALvoid* ptr = OALPLUS_ALUTFUNC(LoadMemoryFromFile)(
267  file_path,
268  &format,
269  &size,
270  frequency
271  );
272  OALPLUS_CHECK_SIMPLE_ALUT(LoadMemoryFromFile);
273 
274  _free_on_scope_exit cleaner = { ptr };
275  OALPLUS_FAKE_USE(cleaner);
276 
277  if(data_format) *data_format = DataFormat(format);
278 
279  return _load_mem_norm(ptr, format, size);
280  }
281 
283 
290  std::vector<ALubyte> LoadMemoryFromFile(
291  const ALchar* file_path,
292  DataFormat* data_format,
293  ALfloat* frequency
294  ) const
295  {
296  ::ALenum format = 0;
297  ::ALsizei size = 0;
298  ::ALvoid* ptr = OALPLUS_ALUTFUNC(LoadMemoryFromFile)(
299  file_path,
300  &format,
301  &size,
302  frequency
303  );
304  OALPLUS_CHECK_SIMPLE_ALUT(LoadMemoryFromFile);
305 
306  _free_on_scope_exit cleaner = { ptr };
307  OALPLUS_FAKE_USE(cleaner);
308 
309  if(data_format) *data_format = DataFormat(format);
310 
311  return _load_memory(ptr, size);
312  }
313 
315 
326  std::vector<ALubyte>& raw,
327  std::vector<ALfloat>& norm,
328  const ALchar* file_path,
329  DataFormat* data_format,
330  ALfloat* frequency
331  ) const
332  {
333  ::ALenum format = 0;
334  ::ALsizei size = 0;
335  ::ALvoid* ptr = OALPLUS_ALUTFUNC(LoadMemoryFromFile)(
336  file_path,
337  &format,
338  &size,
339  frequency
340  );
341  OALPLUS_CHECK_SIMPLE_ALUT(LoadMemoryFromFile);
342 
343  _free_on_scope_exit cleaner = { ptr };
344  OALPLUS_FAKE_USE(cleaner);
345 
346  if(data_format) *data_format = DataFormat(format);
347 
348  raw = _load_memory(ptr, size);
349  norm = _load_mem_norm(ptr, format, size);
350  }
351 };
352 
353 } // namespace oalplus
354 
355 #endif // include guard
std::vector< ALfloat > LoadMemoryFromFileNormalized(const ALchar *file_path, DataFormat *data_format, ALfloat *frequency) const
Loads samples from a sound file into a buffer.
Definition: alut.hpp:258
ALUtilityToolkit(ALUtilityToolkit &&tmp)
Move construction.
Definition: alut.hpp:75
ALUtilityToolkit(bool with_context)
Initializes the alut library, optionally with a context.
Definition: alut.hpp:70
Forward declarations.
Compile-time configuration options.
Helper macro expanding into OpenAL function name.
Buffer CreateBufferFromFile(const ALchar *file_path) const
Create a buffer containing the samples from a specified sound file.
Definition: alut.hpp:211
Object< BufferOps > Buffer
An oalplus_object encapsulating the OpenAL buffer functionality.
Definition: buffer.hpp:233
Buffer CreateBufferHelloWorld(void) const
Create a buffer containing the samples of a 'Hello World' sound.
Definition: alut.hpp:196
Wrapper for the ALUT library.
Definition: alut.hpp:31
std::vector< ALubyte > LoadMemoryFromFile(const ALchar *file_path, DataFormat *data_format, ALfloat *frequency) const
Loads samples from a sound file into a buffer.
Definition: alut.hpp:290
String-related typedefs.
Wrapper for OpenAL buffer object.
Data format enumeration.
~ALUtilityToolkit(void)
Cleans up the ALUT library.
Definition: alut.hpp:86
std::vector< ALfloat > LoadMemoryHelloWorldNormalized(DataFormat *data_format, ALfloat *frequency) const
Loads samples of a 'Hello World' sound into a buffer.
Definition: alut.hpp:227
ALUtilityToolkit(bool with_context, int argc, char **argv)
Initializes the alut library, optionally with a context.
Definition: alut.hpp:60
void LoadMemoryFromFile(std::vector< ALubyte > &raw, std::vector< ALfloat > &norm, const ALchar *file_path, DataFormat *data_format, ALfloat *frequency) const
Loads samples from a sound file into a buffer.
Definition: alut.hpp:325

Copyright © 2010-2014 Matúš Chochlík, University of Žilina, Žilina, Slovakia.
<matus.chochlik -at- fri.uniza.sk>
<chochlik -at -gmail.com>
Documentation generated on Mon Sep 22 2014 by Doxygen (version 1.8.6).