瀏覽代碼

LibAudio+aplay: Make the aplay output look a little funner.

Show some information about the file we're playing, and display how many
samples we've played out of how many total.

This might be a bit buggy as I haven't tested it with many different files,
but it's a start. :^)
Andreas Kling 6 年之前
父節點
當前提交
ae4a9e017a
共有 3 個文件被更改,包括 31 次插入13 次删除
  1. 7 1
      Libraries/LibAudio/AWavLoader.cpp
  2. 9 0
      Libraries/LibAudio/AWavLoader.h
  3. 15 12
      Userland/aplay.cpp

+ 7 - 1
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());
 

+ 9 - 0
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 };
 };

+ 15 - 12
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;
 }