diff --git a/Userland/Utilities/aplay.cpp b/Userland/Utilities/aplay.cpp index 72c26397f2..ce8bb75a1e 100644 --- a/Userland/Utilities/aplay.cpp +++ b/Userland/Utilities/aplay.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2018-2020, Andreas Kling + * Copyright (c) 2021-2022, kleines Filmröllchen * * SPDX-License-Identifier: BSD-2-Clause */ @@ -10,6 +11,7 @@ #include #include #include +#include #include // The Kernel has issues with very large anonymous buffers. @@ -20,10 +22,12 @@ ErrorOr serenity_main(Main::Arguments arguments) { const char* path = nullptr; bool should_loop = false; + bool show_sample_progress = false; Core::ArgsParser args_parser; args_parser.add_positional_argument(path, "Path to audio file", "path"); args_parser.add_option(should_loop, "Loop playback", "loop", 'l'); + args_parser.add_option(show_sample_progress, "Show playback progress in samples", "sample-progress", 's'); args_parser.parse(arguments); Core::EventLoop loop; @@ -59,7 +63,27 @@ ErrorOr serenity_main(Main::Arguments arguments) if (samples.value()->sample_count() > 0) { // We can read and enqueue more samples out("\033[u"); - out("{}/{}", loader->loaded_samples(), loader->total_samples()); + if (show_sample_progress) { + out("{}/{}", loader->loaded_samples(), loader->total_samples()); + } else { + auto playing_seconds = static_cast(floor(static_cast(loader->loaded_samples()) / static_cast(loader->sample_rate()))); + auto playing_minutes = playing_seconds / 60; + auto playing_seconds_of_minute = playing_seconds % 60; + + auto total_seconds = static_cast(floor(static_cast(loader->total_samples()) / static_cast(loader->sample_rate()))); + auto total_minutes = total_seconds / 60; + auto total_seconds_of_minute = total_seconds % 60; + + auto remaining_seconds = total_seconds - playing_seconds; + auto remaining_minutes = remaining_seconds / 60; + auto remaining_seconds_of_minute = remaining_seconds % 60; + + out("\033[1m{:02d}:{:02d}\033[0m [{}{:02d}:{:02d}] -- {:02d}:{:02d}", + playing_minutes, playing_seconds_of_minute, + remaining_seconds == 0 ? " " : "-", + remaining_minutes, remaining_seconds_of_minute, + total_minutes, total_seconds_of_minute); + } fflush(stdout); resampler.reset(); auto resampled_samples = TRY(Audio::resample_buffer(resampler, *samples.value()));