/src/serenity/Userland/Libraries/LibAudio/WavLoader.h
Line | Count | Source |
1 | | /* |
2 | | * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> |
3 | | * Copyright (c) 2021, kleines Filmröllchen <filmroellchen@serenityos.org> |
4 | | * |
5 | | * SPDX-License-Identifier: BSD-2-Clause |
6 | | */ |
7 | | |
8 | | #pragma once |
9 | | |
10 | | #include <AK/ByteString.h> |
11 | | #include <AK/FixedArray.h> |
12 | | #include <AK/OwnPtr.h> |
13 | | #include <AK/RefPtr.h> |
14 | | #include <AK/Span.h> |
15 | | #include <AK/StringView.h> |
16 | | #include <LibAudio/Loader.h> |
17 | | #include <LibRIFF/RIFF.h> |
18 | | |
19 | | namespace Audio { |
20 | | |
21 | | // Loader for the WAVE (file extension .wav) uncompressed audio file format. |
22 | | // WAVE uses the Microsoft RIFF container. |
23 | | // Original RIFF Spec, without later extensions: https://www.aelius.com/njh/wavemetatools/doc/riffmci.pdf |
24 | | // More concise WAVE information plus various spec links: http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html |
25 | | class WavLoaderPlugin : public LoaderPlugin { |
26 | | public: |
27 | | explicit WavLoaderPlugin(NonnullOwnPtr<SeekableStream> stream); |
28 | | |
29 | | static bool sniff(SeekableStream& stream); |
30 | | static ErrorOr<NonnullOwnPtr<LoaderPlugin>, LoaderError> create(NonnullOwnPtr<SeekableStream>); |
31 | | |
32 | | virtual ErrorOr<Vector<FixedArray<Sample>>, LoaderError> load_chunks(size_t samples_to_read_from_input) override; |
33 | | |
34 | 0 | virtual MaybeLoaderError reset() override { return seek(0); } |
35 | | |
36 | | // sample_index 0 is the start of the raw audio sample data |
37 | | // within the file/stream. |
38 | | virtual MaybeLoaderError seek(int sample_index) override; |
39 | | |
40 | 0 | virtual int loaded_samples() override { return static_cast<int>(m_loaded_samples); } |
41 | 0 | virtual int total_samples() override { return static_cast<int>(m_total_samples); } |
42 | 0 | virtual u32 sample_rate() override { return m_sample_rate; } |
43 | 0 | virtual u16 num_channels() override { return m_num_channels; } |
44 | 0 | virtual ByteString format_name() override { return "RIFF WAVE (.wav)"; } |
45 | 0 | virtual PcmSampleFormat pcm_format() override { return m_sample_format; } |
46 | | |
47 | | private: |
48 | | MaybeLoaderError parse_header(); |
49 | | MaybeLoaderError load_wav_info_block(Vector<RIFF::OwnedChunk> info_chunks); |
50 | | |
51 | | LoaderSamples samples_from_pcm_data(ReadonlyBytes data, size_t samples_to_read) const; |
52 | | template<typename SampleReader> |
53 | | MaybeLoaderError read_samples_from_stream(Stream& stream, SampleReader read_sample, FixedArray<Sample>& samples) const; |
54 | | |
55 | | u32 m_sample_rate { 0 }; |
56 | | u16 m_num_channels { 0 }; |
57 | | PcmSampleFormat m_sample_format; |
58 | | size_t m_byte_offset_of_data_samples { 0 }; |
59 | | |
60 | | size_t m_loaded_samples { 0 }; |
61 | | size_t m_total_samples { 0 }; |
62 | | }; |
63 | | |
64 | | } |