aboutsummaryrefslogtreecommitdiff
path: root/src/sfml/audio
diff options
context:
space:
mode:
authortslil clingman <>2021-09-01 12:59:50 -0400
committertslil clingman <>2021-09-01 12:59:50 -0400
commit6a2d132873ce7b40405a3dc000a12539fffd969b (patch)
tree3b730360b348900fbc937bd44b89c293c39ca00c /src/sfml/audio
Init
Diffstat (limited to 'src/sfml/audio')
-rw-r--r--src/sfml/audio/Music.zig111
-rw-r--r--src/sfml/audio/Sound.zig107
-rw-r--r--src/sfml/audio/SoundBuffer.zig79
3 files changed, 297 insertions, 0 deletions
diff --git a/src/sfml/audio/Music.zig b/src/sfml/audio/Music.zig
new file mode 100644
index 0000000..b02b620
--- /dev/null
+++ b/src/sfml/audio/Music.zig
@@ -0,0 +1,111 @@
+//! Streamed music played from an audio file.
+
+const sf = @import("../sfml.zig");
+
+const Music = @This();
+
+// Constructor/destructor
+
+/// Loads music from a file
+pub fn createFromFile(path: [:0]const u8) !Music {
+ var music = sf.c.sfMusic_createFromFile(path);
+ if (music == null)
+ return sf.Error.resourceLoadingError;
+ return Music{ .ptr = music.? };
+}
+
+pub const initFromMemory = @compileError("Function is not implemented yet.");
+pub const initFromStream = @compileError("Function is not implemented yet.");
+
+/// Destroys this music object
+pub fn destroy(self: Music) void {
+ sf.c.sfMusic_destroy(self.ptr);
+}
+
+// Music control functions
+
+/// Plays the music
+pub fn play(self: Music) void {
+ sf.c.sfMusic_play(self.ptr);
+}
+/// Pauses the music
+pub fn pause(self: Music) void {
+ sf.c.sfMusic_pause(self.ptr);
+}
+/// Stops the music and resets the player position
+pub fn stop(self: Music) void {
+ sf.c.sfMusic_stop(self.ptr);
+}
+
+// Getters / Setters
+
+/// Gets the total duration of the music
+pub fn getDuration(self: Music) sf.Time {
+ return sf.Time.fromCSFML(sf.c.sfMusic_getDuration(self.ptr));
+}
+
+/// Gets the current stream position of the music
+pub fn getPlayingOffset(self: Music) sf.Time {
+ return sf.Time.fromCSFML(sf.c.sfMusic_getPlayingOffset(self.ptr));
+}
+/// Sets the current stream position of the music
+pub fn setPlayingOffset(self: Music, offset: sf.Time) void {
+ sf.c.sfMusic_setPlayingOffset(self.ptr, offset.toCSFML());
+}
+
+/// Gets the loop points of the music
+pub fn getLoopPoints(self: Music) sf.TimeSpan {
+ return sf.TimeSpan.fromCSFML(sf.c.sfMusic_getLoopPoints(self.ptr));
+}
+/// Gets the loop points of the music
+pub fn setLoopPoints(self: Music, span: sf.TimeSpan) void {
+ sf.c.sfMusic_setLoopPoints(self.ptr, span.toCSFML());
+}
+
+/// Tells whether or not this stream is in loop mode
+pub fn getLoop(self: Music) bool {
+ return sf.c.sfMusic_getLoop(self.ptr) != 0;
+}
+/// Enable or disable auto loop
+pub fn setLoop(self: Music, loop: bool) void {
+ sf.c.sfMusic_setLoop(self.ptr, if (loop) 1 else 0);
+}
+
+/// Sets the pitch of the music
+pub fn getPitch(self: Music) f32 {
+ return sf.c.sfMusic_getPitch(self.ptr);
+}
+/// Gets the pitch of the music
+pub fn setPitch(self: Music, pitch: f32) void {
+ sf.c.sfMusic_setPitch(self.ptr, pitch);
+}
+
+/// Sets the volume of the music
+pub fn getVolume(self: Music) f32 {
+ return sf.c.sfMusic_getVolume(self.ptr);
+}
+/// Gets the volume of the music
+pub fn setVolume(self: Music, volume: f32) void {
+ sf.c.sfMusic_setVolume(self.ptr, volume);
+}
+
+/// Gets the sample rate of this music
+pub fn getSampleRate(self: Music) usize {
+ return @intCast(usize, sf.c.sfMusic_getSampleRate(self.ptr));
+}
+
+/// Gets the channel count of the music
+pub fn getChannelCount(self: Music) usize {
+ return @intCast(usize, sf.c.sfMusic_getChannelCount(self.ptr));
+}
+
+pub const getStatus = @compileError("Function is not implemented yet.");
+pub const setRelativeToListener = @compileError("Function is not implemented yet.");
+pub const isRelativeToListener = @compileError("Function is not implemented yet.");
+pub const setMinDistance = @compileError("Function is not implemented yet.");
+pub const setAttenuation = @compileError("Function is not implemented yet.");
+pub const getMinDistance = @compileError("Function is not implemented yet.");
+pub const getAttenuation = @compileError("Function is not implemented yet.");
+
+/// Pointer to the csfml music
+ptr: *sf.c.sfMusic,
diff --git a/src/sfml/audio/Sound.zig b/src/sfml/audio/Sound.zig
new file mode 100644
index 0000000..4430dcb
--- /dev/null
+++ b/src/sfml/audio/Sound.zig
@@ -0,0 +1,107 @@
+//! Regular sound that can be played in the audio environment.
+
+const sf = struct {
+ pub usingnamespace @import("../sfml.zig");
+ pub usingnamespace audio;
+};
+
+const Sound = @This();
+
+// Constructor/destructor
+
+/// Inits an empty sound
+pub fn create() !Sound {
+ var sound = sf.c.sfSound_create();
+ if (sound == null)
+ return sf.Error.nullptrUnknownReason;
+ return Sound{ .ptr = sound.? };
+}
+
+/// Inits a sound with a SoundBuffer object
+pub fn createFromBuffer(buffer: sf.SoundBuffer) !Sound {
+ var sound = try Sound.create();
+ sound.setBuffer(buffer);
+ return sound;
+}
+
+/// Destroys this sound object
+pub fn destroy(self: Sound) void {
+ sf.c.sfSound_destroy(self.ptr);
+}
+
+// Sound control functions
+
+/// Plays the sound
+pub fn play(self: Sound) void {
+ sf.c.sfSound_play(self.ptr);
+}
+/// Pauses the sound
+pub fn pause(self: Sound) void {
+ sf.c.sfSound_pause(self.ptr);
+}
+/// Stops the sound and resets the player position
+pub fn stop(self: Sound) void {
+ sf.c.sfSound_stop(self.ptr);
+}
+
+// Getters / Setters
+
+/// Gets the buffer this sound is attached to
+pub fn getBuffer(self: Sound) ?sf.SoundBuffer {
+ var buf = sf.c.sfSound_getBuffer(self.ptr);
+ if (buf) |buffer| {
+ return .{ .ptr = buffer };
+ } else return null;
+}
+
+/// Sets the buffer this sound will play
+pub fn setBuffer(self: Sound, buffer: sf.SoundBuffer) void {
+ sf.c.sfSound_setBuffer(self.ptr, buffer.ptr);
+}
+
+/// Gets the current playing offset of the sound
+pub fn getPlayingOffset(self: Sound) sf.Time {
+ return sf.Time.fromCSFML(sf.c.sfSound_getPlayingOffset(self.ptr));
+}
+/// Sets the current playing offset of the sound
+pub fn setPlayingOffset(self: Sound, offset: sf.Time) void {
+ sf.c.sfSound_setPlayingOffset(self.ptr, offset.toCSFML());
+}
+
+/// Tells whether or not this sound is in loop mode
+pub fn getLoop(self: Sound) bool {
+ return sf.c.sfSound_getLoop(self.ptr) != 0;
+}
+/// Enable or disable auto loop
+pub fn setLoop(self: Sound, loop: bool) void {
+ sf.c.sfSound_setLoop(self.ptr, if (loop) 1 else 0);
+}
+
+/// Sets the pitch of the sound
+pub fn getPitch(self: Sound) f32 {
+ return sf.c.sfSound_getPitch(self.ptr);
+}
+/// Gets the pitch of the sound
+pub fn setPitch(self: Sound, pitch: f32) void {
+ sf.c.sfSound_setPitch(self.ptr, pitch);
+}
+
+/// Sets the volume of the sound
+pub fn getVolume(self: Sound) f32 {
+ return sf.c.sfSound_getVolume(self.ptr);
+}
+/// Gets the volume of the sound
+pub fn setVolume(self: Sound, volume: f32) void {
+ sf.c.sfSound_setVolume(self.ptr, volume);
+}
+
+pub const getStatus = @compileError("Function is not implemented yet.");
+pub const setRelativeToListener = @compileError("Function is not implemented yet.");
+pub const isRelativeToListener = @compileError("Function is not implemented yet.");
+pub const setMinDistance = @compileError("Function is not implemented yet.");
+pub const setAttenuation = @compileError("Function is not implemented yet.");
+pub const getMinDistance = @compileError("Function is not implemented yet.");
+pub const getAttenuation = @compileError("Function is not implemented yet.");
+
+/// Pointer to the csfml sound
+ptr: *sf.c.sfSound,
diff --git a/src/sfml/audio/SoundBuffer.zig b/src/sfml/audio/SoundBuffer.zig
new file mode 100644
index 0000000..9727088
--- /dev/null
+++ b/src/sfml/audio/SoundBuffer.zig
@@ -0,0 +1,79 @@
+//! Storage for audio samples defining a sound.
+
+const sf = @import("../sfml.zig");
+
+const SoundBuffer = @This();
+
+// Constructor/destructor
+/// Loads music from a file
+pub fn createFromFile(path: [:0]const u8) !SoundBuffer {
+ var sound = sf.c.sfSoundBuffer_createFromFile(path);
+ if (sound == null)
+ return sf.Error.resourceLoadingError;
+ return SoundBuffer{ .ptr = sound.? };
+}
+/// Creates a sound buffer from sample data
+pub fn createFromSamples(samples: []const i16, channel_count: usize, sample_rate: usize) !SoundBuffer {
+ var sound = sf.c.sfSoundBuffer_createFromSamples(@ptrCast([*c]const c_short, samples.ptr), samples.len, @intCast(c_uint, channel_count), @intCast(c_uint, sample_rate));
+ if (sound == null)
+ return sf.Error.resourceLoadingError;
+ return SoundBuffer{ .ptr = sound.? };
+}
+
+pub const initFromMemory = @compileError("Function is not implemented yet.");
+pub const initFromStream = @compileError("Function is not implemented yet.");
+
+/// Destroys this music object
+pub fn destroy(self: SoundBuffer) void {
+ sf.c.sfSoundBuffer_destroy(self.ptr);
+}
+
+// Getters / Setters
+
+/// Gets the duration of the sound
+pub fn getDuration(self: SoundBuffer) sf.system.Time {
+ return sf.system.Time.fromCSFML(sf.c.sfSoundBuffer_getDuration(self.ptr));
+}
+
+/// Gets the sample count of this sound
+pub fn getSampleCount(self: SoundBuffer) usize {
+ return @intCast(usize, sf.c.sfSoundBuffer_getSampleCount(self.ptr));
+}
+
+/// Gets the sample rate of this sound (n° of samples per second, often 44100)
+pub fn getSampleRate(self: SoundBuffer) usize {
+ return @intCast(usize, sf.c.sfSoundBuffer_getSampleRate(self.ptr));
+}
+
+/// Gets the channel count (2 is stereo for instance)
+pub fn getChannelCount(self: SoundBuffer) usize {
+ return @intCast(usize, sf.c.sfSoundBuffer_getChannelCount(self.ptr));
+}
+
+// Misc
+
+/// Save the sound buffer to an audio file
+pub fn saveToFile(self: SoundBuffer, path: [:0]const u8) !void {
+ if (sf.c.sfSoundBuffer_saveToFile(self.ptr, path) != 1)
+ return sf.Error.savingInFileFailed;
+}
+
+/// Pointer to the csfml texture
+ptr: *sf.c.sfSoundBuffer,
+
+test "sound buffer: sane getter and setters" {
+ const std = @import("std");
+ const tst = std.testing;
+ const allocator = std.heap.page_allocator;
+
+ var samples = try allocator.alloc(i16, 44100 * 3);
+ defer allocator.free(samples);
+
+ var buffer = try SoundBuffer.createFromSamples(samples, 1, 44100);
+ defer buffer.destroy();
+
+ try tst.expectApproxEqAbs(@as(f32, 3), buffer.getDuration().asSeconds(), 0.001);
+ try tst.expectEqual(@as(usize, 44100 * 3), buffer.getSampleCount());
+ try tst.expectEqual(@as(usize, 44100), buffer.getSampleRate());
+ try tst.expectEqual(@as(usize, 1), buffer.getChannelCount());
+}