1/**
2 * Copyright (c) 2006-2023 LOVE Development Team
3 *
4 * This software is provided 'as-is', without any express or implied
5 * warranty. In no event will the authors be held liable for any damages
6 * arising from the use of this software.
7 *
8 * Permission is granted to anyone to use this software for any purpose,
9 * including commercial applications, and to alter it and redistribute it
10 * freely, subject to the following restrictions:
11 *
12 * 1. The origin of this software must not be misrepresented; you must not
13 * claim that you wrote the original software. If you use this software
14 * in a product, an acknowledgment in the product documentation would be
15 * appreciated but is not required.
16 * 2. Altered source versions must be plainly marked as such, and must not be
17 * misrepresented as being the original software.
18 * 3. This notice may not be removed or altered from any source distribution.
19 **/
20
21#ifndef LOVE_SOUND_LULLABY_VORBIS_DECODER_H
22#define LOVE_SOUND_LULLABY_VORBIS_DECODER_H
23
24// LOVE
25#include "common/Data.h"
26#include "common/int.h"
27#include "sound/Decoder.h"
28
29// vorbis
30#define OV_EXCLUDE_STATIC_CALLBACKS
31#include <vorbis/codec.h>
32#include <vorbis/vorbisfile.h>
33
34namespace love
35{
36namespace sound
37{
38namespace lullaby
39{
40
41// Struct for handling data
42struct SOggFile
43{
44 const char *dataPtr; // Pointer to the data in memory
45 int64 dataSize; // Size of the data
46 int64 dataRead; // How much we've read so far
47};
48
49class VorbisDecoder : public Decoder
50{
51public:
52
53 VorbisDecoder(Data *data, int bufferSize);
54 virtual ~VorbisDecoder();
55
56 static bool accepts(const std::string &ext);
57
58 love::sound::Decoder *clone();
59 int decode();
60 bool seek(double s);
61 bool rewind();
62 bool isSeekable();
63 int getChannelCount() const;
64 int getBitDepth() const;
65 int getSampleRate() const;
66 double getDuration();
67
68private:
69 SOggFile oggFile; // (see struct)
70 ov_callbacks vorbisCallbacks; // Callbacks used to read the file from mem
71 OggVorbis_File handle; // Handle to the file
72 vorbis_info *vorbisInfo; // Info
73 vorbis_comment *vorbisComment; // Comments
74 int endian; // Endianness
75 double duration;
76}; // VorbisDecoder
77
78} // lullaby
79} // sound
80} // love
81
82#endif // LOVE_SOUND_LULLABY_VORBIS_DECODER_H
83