diff options
Diffstat (limited to 'src/brr.zig')
-rw-r--r-- | src/brr.zig | 66 |
1 files changed, 41 insertions, 25 deletions
diff --git a/src/brr.zig b/src/brr.zig index 74ee419..bbacdd7 100644 --- a/src/brr.zig +++ b/src/brr.zig @@ -4,17 +4,23 @@ const c = @cImport({ @cInclude("alsa/asoundlib.h"); }); -pub fn brr(file: []const u8) !void { +pub fn brr(allocator: std.mem.Allocator, file: [*:0]const u8) !void { _ = c.mpg123_init(); - const handle = c.mpg123_new(null, null) orelse { std.log.warn("Failed to create mpg123 handle\n", .{}); return; }; - const file_path: [*c]const u8 = @ptrCast(file); - if (c.mpg123_open(handle, file_path) != c.MPG123_OK) { - std.log.warn("Failed to open the file: {s}\n", .{file_path}); + if (c.mpg123_open(handle, file) != c.MPG123_OK) { + std.log.warn("Failed to open the file: {s}\n", .{file}); + return; + } + + var encoding: c_int = 0; + var channels: c_int = 0; + var rate: c_long = 0; + if (c.mpg123_getformat(handle, &rate, &channels, &encoding) != c.MPG123_OK) { + std.log.warn("Failed to get format\n", .{}); return; } @@ -24,37 +30,47 @@ pub fn brr(file: []const u8) !void { return; } + var dir: c_int = 0; var params: ?*c.snd_pcm_hw_params_t = null; - _ = c.snd_pcm_hw_params_malloc(¶ms); + if (c.snd_pcm_hw_params_malloc(¶ms) < 0) { + std.log.warn("Failed to allocate ALSA hardware parameters\n", .{}); + return; + } - _ = c.snd_pcm_hw_params(pcm, params); - _ = c.snd_pcm_hw_params_set_access(pcm, params, c.SND_PCM_FORMAT_S16_LE); - _ = c.snd_pcm_hw_params_set_channels(pcm, params, 2); - _ = c.snd_pcm_hw_params_set_rate(pcm, params, 44100, 0); + _ = c.snd_pcm_hw_params_any(pcm, params); + _ = c.snd_pcm_hw_params_set_access(pcm, params, c.SND_PCM_ACCESS_RW_INTERLEAVED); + _ = c.snd_pcm_hw_params_set_format(pcm, params, c.SND_PCM_FORMAT_S16_LE); + _ = c.snd_pcm_hw_params_set_channels(pcm, params, @as(c_uint, @intCast(channels))); + _ = c.snd_pcm_hw_params_set_rate_near(pcm, params, @as(*c_uint, @ptrCast(&rate)), &dir); + if (c.snd_pcm_hw_params(pcm, params) < 0) { + std.log.warn("Failed to set ALSA hardware parameters\n", .{}); + return; + } - _ = c.snd_pcm_hw_params(pcm, params); + const buffer_size = c.mpg123_outblock(handle); + var done: usize = 0; - var buffer: [4096]u8 = undefined; + var mpg123_buffer: []u8 = try allocator.alloc(u8, buffer_size); + _ = &mpg123_buffer; + defer allocator.free(mpg123_buffer); + var result: c_int = 0; while (true) { - var done: usize = 0; - const result = c.mpg123_read(handle, &buffer[0], buffer.len, &done); + result = c.mpg123_read(handle, @as(?*anyopaque, @ptrCast(mpg123_buffer.ptr)), buffer_size, &done); switch (result) { c.MPG123_OK => { - std.log.info("Reading successfule", .{}); + _ = c.snd_pcm_writei(pcm, @as(?*anyopaque, @ptrCast(mpg123_buffer.ptr)), done / 4); }, else => { - std.log.err("Decode error {}", .{result}); + const err_str = c.mpg123_strerror(handle); + std.log.warn("Failed to read from file\n {}, {s}", .{ result, err_str }); + break; }, } - - if (done == 0) { - _ = c.mpg123_delete(handle); - _ = c.snd_pcm_hw_params_free(params); - _ = c.snd_pcm_close(pcm); - break; - } - - _ = c.snd_pcm_writei(pcm, &buffer[0], done / 4); } + + _ = c.mpg123_delete(handle); + _ = c.snd_pcm_hw_params_free(params); + _ = c.snd_pcm_close(pcm); + _ = c.mpg123_exit(); } |