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
|
// OpenAL wrapper
// Copyright (C) 2021 Nguyễn Gia Phong
//
// This file is part of zeal.
//
// Zeal is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published
// by the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Zeal is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with zeal. If not, see <https://www.gnu.org/licenses/>.
const Child = @import("std").meta.Child;
usingnamespace @cImport(@cInclude("AL/al.h"));
pub const Error = error {
/// Bad name (ID) passed to an OpenAL function.
InvalidName,
/// Invalid enum parameter passed to an OpenAL function.
InvalidEnum,
/// Invalid value parameter passed to an OpenAL function.
InvalidValue,
/// Requested operation invalid.
InvalidOperation,
/// Requested operation resulted in OpenAL running out of memory.
OutOfMemory,
};
pub const POSITION = AL_POSITION;
pub const ORIENTATION = AL_ORIENTATION;
pub const listener = struct {
/// Set a property for the listener.
pub fn set(param: ALenum, value: anytype) !void {
const T = @TypeOf(value);
switch (T) {
f32 => alListenerf(param, value),
i32 => alListeneri(param, value),
else => switch (Child(T)) {
f32 => alListenerfv(param, value[0..]),
i32 => alListeneriv(param, value[0..]),
else => unreachable,
}
}
switch (alGetError()) {
AL_NO_ERROR => {},
AL_INVALID_VALUE => return Error.InvalidValue,
AL_INVALID_ENUM => return Error.InvalidEnum,
AL_INVALID_OPERATION => return Error.InvalidOperation,
else => unreachable,
}
}
};
/// Generate one buffer for audio data and return its reference.
pub fn genBuffer() !u32 {
var reference: u32 = undefined;
alGenBuffers(1, &reference);
return switch (alGetError()) {
AL_NO_ERROR => reference,
AL_INVALID_VALUE => Error.InvalidValue,
AL_OUT_OF_MEMORY => Error.OutOfMemory,
else => unreachable,
};
}
// TODO: genBuffers
/// Free resources used by one buffer.
/// Buffers attached to a source cannot be deleted.
pub fn deleteBuffer(reference: *const u32) !void {
alDeleteBuffers(1, reference);
switch (alGetError()) {
AL_NO_ERROR => {},
AL_INVALID_OPERATION => return Error.InvalidOperation,
AL_INVALID_NAME => return Error.InvalidName,
AL_INVALID_VALUE => return Error.InvalidValue,
else => unreachable,
}
}
// TODO: deleteBuffers
// alBufferData
// alDeleteSources
// alGenSources
// alGetSourcei
// alSourcef
// alSourcefv
// alSourcei
// alSourcePause
// alSourcePlay
// alSourceStop
|