aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/vlib/sokol/audio/audio.v
blob: 50acb7f5d2c622b012602f78ad119c54f86a3589 (plain)
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
module audio

$if linux {
	// provide a nicer error for the user that does not have ALSA installed
	#include <alsa/asoundlib.h> # Please install the `libasound2-dev` package
}

#flag -I @VEXEROOT/thirdparty/sokol
#define SOKOL_IMPL
#include "sokol_audio.h"
#flag linux -lasound
#flag darwin -framework AudioToolbox
#flag windows -lole32

//
pub type FNStreamingCB = fn (buffer &f32, num_frames int, num_channels int)

pub type FnStreamingCBWithUserData = fn (buffer &f32, num_frames int, num_channels int, user_data voidptr)

pub fn (x FNStreamingCB) str() string {
	return '&FNStreamingCB{ ${ptr_str(x)} }'
}

pub fn (x FnStreamingCBWithUserData) str() string {
	return '&FnStreamingCBWithUserData{ ${ptr_str(x)} }'
}

//
pub struct C.saudio_desc {
	sample_rate        int
	num_channels       int
	buffer_frames      int
	packet_frames      int
	num_packets        int
	stream_cb          FNStreamingCB
	stream_userdata_cb FnStreamingCBWithUserData
	user_data          voidptr
}

fn C.saudio_setup(desc &C.saudio_desc)

fn C.saudio_shutdown()

fn C.saudio_isvalid() bool

fn C.saudio_userdata() voidptr

fn C.saudio_query_desc() C.saudio_desc

fn C.saudio_sample_rate() int

fn C.saudio_buffer_frames() int

fn C.saudio_channels() int

fn C.saudio_expect() int

fn C.saudio_push(frames &f32, num_frames int) int

// audio.setup - setup sokol-audio
pub fn setup(desc C.saudio_desc) {
	C.saudio_setup(&desc)
}

// audio.shutdown - shutdown sokol-audio
pub fn shutdown() {
	C.saudio_shutdown()
}

// audio.is_valid - true after setup if audio backend was successfully initialized
pub fn is_valid() bool {
	return C.saudio_isvalid()
}

// audio.userdata - return the saudio_desc.user_data pointer
pub fn user_data() voidptr {
	return C.saudio_userdata()
}

// audio.query - return a copy of the original saudio_desc struct
pub fn query() C.saudio_desc {
	return C.saudio_query_desc()
}

// audio.sample_rate - actual sample rate
pub fn sample_rate() int {
	return C.saudio_sample_rate()
}

// audio.buffer_frames - return actual backend buffer size in number of frames
pub fn buffer_frames() int {
	return C.saudio_buffer_frames()
}

// audio.channels - actual number of channels
pub fn channels() int {
	return C.saudio_channels()
}

// audio.expect - get current number of frames to fill packet queue; use in combination with audio.push/2
pub fn expect() int {
	return C.saudio_expect()
}

// audio.push - push sample frames from main thread, returns number of frames actually pushed
pub fn push(frames &f32, num_frames int) int {
	return C.saudio_push(frames, num_frames)
}

//
[inline]
pub fn fclamp(x f32, flo f32, fhi f32) f32 {
	if x > fhi {
		return fhi
	}
	if x < flo {
		return flo
	}
	return x
}

pub fn min(x int, y int) int {
	if x < y {
		return x
	}
	return y
}

pub fn max(x int, y int) int {
	if x < y {
		return y
	}
	return x
}