1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 22:47:47 +00:00

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. :^)
This commit is contained in:
Andreas Kling 2019-07-28 21:52:30 +02:00
parent b44d3faa1c
commit ae4a9e017a
3 changed files with 31 additions and 13 deletions

View file

@ -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());

View file

@ -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 };
};

View file

@ -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;
}