mirror of https://github.com/godotengine/godot
Replace `minimp3` with `dr_mp3`
This commit is contained in:
parent
d61cd9149a
commit
f46bca99c7
|
|
@ -78,8 +78,8 @@
|
||||||
## Audio (+ video)
|
## Audio (+ video)
|
||||||
/modules/interactive_music/ @godotengine/audio
|
/modules/interactive_music/ @godotengine/audio
|
||||||
/modules/interactive_music/doc_classes/ @godotengine/audio @godotengine/documentation
|
/modules/interactive_music/doc_classes/ @godotengine/audio @godotengine/documentation
|
||||||
/modules/minimp3/ @godotengine/audio
|
/modules/mp3/ @godotengine/audio
|
||||||
/modules/minimp3/doc_classes/ @godotengine/audio @godotengine/documentation
|
/modules/mp3/doc_classes/ @godotengine/audio @godotengine/documentation
|
||||||
/modules/ogg/ @godotengine/audio
|
/modules/ogg/ @godotengine/audio
|
||||||
/modules/ogg/doc_classes/ @godotengine/audio @godotengine/documentation
|
/modules/ogg/doc_classes/ @godotengine/audio @godotengine/documentation
|
||||||
/modules/theora/ @godotengine/audio
|
/modules/theora/ @godotengine/audio
|
||||||
|
|
|
||||||
|
|
@ -253,6 +253,11 @@ Comment: doctest
|
||||||
Copyright: 2016-2023, Viktor Kirilov
|
Copyright: 2016-2023, Viktor Kirilov
|
||||||
License: Expat
|
License: Expat
|
||||||
|
|
||||||
|
Files: thirdparty/dr_libs/*
|
||||||
|
Comment: dr_libs
|
||||||
|
Copyright: 2020, David Reid
|
||||||
|
License: Unlicense or MIT-0
|
||||||
|
|
||||||
Files: thirdparty/embree/*
|
Files: thirdparty/embree/*
|
||||||
Comment: Embree
|
Comment: Embree
|
||||||
Copyright: 2009-2021 Intel Corporation
|
Copyright: 2009-2021 Intel Corporation
|
||||||
|
|
@ -415,11 +420,6 @@ Comment: mingw-std-threads
|
||||||
Copyright: 2016, Mega Limited
|
Copyright: 2016, Mega Limited
|
||||||
License: BSD-2-clause
|
License: BSD-2-clause
|
||||||
|
|
||||||
Files: thirdparty/minimp3/*
|
|
||||||
Comment: MiniMP3
|
|
||||||
Copyright: lieff
|
|
||||||
License: CC0-1.0
|
|
||||||
|
|
||||||
Files: thirdparty/miniupnpc/*
|
Files: thirdparty/miniupnpc/*
|
||||||
Comment: MiniUPnP Project
|
Comment: MiniUPnP Project
|
||||||
Copyright: 2005-2025, Thomas Bernard
|
Copyright: 2005-2025, Thomas Bernard
|
||||||
|
|
@ -2135,6 +2135,22 @@ License: MPL-2.0
|
||||||
This Source Code Form is "Incompatible With Secondary Licenses", as
|
This Source Code Form is "Incompatible With Secondary Licenses", as
|
||||||
defined by the Mozilla Public License, v. 2.0.
|
defined by the Mozilla Public License, v. 2.0.
|
||||||
|
|
||||||
|
License: MIT-0
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so.
|
||||||
|
.
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
License: OFL-1.1
|
License: OFL-1.1
|
||||||
PREAMBLE
|
PREAMBLE
|
||||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
|
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
#!/usr/bin/env python
|
|
||||||
from misc.utility.scons_hints import *
|
|
||||||
|
|
||||||
Import("env")
|
|
||||||
Import("env_modules")
|
|
||||||
|
|
||||||
env_minimp3 = env_modules.Clone()
|
|
||||||
|
|
||||||
thirdparty_dir = "#thirdparty/minimp3/"
|
|
||||||
|
|
||||||
env_minimp3.Prepend(CPPPATH=[thirdparty_dir])
|
|
||||||
|
|
||||||
if not env["minimp3_extra_formats"]:
|
|
||||||
env_minimp3.Append(CPPDEFINES=["MINIMP3_ONLY_MP3"])
|
|
||||||
|
|
||||||
# Godot source files
|
|
||||||
env_minimp3.add_source_files(env.modules_sources, "*.cpp")
|
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
from misc.utility.scons_hints import *
|
||||||
|
|
||||||
|
Import("env")
|
||||||
|
Import("env_modules")
|
||||||
|
|
||||||
|
env_mp3 = env_modules.Clone()
|
||||||
|
|
||||||
|
if not env["mp3_extra_formats"]:
|
||||||
|
env_mp3.Append(CPPDEFINES=["DR_MP3_ONLY_MP3"])
|
||||||
|
|
||||||
|
# Godot source files
|
||||||
|
env_mp3.add_source_files(env.modules_sources, "*.cpp")
|
||||||
|
|
@ -28,13 +28,15 @@
|
||||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
|
|
||||||
#define MINIMP3_FLOAT_OUTPUT
|
#define DR_MP3_FLOAT_OUTPUT
|
||||||
#define MINIMP3_IMPLEMENTATION
|
#define DR_MP3_IMPLEMENTATION
|
||||||
#define MINIMP3_NO_STDIO
|
#define DR_MP3_NO_STDIO
|
||||||
|
|
||||||
#include "audio_stream_mp3.h"
|
#include "audio_stream_mp3.h"
|
||||||
#include "core/io/file_access.h"
|
#include "core/io/file_access.h"
|
||||||
|
|
||||||
|
#include "thirdparty/dr_libs/dr_bridge.h"
|
||||||
|
|
||||||
int AudioStreamPlaybackMP3::_mix_internal(AudioFrame *p_buffer, int p_frames) {
|
int AudioStreamPlaybackMP3::_mix_internal(AudioFrame *p_buffer, int p_frames) {
|
||||||
if (!active) {
|
if (!active) {
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -53,13 +55,12 @@ int AudioStreamPlaybackMP3::_mix_internal(AudioFrame *p_buffer, int p_frames) {
|
||||||
}
|
}
|
||||||
|
|
||||||
while (todo && active) {
|
while (todo && active) {
|
||||||
mp3dec_frame_info_t frame_info;
|
drmp3d_sample_t buf_frame[2];
|
||||||
mp3d_sample_t *buf_frame = nullptr;
|
|
||||||
|
|
||||||
int samples_mixed = mp3dec_ex_read_frame(&mp3d, &buf_frame, &frame_info, mp3_stream->channels);
|
int samples_mixed = drmp3_read_pcm_frames_f32(&mp3d, 1, buf_frame);
|
||||||
|
|
||||||
if (samples_mixed) {
|
if (samples_mixed) {
|
||||||
p_buffer[p_frames - todo] = AudioFrame(buf_frame[0], buf_frame[samples_mixed - 1]);
|
p_buffer[p_frames - todo] = AudioFrame(buf_frame[0], buf_frame[mp3d.channels - 1]);
|
||||||
if (loop_fade_remaining < FADE_SIZE) {
|
if (loop_fade_remaining < FADE_SIZE) {
|
||||||
p_buffer[p_frames - todo] += loop_fade[loop_fade_remaining] * (float(FADE_SIZE - loop_fade_remaining) / float(FADE_SIZE));
|
p_buffer[p_frames - todo] += loop_fade[loop_fade_remaining] * (float(FADE_SIZE - loop_fade_remaining) / float(FADE_SIZE));
|
||||||
loop_fade_remaining++;
|
loop_fade_remaining++;
|
||||||
|
|
@ -69,8 +70,8 @@ int AudioStreamPlaybackMP3::_mix_internal(AudioFrame *p_buffer, int p_frames) {
|
||||||
|
|
||||||
if (beat_loop && (int)frames_mixed >= beat_length_frames) {
|
if (beat_loop && (int)frames_mixed >= beat_length_frames) {
|
||||||
for (int i = 0; i < FADE_SIZE; i++) {
|
for (int i = 0; i < FADE_SIZE; i++) {
|
||||||
samples_mixed = mp3dec_ex_read_frame(&mp3d, &buf_frame, &frame_info, mp3_stream->channels);
|
samples_mixed = drmp3_read_pcm_frames_f32(&mp3d, 1, buf_frame);
|
||||||
loop_fade[i] = AudioFrame(buf_frame[0], buf_frame[samples_mixed - 1]);
|
loop_fade[i] = AudioFrame(buf_frame[0], buf_frame[mp3d.channels - 1]);
|
||||||
if (!samples_mixed) {
|
if (!samples_mixed) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -137,7 +138,7 @@ void AudioStreamPlaybackMP3::seek(double p_time) {
|
||||||
}
|
}
|
||||||
|
|
||||||
frames_mixed = uint32_t(mp3_stream->sample_rate * p_time);
|
frames_mixed = uint32_t(mp3_stream->sample_rate * p_time);
|
||||||
mp3dec_ex_seek(&mp3d, (uint64_t)frames_mixed * mp3_stream->channels);
|
drmp3_seek_to_pcm_frame(&mp3d, (uint64_t)frames_mixed);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioStreamPlaybackMP3::tag_used_streams() {
|
void AudioStreamPlaybackMP3::tag_used_streams() {
|
||||||
|
|
@ -183,7 +184,7 @@ Variant AudioStreamPlaybackMP3::get_parameter(const StringName &p_name) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioStreamPlaybackMP3::~AudioStreamPlaybackMP3() {
|
AudioStreamPlaybackMP3::~AudioStreamPlaybackMP3() {
|
||||||
mp3dec_ex_close(&mp3d);
|
drmp3_uninit(&mp3d);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ref<AudioStreamPlayback> AudioStreamMP3::instantiate_playback() {
|
Ref<AudioStreamPlayback> AudioStreamMP3::instantiate_playback() {
|
||||||
|
|
@ -197,15 +198,13 @@ Ref<AudioStreamPlayback> AudioStreamMP3::instantiate_playback() {
|
||||||
mp3s.instantiate();
|
mp3s.instantiate();
|
||||||
mp3s->mp3_stream = Ref<AudioStreamMP3>(this);
|
mp3s->mp3_stream = Ref<AudioStreamMP3>(this);
|
||||||
|
|
||||||
int errorcode = mp3dec_ex_open_buf(&mp3s->mp3d, data.ptr(), data_len, MP3D_SEEK_TO_SAMPLE);
|
int success = drmp3_init_memory(&mp3s->mp3d, data.ptr(), data_len, (drmp3_allocation_callbacks *)&dr_alloc_calls);
|
||||||
|
|
||||||
mp3s->frames_mixed = 0;
|
mp3s->frames_mixed = 0;
|
||||||
mp3s->active = false;
|
mp3s->active = false;
|
||||||
mp3s->loops = 0;
|
mp3s->loops = 0;
|
||||||
|
|
||||||
if (errorcode) {
|
ERR_FAIL_COND_V(!success, Ref<AudioStreamPlaybackMP3>());
|
||||||
ERR_FAIL_COND_V(errorcode, Ref<AudioStreamPlaybackMP3>());
|
|
||||||
}
|
|
||||||
|
|
||||||
return mp3s;
|
return mp3s;
|
||||||
}
|
}
|
||||||
|
|
@ -221,18 +220,18 @@ void AudioStreamMP3::clear_data() {
|
||||||
void AudioStreamMP3::set_data(const Vector<uint8_t> &p_data) {
|
void AudioStreamMP3::set_data(const Vector<uint8_t> &p_data) {
|
||||||
int src_data_len = p_data.size();
|
int src_data_len = p_data.size();
|
||||||
|
|
||||||
mp3dec_ex_t *mp3d = memnew(mp3dec_ex_t);
|
drmp3 *mp3d = memnew(drmp3);
|
||||||
int err = mp3dec_ex_open_buf(mp3d, p_data.ptr(), src_data_len, MP3D_SEEK_TO_SAMPLE);
|
int success = drmp3_init_memory(mp3d, p_data.ptr(), src_data_len, (drmp3_allocation_callbacks *)&dr_alloc_calls);
|
||||||
if (err || mp3d->info.hz == 0) {
|
if (!success || mp3d->sampleRate == 0) {
|
||||||
memdelete(mp3d);
|
memdelete(mp3d);
|
||||||
ERR_FAIL_MSG("Failed to decode mp3 file. Make sure it is a valid mp3 audio file.");
|
ERR_FAIL_MSG("Failed to decode mp3 file. Make sure it is a valid mp3 audio file.");
|
||||||
}
|
}
|
||||||
|
|
||||||
channels = mp3d->info.channels;
|
channels = mp3d->channels;
|
||||||
sample_rate = mp3d->info.hz;
|
sample_rate = mp3d->sampleRate;
|
||||||
length = float(mp3d->samples) / (sample_rate * float(channels));
|
length = float(drmp3_get_pcm_frame_count(mp3d)) / (mp3d->sampleRate);
|
||||||
|
|
||||||
mp3dec_ex_close(mp3d);
|
drmp3_uninit(mp3d);
|
||||||
memdelete(mp3d);
|
memdelete(mp3d);
|
||||||
|
|
||||||
data = p_data;
|
data = p_data;
|
||||||
|
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
#include "servers/audio/audio_stream.h"
|
#include "servers/audio/audio_stream.h"
|
||||||
|
|
||||||
#include <minimp3_ex.h>
|
#include "thirdparty/dr_libs/dr_mp3.h"
|
||||||
|
|
||||||
class AudioStreamMP3;
|
class AudioStreamMP3;
|
||||||
|
|
||||||
|
|
@ -47,7 +47,7 @@ class AudioStreamPlaybackMP3 : public AudioStreamPlaybackResampled {
|
||||||
|
|
||||||
bool looping_override = false;
|
bool looping_override = false;
|
||||||
bool looping = false;
|
bool looping = false;
|
||||||
mp3dec_ex_t mp3d = {};
|
drmp3 mp3d = {};
|
||||||
uint32_t frames_mixed = 0;
|
uint32_t frames_mixed = 0;
|
||||||
bool active = false;
|
bool active = false;
|
||||||
int loops = 0;
|
int loops = 0;
|
||||||
|
|
@ -6,7 +6,7 @@ def get_opts(platform):
|
||||||
from SCons.Variables import BoolVariable
|
from SCons.Variables import BoolVariable
|
||||||
|
|
||||||
return [
|
return [
|
||||||
BoolVariable("minimp3_extra_formats", "Build minimp3 with MP1/MP2 decoding support", False),
|
BoolVariable("mp3_extra_formats", "Build mp3 module with MP1/MP2 decoding support", False),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -44,7 +44,7 @@ static void _editor_init() {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void initialize_minimp3_module(ModuleInitializationLevel p_level) {
|
void initialize_mp3_module(ModuleInitializationLevel p_level) {
|
||||||
if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE) {
|
if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE) {
|
||||||
GDREGISTER_CLASS(AudioStreamMP3);
|
GDREGISTER_CLASS(AudioStreamMP3);
|
||||||
}
|
}
|
||||||
|
|
@ -58,5 +58,5 @@ void initialize_minimp3_module(ModuleInitializationLevel p_level) {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void uninitialize_minimp3_module(ModuleInitializationLevel p_level) {
|
void uninitialize_mp3_module(ModuleInitializationLevel p_level) {
|
||||||
}
|
}
|
||||||
|
|
@ -32,5 +32,5 @@
|
||||||
|
|
||||||
#include "modules/register_module_types.h"
|
#include "modules/register_module_types.h"
|
||||||
|
|
||||||
void initialize_minimp3_module(ModuleInitializationLevel p_level);
|
void initialize_mp3_module(ModuleInitializationLevel p_level);
|
||||||
void uninitialize_minimp3_module(ModuleInitializationLevel p_level);
|
void uninitialize_mp3_module(ModuleInitializationLevel p_level);
|
||||||
|
|
@ -46,7 +46,7 @@ String ResourceImporterMP3::get_visible_name() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceImporterMP3::get_recognized_extensions(List<String> *p_extensions) const {
|
void ResourceImporterMP3::get_recognized_extensions(List<String> *p_extensions) const {
|
||||||
#ifndef MINIMP3_ONLY_MP3
|
#ifndef DR_MP3_ONLY_MP3
|
||||||
p_extensions->push_back("mp1");
|
p_extensions->push_back("mp1");
|
||||||
p_extensions->push_back("mp2");
|
p_extensions->push_back("mp2");
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -200,6 +200,20 @@ Patches:
|
||||||
- `0001-ciso646-version.patch` (GH-105913)
|
- `0001-ciso646-version.patch` (GH-105913)
|
||||||
|
|
||||||
|
|
||||||
|
## dr_libs
|
||||||
|
|
||||||
|
- Upstream: https://github.com/mackron/dr_libs
|
||||||
|
- Version: mp3-0.7.2 (547c211a87a06a42bf62c1366616aa14b57dd429, 2025)
|
||||||
|
- License: Public Domain or Unlicense or MIT-0
|
||||||
|
|
||||||
|
Files extracted from upstream source:
|
||||||
|
|
||||||
|
- `dr_mp3.h`
|
||||||
|
- `LICENSE`
|
||||||
|
|
||||||
|
`dr_bridge.h` is a Godot file and should be preserved on updates.
|
||||||
|
|
||||||
|
|
||||||
## embree
|
## embree
|
||||||
|
|
||||||
- Upstream: https://github.com/embree/embree
|
- Upstream: https://github.com/embree/embree
|
||||||
|
|
@ -709,24 +723,6 @@ Patches:
|
||||||
- `0002-clang-std-replacements-leak.patch` (GH-85208)
|
- `0002-clang-std-replacements-leak.patch` (GH-85208)
|
||||||
|
|
||||||
|
|
||||||
## minimp3
|
|
||||||
|
|
||||||
- Upstream: https://github.com/lieff/minimp3
|
|
||||||
- Version: git (afb604c06bc8beb145fecd42c0ceb5bda8795144, 2021)
|
|
||||||
- License: CC0 1.0
|
|
||||||
|
|
||||||
Files extracted from upstream repository:
|
|
||||||
|
|
||||||
- `minimp3.h`
|
|
||||||
- `minimp3_ex.h`
|
|
||||||
- `LICENSE`
|
|
||||||
|
|
||||||
Patches:
|
|
||||||
|
|
||||||
- `0001-msvc-arm.patch` (GH-64921)
|
|
||||||
- `0002-msvc-warnings.patch` (GH-66545)
|
|
||||||
|
|
||||||
|
|
||||||
## miniupnpc
|
## miniupnpc
|
||||||
|
|
||||||
- Upstream: https://github.com/miniupnp/miniupnp
|
- Upstream: https://github.com/miniupnp/miniupnp
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,47 @@
|
||||||
|
This software is available as a choice of the following licenses. Choose
|
||||||
|
whichever you prefer.
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
ALTERNATIVE 1 - Public Domain (www.unlicense.org)
|
||||||
|
===============================================================================
|
||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||||
|
software, either in source code form or as a compiled binary, for any purpose,
|
||||||
|
commercial or non-commercial, and by any means.
|
||||||
|
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||||
|
software dedicate any and all copyright interest in the software to the public
|
||||||
|
domain. We make this dedication for the benefit of the public at large and to
|
||||||
|
the detriment of our heirs and successors. We intend this dedication to be an
|
||||||
|
overt act of relinquishment in perpetuity of all present and future rights to
|
||||||
|
this software under copyright law.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
For more information, please refer to <http://unlicense.org/>
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
ALTERNATIVE 2 - MIT No Attribution
|
||||||
|
===============================================================================
|
||||||
|
Copyright 2020 David Reid
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
|
so.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
@ -0,0 +1,61 @@
|
||||||
|
/**************************************************************************/
|
||||||
|
/* dr_bridge.h */
|
||||||
|
/**************************************************************************/
|
||||||
|
/* This file is part of: */
|
||||||
|
/* GODOT ENGINE */
|
||||||
|
/* https://godotengine.org */
|
||||||
|
/**************************************************************************/
|
||||||
|
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
|
||||||
|
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
|
||||||
|
/* */
|
||||||
|
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||||
|
/* a copy of this software and associated documentation files (the */
|
||||||
|
/* "Software"), to deal in the Software without restriction, including */
|
||||||
|
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||||
|
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||||
|
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||||
|
/* the following conditions: */
|
||||||
|
/* */
|
||||||
|
/* The above copyright notice and this permission notice shall be */
|
||||||
|
/* included in all copies or substantial portions of the Software. */
|
||||||
|
/* */
|
||||||
|
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||||
|
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||||
|
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
|
||||||
|
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||||
|
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||||
|
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||||
|
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||||
|
/**************************************************************************/
|
||||||
|
|
||||||
|
#include "core/io/file_access.h"
|
||||||
|
#include "core/os/memory.h"
|
||||||
|
#include "core/typedefs.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
void *user_data;
|
||||||
|
void *(*malloc_func)(size_t size, void *user_data);
|
||||||
|
void *(*realloc_func)(void *ptr, size_t size, void *user_data);
|
||||||
|
void (*free_func)(void *ptr, void *user_data);
|
||||||
|
} dr_allocation_callbacks;
|
||||||
|
|
||||||
|
static void *dr_memalloc(size_t size, void *user_data) {
|
||||||
|
return memalloc(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *dr_memrealloc(void *ptr, size_t size, void *user_data) {
|
||||||
|
return memrealloc(ptr, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dr_memfree(void *ptr, void *user_data) {
|
||||||
|
if (ptr) {
|
||||||
|
memfree(ptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const dr_allocation_callbacks dr_alloc_calls = {
|
||||||
|
nullptr,
|
||||||
|
dr_memalloc,
|
||||||
|
dr_memrealloc,
|
||||||
|
dr_memfree
|
||||||
|
};
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,117 +0,0 @@
|
||||||
CC0 1.0 Universal
|
|
||||||
|
|
||||||
Statement of Purpose
|
|
||||||
|
|
||||||
The laws of most jurisdictions throughout the world automatically confer
|
|
||||||
exclusive Copyright and Related Rights (defined below) upon the creator and
|
|
||||||
subsequent owner(s) (each and all, an "owner") of an original work of
|
|
||||||
authorship and/or a database (each, a "Work").
|
|
||||||
|
|
||||||
Certain owners wish to permanently relinquish those rights to a Work for the
|
|
||||||
purpose of contributing to a commons of creative, cultural and scientific
|
|
||||||
works ("Commons") that the public can reliably and without fear of later
|
|
||||||
claims of infringement build upon, modify, incorporate in other works, reuse
|
|
||||||
and redistribute as freely as possible in any form whatsoever and for any
|
|
||||||
purposes, including without limitation commercial purposes. These owners may
|
|
||||||
contribute to the Commons to promote the ideal of a free culture and the
|
|
||||||
further production of creative, cultural and scientific works, or to gain
|
|
||||||
reputation or greater distribution for their Work in part through the use and
|
|
||||||
efforts of others.
|
|
||||||
|
|
||||||
For these and/or other purposes and motivations, and without any expectation
|
|
||||||
of additional consideration or compensation, the person associating CC0 with a
|
|
||||||
Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
|
|
||||||
and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
|
|
||||||
and publicly distribute the Work under its terms, with knowledge of his or her
|
|
||||||
Copyright and Related Rights in the Work and the meaning and intended legal
|
|
||||||
effect of CC0 on those rights.
|
|
||||||
|
|
||||||
1. Copyright and Related Rights. A Work made available under CC0 may be
|
|
||||||
protected by copyright and related or neighboring rights ("Copyright and
|
|
||||||
Related Rights"). Copyright and Related Rights include, but are not limited
|
|
||||||
to, the following:
|
|
||||||
|
|
||||||
i. the right to reproduce, adapt, distribute, perform, display, communicate,
|
|
||||||
and translate a Work;
|
|
||||||
|
|
||||||
ii. moral rights retained by the original author(s) and/or performer(s);
|
|
||||||
|
|
||||||
iii. publicity and privacy rights pertaining to a person's image or likeness
|
|
||||||
depicted in a Work;
|
|
||||||
|
|
||||||
iv. rights protecting against unfair competition in regards to a Work,
|
|
||||||
subject to the limitations in paragraph 4(a), below;
|
|
||||||
|
|
||||||
v. rights protecting the extraction, dissemination, use and reuse of data in
|
|
||||||
a Work;
|
|
||||||
|
|
||||||
vi. database rights (such as those arising under Directive 96/9/EC of the
|
|
||||||
European Parliament and of the Council of 11 March 1996 on the legal
|
|
||||||
protection of databases, and under any national implementation thereof,
|
|
||||||
including any amended or successor version of such directive); and
|
|
||||||
|
|
||||||
vii. other similar, equivalent or corresponding rights throughout the world
|
|
||||||
based on applicable law or treaty, and any national implementations thereof.
|
|
||||||
|
|
||||||
2. Waiver. To the greatest extent permitted by, but not in contravention of,
|
|
||||||
applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
|
|
||||||
unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
|
|
||||||
and Related Rights and associated claims and causes of action, whether now
|
|
||||||
known or unknown (including existing as well as future claims and causes of
|
|
||||||
action), in the Work (i) in all territories worldwide, (ii) for the maximum
|
|
||||||
duration provided by applicable law or treaty (including future time
|
|
||||||
extensions), (iii) in any current or future medium and for any number of
|
|
||||||
copies, and (iv) for any purpose whatsoever, including without limitation
|
|
||||||
commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
|
|
||||||
the Waiver for the benefit of each member of the public at large and to the
|
|
||||||
detriment of Affirmer's heirs and successors, fully intending that such Waiver
|
|
||||||
shall not be subject to revocation, rescission, cancellation, termination, or
|
|
||||||
any other legal or equitable action to disrupt the quiet enjoyment of the Work
|
|
||||||
by the public as contemplated by Affirmer's express Statement of Purpose.
|
|
||||||
|
|
||||||
3. Public License Fallback. Should any part of the Waiver for any reason be
|
|
||||||
judged legally invalid or ineffective under applicable law, then the Waiver
|
|
||||||
shall be preserved to the maximum extent permitted taking into account
|
|
||||||
Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
|
|
||||||
is so judged Affirmer hereby grants to each affected person a royalty-free,
|
|
||||||
non transferable, non sublicensable, non exclusive, irrevocable and
|
|
||||||
unconditional license to exercise Affirmer's Copyright and Related Rights in
|
|
||||||
the Work (i) in all territories worldwide, (ii) for the maximum duration
|
|
||||||
provided by applicable law or treaty (including future time extensions), (iii)
|
|
||||||
in any current or future medium and for any number of copies, and (iv) for any
|
|
||||||
purpose whatsoever, including without limitation commercial, advertising or
|
|
||||||
promotional purposes (the "License"). The License shall be deemed effective as
|
|
||||||
of the date CC0 was applied by Affirmer to the Work. Should any part of the
|
|
||||||
License for any reason be judged legally invalid or ineffective under
|
|
||||||
applicable law, such partial invalidity or ineffectiveness shall not
|
|
||||||
invalidate the remainder of the License, and in such case Affirmer hereby
|
|
||||||
affirms that he or she will not (i) exercise any of his or her remaining
|
|
||||||
Copyright and Related Rights in the Work or (ii) assert any associated claims
|
|
||||||
and causes of action with respect to the Work, in either case contrary to
|
|
||||||
Affirmer's express Statement of Purpose.
|
|
||||||
|
|
||||||
4. Limitations and Disclaimers.
|
|
||||||
|
|
||||||
a. No trademark or patent rights held by Affirmer are waived, abandoned,
|
|
||||||
surrendered, licensed or otherwise affected by this document.
|
|
||||||
|
|
||||||
b. Affirmer offers the Work as-is and makes no representations or warranties
|
|
||||||
of any kind concerning the Work, express, implied, statutory or otherwise,
|
|
||||||
including without limitation warranties of title, merchantability, fitness
|
|
||||||
for a particular purpose, non infringement, or the absence of latent or
|
|
||||||
other defects, accuracy, or the present or absence of errors, whether or not
|
|
||||||
discoverable, all to the greatest extent permissible under applicable law.
|
|
||||||
|
|
||||||
c. Affirmer disclaims responsibility for clearing rights of other persons
|
|
||||||
that may apply to the Work or any use thereof, including without limitation
|
|
||||||
any person's Copyright and Related Rights in the Work. Further, Affirmer
|
|
||||||
disclaims responsibility for obtaining any necessary consents, permissions
|
|
||||||
or other rights required for any use of the Work.
|
|
||||||
|
|
||||||
d. Affirmer understands and acknowledges that Creative Commons is not a
|
|
||||||
party to this document and has no duty or obligation with respect to this
|
|
||||||
CC0 or use of the Work.
|
|
||||||
|
|
||||||
For more information, please see
|
|
||||||
<http://creativecommons.org/publicdomain/zero/1.0/>
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,39 +0,0 @@
|
||||||
diff --git a/thirdparty/minimp3/minimp3.h b/thirdparty/minimp3/minimp3.h
|
|
||||||
index 3220ae1a85..49708b9846 100644
|
|
||||||
--- a/thirdparty/minimp3/minimp3.h
|
|
||||||
+++ b/thirdparty/minimp3/minimp3.h
|
|
||||||
@@ -1566,7 +1566,16 @@ static void mp3d_synth(float *xl, mp3d_sample_t *dstl, int nch, float *lins)
|
|
||||||
|
|
||||||
#else /* MINIMP3_FLOAT_OUTPUT */
|
|
||||||
|
|
||||||
+#if defined(_MSC_VER) && (defined(_M_ARM64) || defined(_M_ARM64EC) || defined(_M_ARM))
|
|
||||||
+ static f4 g_scale;
|
|
||||||
+ g_scale = vsetq_lane_f32(1.0f/32768.0f, g_scale, 0);
|
|
||||||
+ g_scale = vsetq_lane_f32(1.0f/32768.0f, g_scale, 1);
|
|
||||||
+ g_scale = vsetq_lane_f32(1.0f/32768.0f, g_scale, 2);
|
|
||||||
+ g_scale = vsetq_lane_f32(1.0f/32768.0f, g_scale, 3);
|
|
||||||
+#else
|
|
||||||
static const f4 g_scale = { 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f };
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
a = VMUL(a, g_scale);
|
|
||||||
b = VMUL(b, g_scale);
|
|
||||||
#if HAVE_SSE
|
|
||||||
@@ -1813,7 +1822,17 @@ void mp3dec_f32_to_s16(const float *in, int16_t *out, int num_samples)
|
|
||||||
int aligned_count = num_samples & ~7;
|
|
||||||
for(; i < aligned_count; i += 8)
|
|
||||||
{
|
|
||||||
+
|
|
||||||
+#if defined(_MSC_VER) && (defined(_M_ARM64) || defined(_M_ARM64EC) || defined(_M_ARM))
|
|
||||||
+ static f4 g_scale;
|
|
||||||
+ g_scale = vsetq_lane_f32(32768.0f, g_scale, 0);
|
|
||||||
+ g_scale = vsetq_lane_f32(32768.0f, g_scale, 1);
|
|
||||||
+ g_scale = vsetq_lane_f32(32768.0f, g_scale, 2);
|
|
||||||
+ g_scale = vsetq_lane_f32(32768.0f, g_scale, 3);
|
|
||||||
+#else
|
|
||||||
static const f4 g_scale = { 32768.0f, 32768.0f, 32768.0f, 32768.0f };
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
f4 a = VMUL(VLD(&in[i ]), g_scale);
|
|
||||||
f4 b = VMUL(VLD(&in[i+4]), g_scale);
|
|
||||||
#if HAVE_SSE
|
|
||||||
|
|
@ -1,51 +0,0 @@
|
||||||
diff --git a/thirdparty/minimp3/minimp3_ex.h b/thirdparty/minimp3/minimp3_ex.h
|
|
||||||
index 2871705df3..2b207a25a7 100644
|
|
||||||
--- a/thirdparty/minimp3/minimp3_ex.h
|
|
||||||
+++ b/thirdparty/minimp3/minimp3_ex.h
|
|
||||||
@@ -377,7 +377,7 @@ int mp3dec_load_cb(mp3dec_t *dec, mp3dec_io_t *io, uint8_t *buf, size_t buf_size
|
|
||||||
samples = hdr_frame_samples(hdr)*frame_info.channels;
|
|
||||||
if (3 != frame_info.layer)
|
|
||||||
break;
|
|
||||||
- int ret = mp3dec_check_vbrtag(hdr, frame_size, &frames, &delay, &padding);
|
|
||||||
+ ret = mp3dec_check_vbrtag(hdr, frame_size, &frames, &delay, &padding);
|
|
||||||
if (ret > 0)
|
|
||||||
{
|
|
||||||
padding *= frame_info.channels;
|
|
||||||
@@ -529,7 +529,8 @@ int mp3dec_iterate_buf(const uint8_t *buf, size_t buf_size, MP3D_ITERATE_CB call
|
|
||||||
|
|
||||||
if (callback)
|
|
||||||
{
|
|
||||||
- if ((ret = callback(user_data, hdr, frame_size, free_format_bytes, buf_size, hdr - orig_buf, &frame_info)))
|
|
||||||
+ ret = callback(user_data, hdr, frame_size, free_format_bytes, buf_size, hdr - orig_buf, &frame_info);
|
|
||||||
+ if (ret != 0)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
buf += frame_size;
|
|
||||||
@@ -562,7 +563,7 @@ int mp3dec_iterate_cb(mp3dec_io_t *io, uint8_t *buf, size_t buf_size, MP3D_ITERA
|
|
||||||
readed += id3v2size;
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
- size_t readed = io->read(buf + MINIMP3_ID3_DETECT_SIZE, buf_size - MINIMP3_ID3_DETECT_SIZE, io->read_data);
|
|
||||||
+ readed = io->read(buf + MINIMP3_ID3_DETECT_SIZE, buf_size - MINIMP3_ID3_DETECT_SIZE, io->read_data);
|
|
||||||
if (readed > (buf_size - MINIMP3_ID3_DETECT_SIZE))
|
|
||||||
return MP3D_E_IOERROR;
|
|
||||||
filled += readed;
|
|
||||||
@@ -590,7 +591,8 @@ int mp3dec_iterate_cb(mp3dec_io_t *io, uint8_t *buf, size_t buf_size, MP3D_ITERA
|
|
||||||
readed += i;
|
|
||||||
if (callback)
|
|
||||||
{
|
|
||||||
- if ((ret = callback(user_data, hdr, frame_size, free_format_bytes, filled - consumed, readed, &frame_info)))
|
|
||||||
+ ret = callback(user_data, hdr, frame_size, free_format_bytes, filled - consumed, readed, &frame_info);
|
|
||||||
+ if (ret != 0)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
readed += frame_size;
|
|
||||||
@@ -600,7 +602,7 @@ int mp3dec_iterate_cb(mp3dec_io_t *io, uint8_t *buf, size_t buf_size, MP3D_ITERA
|
|
||||||
memmove(buf, buf + consumed, filled - consumed);
|
|
||||||
filled -= consumed;
|
|
||||||
consumed = 0;
|
|
||||||
- size_t readed = io->read(buf + filled, buf_size - filled, io->read_data);
|
|
||||||
+ readed = io->read(buf + filled, buf_size - filled, io->read_data);
|
|
||||||
if (readed > (buf_size - filled))
|
|
||||||
return MP3D_E_IOERROR;
|
|
||||||
if (readed != (buf_size - filled))
|
|
||||||
Loading…
Reference in New Issue