Skip to content

Commit 43d85fd

Browse files
rohanrhufire
authored andcommitted
Load OGGs from file system
1 parent 543750a commit 43d85fd

File tree

5 files changed

+90
-47
lines changed

5 files changed

+90
-47
lines changed

modules/vorbis/audio_stream_ogg_vorbis.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
#include "core/io/file_access.h"
3434
#include "core/variant/typed_array.h"
3535

36+
#include "modules/vorbis/resource_importer_ogg_vorbis.h"
37+
#include "thirdparty/libogg/ogg/ogg.h"
3638
#include <ogg/ogg.h>
3739

3840
int AudioStreamPlaybackOggVorbis::_mix_internal(AudioFrame *p_buffer, int p_frames) {
@@ -520,6 +522,9 @@ bool AudioStreamOggVorbis::is_monophonic() const {
520522
}
521523

522524
void AudioStreamOggVorbis::_bind_methods() {
525+
ClassDB::bind_static_method("AudioStreamOggVorbis", D_METHOD("from_buffer", "buffer"), &AudioStreamOggVorbis::from_buffer);
526+
ClassDB::bind_static_method("AudioStreamOggVorbis", D_METHOD("from_filesystem", "path"), &AudioStreamOggVorbis::from_filesystem);
527+
523528
ClassDB::bind_method(D_METHOD("set_packet_sequence", "packet_sequence"), &AudioStreamOggVorbis::set_packet_sequence);
524529
ClassDB::bind_method(D_METHOD("get_packet_sequence"), &AudioStreamOggVorbis::get_packet_sequence);
525530

@@ -549,3 +554,11 @@ void AudioStreamOggVorbis::_bind_methods() {
549554
AudioStreamOggVorbis::AudioStreamOggVorbis() {}
550555

551556
AudioStreamOggVorbis::~AudioStreamOggVorbis() {}
557+
558+
Ref<AudioStreamOggVorbis> AudioStreamOggVorbis::AudioStreamOggVorbis::from_buffer(const Vector<uint8_t> &file_data) {
559+
return ResourceImporterOggVorbis::load_from_buffer(file_data);
560+
}
561+
562+
Ref<AudioStreamOggVorbis> AudioStreamOggVorbis::from_filesystem(const String &p_path) {
563+
return ResourceImporterOggVorbis::load_from_filesystem(p_path);
564+
}

modules/vorbis/audio_stream_ogg_vorbis.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ class AudioStreamOggVorbis : public AudioStream {
125125
static void _bind_methods();
126126

127127
public:
128+
static Ref<AudioStreamOggVorbis> from_filesystem(const String &p_path);
129+
static Ref<AudioStreamOggVorbis> from_buffer(const Vector<uint8_t> &file_data);
128130
void set_loop(bool p_enable);
129131
virtual bool has_loop() const override;
130132

modules/vorbis/doc_classes/AudioStreamOggVorbis.xml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,29 @@
11
<?xml version="1.0" encoding="UTF-8" ?>
22
<class name="AudioStreamOggVorbis" inherits="AudioStream" version="4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../doc/class.xsd">
33
<brief_description>
4+
A class representing an Ogg Vorbis audio stream.
45
</brief_description>
56
<description>
7+
The AudioStreamOggVorbis class is a specialized [AudioStream] for handling Ogg Vorbis file formats. It offers functionality for loading and playing back Ogg Vorbis files, as well as managing looping and other playback properties. This class is part of the audio stream system, which also supports WAV files through the [AudioStreamWAV] class.
68
</description>
79
<tutorials>
810
</tutorials>
11+
<methods>
12+
<method name="from_buffer" qualifiers="static">
13+
<return type="AudioStreamOggVorbis" />
14+
<param index="0" name="buffer" type="PackedByteArray" />
15+
<description>
16+
Creates a new AudioStreamOggVorbis instance from the given buffer. The buffer must contain Ogg Vorbis data.
17+
</description>
18+
</method>
19+
<method name="from_filesystem" qualifiers="static">
20+
<return type="AudioStreamOggVorbis" />
21+
<param index="0" name="path" type="String" />
22+
<description>
23+
Creates a new AudioStreamOggVorbis instance from the given file path. The file must be in Ogg Vorbis format.
24+
</description>
25+
</method>
26+
</methods>
927
<members>
1028
<member name="bar_beats" type="int" setter="set_bar_beats" getter="get_bar_beats" default="4">
1129
</member>

modules/vorbis/resource_importer_ogg_vorbis.cpp

Lines changed: 52 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -81,18 +81,50 @@ void ResourceImporterOggVorbis::get_import_options(const String &p_path, List<Im
8181
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "bar_beats", PROPERTY_HINT_RANGE, "2,32,or_greater"), 4));
8282
}
8383

84-
Ref<AudioStreamOggVorbis> ResourceImporterOggVorbis::import_ogg_vorbis(const String &p_path) {
85-
Ref<FileAccess> f = FileAccess::open(p_path, FileAccess::READ);
86-
ERR_FAIL_COND_V_MSG(f.is_null(), Ref<AudioStreamOggVorbis>(), "Cannot open file '" + p_path + "'.");
84+
#ifdef TOOLS_ENABLED
8785

88-
uint64_t len = f->get_length();
86+
bool ResourceImporterOggVorbis::has_advanced_options() const {
87+
return true;
88+
}
8989

90-
Vector<uint8_t> file_data;
91-
file_data.resize(len);
92-
uint8_t *w = file_data.ptrw();
90+
void ResourceImporterOggVorbis::show_advanced_options(const String &p_path) {
91+
Ref<AudioStreamOggVorbis> ogg_stream = load_from_filesystem(p_path);
92+
if (ogg_stream.is_valid()) {
93+
AudioStreamImportSettings::get_singleton()->edit(p_path, "oggvorbisstr", ogg_stream);
94+
}
95+
}
96+
#endif
9397

94-
f->get_buffer(w, len);
98+
Error ResourceImporterOggVorbis::import(const String &p_source_file, const String &p_save_path, const HashMap<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
99+
bool loop = p_options["loop"];
100+
float loop_offset = p_options["loop_offset"];
101+
double bpm = p_options["bpm"];
102+
int beat_count = p_options["beat_count"];
103+
int bar_beats = p_options["bar_beats"];
104+
105+
Ref<AudioStreamOggVorbis> ogg_vorbis_stream = load_from_filesystem(p_source_file);
106+
if (ogg_vorbis_stream.is_null()) {
107+
return ERR_CANT_OPEN;
108+
}
109+
110+
ogg_vorbis_stream->set_loop(loop);
111+
ogg_vorbis_stream->set_loop_offset(loop_offset);
112+
ogg_vorbis_stream->set_bpm(bpm);
113+
ogg_vorbis_stream->set_beat_count(beat_count);
114+
ogg_vorbis_stream->set_bar_beats(bar_beats);
115+
116+
return ResourceSaver::save(ogg_vorbis_stream, p_save_path + ".oggvorbisstr");
117+
}
118+
119+
ResourceImporterOggVorbis::ResourceImporterOggVorbis() {
120+
}
95121

122+
void ResourceImporterOggVorbis::_bind_methods() {
123+
ClassDB::bind_static_method("ResourceImporterOggVorbis", D_METHOD("load_from_buffer", "array"), &ResourceImporterOggVorbis::load_from_buffer);
124+
ClassDB::bind_static_method("ResourceImporterOggVorbis", D_METHOD("load_from_filesystem", "path"), &ResourceImporterOggVorbis::load_from_filesystem);
125+
}
126+
127+
Ref<AudioStreamOggVorbis> ResourceImporterOggVorbis::load_from_buffer(const Vector<uint8_t> &file_data) {
96128
Ref<AudioStreamOggVorbis> ogg_vorbis_stream;
97129
ogg_vorbis_stream.instantiate();
98130

@@ -114,7 +146,7 @@ Ref<AudioStreamOggVorbis> ResourceImporterOggVorbis::import_ogg_vorbis(const Str
114146
err = ogg_sync_check(&sync_state);
115147
ERR_FAIL_COND_V_MSG(err != 0, Ref<AudioStreamOggVorbis>(), "Ogg sync error " + itos(err));
116148
while (ogg_sync_pageout(&sync_state, &page) != 1) {
117-
if (cursor >= len) {
149+
if (cursor >= size_t(file_data.size())) {
118150
done = true;
119151
break;
120152
}
@@ -123,8 +155,8 @@ Ref<AudioStreamOggVorbis> ResourceImporterOggVorbis::import_ogg_vorbis(const Str
123155
char *sync_buf = ogg_sync_buffer(&sync_state, OGG_SYNC_BUFFER_SIZE);
124156
err = ogg_sync_check(&sync_state);
125157
ERR_FAIL_COND_V_MSG(err != 0, Ref<AudioStreamOggVorbis>(), "Ogg sync error " + itos(err));
126-
ERR_FAIL_COND_V(cursor > len, Ref<AudioStreamOggVorbis>());
127-
size_t copy_size = len - cursor;
158+
ERR_FAIL_COND_V(cursor > size_t(file_data.size()), Ref<AudioStreamOggVorbis>());
159+
size_t copy_size = file_data.size() - cursor;
128160
if (copy_size > OGG_SYNC_BUFFER_SIZE) {
129161
copy_size = OGG_SYNC_BUFFER_SIZE;
130162
}
@@ -201,40 +233,17 @@ Ref<AudioStreamOggVorbis> ResourceImporterOggVorbis::import_ogg_vorbis(const Str
201233
return ogg_vorbis_stream;
202234
}
203235

204-
#ifdef TOOLS_ENABLED
205-
206-
bool ResourceImporterOggVorbis::has_advanced_options() const {
207-
return true;
208-
}
209-
210-
void ResourceImporterOggVorbis::show_advanced_options(const String &p_path) {
211-
Ref<AudioStreamOggVorbis> ogg_stream = import_ogg_vorbis(p_path);
212-
if (ogg_stream.is_valid()) {
213-
AudioStreamImportSettings::get_singleton()->edit(p_path, "oggvorbisstr", ogg_stream);
214-
}
215-
}
216-
#endif
217-
218-
Error ResourceImporterOggVorbis::import(const String &p_source_file, const String &p_save_path, const HashMap<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
219-
bool loop = p_options["loop"];
220-
float loop_offset = p_options["loop_offset"];
221-
double bpm = p_options["bpm"];
222-
int beat_count = p_options["beat_count"];
223-
int bar_beats = p_options["bar_beats"];
236+
Ref<AudioStreamOggVorbis> ResourceImporterOggVorbis::load_from_filesystem(const String &p_path) {
237+
Ref<FileAccess> f = FileAccess::open(p_path, FileAccess::READ);
238+
ERR_FAIL_COND_V_MSG(f.is_null(), Ref<AudioStreamOggVorbis>(), "Cannot open file '" + p_path + "'.");
224239

225-
Ref<AudioStreamOggVorbis> ogg_vorbis_stream = import_ogg_vorbis(p_source_file);
226-
if (ogg_vorbis_stream.is_null()) {
227-
return ERR_CANT_OPEN;
228-
}
240+
uint64_t len = f->get_length();
229241

230-
ogg_vorbis_stream->set_loop(loop);
231-
ogg_vorbis_stream->set_loop_offset(loop_offset);
232-
ogg_vorbis_stream->set_bpm(bpm);
233-
ogg_vorbis_stream->set_beat_count(beat_count);
234-
ogg_vorbis_stream->set_bar_beats(bar_beats);
242+
Vector<uint8_t> file_data;
243+
file_data.resize(len);
244+
uint8_t *w = file_data.ptrw();
235245

236-
return ResourceSaver::save(ogg_vorbis_stream, p_save_path + ".oggvorbisstr");
237-
}
246+
f->get_buffer(w, len);
238247

239-
ResourceImporterOggVorbis::ResourceImporterOggVorbis() {
248+
return load_from_buffer(file_data);
240249
}

modules/vorbis/resource_importer_ogg_vorbis.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,17 @@ class ResourceImporterOggVorbis : public ResourceImporter {
4141
OGG_SYNC_BUFFER_SIZE = 8192,
4242
};
4343

44-
private:
45-
// virtual int get_samples_in_packet(Vector<uint8_t> p_packet) = 0;
46-
47-
static Ref<AudioStreamOggVorbis> import_ogg_vorbis(const String &p_path);
44+
protected:
45+
static void _bind_methods();
4846

4947
public:
5048
#ifdef TOOLS_ENABLED
5149
virtual bool has_advanced_options() const override;
5250
virtual void show_advanced_options(const String &p_path) override;
5351
#endif
52+
53+
static Ref<AudioStreamOggVorbis> load_from_filesystem(const String &p_path);
54+
static Ref<AudioStreamOggVorbis> load_from_buffer(const Vector<uint8_t> &file_data);
5455
virtual void get_recognized_extensions(List<String> *p_extensions) const override;
5556
virtual String get_save_extension() const override;
5657
virtual String get_resource_type() const override;

0 commit comments

Comments
 (0)