1 /**
2  * ae.ui.audio.wave.base
3  *
4  * License:
5  *   This Source Code Form is subject to the terms of
6  *   the Mozilla Public License, v. 2.0. If a copy of
7  *   the MPL was not distributed with this file, You
8  *   can obtain one at http://mozilla.org/MPL/2.0/.
9  *
10  * Authors:
11  *   Vladimir Panteleev <vladimir@thecybershadow.net>
12  */
13 
14 module ae.ui.audio.source.wave;
15 
16 import std.algorithm.mutation;
17 import std.range;
18 import std.range.primitives;
19 
20 import ae.ui.audio.source.base;
21 
22 template WaveSoundSource(Wave)
23 {
24 	alias Sample = typeof(Wave.init.front);
25 
26 	class WaveSoundSource : AbstractSoundSource!Sample
27 	{
28 		Wave wave;
29 		uint sampleRate;
30 
31 		this(Wave wave, uint sampleRate)
32 		{
33 			this.wave = wave;
34 			this.sampleRate = sampleRate;
35 		}
36 
37 		override uint getSampleRate() const nothrow
38 		{
39 			return sampleRate;
40 		}
41 
42 		override size_t getNumChannels() const nothrow
43 		{
44 			// TODO
45 			return 1;
46 		}
47 
48 		override bool procedural() const nothrow
49 		{
50 			return true;
51 		}
52 
53 		override size_t copySamples(size_t channel, size_t start, Sample[] buffer) const nothrow
54 		{
55 			auto remaining = copy(wave.drop(start).take(buffer.length), buffer);
56 			return buffer.length - remaining.length;
57 		}
58 
59 		override const(Sample)[] getSamples(size_t channel, size_t start, size_t maxLength) const nothrow
60 		{
61 			assert(false, "Procedural");
62 		}
63 	}
64 }
65 
66 WaveSoundSource!Wave waveSoundSource(Wave)(Wave wave, uint sampleRate)
67 {
68 	return new WaveSoundSource!Wave(wave, sampleRate);
69 }
70 
71 unittest
72 {
73 	auto w = waveSoundSource([short.max, short.min], 44100);
74 }