Signature
-
myQwil
I recently heard about the Zig programming language and wanted to see if I could make Pd externals with it, so I put together a "hello world" external, which showcases things like printing to console, working with symbols, and sending floats through an outlet.
Getting it to work required using a local copy of
m_pd.h
and making a small change to thet_text
struct, since Zig's C-translator apparently doesn't like bit fields.:- unsigned int te_type:2; /* from defs below */ + unsigned char te_type; /* from defs below */
Currently, the build file is catered to a Linux installation, but probably all that would need to be changed for a different platform is the system include path and the library extension.
To do a build, just run:
zig build -Doptimize=ReleaseFast
EDIT: Changed the struct to an
extern struct
to guarantee the ordering of its fields.EDIT2: Functions are now inside the struct. This seems to be more idiomatic to Zig, plus it looks nicer.
EDIT3: Link with libc during the build process.
This keeps the external's size small, even when adding math functions likelog
orexp
to it. Otherwise, there's an increase of about 115KB because those functions get baked right into the external.EDIT4: Replace
m_pd.h
with custom definitions that allow many functions to be called as methods. Some examples:adding a method to a class:
pd.class_addbang(myclass, @ptrCast(&bang)); // old way myclass.addBang(@ptrCast(&bang)); // new way
creating a new instance of an object
// old way const self: *Self = @ptrCast(pd.pd_new(myclass)); _ = pd.outlet_new(&self.obj, &pd.s_float); self.sym = pd.gensym("world"); // new way const self: *Self = @ptrCast(myclass.new()); _ = self.obj.outlet(pd.s.float); self.sym = pd.symbol("world");
sending a float through the main outlet:
pd.outlet_float(self.obj.te_outlet, f * 2); // old way self.obj.out.float(f * 2); // new way
repo: https://github.com/myQwil/pd-zig-external
More examples can be found on my library's Zig rewrite branch:
https://github.com/myQwil/pd-quilt/tree/zig-rewrite -
myQwil
@pajzd said:
so, what does this mean for os X
Same thing. It should work for both OS X and macOS.
If gme(s) are not working as expected, let me know. There's a gme post where we can continue that discussion: https://forum.pdpatchrepo.info/topic/11828/gme-gmes-game-music-emu
Also, bear in mind that the latest version of the quilt library switched from using
ffmpeg@4
to justffmpeg
. That's if you download the library through deken, which I would recommend from now on. -
myQwil
@tatsuya_yamada That would probably prove to be quite difficult. The packets would have to be retrieved in reverse order, but FFmpeg doesn't index the packets. So for the time being, reverse playback is not a feature.
-
myQwil
Performing a static build is also an option. That would make it so that the libraries are built into the external. I've always been on the fence about distributing a static build though because I've read that some of the decoders used in the ffmpeg library are proprietary. Their site talks about that near the bottom of this page: https://www.ffmpeg.org/legal.html
It sounds like it's only a problem if someone, as they put it, "starts trying to make money from patented technologies" but since this is being distributed freely, it's probably not an issue.
-
myQwil
Okay, I think I've found out the problem. Here's the list of dependencies of ffplay~.m_amd64:
avcodec-58.dll
avformat-58.dll
avutil-56.dll
swresample-3.dllBut all the libraries have been updated since I built it, so the version numbers in their names have been incremented to 59, 57, and 4.
So, you could probably just rename the dll's and my guess is it'll still work.
-
myQwil
My guess is it either needs a fresh build or it's missing some other dependency from MSYS2/MinGW.
I recommend trying Dependency Walker. It might be able to shed some light on which dependencies aren't being met. Their site: https://www.dependencywalker.com/If that doesn't work, I'll see about doing a fresh build tomorrow
-
myQwil
This should be what you need for the Windows version: https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-full-shared.7z
Inside the zip, there's a 'bin' folder and you just need to extract the .dll files and place them in the same folder as ffplay~.m_amd64. I'm assuming it'll still work. Even though the ffmpeg libraries are newer than when I built it, no big changes have been made to how any of the functions are called.