@@ -8,33 +8,37 @@ const build_options = @import("build_options");
88const clap = @import ("clap" );
99
1010/// Runs `linuxwave`.
11- fn run (allocator : std.mem.Allocator , output : anytype ) ! void {
11+ fn run (io : std.Io , allocator : std.mem.Allocator , output : * std.Io.Writer , argv : std.process.Args ) ! void {
1212 // Parse command-line arguments.
13- const cli = try clap .parse (clap .Help , & args .params , args .parsers , .{ .allocator = allocator });
13+ const cli = try clap .parse (clap .Help , & args .params , args .parsers , argv , .{ .allocator = allocator });
1414 defer cli .deinit ();
1515 if (cli .args .help != 0 ) {
1616 try output .print ("{s}\n " , .{args .banner });
17- return clap .help (output , clap .Help , & args .params , args .help_options );
18- } else if (cli .args .version != 0 ) {
17+ try clap .help (output , clap .Help , & args .params , args .help_options );
18+ try output .flush ();
19+ return ;
20+ }
21+ if (cli .args .version != 0 ) {
1922 try output .print ("{s} {s}\n " , .{ build_options .exe_name , build_options .version });
23+ try output .flush ();
2024 return ;
2125 }
2226
2327 // Create encoder configuration.
24- const encoder_config = wav.EncoderConfig {
28+ const encoder_config : wav.EncoderConfig = . {
2529 .num_channels = if (cli .args .channels ) | channels | channels else defaults .channels ,
2630 .sample_rate = if (cli .args .rate ) | rate | @intFromFloat (rate ) else defaults .sample_rate ,
2731 .format = if (cli .args .format ) | format | format else defaults .format ,
2832 };
2933
3034 // Create generator configuration.
3135 const scale = s : {
32- var scale = std .ArrayList (u8 ). init ( allocator ) ;
36+ var scale : std .ArrayList (u8 ) = .empty ;
3337 var splits = std .mem .splitAny (u8 , if (cli .args .scale ) | s | s else defaults .scale , "," );
3438 while (splits .next ()) | chunk | {
35- try scale .append (try std .fmt .parseInt (u8 , chunk , 0 ));
39+ try scale .append (allocator , try std .fmt .parseInt (u8 , chunk , 0 ));
3640 }
37- break :s try scale .toOwnedSlice ();
41+ break :s try scale .toOwnedSlice (allocator );
3842 };
3943 defer allocator .free (scale );
4044 const generator_config = gen.GeneratorConfig {
@@ -50,63 +54,76 @@ fn run(allocator: std.mem.Allocator, output: anytype) !void {
5054 const buffer = b : {
5155 if (std .mem .eql (u8 , input_file , "-" )) {
5256 try output .print ("Reading {d} bytes from stdin\n " , .{data_len });
53- var list = try std .ArrayList (u8 ).initCapacity (allocator , data_len );
54- const buffer = list .allocatedSlice ();
55- const stdin = std .io .getStdIn ().reader ();
56- try stdin .readNoEof (buffer );
57- break :b buffer ;
58- } else {
59- try output .print ("Reading {d} bytes from {s}\n " , .{ data_len , input_file });
60- break :b try file .readBytes (allocator , input_file , data_len );
57+ try output .flush ();
58+ var read_buffer : [1024 ]u8 = undefined ;
59+ var stdin_reader = std .Io .File .stdin ().reader (io , & read_buffer );
60+ const stdin = & stdin_reader .interface ;
61+ break :b try stdin .readAlloc (allocator , data_len );
6162 }
63+
64+ try output .print ("Reading {d} bytes from {s}\n " , .{ data_len , input_file });
65+ try output .flush ();
66+ break :b try file .readBytes (io , allocator , input_file , data_len );
6267 };
6368 defer allocator .free (buffer );
6469
6570 // Generate music.
66- const generator = gen .Generator .init (generator_config );
67- var data = std .ArrayList (u8 ). init ( allocator ) ;
71+ const generator : gen.Generator = .init (generator_config );
72+ var data : std .ArrayList (u8 ) = .empty ;
6873 for (buffer ) | v | {
6974 const gen_data = try generator .generate (allocator , v );
7075 defer allocator .free (gen_data );
71- try data .appendSlice (gen_data );
76+ try data .appendSlice (allocator , gen_data );
7277 }
7378
7479 // Encode WAV.
7580 const out = if (cli .args .output ) | out | out else defaults .output ;
76- const writer = w : {
81+ var write_buffer : [1024 ]u8 = undefined ;
82+ var fhandle : ? std.Io.File = null ;
83+ defer if (fhandle ) | f | {
84+ f .close (io );
85+ };
86+ var file_writer = w : {
7787 if (std .mem .eql (u8 , out , "-" )) {
7888 try output .print ("Writing to stdout\n " , .{});
79- break :w std .io .getStdOut ().writer ();
80- } else {
81- try output .print ("Saving to {s}\n " , .{out });
82- const out_file = try std .fs .cwd ().createFile (out , .{});
83- break :w out_file .writer ();
89+ try output .flush ();
90+ break :w std .Io .File .stdout ().writer (io , & write_buffer );
8491 }
92+
93+ try output .print ("Saving to {s}\n " , .{out });
94+ try output .flush ();
95+ fhandle = try std .Io .Dir .cwd ().createFile (io , out , .{});
96+ break :w fhandle .? .writer (io , & write_buffer );
8597 };
86- const wav_data = try data .toOwnedSlice ();
98+ const wav_data = try data .toOwnedSlice (allocator );
8799 defer allocator .free (wav_data );
88- try wav .Encoder ( @TypeOf ( writer )). encode (writer , wav_data , encoder_config );
100+ try wav .encode (& file_writer . interface , wav_data , encoder_config );
89101}
90102
91103/// Entry-point.
92- pub fn main () ! void {
93- var gpa = std .heap .GeneralPurposeAllocator (.{}){};
94- const allocator = gpa .allocator ();
95- const stderr = std .io .getStdErr ().writer ();
96- run (allocator , stderr ) catch | err | {
104+ pub fn main (init : std.process.Init ) ! void {
105+ const allocator = init .gpa ;
106+ const io = init .io ;
107+ var stderr_buffer : [1024 ]u8 = undefined ;
108+ var stderr_writer = std .Io .File .stderr ().writer (io , & stderr_buffer );
109+ const stderr = & stderr_writer .interface ;
110+ run (io , allocator , stderr , init .minimal .args ) catch | err | {
97111 try stderr .print ("Error occurred: {}\n " , .{err });
112+ try stderr .flush ();
98113 };
99114}
100115
101116test "run" {
102117 const allocator = std .testing .allocator ;
103- var buffer = std .ArrayList (u8 ).init (allocator );
104- const output = buffer .writer ();
105- run (allocator , output ) catch | err | {
118+ const io = std .testing .io ;
119+
120+ const fake_args : std.process.Args = .{ .vector = &[_ ][* :0 ]const u8 {} };
121+ var allocating : std.Io.Writer.Allocating = .init (allocator );
122+ run (io , allocator , & allocating .writer , fake_args ) catch | err | {
106123 std .debug .print ("Error occurred: {s}\n " , .{@errorName (err )});
107124 return ;
108125 };
109- const result = buffer .toOwnedSlice () catch | err | {
126+ const result = allocating .toOwnedSlice () catch | err | {
110127 std .debug .print ("Error occurred: {s}\n " , .{@errorName (err )});
111128 return ;
112129 };
0 commit comments