From 482eb28dedf44296c3a47f2312278cb5939bc1f1 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Fri, 24 May 2024 14:00:21 +0100 Subject: [PATCH 01/10] Update sfxSndStream.cpp add different file type modes and reset stream after reading (torque still reads the full thing) --- Engine/source/sfx/media/sfxSndStream.cpp | 33 +++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/Engine/source/sfx/media/sfxSndStream.cpp b/Engine/source/sfx/media/sfxSndStream.cpp index 3c1d21b17..aad9fa897 100644 --- a/Engine/source/sfx/media/sfxSndStream.cpp +++ b/Engine/source/sfx/media/sfxSndStream.cpp @@ -105,14 +105,45 @@ void SFXSndStream::reset() U32 SFXSndStream::read(U8* buffer, U32 length) { + if (!sndFile) + { + Con::errorf("SFXSndStream - read: Called on uninitialized stream."); + return 0; + } + + U32 framesToRead = length / mFormat.getBytesPerSample(); U32 framesRead = 0; - framesRead = sf_readf_short(sndFile, (short*)buffer, sfinfo.frames); + switch (sfinfo.format & SF_FORMAT_SUBMASK) + { + case SF_FORMAT_PCM_S8: + case SF_FORMAT_PCM_U8: + framesRead = sf_readf_int(sndFile, reinterpret_cast(buffer), framesToRead); + break; + case SF_FORMAT_PCM_16: + case SF_FORMAT_VORBIS: + framesRead = sf_readf_short(sndFile, reinterpret_cast(buffer), framesToRead); + break; + case SF_FORMAT_PCM_24: + framesRead = sf_readf_int(sndFile, reinterpret_cast(buffer), framesToRead); // 24-bit usually stored in 32-bit containers + break; + case SF_FORMAT_PCM_32: + case SF_FORMAT_FLOAT: + framesRead = sf_readf_float(sndFile, reinterpret_cast(buffer), framesToRead); + break; + default: + Con::errorf("SFXSndStream - read: Unsupported format."); + return 0; + } + if (framesRead != sfinfo.frames) { Con::errorf("SFXSndStream - read: %s", sf_strerror(sndFile)); } + // reset stream + setPosition(0); + return framesRead * mFormat.getBytesPerSample(); } From bf34d3daa8a2dc87fe732713fe6c61fad178eff6 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Fri, 24 May 2024 14:12:01 +0100 Subject: [PATCH 02/10] Update sfxSndStream.cpp fix distortion issue on some sounds, if vorbis requires a scale set for float conversion --- Engine/source/sfx/media/sfxSndStream.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Engine/source/sfx/media/sfxSndStream.cpp b/Engine/source/sfx/media/sfxSndStream.cpp index aad9fa897..2ccad264f 100644 --- a/Engine/source/sfx/media/sfxSndStream.cpp +++ b/Engine/source/sfx/media/sfxSndStream.cpp @@ -57,8 +57,11 @@ bool SFXSndStream::_readHeader() bitsPerSample = 8; break; case SF_FORMAT_PCM_16: + bitsPerSample = 16; + break; case SF_FORMAT_VORBIS: bitsPerSample = 16; + sf_command(sndFile, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE); break; case SF_FORMAT_PCM_24: bitsPerSample = 24; From ebdc40838523de2bedeab644d613420f3ac44a29 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Fri, 24 May 2024 15:11:18 +0100 Subject: [PATCH 03/10] Update sfxSndStream.cpp streaming file fixes, also only wrap back around when we have read the whole file. --- Engine/source/sfx/media/sfxSndStream.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/Engine/source/sfx/media/sfxSndStream.cpp b/Engine/source/sfx/media/sfxSndStream.cpp index 2ccad264f..a2a508804 100644 --- a/Engine/source/sfx/media/sfxSndStream.cpp +++ b/Engine/source/sfx/media/sfxSndStream.cpp @@ -139,13 +139,22 @@ U32 SFXSndStream::read(U8* buffer, U32 length) return 0; } - if (framesRead != sfinfo.frames) + if (framesRead != framesToRead) { Con::errorf("SFXSndStream - read: %s", sf_strerror(sndFile)); } - // reset stream - setPosition(0); + // make sure we are more than 0 position. + if (getPosition() > 0) + { + // (convert to frames) == number of frames available? + if ((getPosition() / mFormat.getBytesPerSample()) == sfinfo.frames) + { + // reset stream + setPosition(0); + } + } + return framesRead * mFormat.getBytesPerSample(); } From c28cedc2d898f2c2fa00d02bc715f535878879ea Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Fri, 24 May 2024 16:19:10 +0100 Subject: [PATCH 04/10] 32 bit float test 32 bit floating point sounds --- Engine/source/sfx/media/sfxSndStream.cpp | 7 ++----- Engine/source/sfx/openal/sfxALBuffer.h | 16 +++++++++++++--- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/Engine/source/sfx/media/sfxSndStream.cpp b/Engine/source/sfx/media/sfxSndStream.cpp index a2a508804..829d73f37 100644 --- a/Engine/source/sfx/media/sfxSndStream.cpp +++ b/Engine/source/sfx/media/sfxSndStream.cpp @@ -59,15 +59,12 @@ bool SFXSndStream::_readHeader() case SF_FORMAT_PCM_16: bitsPerSample = 16; break; - case SF_FORMAT_VORBIS: - bitsPerSample = 16; - sf_command(sndFile, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE); - break; case SF_FORMAT_PCM_24: bitsPerSample = 24; break; case SF_FORMAT_PCM_32: case SF_FORMAT_FLOAT: + case SF_FORMAT_VORBIS: bitsPerSample = 32; break; default: @@ -124,7 +121,6 @@ U32 SFXSndStream::read(U8* buffer, U32 length) framesRead = sf_readf_int(sndFile, reinterpret_cast(buffer), framesToRead); break; case SF_FORMAT_PCM_16: - case SF_FORMAT_VORBIS: framesRead = sf_readf_short(sndFile, reinterpret_cast(buffer), framesToRead); break; case SF_FORMAT_PCM_24: @@ -132,6 +128,7 @@ U32 SFXSndStream::read(U8* buffer, U32 length) break; case SF_FORMAT_PCM_32: case SF_FORMAT_FLOAT: + case SF_FORMAT_VORBIS: framesRead = sf_readf_float(sndFile, reinterpret_cast(buffer), framesToRead); break; default: diff --git a/Engine/source/sfx/openal/sfxALBuffer.h b/Engine/source/sfx/openal/sfxALBuffer.h index 26864a3d0..7589485bd 100644 --- a/Engine/source/sfx/openal/sfxALBuffer.h +++ b/Engine/source/sfx/openal/sfxALBuffer.h @@ -84,14 +84,24 @@ class SFXALBuffer : public SFXBuffer return AL_FORMAT_STEREO8; else if( bps == 32 ) return AL_FORMAT_STEREO16; + else if (bps == 64) + { + if (alIsExtensionPresent("AL_EXT_FLOAT32")) + return AL_FORMAT_STEREO_FLOAT32; + } } else if( format.getChannels() == 1 ) { const U32 bps = format.getBitsPerSample(); - if( bps == 8 ) + if (bps == 8) return AL_FORMAT_MONO8; - else if( bps == 16 ) + else if (bps == 16) return AL_FORMAT_MONO16; + else if (bps == 32) + { + if(alIsExtensionPresent("AL_EXT_FLOAT32")) + return AL_FORMAT_MONO_FLOAT32; + } } return 0; } @@ -116,4 +126,4 @@ class SFXALBuffer : public SFXBuffer virtual ~SFXALBuffer(); }; -#endif // _SFXALBUFFER_H_ \ No newline at end of file +#endif // _SFXALBUFFER_H_ From de454dc793d0bb760586296cbd9e127cc6375e04 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Fri, 24 May 2024 16:25:26 +0100 Subject: [PATCH 05/10] Update sfxSndStream.cpp revert vorbis back to 16bit add normalisation option. --- Engine/source/sfx/media/sfxSndStream.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Engine/source/sfx/media/sfxSndStream.cpp b/Engine/source/sfx/media/sfxSndStream.cpp index 829d73f37..1eeffab31 100644 --- a/Engine/source/sfx/media/sfxSndStream.cpp +++ b/Engine/source/sfx/media/sfxSndStream.cpp @@ -59,12 +59,16 @@ bool SFXSndStream::_readHeader() case SF_FORMAT_PCM_16: bitsPerSample = 16; break; + case SF_FORMAT_VORBIS: + bitsPerSample = 16; + sf_command(sndFile, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE); + sf_command(sndFile, SFC_SET_NORM_FLOAT, NULL, SF_TRUE); + break; case SF_FORMAT_PCM_24: bitsPerSample = 24; break; case SF_FORMAT_PCM_32: case SF_FORMAT_FLOAT: - case SF_FORMAT_VORBIS: bitsPerSample = 32; break; default: @@ -121,6 +125,7 @@ U32 SFXSndStream::read(U8* buffer, U32 length) framesRead = sf_readf_int(sndFile, reinterpret_cast(buffer), framesToRead); break; case SF_FORMAT_PCM_16: + case SF_FORMAT_VORBIS: framesRead = sf_readf_short(sndFile, reinterpret_cast(buffer), framesToRead); break; case SF_FORMAT_PCM_24: @@ -128,7 +133,6 @@ U32 SFXSndStream::read(U8* buffer, U32 length) break; case SF_FORMAT_PCM_32: case SF_FORMAT_FLOAT: - case SF_FORMAT_VORBIS: framesRead = sf_readf_float(sndFile, reinterpret_cast(buffer), framesToRead); break; default: From aa9cb63789037916719c9ba6ad0efa9d4d042089 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Fri, 24 May 2024 17:18:35 +0100 Subject: [PATCH 06/10] Update sfxSndStream.cpp --- Engine/source/sfx/media/sfxSndStream.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Engine/source/sfx/media/sfxSndStream.cpp b/Engine/source/sfx/media/sfxSndStream.cpp index 1eeffab31..26d774c44 100644 --- a/Engine/source/sfx/media/sfxSndStream.cpp +++ b/Engine/source/sfx/media/sfxSndStream.cpp @@ -62,7 +62,6 @@ bool SFXSndStream::_readHeader() case SF_FORMAT_VORBIS: bitsPerSample = 16; sf_command(sndFile, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE); - sf_command(sndFile, SFC_SET_NORM_FLOAT, NULL, SF_TRUE); break; case SF_FORMAT_PCM_24: bitsPerSample = 24; @@ -148,8 +147,8 @@ U32 SFXSndStream::read(U8* buffer, U32 length) // make sure we are more than 0 position. if (getPosition() > 0) { - // (convert to frames) == number of frames available? - if ((getPosition() / mFormat.getBytesPerSample()) == sfinfo.frames) + // (convert to frames) - number of frames available < MAX_BUFFER? + if (((getPosition() / mFormat.getBytesPerSample()) - sfinfo.frames) < MAX_BUFFER) { // reset stream setPosition(0); From 0ae0d633e99751f7a0db070fa4dc2899be475399 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Sat, 25 May 2024 08:16:43 +0100 Subject: [PATCH 07/10] Update sfxSndStream.cpp --- Engine/source/sfx/media/sfxSndStream.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Engine/source/sfx/media/sfxSndStream.cpp b/Engine/source/sfx/media/sfxSndStream.cpp index 26d774c44..955f118d8 100644 --- a/Engine/source/sfx/media/sfxSndStream.cpp +++ b/Engine/source/sfx/media/sfxSndStream.cpp @@ -64,8 +64,6 @@ bool SFXSndStream::_readHeader() sf_command(sndFile, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE); break; case SF_FORMAT_PCM_24: - bitsPerSample = 24; - break; case SF_FORMAT_PCM_32: case SF_FORMAT_FLOAT: bitsPerSample = 32; @@ -124,12 +122,12 @@ U32 SFXSndStream::read(U8* buffer, U32 length) framesRead = sf_readf_int(sndFile, reinterpret_cast(buffer), framesToRead); break; case SF_FORMAT_PCM_16: + framesRead = sf_readf_short(sndFile, reinterpret_cast(buffer), framesToRead); + break; case SF_FORMAT_VORBIS: framesRead = sf_readf_short(sndFile, reinterpret_cast(buffer), framesToRead); break; case SF_FORMAT_PCM_24: - framesRead = sf_readf_int(sndFile, reinterpret_cast(buffer), framesToRead); // 24-bit usually stored in 32-bit containers - break; case SF_FORMAT_PCM_32: case SF_FORMAT_FLOAT: framesRead = sf_readf_float(sndFile, reinterpret_cast(buffer), framesToRead); From e3d977b8e710852eea8368593756629ba71364c3 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Sat, 25 May 2024 09:10:47 +0100 Subject: [PATCH 08/10] Update sfxALBuffer.h mac dont like --- Engine/source/sfx/openal/sfxALBuffer.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Engine/source/sfx/openal/sfxALBuffer.h b/Engine/source/sfx/openal/sfxALBuffer.h index 7589485bd..d3260d704 100644 --- a/Engine/source/sfx/openal/sfxALBuffer.h +++ b/Engine/source/sfx/openal/sfxALBuffer.h @@ -84,11 +84,12 @@ class SFXALBuffer : public SFXBuffer return AL_FORMAT_STEREO8; else if( bps == 32 ) return AL_FORMAT_STEREO16; + /* MAC doesnt like 32bit openal (doesnt use the ext) else if (bps == 64) { if (alIsExtensionPresent("AL_EXT_FLOAT32")) return AL_FORMAT_STEREO_FLOAT32; - } + }*/ } else if( format.getChannels() == 1 ) { @@ -97,11 +98,12 @@ class SFXALBuffer : public SFXBuffer return AL_FORMAT_MONO8; else if (bps == 16) return AL_FORMAT_MONO16; + /* else if (bps == 32) { if(alIsExtensionPresent("AL_EXT_FLOAT32")) return AL_FORMAT_MONO_FLOAT32; - } + }*/ } return 0; } From 0d1dc234fac406cce67e872dfa8391db2c64fc4e Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Sat, 25 May 2024 10:04:51 +0100 Subject: [PATCH 09/10] Update sfxSndStream.cpp we always want shorts --- Engine/source/sfx/media/sfxSndStream.cpp | 26 ++++++++---------------- 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/Engine/source/sfx/media/sfxSndStream.cpp b/Engine/source/sfx/media/sfxSndStream.cpp index 955f118d8..96ad07711 100644 --- a/Engine/source/sfx/media/sfxSndStream.cpp +++ b/Engine/source/sfx/media/sfxSndStream.cpp @@ -60,13 +60,11 @@ bool SFXSndStream::_readHeader() bitsPerSample = 16; break; case SF_FORMAT_VORBIS: - bitsPerSample = 16; - sf_command(sndFile, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE); - break; case SF_FORMAT_PCM_24: case SF_FORMAT_PCM_32: case SF_FORMAT_FLOAT: - bitsPerSample = 32; + bitsPerSample = 16; + sf_command(sndFile, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE); break; default: // missed, set it to 16 anyway. @@ -119,18 +117,14 @@ U32 SFXSndStream::read(U8* buffer, U32 length) { case SF_FORMAT_PCM_S8: case SF_FORMAT_PCM_U8: - framesRead = sf_readf_int(sndFile, reinterpret_cast(buffer), framesToRead); + framesRead = sf_readf_int(sndFile, (int*)buffer, framesToRead); break; case SF_FORMAT_PCM_16: - framesRead = sf_readf_short(sndFile, reinterpret_cast(buffer), framesToRead); - break; case SF_FORMAT_VORBIS: - framesRead = sf_readf_short(sndFile, reinterpret_cast(buffer), framesToRead); - break; case SF_FORMAT_PCM_24: case SF_FORMAT_PCM_32: case SF_FORMAT_FLOAT: - framesRead = sf_readf_float(sndFile, reinterpret_cast(buffer), framesToRead); + framesRead = sf_readf_short(sndFile, (short*)buffer, framesToRead); break; default: Con::errorf("SFXSndStream - read: Unsupported format."); @@ -142,15 +136,11 @@ U32 SFXSndStream::read(U8* buffer, U32 length) Con::errorf("SFXSndStream - read: %s", sf_strerror(sndFile)); } - // make sure we are more than 0 position. - if (getPosition() > 0) + // (convert to frames) - number of frames available < MAX_BUFFER? reset + if (((getPosition() / mFormat.getBytesPerSample()) - sfinfo.frames) < MAX_BUFFER) { - // (convert to frames) - number of frames available < MAX_BUFFER? - if (((getPosition() / mFormat.getBytesPerSample()) - sfinfo.frames) < MAX_BUFFER) - { - // reset stream - setPosition(0); - } + // reset stream + setPosition(0); } From 79dfd14bea11a22888b03fa30b7978e219846dc3 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Sat, 25 May 2024 10:20:14 +0100 Subject: [PATCH 10/10] Update sfxALBuffer.h revert to head --- Engine/source/sfx/openal/sfxALBuffer.h | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/Engine/source/sfx/openal/sfxALBuffer.h b/Engine/source/sfx/openal/sfxALBuffer.h index d3260d704..26864a3d0 100644 --- a/Engine/source/sfx/openal/sfxALBuffer.h +++ b/Engine/source/sfx/openal/sfxALBuffer.h @@ -84,26 +84,14 @@ class SFXALBuffer : public SFXBuffer return AL_FORMAT_STEREO8; else if( bps == 32 ) return AL_FORMAT_STEREO16; - /* MAC doesnt like 32bit openal (doesnt use the ext) - else if (bps == 64) - { - if (alIsExtensionPresent("AL_EXT_FLOAT32")) - return AL_FORMAT_STEREO_FLOAT32; - }*/ } else if( format.getChannels() == 1 ) { const U32 bps = format.getBitsPerSample(); - if (bps == 8) + if( bps == 8 ) return AL_FORMAT_MONO8; - else if (bps == 16) + else if( bps == 16 ) return AL_FORMAT_MONO16; - /* - else if (bps == 32) - { - if(alIsExtensionPresent("AL_EXT_FLOAT32")) - return AL_FORMAT_MONO_FLOAT32; - }*/ } return 0; } @@ -128,4 +116,4 @@ class SFXALBuffer : public SFXBuffer virtual ~SFXALBuffer(); }; -#endif // _SFXALBUFFER_H_ +#endif // _SFXALBUFFER_H_ \ No newline at end of file