Fix some libretro build errors for game consoles

This commit is contained in:
刘皓 2025-02-12 12:49:25 -05:00
parent d89c7894da
commit 322caeb628
No known key found for this signature in database
GPG key ID: 7901753DB465B711
6 changed files with 132 additions and 14 deletions

View file

@ -2,4 +2,4 @@
url = https://github.com/xiph/flac url = https://github.com/xiph/flac
revision = 1.4.3 revision = 1.4.3
depth = 1 depth = 1
diff_files = flac-buildtype.patch, flac-deps.patch, flac-emscripten-endian.patch diff_files = flac-buildtype.patch, flac-deps.patch, flac-emscripten-endian.patch, flac-int32.patch

View file

@ -2,4 +2,4 @@
url = https://github.com/libsndfile/libsndfile url = https://github.com/libsndfile/libsndfile
revision = 1.2.2 revision = 1.2.2
depth = 1 depth = 1
diff_files = libsndfile-deps.patch, libsndfile-emscripten-endian.patch diff_files = libsndfile-deps.patch, libsndfile-emscripten-endian.patch, libsndfile-int32.patch

View file

@ -0,0 +1,23 @@
# Fixes a compilation error when using the devkitARM toolchain or Vita SDK toolchain to compile FLAC.
# For some reason, there's no implicit casting between `int` and `int32_t` and between `unsigned int` and `uint32_t` in devkitARM or Vita SDK even though they're the same size, so we have to do this whole song and dance to appease the compiler.
--- a/src/libFLAC/stream_decoder.c
+++ b/src/libFLAC/stream_decoder.c
@@ -2973,7 +2973,7 @@ FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder *decoder, uint32_
if(rice_parameter < pesc) {
partitioned_rice_contents->raw_bits[partition] = 0;
u = (partition == 0) ? partition_samples - predictor_order : partition_samples;
- if(!decoder->private_->local_bitreader_read_rice_signed_block(decoder->private_->input, residual + sample, u, rice_parameter)){
+ if(!decoder->private_->local_bitreader_read_rice_signed_block(decoder->private_->input, (int *)(residual + sample), u, rice_parameter)){
if(decoder->protected_->state == FLAC__STREAM_DECODER_READ_FRAME) {
/* no error was set, read_callback_ didn't set it, so
* invalid rice symbol was found */
@@ -2996,7 +2996,7 @@ FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder *decoder, uint32_
}
else{
for(u = (partition == 0)? predictor_order : 0; u < partition_samples; u++, sample++) {
- if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i, rice_parameter))
+ if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, (FLAC__int32 *)&i, rice_parameter))
return false; /* read_callback_ sets the state for us */
residual[sample] = i;
}

View file

@ -0,0 +1,63 @@
# Fixes a compilation error when using the devkitARM toolchain or Vita SDK toolchain to compile libsndfile.
# For some reason, there's no implicit casting between `int` and `int32_t` and between `unsigned int` and `uint32_t` in devkitARM or Vita SDK even though they're the same size, so we have to do this whole song and dance to appease the compiler.
--- a/src/alac.c
+++ b/src/alac.c
@@ -427,7 +427,7 @@ alac_decode_block (SF_PRIVATE *psf, ALAC_PRIVATE *plac)
plac->input_data_pos += packet_size ;
plac->frames_this_block = 0 ;
- alac_decode (pdec, &bit_buffer, plac->buffer, plac->frames_per_block, &plac->frames_this_block) ;
+ alac_decode (pdec, &bit_buffer, (int32_t *)plac->buffer, plac->frames_per_block, &plac->frames_this_block) ;
plac->partial_block_frames = 0 ;
@@ -440,7 +440,7 @@ alac_encode_block (ALAC_PRIVATE *plac)
{ ALAC_ENCODER *penc = &plac->u.encoder ;
uint32_t num_bytes = 0 ;
- alac_encode (penc, plac->partial_block_frames, plac->buffer, plac->byte_buffer, &num_bytes) ;
+ alac_encode (penc, plac->partial_block_frames, (int32_t *)plac->buffer, plac->byte_buffer, &num_bytes) ;
if (fwrite (plac->byte_buffer, 1, num_bytes, plac->enctmp) != num_bytes)
return 0 ;
--- a/src/flac.c
+++ b/src/flac.c
@@ -132,7 +132,7 @@ static void sf_flac_error_callback (const FLAC__StreamDecoder *decoder, FLAC__St
/* Encoder Callbacks */
static FLAC__StreamEncoderSeekStatus sf_flac_enc_seek_callback (const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data) ;
static FLAC__StreamEncoderTellStatus sf_flac_enc_tell_callback (const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data) ;
-static FLAC__StreamEncoderWriteStatus sf_flac_enc_write_callback (const FLAC__StreamEncoder *encoder, const FLAC__byte buffer [], size_t bytes, unsigned samples, unsigned current_frame, void *client_data) ;
+static FLAC__StreamEncoderWriteStatus sf_flac_enc_write_callback (const FLAC__StreamEncoder *encoder, const FLAC__byte buffer [], size_t bytes, uint32_t samples, uint32_t current_frame, void *client_data) ;
static void
s2flac8_array (const short *src, int32_t *dest, int count)
@@ -579,7 +579,7 @@ sf_flac_enc_tell_callback (const FLAC__StreamEncoder *UNUSED (encoder), FLAC__ui
} /* sf_flac_enc_tell_callback */
static FLAC__StreamEncoderWriteStatus
-sf_flac_enc_write_callback (const FLAC__StreamEncoder * UNUSED (encoder), const FLAC__byte buffer [], size_t bytes, unsigned UNUSED (samples), unsigned UNUSED (current_frame), void *client_data)
+sf_flac_enc_write_callback (const FLAC__StreamEncoder * UNUSED (encoder), const FLAC__byte buffer [], size_t bytes, uint32_t UNUSED (samples), uint32_t UNUSED (current_frame), void *client_data)
{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
if (psf_fwrite (buffer, 1, bytes, psf) == (sf_count_t) bytes && psf->error == 0)
--- a/src/ogg_opus.c
+++ b/src/ogg_opus.c
@@ -713,7 +713,7 @@ ogg_opus_setup_encoder (SF_PRIVATE *psf, OGG_PRIVATE *odata, OPUS_PRIVATE *oopus
oopus->header.nb_streams = nb_streams ;
oopus->header.nb_coupled = nb_coupled ;
- opus_multistream_encoder_ctl (oopus->u.encode.state, OPUS_GET_BITRATE (&oopus->u.encode.bitrate)) ;
+ opus_multistream_encoder_ctl (oopus->u.encode.state, OPUS_GET_BITRATE ((opus_int32 *)&oopus->u.encode.bitrate)) ;
psf_log_printf (psf, "Encoding at target bitrate of %dbps\n", oopus->u.encode.bitrate) ;
/* TODO: Make configurable? */
@@ -729,7 +729,7 @@ ogg_opus_setup_encoder (SF_PRIVATE *psf, OGG_PRIVATE *odata, OPUS_PRIVATE *oopus
** GOTCHA: This returns the preskip at the encoder samplerate, not the
** granulepos rate of 48000Hz needed for header.preskip.
*/
- error = opus_multistream_encoder_ctl (oopus->u.encode.state, OPUS_GET_LOOKAHEAD (&lookahead)) ;
+ error = opus_multistream_encoder_ctl (oopus->u.encode.state, OPUS_GET_LOOKAHEAD ((opus_int32 *)&lookahead)) ;
if (error != OPUS_OK)
{ psf_log_printf (psf, "Opus : OPUS_GET_LOOKAHEAD returned: %s\n", opus_strerror (error)) ;
return SFE_BAD_OPEN_FORMAT ;

View file

@ -2,61 +2,70 @@
--- a/common/althreads.h --- a/common/althreads.h
+++ b/common/althreads.h +++ b/common/althreads.h
@@ -13,7 +13,7 @@
#include <pthread.h>
-#else
+#elif (!defined(__EMSCRIPTEN__) || defined(__EMSCRIPTEN_PTHREADS__)) && !defined(__DEVKITPPC__) && !defined(__vita__)
#include <threads.h>
#endif
@@ -107,29 +107,57 @@ public: @@ -107,29 +107,57 @@ public:
#else #else
+#if defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__) +#if (defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__)) || defined(__DEVKITPPC__) || defined(__vita__)
+ void **mTss; + void **mTss;
+#else +#else
tss_t mTss{}; tss_t mTss{};
+#endif /* defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__) */ +#endif /* (defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__)) || defined(__DEVKITPPC__) || defined(__vita__) */
public: public:
tss() tss()
{ {
+#if defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__) +#if (defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__)) || defined(__DEVKITPPC__) || defined(__vita__)
+ if ((mTss = (void **)std::malloc(sizeof *mTss)) == NULL) + if ((mTss = (void **)std::malloc(sizeof *mTss)) == NULL)
+ throw std::runtime_error{"al::tss::tss()"}; + throw std::runtime_error{"al::tss::tss()"};
+ *mTss = nullptr; + *mTss = nullptr;
+#else +#else
if(int res{tss_create(&mTss, nullptr)}; res != thrd_success) if(int res{tss_create(&mTss, nullptr)}; res != thrd_success)
throw std::runtime_error{"al::tss::tss()"}; throw std::runtime_error{"al::tss::tss()"};
+#endif /* defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__) */ +#endif /* (defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__)) || defined(__DEVKITPPC__) || defined(__vita__) */
} }
explicit tss(const T &init) : tss{} explicit tss(const T &init) : tss{}
{ {
+#if defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__) +#if (defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__)) || defined(__DEVKITPPC__) || defined(__vita__)
+ if ((mTss = (void **)std::malloc(sizeof *mTss)) == NULL) + if ((mTss = (void **)std::malloc(sizeof *mTss)) == NULL)
+ throw std::runtime_error{"al::tss::tss()"}; + throw std::runtime_error{"al::tss::tss()"};
+ *mTss = to_ptr(init); + *mTss = to_ptr(init);
+#else +#else
if(int res{tss_set(mTss, to_ptr(init))}; res != thrd_success) if(int res{tss_set(mTss, to_ptr(init))}; res != thrd_success)
throw std::runtime_error{"al::tss::tss(T)"}; throw std::runtime_error{"al::tss::tss(T)"};
+#endif /* defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__) */ +#endif /* (defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__)) || defined(__DEVKITPPC__) || defined(__vita__) */
} }
+#if defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__) +#if (defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__)) || defined(__DEVKITPPC__) || defined(__vita__)
+ ~tss() { std::free(mTss); } + ~tss() { std::free(mTss); }
+#else +#else
~tss() { tss_delete(mTss); } ~tss() { tss_delete(mTss); }
+#endif /* defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__) */ +#endif /* (defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__)) || defined(__DEVKITPPC__) || defined(__vita__) */
void set(const T &value) const void set(const T &value) const
{ {
+#if defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__) +#if (defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__)) || defined(__DEVKITPPC__) || defined(__vita__)
+ *mTss = to_ptr(value); + *mTss = to_ptr(value);
+#else +#else
if(int res{tss_set(mTss, to_ptr(value))}; res != thrd_success) if(int res{tss_set(mTss, to_ptr(value))}; res != thrd_success)
throw std::runtime_error{"al::tss::set(T)"}; throw std::runtime_error{"al::tss::set(T)"};
+#endif /* defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__) */ +#endif /* (defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__)) || defined(__DEVKITPPC__) || defined(__vita__) */
} }
[[nodiscard]] [[nodiscard]]
+#if defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__) +#if (defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__)) || defined(__DEVKITPPC__) || defined(__vita__)
+ auto get() const noexcept -> T { return from_ptr(*mTss); } + auto get() const noexcept -> T { return from_ptr(*mTss); }
+#else +#else
auto get() const noexcept -> T { return from_ptr(tss_get(mTss)); } auto get() const noexcept -> T { return from_ptr(tss_get(mTss)); }
+#endif /* defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__) */ +#endif /* (defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__)) || defined(__DEVKITPPC__) || defined(__vita__) */
#endif /* _WIN32 */ #endif /* _WIN32 */
tss(const tss&) = delete; tss(const tss&) = delete;

View file

@ -1,6 +1,29 @@
# Fixes a compilation error when using the devkitARM toolchain or Vita SDK toolchain to compile OpenAL Soft. # Fixes a compilation error when using the devkitARM toolchain or Vita SDK toolchain to compile OpenAL Soft.
# For some reason, there's no implicit casting between `int` and `int32_t` and between `unsigned int` and `uint32_t` in devkitARM or Vita SDK even though they're the same size, so we have to do this whole song and dance to appease the compiler. # For some reason, there's no implicit casting between `int` and `int32_t` and between `unsigned int` and `uint32_t` in devkitARM or Vita SDK even though they're the same size, so we have to do this whole song and dance to appease the compiler.
--- a/core/converter.cpp
+++ b/core/converter.cpp
@@ -83,16 +83,16 @@ inline DevFmtType_t<T> StoreSample(float) noexcept;
template<> inline float StoreSample<DevFmtFloat>(float val) noexcept
{ return val; }
-template<> inline int32_t StoreSample<DevFmtInt>(float val) noexcept
-{ return fastf2i(std::clamp(val*2147483648.0f, -2147483648.0f, 2147483520.0f)); }
+template<> inline int StoreSample<DevFmtInt>(float val) noexcept
+{ static_assert(sizeof(int) == sizeof(int32_t), "`int` should be a 32-bit integer"); return fastf2i(std::clamp(val*2147483648.0f, -2147483648.0f, 2147483520.0f)); }
template<> inline int16_t StoreSample<DevFmtShort>(float val) noexcept
{ return static_cast<int16_t>(fastf2i(std::clamp(val*32768.0f, -32768.0f, 32767.0f))); }
template<> inline int8_t StoreSample<DevFmtByte>(float val) noexcept
{ return static_cast<int8_t>(fastf2i(std::clamp(val*128.0f, -128.0f, 127.0f))); }
/* Define unsigned output variations. */
-template<> inline uint32_t StoreSample<DevFmtUInt>(float val) noexcept
-{ return static_cast<uint32_t>(StoreSample<DevFmtInt>(val)) + 2147483648u; }
+template<> inline unsigned int StoreSample<DevFmtUInt>(float val) noexcept
+{ static_assert(sizeof(unsigned int) == sizeof(uint32_t), "`unsigned int` should be a 32-bit integer"); return static_cast<unsigned int>(StoreSample<DevFmtInt>(val)) + 2147483648u; }
template<> inline uint16_t StoreSample<DevFmtUShort>(float val) noexcept
{ return static_cast<uint16_t>(StoreSample<DevFmtShort>(val) + 32768); }
template<> inline uint8_t StoreSample<DevFmtUByte>(float val) noexcept
--- a/core/devformat.h --- a/core/devformat.h
+++ b/core/devformat.h +++ b/core/devformat.h
@@ -94,9 +94,9 @@ struct DevFmtTypeTraits<DevFmtShort> { using Type = int16_t; }; @@ -94,9 +94,9 @@ struct DevFmtTypeTraits<DevFmtShort> { using Type = int16_t; };