diff options
-rw-r--r-- | Libraries/LibAudio/AWavLoader.cpp | 8 | ||||
-rw-r--r-- | Libraries/LibAudio/AWavLoader.h | 9 | ||||
-rw-r--r-- | Userland/aplay.cpp | 27 |
3 files changed, 31 insertions, 13 deletions
diff --git a/Libraries/LibAudio/AWavLoader.cpp b/Libraries/LibAudio/AWavLoader.cpp index 93e6a2bd17..f4078cd4dc 100644 --- a/Libraries/LibAudio/AWavLoader.cpp +++ b/Libraries/LibAudio/AWavLoader.cpp @@ -25,7 +25,10 @@ RefPtr<ABuffer> AWavLoader::get_more_samples() auto raw_samples = m_file.read(128 * KB); if (raw_samples.is_empty()) return nullptr; - return ABuffer::from_pcm_data(raw_samples, m_num_channels, m_bits_per_sample, m_sample_rate); + + auto buffer = ABuffer::from_pcm_data(raw_samples, m_num_channels, m_bits_per_sample, m_sample_rate); + m_loaded_samples += buffer->sample_count(); + return buffer; } bool AWavLoader::parse_header() @@ -125,6 +128,9 @@ bool AWavLoader::parse_header() ok = ok && data_sz < INT32_MAX; CHECK_OK("Data was too large"); + int bytes_per_sample = (m_bits_per_sample / 8) * m_num_channels; + m_total_samples = data_sz / bytes_per_sample; + // Just make sure we're good before we read the data... ASSERT(!stream.handle_read_failure()); diff --git a/Libraries/LibAudio/AWavLoader.h b/Libraries/LibAudio/AWavLoader.h index d1d30a3884..43d24657fe 100644 --- a/Libraries/LibAudio/AWavLoader.h +++ b/Libraries/LibAudio/AWavLoader.h @@ -20,6 +20,12 @@ public: RefPtr<ABuffer> get_more_samples(); + int loaded_samples() const { return m_loaded_samples; } + int total_samples() const { return m_total_samples; } + u32 sample_rate() const { return m_sample_rate; } + u16 num_channels() const { return m_num_channels; } + u16 bits_per_sample() const { return m_bits_per_sample; } + private: bool parse_header(); CFile m_file; @@ -28,4 +34,7 @@ private: u32 m_sample_rate { 0 }; u16 m_num_channels { 0 }; u16 m_bits_per_sample { 0 }; + + int m_loaded_samples { 0 }; + int m_total_samples { 0 }; }; diff --git a/Userland/aplay.cpp b/Userland/aplay.cpp index 9d2fba736b..5582fd9ca0 100644 --- a/Userland/aplay.cpp +++ b/Userland/aplay.cpp @@ -1,10 +1,10 @@ -#include <LibCore/CEventLoop.h> -#include <LibAudio/AWavLoader.h> -#include <LibAudio/AClientConnection.h> #include <LibAudio/ABuffer.h> +#include <LibAudio/AClientConnection.h> +#include <LibAudio/AWavLoader.h> +#include <LibCore/CEventLoop.h> #include <cstdio> -int main(int argc, char **argv) +int main(int argc, char** argv) { CEventLoop loop; if (argc < 2) { @@ -12,22 +12,25 @@ int main(int argc, char **argv) return 1; } - printf("Establishing connection\n"); AClientConnection a_conn; a_conn.handshake(); - printf("Established connection\n"); AWavLoader loader(argv[1]); - printf("Loaded WAV\n"); + printf("\033[34;1mPlaying\033[0m: %s\n", argv[1]); + printf("\033[34;1m Format\033[0m: %u Hz, %u-bit, %s\n", + loader.sample_rate(), + loader.bits_per_sample(), + loader.num_channels() == 1 ? "Mono" : "Stereo"); + printf("\033[34;1m Sample\033[0m: \033[s"); for (;;) { auto samples = loader.get_more_samples(); - if (!samples) { + if (!samples) break; - } - printf("Playing %d sample(s)\n", samples->sample_count()); + printf("\033[u"); + printf("%d/%d", loader.loaded_samples(), loader.total_samples()); + fflush(stdout); a_conn.enqueue(*samples); } - - printf("Exiting! :)\n"); + printf("\n"); return 0; } |