Skip to content

Commit b209439

Browse files
committed
build: add bindings for zig
1 parent 345a6dd commit b209439

File tree

3 files changed

+173
-0
lines changed

3 files changed

+173
-0
lines changed

.gitignore

+4
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,7 @@ Thumbs.db
3232
# config files
3333
include/config.h
3434
wildmidi.pc
35+
36+
# Zig
37+
zig-out/
38+
zig-cache/

build.zig

+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
const std = @import("std");
2+
const LibExeObjStep = std.build.LibExeObjStep;
3+
4+
pub fn build(b: *std.Build) void {
5+
const target = b.standardTargetOptions(.{});
6+
const optimize = b.standardOptimizeOption(.{});
7+
8+
const lib = b.addStaticLibrary(.{
9+
.name = "wildmidi",
10+
.root_source_file = .{ .path = "include/wildmidi_lib.h" },
11+
.target = target,
12+
.optimize = optimize,
13+
});
14+
15+
lib.linkLibC();
16+
lib.addIncludePath("include");
17+
18+
const sourceFiles = .{
19+
"src/wm_error.c",
20+
"src/file_io.c",
21+
"src/lock.c",
22+
"src/wildmidi_lib.c",
23+
"src/reverb.c",
24+
"src/gus_pat.c",
25+
"src/internal_midi.c",
26+
"src/patches.c",
27+
"src/f_xmidi.c",
28+
"src/f_mus.c",
29+
"src/f_hmp.c",
30+
"src/f_hmi.c",
31+
"src/f_midi.c",
32+
"src/sample.c",
33+
"src/mus2mid.c",
34+
"src/xmi2mid.c",
35+
};
36+
37+
const defaultFlags = .{
38+
"-Wall",
39+
"-W",
40+
"-fno-common",
41+
"-DWILDMIDI_BUILD",
42+
"-g",
43+
};
44+
45+
const config_header = b.addConfigHeader(.{ .style = .{
46+
.cmake = .{ .path = "include/config.h.cmake" },
47+
} }, .{
48+
.HAVE_C_INLINE = 1,
49+
.HAVE_C___INLINE = 1,
50+
.HAVE_C___INLINE__ = 1,
51+
.HAVE___BUILTIN_EXPECT = 1,
52+
.HAVE_STDINT_H = 1,
53+
.HAVE_INTTYPES_H = 1,
54+
.WORDS_BIGENDIAN = null,
55+
.WILDMIDI_AMIGA = null,
56+
.HAVE_SYS_SOUNDCARD_H = null,
57+
.AUDIODRV_ALSA = null,
58+
.AUDIODRV_OSS = null,
59+
.AUDIODRV_AHI = null,
60+
.AUDIODRV_OPENAL = null,
61+
});
62+
63+
lib.addConfigHeader(config_header);
64+
65+
switch (lib.target.toTarget().os.tag) {
66+
.windows => {
67+
lib.addCSourceFiles(&sourceFiles, &(.{"-DWILDMIDI_STATIC"} ++ defaultFlags));
68+
lib.addIncludePath("mingw");
69+
},
70+
.macos => {
71+
lib.addCSourceFiles(&sourceFiles, &defaultFlags);
72+
lib.addIncludePath("macosx");
73+
},
74+
else => {
75+
lib.addCSourceFiles(&sourceFiles, &defaultFlags);
76+
},
77+
}
78+
79+
b.installArtifact(lib);
80+
81+
_ = b.addModule("wildmidi", .{ .source_file = .{ .path = "./lib-wildmidi.zig" } });
82+
}

lib-wildmidi.zig

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
const std = @import("std");
2+
3+
pub fn Init(config_file: [*c]const u8, rate: u16, options: InitOptions) c_int {
4+
return WildMidi_Init(config_file, rate, options);
5+
}
6+
7+
pub fn GetVersion() c_long {
8+
return WildMidi_GetVersion();
9+
}
10+
11+
pub const MidiFile = struct {
12+
handle: [*c]c_long,
13+
14+
pub fn getOutput(self: MidiFile, buffer: [*c]u8, size: usize) c_int {
15+
return WildMidi_GetOutput(self.handle, buffer, size);
16+
}
17+
18+
pub fn getInfo(self: MidiFile) *WildMidiInfo {
19+
return WildMidi_GetInfo(self.handle);
20+
}
21+
22+
pub fn setOption(self: MidiFile, options: c_uint, setting: c_uint) c_int {
23+
return WildMidi_SetOption(self.handle, options, setting);
24+
}
25+
26+
pub fn close(self: MidiFile) void {
27+
_ = WildMidi_Close(self.handle);
28+
}
29+
};
30+
31+
pub fn Open(midi_file: []const u8) !MidiFile {
32+
const midi_file_terminated = try std.mem.concat(std.heap.c_allocator, u8, &.{ midi_file, "\x00" });
33+
defer std.heap.c_allocator.free(midi_file_terminated);
34+
35+
const handle = WildMidi_Open(@ptrCast([*c]const u8, midi_file_terminated));
36+
37+
return MidiFile{
38+
.handle = handle,
39+
};
40+
}
41+
42+
pub fn OpenBuffer(midi_buffer: [*c]const u8, size: c_uint) MidiFile {
43+
const handle = WildMidi_OpenBuffer(midi_buffer, size);
44+
45+
return MidiFile{
46+
.handle = handle,
47+
};
48+
}
49+
50+
pub fn GetError() [*c]u8 {
51+
return WildMidi_GetError();
52+
}
53+
54+
pub fn MasterVolume(master_volume: c_short) c_int {
55+
return WildMidi_MasterVolume(master_volume);
56+
}
57+
58+
pub const InitOptions = enum(c_uint) {
59+
Default = 0x0,
60+
LogVolume = 0x1,
61+
EnhancedResampling = 0x2,
62+
Reverb = 0x4,
63+
Loop = 0x8,
64+
SaveAsType0 = 0x1000,
65+
RoundTempo = 0x2000,
66+
StripSilence = 0x4000,
67+
TextAsLyric = 0x8000,
68+
};
69+
70+
pub const WildMidiInfo = extern struct {
71+
copyright: [*c]u8,
72+
current_sample: c_uint,
73+
approx_total_samples: c_uint,
74+
mixer_options: c_ushort,
75+
total_midi_time: c_uint,
76+
};
77+
78+
extern fn WildMidi_Init(config_file: [*c]const u8, rate: u16, options: InitOptions) c_int;
79+
extern fn WildMidi_GetVersion() c_long;
80+
extern fn WildMidi_Open(midi_file: [*c]const u8) [*c]c_long;
81+
extern fn WildMidi_OpenBuffer(midi_buffer: [*c]const u8, size: c_uint) [*c]c_long;
82+
extern fn WildMidi_Close(handle: [*]c_long) c_int;
83+
extern fn WildMidi_GetOutput(handle: [*c]c_long, buffer: [*c]u8, size: usize) c_int;
84+
extern fn WildMidi_GetInfo(handle: [*]c_long) [*c]WildMidiInfo;
85+
extern fn WildMidi_GetError() [*c]u8;
86+
extern fn WildMidi_MasterVolume(master_volume: c_short) c_int;
87+
extern fn WildMidi_SetOption(handle: [*]c_long, options: c_uint, setting: c_uint) c_int;

0 commit comments

Comments
 (0)