forked from twig33/ynoclient
-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathaudio_secache.h
147 lines (127 loc) · 4.25 KB
/
audio_secache.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/*
* This file is part of EasyRPG Player.
*
* EasyRPG Player is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EasyRPG Player is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EasyRPG Player. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef EP_AUDIO_SECACHE_H
#define EP_AUDIO_SECACHE_H
// Headers
#include <cstdio>
#include <string>
#include <vector>
#include <memory>
#include <map>
#include "audio_decoder.h"
#include "game_clock.h"
class AudioSeCache;
/**
* AudioSeData contains the decoded sample of AudioSeCache.
*/
class AudioSeData {
public:
std::vector<uint8_t> buffer;
Game_Clock::time_point last_access;
int frequency;
AudioDecoder::Format format;
int channels;
};
typedef std::shared_ptr<AudioSeData> AudioSeRef;
/**
* AudioSeDecoder operates on supplied AudioSeData and does format
* conversions through the resamplers.
*/
class AudioSeDecoder : public AudioDecoder {
public:
explicit AudioSeDecoder(const AudioSeRef& se);
bool Open(Filesystem_Stream::InputStream) override { return true; };
bool IsFinished() const override;
void GetFormat(int& frequency, Format& format, int& channels) const override;
int GetPitch() const override;
bool Seek(std::streamoff, std::ios_base::seekdir) override { return false; }
int GetTicks() const override { return 0; }
private:
int FillBuffer(uint8_t* buffer, int size) override;
AudioSeRef se;
size_t offset = 0;
};
/**
* AudioSeCache provides an interface for accessing sound effects.
* It also provides an automatic cache management, any SE is only decoded
* once, otherwise returned from the cache.
* The cache is flushed from recently (>10 seconds by default) unused
* samples when it reaches the memory limit (5 MB by default).
* Uses an internal AudioDecoder for handling the decoding.
*/
class AudioSeCache {
public:
/**
* Opens the passed filename with the internal audio decoder.
*
* @param stream Stream to the audio file
* @param name Name for the cache entry
* @return An AudioSeCache instance when the format was detected, otherwise null
*/
static std::unique_ptr<AudioSeCache> Create(Filesystem_Stream::InputStream stream, StringView name);
/**
* Retrieves the format of the internal audio decoder.
* It is guaranteed that these settings will stay constant the whole time.
*
* @param frequency Filled with the audio frequency
* @param format Filled with the audio format
* @param channels Filled with the amount of channels
*/
void GetFormat(int& frequency, AudioDecoder::Format& format, int& channels) const;
/**
* If already cached returns the cached SE
*
* @param name Cache entry name
* @return SE is already in cache, nullptr otherwise
*/
static std::unique_ptr<AudioSeCache> GetCachedSe(StringView name);
/**
* Retrieves the format of the cached file.
* It is guaranteed that these settings will stay constant the whole time.
* When the format is not cached (false returned) the arguments are not
* populated.
*
* @param frequency Filled with the audio frequency
* @param format Filled with the audio format
* @param channels Filled with the amount of channels
* @return true when format was cached, the values were populated
*/
bool GetCachedFormat(int& frequency, AudioDecoder::Format& format, int& channels) const;
/**
* Decodes the whole sample without doing any resampling and caches it.
* When cached the decoding step is skipped.
* The returned AudioDecoder contains the SE sample.
*
* @return Decoded sound effect
*/
std::unique_ptr<AudioDecoderBase> CreateSeDecoder();
/**
* Returns the SE sample data handled by this SeCache.
*
* @return sample data
*/
AudioSeRef GetSeData() const;
/**
* @return name of the cached SE
*/
StringView GetName() const;
static void Clear();
private:
std::unique_ptr<AudioDecoderBase> audio_decoder;
std::string name;
};
#endif