From 2184fd917a65966edaa9ab716588a4fc01c652a1 Mon Sep 17 00:00:00 2001 From: jenz Date: Sun, 31 May 2026 00:13:47 +0100 Subject: [PATCH] first commit to transcode branch for supporting both nosteam celt and steam opus --- AMBuilder | 6 +- README.md | 15 + celt/celt.h | 325 ++++++++++++++ celt/celt_header.h | 66 +++ celt/celt_types.h | 151 +++++++ celt/celt_work/bands.o | Bin 0 -> 19044 bytes celt/celt_work/celt.o | Bin 0 -> 47212 bytes celt/celt_work/cwrs.o | Bin 0 -> 10200 bytes celt/celt_work/entcode.o | Bin 0 -> 1320 bytes celt/celt_work/entdec.o | Bin 0 -> 3608 bytes celt/celt_work/entenc.o | Bin 0 -> 5128 bytes celt/celt_work/header.o | Bin 0 -> 2784 bytes celt/celt_work/kiss_fft.o | Bin 0 -> 12940 bytes celt/celt_work/laplace.o | Bin 0 -> 2344 bytes celt/celt_work/mathops.o | Bin 0 -> 1292 bytes celt/celt_work/mdct.o | Bin 0 -> 5724 bytes celt/celt_work/modes.o | Bin 0 -> 6344 bytes celt/celt_work/pitch.o | Bin 0 -> 5844 bytes celt/celt_work/plc.o | Bin 0 -> 3088 bytes celt/celt_work/quant_bands.o | Bin 0 -> 10264 bytes celt/celt_work/rate.o | Bin 0 -> 9868 bytes celt/celt_work/vq.o | Bin 0 -> 5792 bytes celt/libcelt0.a | Bin 0 -> 155506 bytes celt/libcelt0_patched.a | Bin 0 -> 157454 bytes extension.cpp | 841 ++++++++++++++++++++++++++++++++++- extension.h | 50 ++- inetmessage.h | 195 ++++++++ 27 files changed, 1634 insertions(+), 15 deletions(-) create mode 100644 README.md create mode 100644 celt/celt.h create mode 100644 celt/celt_header.h create mode 100644 celt/celt_types.h create mode 100644 celt/celt_work/bands.o create mode 100644 celt/celt_work/celt.o create mode 100644 celt/celt_work/cwrs.o create mode 100644 celt/celt_work/entcode.o create mode 100644 celt/celt_work/entdec.o create mode 100644 celt/celt_work/entenc.o create mode 100644 celt/celt_work/header.o create mode 100644 celt/celt_work/kiss_fft.o create mode 100644 celt/celt_work/laplace.o create mode 100644 celt/celt_work/mathops.o create mode 100644 celt/celt_work/mdct.o create mode 100644 celt/celt_work/modes.o create mode 100644 celt/celt_work/pitch.o create mode 100644 celt/celt_work/plc.o create mode 100644 celt/celt_work/quant_bands.o create mode 100644 celt/celt_work/rate.o create mode 100644 celt/celt_work/vq.o create mode 100644 celt/libcelt0.a create mode 100644 celt/libcelt0_patched.a create mode 100644 inetmessage.h diff --git a/AMBuilder b/AMBuilder index 2cd6157..73b85bb 100644 --- a/AMBuilder +++ b/AMBuilder @@ -36,10 +36,12 @@ for sdk_name in SM.sdks: binary.compiler.cxxincludes += [ os.path.join(SM.sm_root, 'public', 'extensions'), - os.path.join(builder.sourcePath, 'opus') + os.path.join(builder.sourcePath, 'opus'), + os.path.join(builder.sourcePath, 'celt') ] binary.compiler.linkflags += [ - os.path.join(builder.sourcePath, 'opus', 'libopus.a') + os.path.join(builder.sourcePath, 'opus', 'libopus.a'), + os.path.join(builder.sourcePath, 'celt', 'libcelt0_patched.a') ] SM.extensions += builder.Add(project) diff --git a/README.md b/README.md new file mode 100644 index 0000000..c9bedb5 --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +This new branch is used for allowing both nosteamers and linux users to communicate at the same time. + +Nosteamers are stuck with CELT codec as they dont support steam/opus. + +Linux users are stuck with steam as they dont support celt without manually fixing the .so file. + +This branch discards BroadCastVoiceData for instead creating our own SendNetMsg using SVC_VoiceData + +that enables us to take opus packets, decode to raw pcm and encode with celt. + +that enables us to take celt packets, decode to raw pcm and encode with opus. + +currently does the support for nosteamers to hear steam voice chat still have to be improved, but steam users can hear nosteam users very fine. + +the sourcemod plugin used for stubbing nosteamers with SVC_VoiceInit: https://git.unloze.com/UNLOZE/sm-plugins/src/branch/master/CELT_VOICE diff --git a/celt/celt.h b/celt/celt.h new file mode 100644 index 0000000..2bbf506 --- /dev/null +++ b/celt/celt.h @@ -0,0 +1,325 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2009 Xiph.Org Foundation + Copyright (c) 2008 Gregory Maxwell + Written by Jean-Marc Valin and Gregory Maxwell */ +/** + @file celt.h + @brief Contains all the functions for encoding and decoding audio + */ + +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef CELT_H +#define CELT_H + +#include "celt_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(__GNUC__) && defined(CELT_BUILD) +#define EXPORT __attribute__ ((visibility ("default"))) +#elif defined(WIN32) +#define EXPORT __declspec(dllexport) +#else +#define EXPORT +#endif + +#define _celt_check_int(x) (((void)((x) == (celt_int32)0)), (celt_int32)(x)) +#define _celt_check_mode_ptr_ptr(ptr) ((ptr) + ((ptr) - (const CELTMode**)(ptr))) +#define _celt_check_int_ptr(ptr) ((ptr) + ((ptr) - (int*)(ptr))) + +/* Error codes */ +/** No error */ +#define CELT_OK 0 +/** An (or more) invalid argument (e.g. out of range) */ +#define CELT_BAD_ARG -1 +/** The mode struct passed is invalid */ +#define CELT_BUFFER_TOO_SMALL -2 +/** An internal error was detected */ +#define CELT_INTERNAL_ERROR -3 +/** The data passed (e.g. compressed data to decoder) is corrupted */ +#define CELT_CORRUPTED_DATA -4 +/** Invalid/unsupported request number */ +#define CELT_UNIMPLEMENTED -5 +/** An encoder or decoder structure is invalid or already freed */ +#define CELT_INVALID_STATE -6 +/** Memory allocation has failed */ +#define CELT_ALLOC_FAIL -7 + + +/* Encoder/decoder Requests */ + +#define CELT_SET_COMPLEXITY_REQUEST 2 +/** Controls the complexity from 0-10 (int) */ +#define CELT_SET_COMPLEXITY(x) CELT_SET_COMPLEXITY_REQUEST, _celt_check_int(x) + +#define CELT_SET_PREDICTION_REQUEST 4 +/** Controls the use of interframe prediction. + 0=Independent frames + 1=Short term interframe prediction allowed + 2=Long term prediction allowed + */ +#define CELT_SET_PREDICTION(x) CELT_SET_PREDICTION_REQUEST, _celt_check_int(x) + +#define CELT_SET_BITRATE_REQUEST 6 +/** Set the target VBR rate in bits per second(int); 0=CBR (default) */ +#define CELT_SET_BITRATE(x) CELT_SET_BITRATE_REQUEST, _celt_check_int(x) + +#define CELT_RESET_STATE_REQUEST 8 +/** Reset the encoder/decoder memories to zero*/ +#define CELT_RESET_STATE CELT_RESET_STATE_REQUEST + +#define CELT_SET_VBR_CONSTRAINT_REQUEST 10 +#define CELT_SET_VBR_CONSTRAINT(x) CELT_SET_VBR_CONSTRAINT_REQUEST, _celt_check_int(x) + +#define CELT_SET_VBR_REQUEST 12 +#define CELT_SET_VBR(x) CELT_SET_VBR_REQUEST, _celt_check_int(x) + +#define CELT_SET_INPUT_CLIPPING_REQUEST 14 +#define CELT_SET_INPUT_CLIPPING(x) CELT_SET_INPUT_CLIPPING_REQUEST, _celt_check_int(x) + +#define CELT_GET_AND_CLEAR_ERROR_REQUEST 15 +#define CELT_GET_AND_CLEAR_ERROR(x) CELT_GET_AND_CLEAR_ERROR_REQUEST, _celt_check_int_ptr(x) + +#define CELT_GET_LOOKAHEAD_REQUEST 17 +#define CELT_GET_LOOKAHEAD(x) CELT_GET_LOOKAHEAD_REQUEST, _celt_check_int_ptr(x) + +#define CELT_SET_CHANNELS_REQUEST 18 +#define CELT_SET_CHANNELS(x) CELT_SET_CHANNELS_REQUEST, _celt_check_int(x) + +#define CELT_SET_LOSS_PERC_REQUEST 20 +#define CELT_SET_LOSS_PERC(x) CELT_SET_LOSS_PERC_REQUEST, _celt_check_int(x) + +/* Internal */ +#define CELT_SET_START_BAND_REQUEST 10000 +#define CELT_SET_START_BAND(x) CELT_SET_START_BAND_REQUEST, _celt_check_int(x) + +#define CELT_SET_END_BAND_REQUEST 10001 +#define CELT_SET_END_BAND(x) CELT_SET_END_BAND_REQUEST, _celt_check_int(x) + + + +/** Contains the state of an encoder. One encoder state is needed + for each stream. It is initialised once at the beginning of the + stream. Do *not* re-initialise the state for every frame. + @brief Encoder state + */ +typedef struct CELTEncoder CELTEncoder; + +/** State of the decoder. One decoder state is needed for each stream. + It is initialised once at the beginning of the stream. Do *not* + re-initialise the state for every frame */ +typedef struct CELTDecoder CELTDecoder; + +/** The mode contains all the information necessary to create an + encoder. Both the encoder and decoder need to be initialised + with exactly the same mode, otherwise the quality will be very + bad */ +typedef struct CELTMode CELTMode; + + +/** \defgroup codec Encoding and decoding */ +/* @{ */ + +/* Mode calls */ + +/** Creates a new mode struct. This will be passed to an encoder or + decoder. The mode MUST NOT BE DESTROYED until the encoders and + decoders that use it are destroyed as well. + @param Fs Sampling rate (32000 to 96000 Hz) + @param frame_size Number of samples (per channel) to encode in each + packet (even values; 64 - 512) + @param error Returned error code (if NULL, no error will be returned) + @return A newly created mode +*/ +EXPORT CELTMode *celt_mode_create(celt_int32 Fs, int frame_size, int *error); + +/** Destroys a mode struct. Only call this after all encoders and + decoders using this mode are destroyed as well. + @param mode Mode to be destroyed +*/ +EXPORT void celt_mode_destroy(CELTMode *mode); + +/* Encoder stuff */ + +EXPORT int celt_encoder_get_size(int channels); + +EXPORT int celt_encoder_get_size_custom(const CELTMode *mode, int channels); + +/** Creates a new encoder state. Each stream needs its own encoder + state (can't be shared across simultaneous streams). + @param channels Number of channels + @param error Returns an error code + @return Newly created encoder state. +*/ +EXPORT CELTEncoder *celt_encoder_create(int sampling_rate, int channels, int *error); + +/** Creates a new encoder state. Each stream needs its own encoder + state (can't be shared across simultaneous streams). + @param mode Contains all the information about the characteristics of + * the stream (must be the same characteristics as used for the + * decoder) + @param channels Number of channels + @param error Returns an error code + @return Newly created encoder state. +*/ +EXPORT CELTEncoder *celt_encoder_create_custom(const CELTMode *mode, int channels, int *error); + +EXPORT CELTEncoder *celt_encoder_init(CELTEncoder *st, int sampling_rate, int channels, int *error); + +EXPORT CELTEncoder *celt_encoder_init_custom(CELTEncoder *st, const CELTMode *mode, int channels, int *error); + +/** Destroys a an encoder state. + @param st Encoder state to be destroyed + */ +EXPORT void celt_encoder_destroy(CELTEncoder *st); + +/** Encodes a frame of audio. + @param st Encoder state + @param pcm PCM audio in float format, with a normal range of ±1.0. + * Samples with a range beyond ±1.0 are supported but will + * be clipped by decoders using the integer API and should + * only be used if it is known that the far end supports + * extended dynmaic range. There must be exactly + * frame_size samples per channel. + @param compressed The compressed data is written here. This may not alias pcm or + * optional_synthesis. + @param nbCompressedBytes Maximum number of bytes to use for compressing the frame + * (can change from one frame to another) + @return Number of bytes written to "compressed". Will be the same as + * "nbCompressedBytes" unless the stream is VBR and will never be larger. + * If negative, an error has occurred (see error codes). It is IMPORTANT that + * the length returned be somehow transmitted to the decoder. Otherwise, no + * decoding is possible. +*/ +EXPORT int celt_encode_float(CELTEncoder *st, const float *pcm, int frame_size, unsigned char *compressed, int maxCompressedBytes); + +/** Encodes a frame of audio. + @param st Encoder state + @param pcm PCM audio in signed 16-bit format (native endian). There must be + * exactly frame_size samples per channel. + @param compressed The compressed data is written here. This may not alias pcm or + * optional_synthesis. + @param nbCompressedBytes Maximum number of bytes to use for compressing the frame + * (can change from one frame to another) + @return Number of bytes written to "compressed". Will be the same as + * "nbCompressedBytes" unless the stream is VBR and will never be larger. + * If negative, an error has occurred (see error codes). It is IMPORTANT that + * the length returned be somehow transmitted to the decoder. Otherwise, no + * decoding is possible. + */ +EXPORT int celt_encode(CELTEncoder *st, const celt_int16 *pcm, int frame_size, unsigned char *compressed, int maxCompressedBytes); + +/** Query and set encoder parameters + @param st Encoder state + @param request Parameter to change or query + @param value Pointer to a 32-bit int value + @return Error code +*/ +EXPORT int celt_encoder_ctl(CELTEncoder * st, int request, ...); + +/* Decoder stuff */ + +EXPORT int celt_decoder_get_size(int channels); + +EXPORT int celt_decoder_get_size_custom(const CELTMode *mode, int channels); + +/** Creates a new decoder state. Each stream needs its own decoder state (can't + be shared across simultaneous streams). + @param mode Contains all the information about the characteristics of the + stream (must be the same characteristics as used for the encoder) + @param channels Number of channels + @param error Returns an error code + @return Newly created decoder state. + */ +EXPORT CELTDecoder *celt_decoder_create(int sampling_rate, int channels, int *error); + +/** Creates a new decoder state. Each stream needs its own decoder state (can't + be shared across simultaneous streams). + @param mode Contains all the information about the characteristics of the + stream (must be the same characteristics as used for the encoder) + @param channels Number of channels + @param error Returns an error code + @return Newly created decoder state. + */ +EXPORT CELTDecoder *celt_decoder_create_custom(const CELTMode *mode, int channels, int *error); + +EXPORT CELTDecoder *celt_decoder_init(CELTDecoder *st, int sampling_rate, int channels, int *error); + +EXPORT CELTDecoder *celt_decoder_init_custom(CELTDecoder *st, const CELTMode *mode, int channels, int *error); + +/** Destroys a a decoder state. + @param st Decoder state to be destroyed + */ +EXPORT void celt_decoder_destroy(CELTDecoder *st); + +/** Decodes a frame of audio. + @param st Decoder state + @param data Compressed data produced by an encoder + @param len Number of bytes to read from "data". This MUST be exactly the number + of bytes returned by the encoder. Using a larger value WILL NOT WORK. + @param pcm One frame (frame_size samples per channel) of decoded PCM will be + returned here in float format. + @return Error code. + */ +EXPORT int celt_decode_float(CELTDecoder *st, const unsigned char *data, int len, float *pcm, int frame_size); + +/** Decodes a frame of audio. + @param st Decoder state + @param data Compressed data produced by an encoder + @param len Number of bytes to read from "data". This MUST be exactly the number + of bytes returned by the encoder. Using a larger value WILL NOT WORK. + @param pcm One frame (frame_size samples per channel) of decoded PCM will be + returned here in 16-bit PCM format (native endian). + @return Error code. + */ +EXPORT int celt_decode(CELTDecoder *st, const unsigned char *data, int len, celt_int16 *pcm, int frame_size); + +/** Query and set decoder parameters + @param st Decoder state + @param request Parameter to change or query + @param value Pointer to a 32-bit int value + @return Error code + */ +EXPORT int celt_decoder_ctl(CELTDecoder * st, int request, ...); + + +/** Returns the English string that corresponds to an error code + * @param error Error code (negative for an error, 0 for success + * @return Constant string (must NOT be freed) + */ +EXPORT const char *celt_strerror(int error); + +/* @} */ + + +#ifdef __cplusplus +} +#endif + +#endif /*CELT_H */ diff --git a/celt/celt_header.h b/celt/celt_header.h new file mode 100644 index 0000000..3777484 --- /dev/null +++ b/celt/celt_header.h @@ -0,0 +1,66 @@ +/* Copyright (c) 2007 CSIRO + Copyright (c) 2007-2008 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef CELT_HEADER_H +#define CELT_HEADER_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "celt.h" +#include "celt_types.h" + +/** Header data to be used for Ogg files (or possibly other encapsulation) + @brief Header data + */ +typedef struct { + char codec_id[8]; /**< MUST be "CELT " (four spaces) */ + char codec_version[20]; /**< Version used (as string) */ + celt_int32 version_id; /**< Version id (negative for until stream is frozen) */ + celt_int32 header_size; /**< Size of this header */ + celt_int32 sample_rate; /**< Sampling rate of the original audio */ + celt_int32 nb_channels; /**< Number of channels */ + celt_int32 frame_size; /**< Samples per frame (per channel) */ + celt_int32 overlap; /**< Overlapping samples (per channel) */ + celt_int32 bytes_per_packet; /**< Number of bytes per compressed packet (0 if unknown) */ + celt_int32 extra_headers; /**< Number of additional headers that follow this header */ +} CELTHeader; + +/** Creates a basic header struct */ +EXPORT int celt_header_init(CELTHeader *header, const CELTMode *m, int frame_size, int channels); + +EXPORT int celt_header_to_packet(const CELTHeader *header, unsigned char *packet, celt_uint32 size); + +EXPORT int celt_header_from_packet(const unsigned char *packet, celt_uint32 size, CELTHeader *header); + +#ifdef __cplusplus +} +#endif + +#endif /* CELT_HEADER_H */ diff --git a/celt/celt_types.h b/celt/celt_types.h new file mode 100644 index 0000000..bfd498a --- /dev/null +++ b/celt/celt_types.h @@ -0,0 +1,151 @@ +/* (C) COPYRIGHT 1994-2002 Xiph.Org Foundation */ +/* Modified by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* celt_types.h taken from libogg */ + +/** + @file celt_types.h + @brief CELT types +*/ +#ifndef _CELT_TYPES_H +#define _CELT_TYPES_H + +/* Use the real stdint.h if it's there (taken from Paul Hsieh's pstdint.h) */ +#if (defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)) || defined (HAVE_STDINT_H)) +#include + + typedef int16_t celt_int16; + typedef uint16_t celt_uint16; + typedef int32_t celt_int32; + typedef uint32_t celt_uint32; +#elif defined(_WIN32) + +# if defined(__CYGWIN__) +# include <_G_config.h> + typedef _G_int32_t celt_int32; + typedef _G_uint32_t celt_uint32; + typedef _G_int16 celt_int16; + typedef _G_uint16 celt_uint16; +# elif defined(__MINGW32__) + typedef short celt_int16; + typedef unsigned short celt_uint16; + typedef int celt_int32; + typedef unsigned int celt_uint32; +# elif defined(__MWERKS__) + typedef int celt_int32; + typedef unsigned int celt_uint32; + typedef short celt_int16; + typedef unsigned short celt_uint16; +# else + /* MSVC/Borland */ + typedef __int32 celt_int32; + typedef unsigned __int32 celt_uint32; + typedef __int16 celt_int16; + typedef unsigned __int16 celt_uint16; +# endif + +#elif defined(__MACOS__) + +# include + typedef SInt16 celt_int16; + typedef UInt16 celt_uint16; + typedef SInt32 celt_int32; + typedef UInt32 celt_uint32; + +#elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */ + +# include + typedef int16_t celt_int16; + typedef u_int16_t celt_uint16; + typedef int32_t celt_int32; + typedef u_int32_t celt_uint32; + +#elif defined(__BEOS__) + + /* Be */ +# include + typedef int16 celt_int16; + typedef u_int16 celt_uint16; + typedef int32_t celt_int32; + typedef u_int32_t celt_uint32; + +#elif defined (__EMX__) + + /* OS/2 GCC */ + typedef short celt_int16; + typedef unsigned short celt_uint16; + typedef int celt_int32; + typedef unsigned int celt_uint32; + +#elif defined (DJGPP) + + /* DJGPP */ + typedef short celt_int16; + typedef unsigned short celt_uint16; + typedef int celt_int32; + typedef unsigned int celt_uint32; + +#elif defined(R5900) + + /* PS2 EE */ + typedef int celt_int32; + typedef unsigned celt_uint32; + typedef short celt_int16; + typedef unsigned short celt_uint16; + +#elif defined(__SYMBIAN32__) + + /* Symbian GCC */ + typedef signed short celt_int16; + typedef unsigned short celt_uint16; + typedef signed int celt_int32; + typedef unsigned int celt_uint32; + +#elif defined(CONFIG_TI_C54X) || defined (CONFIG_TI_C55X) + + typedef short celt_int16; + typedef unsigned short celt_uint16; + typedef long celt_int32; + typedef unsigned long celt_uint32; + +#elif defined(CONFIG_TI_C6X) + + typedef short celt_int16; + typedef unsigned short celt_uint16; + typedef int celt_int32; + typedef unsigned int celt_uint32; + +#else + + /* Give up, take a reasonable guess */ + typedef short celt_int16; + typedef unsigned short celt_uint16; + typedef int celt_int32; + typedef unsigned int celt_uint32; + +#endif + +#endif /* _CELT_TYPES_H */ diff --git a/celt/celt_work/bands.o b/celt/celt_work/bands.o new file mode 100644 index 0000000000000000000000000000000000000000..efcf256bfe2c854e70b7e2f1a53ac03ab82cdd79 GIT binary patch literal 19044 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 vuNN1pwd1hQwLpTcBq#R)=1 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 literal 0 HcmV?d00001 diff --git a/celt/celt_work/cwrs.o b/celt/celt_work/cwrs.o new file mode 100644 index 0000000000000000000000000000000000000000..b3c5d5fb8538dade3288ac7eb617c5b700ff85ce GIT binary patch literal 10200 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 CUlaHM literal 0 HcmV?d00001 diff --git a/celt/celt_work/entcode.o b/celt/celt_work/entcode.o new file mode 100644 index 0000000000000000000000000000000000000000..80489f3d4bd2c7b32bb3269ee30181fe2b413bcf GIT binary patch literal 1320 zcma)5-%Aux6h1Sv+UD=XH>H+{P^imlp&>r_gVC2ICEYh+Sl3Cx{l)GGCV~$lv@Agn z{U5ytfty6slTd#^FM-rT8~EVE!uEZ$b8|4E4xBmXeD}NOo^$S`yW*hfZ>}X|rp!(G++vmPN)cf}6pnmI342vW0 z$|q&JPJC&oV%HB&`^weN-wD<}*k=|fKSnBct@pKEtDg1(MNkFFZh&nZb=nPodjq?& zSUY>M)GQ~@4v+RfVZD+(=K&v&E0H_LvM@I{85>@BoE(Wws8KZ<8;g%l#K#}RMFwyV z#n^o!#$MDI?21I5qxd0URLU!UW_qHB=4^MH`SLv|(g$dYI3&_Ce|^Jqi^#8Lm|#gT z$N;o1WwE3!Ovf#7!WUvm^df*~$@NR|wM(%fodLpr`b|@Ah8X>3yG({+_9t%6OXt^J zm6o)d@#2n~c04zeah?`a8giVSN8@V4^_&70H@9B?e)LN+| zKA^5HM5XiDEZPv2%X_ZE6S!aUQt7Q$CU=vqWL+HnzcL8ojS!jt0dIn{rSdIM??QS1 z`qubX{C5OP(Qo56eBRtNl(LF>aQ4gv*U!cL_n_Rv|AKPTGJn20-xv_`|HYdC$FGlv zK$tK5j&;6e;Pm5A$`>eSpoMGH)xc`}r*;CX^A!SKaIDl3Cqi6ZLk3uQE}76=h?B=Y tnOEn6D^md23!ayBK*{Taa*v(~T zuNrQeC1^15K_d@57-K?wAq1k?7lIGQ5s1#HiSa89>%)kPYp_~>|8vjjZpVzC?eu^C z-=F7nJEga6R}_WGr7$;Jz!*zEXmc7ksAenK3eH~!JY@aap3dd-`4ZAd>1rxiL7xH7 z=JCOY>13l7BRiE;NVRrVDAQ$^SlOk~nUc$7Z~uXbC2Xh#8-6-@>0_sd6V;J@3J%sj zTSl!Jvu-F;OV~6s-i63!2Dx(iNRZU5U^z!C$9`0;aZae@glbFA<&$dqF=S*;dIYaJ zrRSt%Do|ZIbu$Y&uHX~&+&n@URi;Sslu+~8KDIJ;njJZP_6tgMAtGXiG>fMe@>)U4 z?s`C_n(&iWIC%@Fio&V#G>#PM$-fsxiVlceZf0x7t*Mb<9`>vtMRPsyBv~N6?`%Cz zEMEtr9bZw=z)S@yuaL@oQWIHKajFl^Ozo<&d3Sj=v|2sKo#o6?WwWl8y*-MO%ulaF zfpZEzw3;b1t?)9u*nXcQidwVAZry=>E9mg@lJN4orO!d+3Jn_MezK;liDJA~pW^{& zp9z`YtXXR;rO#17W6pTyl&P8tYZ~F0livNW@EN>6A_P%ht9#2Xju+aE9A$USA&n(g zQ8g%9Z!I#uI6hNq7Y%YW?k$y6>%PBukN&m7mOg72)y^;#Le#hJAU{2e;J4^mJ9GqL z4&_*KC5W|pb|DVXFx9i5&A3z0DLDQEHxpxw`tz!r8DH`I1u88)<8bXwg)#-#*Y#Np zGlnNaj`dmGUxca2yOs)Nd10WB5Hkbc@Tf8}D)_90rnp>Gg&rBqEDr_~P`(h28Pk-q zPj$_ledLM{4W`Mp^t3sYR)>epSQ`1I>ALW`pq(gLK8atIn=mI;o=659kc0VTW`Ttp z2Gxvp3(7y^Y-UslNJVeyG_N{x(2kZMhnW@>1Q*4A&$O9MCUS;OKB+mh9PYIH++|V+ zWWgOz5U;bwo#9$}d2_S4Cr2J7yYu%7_c)6{G2Nw@TRp3qL)nVqA86328#Zfx>QQ}; z&m>hOhHH_<_;HJPROYOpM$ST6E6AUhKsogRofGZAn$2 zG+%=lmk9{|-bFI5-L??f=)`^(`yHo@>n(1B_^)GcfY0+q{Pzm{3!r}qepeAc!ueI8 zO=35=7(3_W>u>vD;^eoQZrAtMCa7NIqaQMBOP0=+z5~vJPYY(2T!PJc9(FhH6ml~p=UDDV zR@|(FEf@S&Ko@=<0;DtbkMIqEvR8yVmz&XF0}IQ|_%~UB;AW+TGacOQfkn7t&yt|7 zb}eHE9TJrP5o|dNt6eU32Dt1!;S`(fHQ^rvmpvtX6u9gm;a>xnJtI5~T=t0Yd%$Hs z2xrlFqB9!tM_4ps3`E17M#u3)vYa1A@>n;(Y_LaBt6vs3050 zv8NmTUD1TmA2AZ$$@pP^_!u*GwC!nWZZr05-`=k8HTE{QwCP5%p`Lh8qKMMhDQ()W zfEyh>@gf-`+20vPphY2d^dyYlzOMdaYEPu|P%$Oh6EF4%^NB%B3ua;k<1@2-C1cME zd^aHB9|-({!0R!bB;N=~{M!QmR^VGvUgEa^68|fK-xhcy?iTU4022QbfnO5%bGQ`5 zZv`a&YlLHH-Y2-4v8x2vFm_kaH6%dv^#q~!1R&}8C~o*{6|h@Cnl++-DBukNX9e_9 zKH%307!)ue;5mXSg#ClZV~KDFU}C_A-SX5m(3k9I{()$(KM_5aV19Hh%={gLgNzgW zOOK5|(ie+iG?_o%mx%iDmTwqLgd>M-OVMu3WH=Uu>;JpfLU5HsxB+Jho&F6#srbu* zGP1|9kyhd6Ka2BK)KMsd_e#u`6oN`{wPV=vO ziwld3iw&e$QLhzi;xpnku1M&)|4L@%MF=dGLL}JSrtzJI)#)`KZZc-9PTyGIB6f=d z2lM}rzIN&h@Uhb)&+?A%H?T1Gdu_CB%A7U|H|x*M1(qy6JM3G;$^K`5B+d6tRlR1k zDz~?eP7ZyBt5~ZQtr~^c;-I(a!$opey{3J+jg5q6Y@^)JGCG;v0nr9(yo(Pry0AEi zKX365|Nbxg#$$_8O^a4D__`JK`7abCwYB88>EkhZyI9Nl*XgIFOO(DQ1wvEBb<)Un zwvmeXj`uF$Bhq9uCW8=Zo_fc=gBfd@5^esH5NE{67jHg^%ub(4r(cUO z{tWrGh_AK^)K%&E8DGYe+4BCY6HvSL5A{+g8mk$26qeRQQQZ_dc_kl|1URcZ!p zkP5i&-w9W^}wO!d<3hcvqCbh16F56Tf1PvHOl7OtxhC; zMH?mW(ExtQ4Jr$DoAkyxb)w9_k8nnnN}f5i~? zAz&1wK*4&%NAYP}yzPov;Fg-FWHKWJby8BP!%c6ZJ<(0p!3Ax1aH)23ses|X91Y~k zpSl!6pm>HEoy!f+d7tUYrRGo-b4*AX;@qTRM$3}o({6-&E1)k9mQi~Z<_z0m?kZe8 z2T4Z=b46oA)R&v{?2%Qf#7b~WK$f--YRK|Al+>*LQ07H^x={s?|5hi$3Ag2{p_A?C zL2#}-|Q=Rc|h};LQy$tQ;yM_fxv4mi1mWV~7G43ucU!Z$*NP z08UeZ2-@XQpAZ+>9`1?4ICv;$YvpC^KLZ0w=FI(9PRVm4 zA)GpOeO>L~+~m3?pXANAu^H7`S_O!<#O`$-F}B}W-(+L(E#(vn#@gex9`RbA;NwXT zpI`O1{m#5${D$kzHo+S9wY_1!Z`@!`?0wYC*HVYx_Mr))wkrn?#bt5xkdTx(n|Ems zH2W`4B6Vd}mM_7o5l3Fy%}`c#WxfE9B9)_aw?*w%W9^jX6KOW4@s8e>i zcgu>=A1G{g5Mq0S(pmGh&L*tGOjFc0Bmt7ecK&zTVju+8W**-W4#EuU)_B8cm77*FjH#?xNo4xh&}hPn%Z#y2lVjE|1ny`!#es~b9UZr8*4j#nWU z0y%<7{u7vWGLPFb)X|MOfjNy?lW|?83VFt}AP?cpqjmhA8vm!DUk87*j(@hszY6*h zWOuHPKO*@ppv_{w2mX(p{OCD%&f|JM-|?Ef3+?pb49hJ<$|>jSlX^m+Z3MpxzWnag z{&)!fn0PhMyHF+unF)^&7qG6~l`=oGWq3{&GCd7K{KP5adZBjCbKp0w5aN9&pE}C6 zPg_C12pJbXs(YL=+rRBT=gBp=9^ki`$l%Sh+>xO}O)RY4iI9zVB{G@Q z@&3WACZzi_sl@TVr;?&8c|6-5kH?2Tza@MmnT?<5if4NV)5pSzArarPYxlN}UGd%9 zx9^Sai|^~$wksM}JCx?WbYHfP(%-Fh+7iIyhx^iXG9YB*$NP_*sHgUIb@$X$2K&8zpL<)!qcc>@&^FP|A)e>3jZF;i2NS_lFtS} zyaAB-MTK8hco1dm`j`+85TaloQ+SFH`!aysw+4NT_{RZ>`%s?5*8mdV4d}T;h$l(^ zq!6bReZmX+o%Vak1sfmYeF1wF98>T`1*a7(Dj4AXA>XdxJ_Xq~NdKXNuP9hlFbJLt zEufW<&JPcqPGu8^0kat!_UhGOeB zM@YrZa$f{Z%ONZ^xx2B3tI)OW!MOA~S|)iMpT;CPg2~bAhdwZQE;}~Qq<;Qb=N{5H zUUKLnuJzrEHRV4_ZmZg}0`cRZKAxqA*0&b~uC?66GIIS&u3ahk1?1=}J*b0oNI^}1 zW0`w=N69JkL;-U5X#_lN>loHl5y9j*fnc2hr2qKF(*EPwj_tyOf2)*1yd88MUqb5A bzQa;fporfgdgvu{#VJ?D=I6B#pqBd&8^3&+ literal 0 HcmV?d00001 diff --git a/celt/celt_work/header.o b/celt/celt_work/header.o new file mode 100644 index 0000000000000000000000000000000000000000..65d39f9426da06495669a11ba72fa8afe6faedaa GIT binary patch literal 2784 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 Sb3@Jx%AJGWZ-eFzC--0b&I70b literal 0 HcmV?d00001 diff --git a/celt/celt_work/laplace.o b/celt/celt_work/laplace.o new file mode 100644 index 0000000000000000000000000000000000000000..59ef2a01cbc2d69dc540137a417717f7dca464d1 GIT binary patch literal 2344 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 Cuk};_ literal 0 HcmV?d00001 diff --git a/celt/celt_work/modes.o b/celt/celt_work/modes.o new file mode 100644 index 0000000000000000000000000000000000000000..1aa6d7228137ff9545450c945cf78bc2323cab89 GIT binary patch literal 6344 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 literal 0 HcmV?d00001 diff --git a/celt/celt_work/pitch.o b/celt/celt_work/pitch.o new file mode 100644 index 0000000000000000000000000000000000000000..b382df0c13f1ce62b7be3bb5c28ac28f50e8429e GIT binary patch literal 5844 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 G8}}a#IJz?c literal 0 HcmV?d00001 diff --git a/celt/celt_work/plc.o b/celt/celt_work/plc.o new file mode 100644 index 0000000000000000000000000000000000000000..843614667285f2d23b6c51b00661d2d8b0b4a090 GIT binary patch literal 3088 zcmb_eZ){Ul6u`6p0;*5OgGcZe1O~)28lSUh}SbyjC-S*L;_<^(B zoqNvtopbIv_uRLgjN1$+ALV&cOf^_MUo!g0=vD+t zLD^@i*|P@ED=;_nK=PW!14dRcd48%Mswxc1rc#`sa)qM!oSZ@B8Y&4GU3tZLGtW-` zFy}xP5845@){n$!Q^4RkWXv`5+9l_oMUMZd^pdFWAykUyKg3FdqK*gEwzX8-D|?LT z262z4hSlPgnf!*ueI_5bxZmX0qaW2mZ}ME@keN0|(7SRc`o~5#LXz< zU(@ajEcWLgokRZB-)taq-1HZt+a%=57=xUQ-%kDYUw7z1FBT)~#u1T;H&+ zsev)_CsI!AW=gVJS>f|~&*6I)gpL-`CHlCwEUrGSZdp|2`CPdQ4B0k1wmaY@yZRfM zh3|f--^X~|yvLpr_Epd&v5tBe`_LVqpYa%8&jn?q<+~PvWcczkc9CL$s0T!(`%>)6 zI!7!q3MhAjI{ayw*6HR^o!mK4DK^sKvM z5iPKF0Lztvk20wCX#zZQH~5>U&$Z zv~r!bAMRm?vD}fueTjG^-cwS}4HrQ;y*Ck#bn20gPQ5*RIHt$qk#LNTNxe}QGtt!r zOBj0_bt|*T8e`y7POI_f#*wcig zbz;%Gqg9F92%W^CtpY>1r?7AZrC0O<_K%^*lE_B%1Qz`-w;79QGlIPePI>8tQY?!9 zG#2^DSNobP7SzHUYP2$o68^>Azt-6}AYAaP+OAShC01vQO|9-lL5}@_aN?Zrn8_`9OleCGH>VNcw>Q literal 0 HcmV?d00001 diff --git a/celt/celt_work/quant_bands.o b/celt/celt_work/quant_bands.o new file mode 100644 index 0000000000000000000000000000000000000000..fde014500508cd6aa71ac6640d6ca885b259b994 GIT binary patch literal 10264 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 literal 0 HcmV?d00001 diff --git a/celt/celt_work/rate.o b/celt/celt_work/rate.o new file mode 100644 index 0000000000000000000000000000000000000000..491d6c5a0d4e41380ebdfebccd4fc40c2edb0426 GIT binary patch literal 9868 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 O?Zdu5pas^j<^BsmRX$4q literal 0 HcmV?d00001 diff --git a/celt/libcelt0.a b/celt/libcelt0.a new file mode 100644 index 0000000000000000000000000000000000000000..0c73b687394c3647480c931948d3464844816489 GIT binary patch literal 155506 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
    $ub^&`>RgiY9rM>tq5rOp_K*kgIP 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

    < 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

    ?u!=y#ZLfbGRAfXOC&arV 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 jrXFPDo48C_;1jY #include +#include "inetmessage.h" + #include "CDetour/detours.h" #include "extension.h" @@ -136,11 +138,133 @@ IServer *iserver = NULL; double g_fLastVoiceData[SM_MAXPLAYERS + 1]; int g_aFrameVoiceBytes[SM_MAXPLAYERS + 1]; +bool g_bIsNoSteam[SM_MAXPLAYERS + 1]; +bool g_bClientMuted[SM_MAXPLAYERS + 1][SM_MAXPLAYERS + 1]; // [muter][mutee] + +static void SendVoiceDataMsg(int fromClientSlot, IClient *pToClient, unsigned char *data, int nBytes, int64 xuid) +{ + SVC_VoiceData msg; + msg.m_bProximity = false; + msg.m_nLength = nBytes * 8; // length in bits + msg.m_xuid = xuid; + msg.m_nFromClient = fromClientSlot; + msg.m_DataOut = data; + pToClient->SendNetMsg(msg); +} + +#define Bits2Bytes(b) ((b+7)>>3) + +/* +objdump -d /home/gameservers/css_dev/bin/engine_srv.so | grep -A 10 "_ZNK11CBaseClient13GetPlayerSlotEv" +00081a90 <_ZNK11CBaseClient13GetPlayerSlotEv>: + 81a90: 55 push %ebp + 81a91: 89 e5 mov %esp,%ebp + 81a93: 8b 45 08 mov 0x8(%ebp),%eax + 81a96: 5d pop %ebp + 81a97: 8b 40 0c mov 0xc(%eax),%eax + 81a9a: c3 ret + 81a9b: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi + 81a9f: 90 nop + +00081aa0 <_ZThn4_NK11CBaseClient13GetPlayerSlotEv>: + +mov 0xc(%eax),%eax -> offset is 12 bytes (0x0c) +*/ + +DETOUR_DECL_MEMBER1(ProcessVoiceData, bool, void *, msg) +{ + //in member class we use "this" to obtain the client. + int playerSlot = *(int*)((char*)this + 12); //m_nClientSlot member CBaseClient which CGameClient inherits from. + int clientIndex = playerSlot + 1; + + CLC_VoiceData *voiceMsg = (CLC_VoiceData *)msg; + + char voiceDataBuffer[4096]; + int bitsRead = voiceMsg->m_DataIn.ReadBitsClamped(voiceDataBuffer, voiceMsg->m_nLength); + int nBytes = Bits2Bytes(bitsRead); + + //still need this super important check for preventing empty voice packets spam. + if (nBytes < 1) + return true; + + if (clientIndex < 1 || clientIndex > SM_MAXPLAYERS) + return true; + + // Reject voice packet if we'd send more than NET_MAX_VOICE_BYTES_FRAME voice bytes from this client in the current frame. + // 5 = SVC_VoiceData header/overhead + g_aFrameVoiceBytes[clientIndex] += 5 + nBytes; + if (g_aFrameVoiceBytes[clientIndex] > NET_MAX_VOICE_BYTES_FRAME) + return true; + + g_fLastVoiceData[clientIndex] = gpGlobals->curtime; + + // Get IClient for sending + IClient *pClient = iserver->GetClient(playerSlot); + if (!pClient) + return true; + + // Detect NoSteam + if (g_bIsNoSteam[clientIndex]) + { + //convert nosteam CELT packet to OPUS for steam clients + g_Interface.TranscodeNoSteamToSteam(playerSlot, nBytes, voiceDataBuffer); + //send nosteam CELT packet to no steam clients + int maxClients = iserver->GetClientCount(); + for (int i = 0; i < maxClients; i++) + { + IClient *pToClient = iserver->GetClient(i); + if (!pToClient || !pToClient->IsConnected() || !pToClient->IsActive() || pToClient->IsFakeClient()) + continue; + + bool bSelf = (i == playerSlot); + + if (bSelf) + continue; + + if (!g_bIsNoSteam[i + 1]) + continue; + if (g_bClientMuted[i + 1][clientIndex]) + continue; + //smutils->LogMessage(myself, "in ProcessVoiceData before SendVoiceDataMsg"); + SendVoiceDataMsg(playerSlot, pToClient, (unsigned char *)voiceDataBuffer, nBytes, voiceMsg->m_xuid); + } + } + else + { + //convert steam OPUS packet to CELT for no steam clients + g_Interface.PushPlayerVoiceData(playerSlot, nBytes, voiceDataBuffer); + // Send steam Opus packet to Steam clients + int maxClients = iserver->GetClientCount(); + for (int i = 0; i < maxClients; i++) + { + IClient *pToClient = iserver->GetClient(i); + if (!pToClient || !pToClient->IsConnected() || !pToClient->IsActive() || pToClient->IsFakeClient()) + continue; + + bool bSelf = (i == playerSlot); + + if (bSelf) + continue; + if (g_bIsNoSteam[i + 1]) + continue; + if (g_bClientMuted[i + 1][clientIndex]) + continue; + //smutils->LogMessage(myself, "in ProcessVoiceData before SendVoiceDataMsg"); + SendVoiceDataMsg(playerSlot, pToClient, (unsigned char *)voiceDataBuffer, nBytes, voiceMsg->m_xuid); + } + } + return true; +} DETOUR_DECL_STATIC4(SV_BroadcastVoiceData, void, IClient *, pClient, int, nBytes, char *, data, int64, xuid) { - if(g_Interface.OnBroadcastVoiceData(pClient, nBytes, data)) + //if(g_Interface.OnBroadcastVoiceData(pClient, nBytes, data)) + /* + if (1 == 2) //we dont do dis no more + { DETOUR_STATIC_CALL(SV_BroadcastVoiceData)(pClient, nBytes, data, xuid); + } + */ } #ifdef _WIN32 @@ -191,7 +315,40 @@ CVoice::CVoice() m_AvailableTime = 0.0; m_VoiceDetour = NULL; + m_ProcessVoiceDataDetour = NULL; m_SV_BroadcastVoiceData = NULL; + + m_TorchlightOpusDecoder = NULL; + for (int i = 0; i <= SM_MAXPLAYERS; i++) + { + m_PlayerOpusDecoder[i] = NULL; + } + + for (int i = 0; i <= SM_MAXPLAYERS; i++) + { + m_pCeltDecoder[i] = NULL; + } + + m_pCeltMode = NULL; + m_pCeltCodec = NULL; + m_pCeltModePlayer = NULL; + m_torchMonoAccumLen = 0; + m_torchResampleAccum = 0; + memset(m_playerResampleAccum, 0, sizeof(m_playerResampleAccum)); + memset(m_torchMonoAccum, 0, sizeof(m_torchMonoAccum)); + memset(m_nosteamSeqNum, 0, sizeof(m_nosteamSeqNum)); + + memset(g_bIsNoSteam, 0, sizeof(g_bIsNoSteam)); + + memset(m_playerAvailableTime, 0, sizeof(m_playerAvailableTime)); + for (int i = 0; i <= SM_MAXPLAYERS; i++) + m_pCeltCodecPlayer[i] = NULL; + + memset(g_bClientMuted, 0, sizeof(g_bClientMuted)); + memset(m_nosteamResampleAccum, 0, sizeof(m_nosteamResampleAccum)); + memset(m_nosteamAvailableTime, 0, sizeof(m_nosteamAvailableTime)); + for (int i = 0; i <= SM_MAXPLAYERS; i++) + m_nosteamOpusEncoder[i] = NULL; } bool CVoice::SDK_OnLoad(char *error, size_t maxlength, bool late) @@ -266,6 +423,8 @@ bool CVoice::SDK_OnLoad(char *error, size_t maxlength, bool late) dlclose(pEngineSo); return false; } + //2026 signature of CGameClient::ProcessVoiceData + void *adrProcessVoiceData = memutils->ResolveSymbol(pEngineSo, "_ZN11CGameClient16ProcessVoiceDataEP13CLC_VoiceData"); dlclose(pEngineSo); m_SV_BroadcastVoiceData = (t_SV_BroadcastVoiceData)adrVoiceData; @@ -299,6 +458,15 @@ bool CVoice::SDK_OnLoad(char *error, size_t maxlength, bool late) m_VoiceDetour->EnableDetour(); + //2026 detouring CGameClient::ProcessVoiceData + m_ProcessVoiceDataDetour = DETOUR_CREATE_MEMBER(ProcessVoiceData, adrProcessVoiceData); + if (!m_ProcessVoiceDataDetour) + { + g_SMAPI->Format(error, maxlength, "ProcessVoiceData detour failed."); + return false; + } + m_ProcessVoiceDataDetour->EnableDetour(); + //opus edit int err; //m_OpusEncoder = opus_encoder_create(24000, 2, OPUS_APPLICATION_AUDIO, &err); @@ -322,6 +490,56 @@ bool CVoice::SDK_OnLoad(char *error, size_t maxlength, bool late) return false; } + // Opus decoder for torchlight (48000 Hz stereo) + int err2; + m_TorchlightOpusDecoder = opus_decoder_create(48000, 2, &err2); + if (err2 < 0) + { + smutils->LogError(myself, "failed to create torchlight opus decoder: %s", opus_strerror(err2)); + return false; + } + + // CELT encoder (22050 Hz mono, 512 samples/frame, 64 byte packets) + m_CeltEncoderSettings.SampleRate_Hz = 22050; + m_CeltEncoderSettings.TargetBitRate_Kbps = 64; + m_CeltEncoderSettings.FrameSize = 512; + m_CeltEncoderSettings.PacketSize = 64; + m_CeltEncoderSettings.Complexity = 10; + m_CeltEncoderSettings.FrameTime = (double)m_CeltEncoderSettings.FrameSize + / (double)m_CeltEncoderSettings.SampleRate_Hz; + + int theError; + //torchlight celt + m_pCeltMode = celt_mode_create(m_CeltEncoderSettings.SampleRate_Hz, + m_CeltEncoderSettings.FrameSize, &theError); + if (!m_pCeltMode) + { + g_SMAPI->Format(error, maxlength, "celt_mode_create error: %d", theError); + SDK_OnUnload(); + return false; + } + + m_pCeltCodec = celt_encoder_create_custom(m_pCeltMode, 1, &theError); + if (!m_pCeltCodec) + { + g_SMAPI->Format(error, maxlength, "celt_encoder_create_custom error: %d", theError); + SDK_OnUnload(); + return false; + } + + celt_encoder_ctl(m_pCeltCodec, CELT_RESET_STATE_REQUEST, NULL); + celt_encoder_ctl(m_pCeltCodec, CELT_SET_BITRATE(m_CeltEncoderSettings.TargetBitRate_Kbps * 1000)); + celt_encoder_ctl(m_pCeltCodec, CELT_SET_COMPLEXITY(m_CeltEncoderSettings.Complexity)); + + //Player celt + m_pCeltModePlayer = celt_mode_create(m_CeltEncoderSettings.SampleRate_Hz, + m_CeltEncoderSettings.FrameSize, &theError); + if (!m_pCeltModePlayer) + { + g_SMAPI->Format(error, maxlength, "celt_mode_create 2 error: %d", theError); + SDK_OnUnload(); + return false; + } return true; } @@ -360,9 +578,54 @@ cell_t IsClientTalking(IPluginContext *pContext, const cell_t *params) return true; } +cell_t Native_SetClientNoSteam(IPluginContext *pContext, const cell_t *params) +{ + int client = params[1]; + bool IsSteam = params[2]; + + if (client < 1 || client > SM_MAXPLAYERS) + return pContext->ThrowNativeError("Invalid client index %d", client); + + g_bIsNoSteam[client] = IsSteam; + return 1; +} + +cell_t Native_SendCeltVoiceInit(IPluginContext *pContext, const cell_t *params) +{ + int client = params[1]; + if (client < 1 || client > SM_MAXPLAYERS) + return pContext->ThrowNativeError("Invalid client index %d", client); + + IClient *pClient = iserver->GetClient(client - 1); + if (!pClient || !pClient->IsConnected()) + return 0; + + SVC_VoiceInit msg("vaudio_celt", 22050); + pClient->SendNetMsg(msg); + smutils->LogMessage(myself, "Sent SVC_VoiceInit vaudio_celt to client %d", client); + return 1; +} + +cell_t Native_ClientMutedOtherClient(IPluginContext *pContext, const cell_t *params) +{ + int clientmuter = params[1]; + int clientmutee = params[2]; + if (clientmuter < 1 || clientmuter > SM_MAXPLAYERS) + return pContext->ThrowNativeError("Invalid clientmuter index %d", clientmuter); + + if (clientmutee < 0 || clientmutee > SM_MAXPLAYERS) //we allow muting the SourceTV + return pContext->ThrowNativeError("Invalid clientmutee index %d", clientmutee); + + g_bClientMuted[clientmuter][clientmutee] = params[3]; //true or false + //smutils->LogMessage(myself, "native g_bClientMuted: %i. clientmuter: %i. clientmutee: %i", g_bClientMuted[clientmuter][clientmutee], clientmuter, clientmutee); + return 1; +} const sp_nativeinfo_t MyNatives[] = { { "IsClientTalking", IsClientTalking }, + { "SetClientNoSteam", Native_SetClientNoSteam }, + { "SendCeltVoiceInit", Native_SendCeltVoiceInit }, + { "ClientMutedOtherClient", Native_ClientMutedOtherClient }, { NULL, NULL } }; @@ -462,6 +725,12 @@ void CVoice::SDK_OnUnload() m_VoiceDetour = NULL; } + if (m_ProcessVoiceDataDetour) + { + m_ProcessVoiceDataDetour->Destroy(); + m_ProcessVoiceDataDetour = NULL; + } + if(m_ListenSocket != -1) { close(m_ListenSocket); @@ -478,12 +747,74 @@ void CVoice::SDK_OnUnload() } opus_encoder_destroy(m_OpusEncoder); + + if (m_TorchlightOpusDecoder) + { + opus_decoder_destroy(m_TorchlightOpusDecoder); + m_TorchlightOpusDecoder = NULL; + } + + for (int i = 0; i <= SM_MAXPLAYERS; i++) + { + if (m_PlayerOpusDecoder[i]) + { + opus_decoder_destroy(m_PlayerOpusDecoder[i]); + m_PlayerOpusDecoder[i] = NULL; + } + } + + if (m_pCeltCodec) + { + celt_encoder_destroy(m_pCeltCodec); + m_pCeltCodec = NULL; + } + + if (m_pCeltMode) + { + celt_mode_destroy(m_pCeltMode); + m_pCeltMode = NULL; + } + + for (int i = 0; i <= SM_MAXPLAYERS; i++) + { + if (m_pCeltCodecPlayer[i]) + { + celt_encoder_destroy(m_pCeltCodecPlayer[i]); + m_pCeltCodecPlayer[i] = NULL; + } + } + + if (m_pCeltModePlayer) + { + celt_mode_destroy(m_pCeltModePlayer); + m_pCeltModePlayer = NULL; + } + + for (int i = 0; i <= SM_MAXPLAYERS; i++) + { + if (m_pCeltDecoder[i]) + { + celt_decoder_destroy(m_pCeltDecoder[i]); + m_pCeltDecoder[i] = NULL; + } + } + + for (int i = 0; i <= SM_MAXPLAYERS; i++) + { + if (m_nosteamOpusEncoder[i]) + { + opus_encoder_destroy(m_nosteamOpusEncoder[i]); + m_nosteamOpusEncoder[i] = NULL; + } + } } void CVoice::OnGameFrame(bool simulating) { HandleNetwork(); HandleVoiceData(); + HandlePlayerVoiceData(); //send celt packets to nosteamers. + HandleNoSteamVoiceData(); //send opus packets to steamers. // Reset per-client voice byte counter to 0 every frame. memset(g_aFrameVoiceBytes, 0, sizeof(g_aFrameVoiceBytes)); @@ -497,6 +828,11 @@ bool CVoice::OnBroadcastVoiceData(IClient *pClient, int nBytes, char *data) int client = pClient->GetPlayerSlot() + 1; + if (client < 1 || client > SM_MAXPLAYERS) + { + return false; + } + // Reject voice packet if we'd send more than NET_MAX_VOICE_BYTES_FRAME voice bytes from this client in the current frame. // 5 = SVC_VoiceData header/overhead g_aFrameVoiceBytes[client] += 5 + nBytes; @@ -690,9 +1026,9 @@ void CVoice::OnDataReceived(CClient *pClient, int16_t *pData, size_t Samples) pClient->m_LastValidData = getTime(); } + void CVoice::HandleVoiceData() { - //uint32_t sampleRate = 24000; uint32_t sampleRate = 48000; const int SamplesPerChannel = 480; const int Channels = 2; @@ -784,6 +1120,7 @@ void CVoice::HandleVoiceData() smutils->LogError(myself, "Opus encode failed: %s", opus_strerror(nbBytes)); return; } + BroadcastVoiceDataCelt(pClient, aBuffer, SamplesPerChannel); // Write frame size *pFrameSize = (uint16_t)nbBytes; @@ -813,7 +1150,20 @@ void CVoice::HandleVoiceData() memcpy(&aFinal[FinalSize], &crc32_value, sizeof(uint32_t)); FinalSize += sizeof(uint32_t); - BroadcastVoiceData(pClient, FinalSize, aFinal); + int maxClients = iserver->GetClientCount(); + for (int i = 0; i < maxClients; i++) + { + IClient *pToClient = iserver->GetClient(i); + if (!pToClient || !pToClient->IsConnected() || !pToClient->IsActive() || pToClient->IsFakeClient()) + continue; + if (g_bClientMuted[i + 1][pClient->GetPlayerSlot()]) + continue; + if (!g_bIsNoSteam[i + 1]) + { + //sending opus packets to steam users. + SendVoiceDataMsg(pClient->GetPlayerSlot(), pToClient, aFinal, FinalSize, 0); + } + } if (m_AvailableTime < getTime()) m_AvailableTime = getTime(); @@ -825,14 +1175,483 @@ void CVoice::HandleVoiceData() } } -void CVoice::BroadcastVoiceData(IClient *pClient, int nBytes, unsigned char *pData) +void CVoice::BroadcastVoiceDataCelt(IClient *pClient, int16_t *pPCM, int nSamples) { - #ifdef _WIN32 - __asm mov ecx, pClient; - __asm mov edx, nBytes; + // pPCM is stereo interleaved at 48000 Hz (SamplesPerChannel * 2 total samples) + // Downsample to mono 22050 Hz and accumulate into m_torchMonoAccum + const int STEP = m_CeltEncoderSettings.SampleRate_Hz; // 22050 + const int DIV = 48000; + const int CELT_FRAME_SIZE = m_CeltEncoderSettings.FrameSize; // 512 + const int CELT_PACKET_SIZE = m_CeltEncoderSettings.PacketSize; // 64 - DETOUR_STATIC_CALL(SV_BroadcastVoiceData_LTCG)((char *)pData, 0); - #else - DETOUR_STATIC_CALL(SV_BroadcastVoiceData)(pClient, nBytes, (char *)pData, 0); - #endif + int fromSlot = pClient->GetPlayerSlot(); + int maxClients = iserver->GetClientCount(); + + for (int i = 0; i < nSamples; i++) + { + if (m_torchMonoAccumLen >= 4096) + break; + + int32_t mono = ((int32_t)pPCM[i * 2] + (int32_t)pPCM[i * 2 + 1]) / 2; + if (mono > 32767) mono = 32767; + if (mono < -32768) mono = -32768; + + m_torchResampleAccum += STEP; + while (m_torchResampleAccum >= DIV) + { + m_torchResampleAccum -= DIV; + if (m_torchMonoAccumLen < 4096) + m_torchMonoAccum[m_torchMonoAccumLen++] = (int16_t)mono; + } + } + + while (m_torchMonoAccumLen >= CELT_FRAME_SIZE) + { + unsigned char celtPacket[CELT_PACKET_SIZE]; + int celtBytes = celt_encode(m_pCeltCodec, m_torchMonoAccum, CELT_FRAME_SIZE, + celtPacket, CELT_PACKET_SIZE); + if (celtBytes > 0) + { + for (int i = 0; i < maxClients; i++) + { + IClient *pToClient = iserver->GetClient(i); + if (!pToClient || !pToClient->IsConnected() || !pToClient->IsActive() || pToClient->IsFakeClient()) + continue; + if (!g_bIsNoSteam[i + 1]) //i dont actually understand why the index is one off here. + continue; + if (g_bClientMuted[i + 1][fromSlot]) + continue; + //smutils->LogMessage(myself, "right before SendVoiceDataMsg"); + SendVoiceDataMsg(fromSlot, pToClient, celtPacket, celtBytes, 0); + } + } + else + { + smutils->LogError(myself, "BroadcastVoiceDataCelt: celt_encode failed: %d", celtBytes); + } + + m_torchMonoAccumLen -= CELT_FRAME_SIZE; + if (m_torchMonoAccumLen > 0) + memmove(m_torchMonoAccum, m_torchMonoAccum + CELT_FRAME_SIZE, + m_torchMonoAccumLen * sizeof(int16_t)); + } +} + +void CVoice::PushPlayerVoiceData(int playerSlot, int nBytes, char *data) +{ + if (playerSlot < 0 || playerSlot >= SM_MAXPLAYERS) + return; + + if (!m_pCeltCodecPlayer[playerSlot]) + { + // First time this player speaks - create encoder + int theError; + m_pCeltCodecPlayer[playerSlot] = celt_encoder_create_custom( + m_pCeltModePlayer, 1, &theError); + if (!m_pCeltCodecPlayer[playerSlot]) + { + smutils->LogError(myself, "PushPlayerVoiceData: celt_encoder_create_custom failed: %d", theError); + return; + } + celt_encoder_ctl(m_pCeltCodecPlayer[playerSlot], CELT_RESET_STATE_REQUEST, NULL); + celt_encoder_ctl(m_pCeltCodecPlayer[playerSlot], CELT_SET_BITRATE( + m_CeltEncoderSettings.TargetBitRate_Kbps * 1000)); + celt_encoder_ctl(m_pCeltCodecPlayer[playerSlot], CELT_SET_COMPLEXITY( + m_CeltEncoderSettings.Complexity)); + } + + if (!m_PlayerOpusDecoder[playerSlot]) + { + int err; + m_PlayerOpusDecoder[playerSlot] = opus_decoder_create(24000, 1, &err); + if (err < 0) + { + smutils->LogError(myself, "PushPlayerVoiceData: opus_decoder_create failed: %s", + opus_strerror(err)); + return; + } + } + + const int OPUS_SAMPLE_RATE = 24000; + const unsigned char *p = (const unsigned char *)data; + + /* + // debugging real steam clients voice packets. + int dumpLen = nBytes < 32 ? nBytes : 32; + char hexBuf[32 * 3 + 1]; + int pos = 0; + for (int i = 0; i < dumpLen; i++) + { + static const char hex[] = "0123456789ABCDEF"; + hexBuf[pos++] = hex[(p[i] >> 4) & 0xF]; + hexBuf[pos++] = hex[p[i] & 0xF]; + hexBuf[pos++] = ' '; + } + hexBuf[pos] = '\0'; + smutils->LogMessage(myself, "Steam packet in PushPlayerVoiceData: nBytes=%d first %d bytes: %s", nBytes, dumpLen, hexBuf); + */ + + //if its not opus packets we dont process it + if (nBytes < 18 || p[8] != 0x0B || (p[11] != 0x05 && p[11] != 0x06)) + return; + + uint16_t totalDataLength; + memcpy(&totalDataLength, p + 12, sizeof(uint16_t)); + if ((int)(14 + totalDataLength + 4) != nBytes) + return; + + uint32_t expectedCRC; + memcpy(&expectedCRC, p + nBytes - 4, sizeof(uint32_t)); + if (UTIL_CRC32(p, nBytes - 4) != expectedCRC) + return; + + int offset = 14; + int end = 14 + (int)totalDataLength; + + if (offset + 4 <= end) + { + uint16_t frameLen; + memcpy(&frameLen, p + offset, sizeof(uint16_t)); + offset += 2; + offset += 2; + + if (frameLen <= 2 || offset + (int)(frameLen - 2) > end) + return; + + const unsigned char *opusFrame = p + offset; + + int16_t pcmBuf[5760]; + int decoded = opus_decode(m_PlayerOpusDecoder[playerSlot], + opusFrame, frameLen - 2, + pcmBuf, 5760, 0); + if (decoded <= 0) + { + smutils->LogError(myself, "PushPlayerVoiceData: opus_decode failed: %s", + opus_strerror(decoded)); + return; + } + + const int STEP = m_CeltEncoderSettings.SampleRate_Hz; + const int DIV = OPUS_SAMPLE_RATE; + + for (int i = 0; i < decoded; i++) + { + m_playerResampleAccum[playerSlot] += STEP; + while (m_playerResampleAccum[playerSlot] >= DIV) + { + m_playerResampleAccum[playerSlot] -= DIV; + int16_t sample = pcmBuf[i]; + if (m_playerVoiceBuffer[playerSlot].CurrentFree() > 0) + m_playerVoiceBuffer[playerSlot].Push(&sample, 1); + } + } + + // If buffer still doesn't have enough for one CELT frame, use Opus PLC to fill + if (m_playerVoiceBuffer[playerSlot].TotalLength() < (size_t)m_CeltEncoderSettings.FrameSize) + { + int16_t plcBuf[5760]; + int plcDecoded = opus_decode(m_PlayerOpusDecoder[playerSlot], + NULL, 0, // NULL = PLC mode + plcBuf, 480, 0); + if (plcDecoded > 0) + { + for (int i = 0; i < plcDecoded; i++) + { + m_playerResampleAccum[playerSlot] += m_CeltEncoderSettings.SampleRate_Hz; + while (m_playerResampleAccum[playerSlot] >= 24000) + { + m_playerResampleAccum[playerSlot] -= 24000; + int16_t sample = plcBuf[i]; + if (m_playerVoiceBuffer[playerSlot].CurrentFree() > 0) + m_playerVoiceBuffer[playerSlot].Push(&sample, 1); + } + } + } + } + } + //smutils->LogMessage(myself, "PushPlayerVoiceData: pushed, bufLen=%d", (int)m_playerVoiceBuffer[playerSlot].TotalLength()); +} + +void CVoice::HandlePlayerVoiceData() +{ + const int CELT_FRAME_SIZE = m_CeltEncoderSettings.FrameSize; + const int CELT_PACKET_SIZE = m_CeltEncoderSettings.PacketSize; + int maxClients = iserver->GetClientCount(); + + for (int playerSlot = 0; playerSlot < maxClients; playerSlot++) + { + if (!m_pCeltCodecPlayer[playerSlot]) + continue; + + if (m_playerVoiceBuffer[playerSlot].TotalLength() < (size_t)CELT_FRAME_SIZE) + continue; + + float timeAvailable = (float)m_playerVoiceBuffer[playerSlot].TotalLength() + / (float)m_CeltEncoderSettings.SampleRate_Hz; + + + //warmup encoder with 5 frames + if (m_playerAvailableTime[playerSlot] == 0.0 && + m_playerVoiceBuffer[playerSlot].TotalLength() >= (size_t)CELT_FRAME_SIZE * 11) + { + for (int w = 0; w < 10; w++) + { + int16_t warmupInput[CELT_FRAME_SIZE]; + if (!m_playerVoiceBuffer[playerSlot].Pop(warmupInput, CELT_FRAME_SIZE)) + break; + unsigned char discard[64]; + celt_encode(m_pCeltCodecPlayer[playerSlot], warmupInput, CELT_FRAME_SIZE, discard, 64); + } + m_playerAvailableTime[playerSlot] = getTime(); + } + + //if (m_playerAvailableTime[playerSlot] < getTime() && timeAvailable < 0.2) + if (m_playerAvailableTime[playerSlot] < getTime() && timeAvailable < 0.05) + continue; + + if (m_playerAvailableTime[playerSlot] > getTime() + 1.0) + continue; + + int framesEmitted = 0; + while (m_playerVoiceBuffer[playerSlot].TotalLength() >= (size_t)CELT_FRAME_SIZE) + { + //smutils->LogMessage(myself, "framesEmitted: %d", framesEmitted); + if (framesEmitted >= 1) + break; + + int16_t celtInput[CELT_FRAME_SIZE]; + if (!m_playerVoiceBuffer[playerSlot].Pop(celtInput, CELT_FRAME_SIZE)) + break; + + unsigned char celtPacket[CELT_PACKET_SIZE]; + int celtBytes = celt_encode(m_pCeltCodecPlayer[playerSlot], celtInput, + CELT_FRAME_SIZE, celtPacket, CELT_PACKET_SIZE); + if (celtBytes > 0) + { + for (int i = 0; i < maxClients; i++) + { + IClient *pToClient = iserver->GetClient(i); + if (!pToClient || !pToClient->IsConnected() || !pToClient->IsActive()) + continue; + if (!g_bIsNoSteam[i + 1]) + continue; + if (g_bClientMuted[i + 1][playerSlot + 1]) + continue; + SendVoiceDataMsg(playerSlot, pToClient, celtPacket, celtBytes, 0); + } + framesEmitted++; + } + else + { + smutils->LogError(myself, "HandlePlayerVoiceData: celt_encode failed: %d", celtBytes); + break; + } + } + + if (framesEmitted > 0) + { + if (m_playerAvailableTime[playerSlot] < getTime()) + m_playerAvailableTime[playerSlot] = getTime(); + m_playerAvailableTime[playerSlot] += (double)framesEmitted * m_CeltEncoderSettings.FrameTime; + } + } +} + +void CVoice::TranscodeNoSteamToSteam(int playerSlot, int nBytes, char *data) +{ + if (playerSlot < 0 || playerSlot >= SM_MAXPLAYERS) + return; + if (!m_pCeltDecoder[playerSlot]) + { + int err; + m_pCeltDecoder[playerSlot] = celt_decoder_create_custom(m_pCeltModePlayer, 1, &err); + if (!m_pCeltDecoder[playerSlot]) + { + smutils->LogError(myself, "TranscodeNoSteamToSteam: celt_decoder_create_custom failed: %d", err); + return; + } + } + + if (!m_nosteamOpusEncoder[playerSlot]) + { + int err; + m_nosteamOpusEncoder[playerSlot] = opus_encoder_create(24000, 1, OPUS_APPLICATION_AUDIO, &err); + if (err < 0) + { + smutils->LogError(myself, "TranscodeNoSteamToSteam: opus_encoder_create failed: %s", opus_strerror(err)); + return; + } + /* + 0x68 TOC -> 01101000 -> c bits (6-7): 00 -> s bit (5): 0 (Mono) -> config bits (0-4): 01101 (13) + Mode: Hybrid (SILK + CELT) + Bandwidth: SWB + Frame Size: 20 ms + BITRATE 640000 changes TOC to 0xD8 + */ + opus_encoder_ctl(m_nosteamOpusEncoder[playerSlot], OPUS_SET_BITRATE(32000)); + opus_encoder_ctl(m_nosteamOpusEncoder[playerSlot], OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE)); + } + + int16_t pcmBuf[512]; + int decoded = celt_decode(m_pCeltDecoder[playerSlot], + (const unsigned char *)data, nBytes, + pcmBuf, m_CeltEncoderSettings.FrameSize); + if (decoded < 0) + { + smutils->LogError(myself, "TranscodeNoSteamToSteam: celt_decode failed: %d", decoded); + return; + } + + // Resample 22050 -> 24000 and push into ring buffer + const int STEP = 24000; + const int DIV = 22050; + + for (int i = 0; i < decoded; i++) + { + m_nosteamResampleAccum[playerSlot] += STEP; + while (m_nosteamResampleAccum[playerSlot] >= DIV) + { + m_nosteamResampleAccum[playerSlot] -= DIV; + int16_t sample = pcmBuf[i]; + if (m_nosteamOpusPCMBuffer[playerSlot].CurrentFree() > 0) + m_nosteamOpusPCMBuffer[playerSlot].Push(&sample, 1); + } + } +} + +void CVoice::HandleNoSteamVoiceData() +{ + int maxClients = iserver->GetClientCount(); + + for (int playerSlot = 0; playerSlot < maxClients; playerSlot++) + { + if (!m_nosteamOpusEncoder[playerSlot]) + continue; + + if (m_nosteamOpusPCMBuffer[playerSlot].TotalLength() < 480) + continue; + + float timeAvailable = (float)m_nosteamOpusPCMBuffer[playerSlot].TotalLength() / 24000.0f; + + if (m_nosteamAvailableTime[playerSlot] < getTime() && timeAvailable < 0.1) + continue; + + if (m_nosteamAvailableTime[playerSlot] > getTime() + 1.0) + continue; + + int framesEmitted = 0; + while (m_nosteamOpusPCMBuffer[playerSlot].TotalLength() >= 480) + { + if (framesEmitted >= 1) + break; + + int16_t opusInput[480]; + if (!m_nosteamOpusPCMBuffer[playerSlot].Pop(opusInput, 480)) + break; + + unsigned char opusBuf[512]; + int opusBytes = opus_encode(m_nosteamOpusEncoder[playerSlot], opusInput, 480, opusBuf, sizeof(opusBuf)); + if (opusBytes < 0) + { + smutils->LogError(myself, "HandleNoSteamVoiceData: opus_encode failed: %s", + opus_strerror(opusBytes)); + break; + } + + IClient *pNoSteamClient = iserver->GetClient(playerSlot); + if (!pNoSteamClient) + continue; + + const char *networkID = pNoSteamClient->GetNetworkIDString(); + uint32_t accountID = 0; + // Parse [U:1:XXXXXXXX] format + const char *numStart = strrchr(networkID, ':'); + if (numStart) + accountID = (uint32_t)atoi(numStart + 1); + + // Build modern Steam voice packet with working routing blocks + unsigned char aFinal[8192]; + size_t FinalSize = 0; + + // Build Steam voice packet header + uint32_t steamID = accountID; + uint32_t steamCommunity = 0x01100001; + memcpy(&aFinal[FinalSize], &steamID, sizeof(uint32_t)); + FinalSize += sizeof(uint32_t); + memcpy(&aFinal[FinalSize], &steamCommunity, sizeof(uint32_t)); + FinalSize += sizeof(uint32_t); + + // 2. Payload Type (1 byte) + aFinal[FinalSize++] = 0x0B; + + // 3. Sample Rate (2 bytes little-endian) + uint16_t sampleRate = 24000; + memcpy(&aFinal[FinalSize], &sampleRate, sizeof(uint16_t)); + FinalSize += sizeof(uint16_t); + + // 4. Codec Type (1 byte) - 0x06 for Opus PLC + aFinal[FinalSize++] = 0x06; + + // 5. Track where Size 1 lives + size_t totalDataLengthOffset = FinalSize; + FinalSize += sizeof(uint16_t); // Reserve 2 bytes + + // 6. Sub-Frame Header size (2 bytes) - MUST be exactly raw opusBytes count + uint16_t frameSize = (uint16_t)opusBytes; + memcpy(&aFinal[FinalSize], &frameSize, sizeof(uint16_t)); + FinalSize += sizeof(uint16_t); + + // 7. Sequence Number (2 bytes) + uint16_t seq = m_nosteamSeqNum[playerSlot]++; + memcpy(&aFinal[FinalSize], &seq, sizeof(uint16_t)); + FinalSize += sizeof(uint16_t); + + // 8. Raw Opus Audio Payload + memcpy(&aFinal[FinalSize], opusBuf, opusBytes); + FinalSize += opusBytes; + + uint16_t totalRemainingBytes = (uint16_t)(sizeof(uint16_t) + sizeof(uint16_t) + opusBytes); + memcpy(&aFinal[totalDataLengthOffset], &totalRemainingBytes, sizeof(uint16_t)); + + // 10. Compute and append CRC32 checksum over the complete array built so far + uint32_t crc = UTIL_CRC32(aFinal, FinalSize); + memcpy(&aFinal[FinalSize], &crc, sizeof(uint32_t)); + FinalSize += sizeof(uint32_t); + + for (int i = 0; i < maxClients; i++) + { + IClient *pToClient = iserver->GetClient(i); + if (!pToClient || !pToClient->IsConnected() || !pToClient->IsActive() || pToClient->IsFakeClient()) + continue; + if (g_bIsNoSteam[i + 1]) + continue; + if (g_bClientMuted[i + 1][playerSlot + 1]) + continue; + // debugging voice packets + /* + int dumpLen = (int)FinalSize < 32 ? (int)FinalSize : 32; + char hexBuf[32 * 3 + 1]; + int pos = 0; + for (int i = 0; i < dumpLen; i++) + { + static const char hex[] = "0123456789ABCDEF"; + hexBuf[pos++] = hex[(aFinal[i] >> 4) & 0xF]; + hexBuf[pos++] = hex[aFinal[i] & 0xF]; + hexBuf[pos++] = ' '; + } + hexBuf[pos] = '\0'; + smutils->LogMessage(myself, "CVoice::HandleNoSteamVoiceData packet: FinalSize=%d first %d bytes: %s", (int)FinalSize, dumpLen, hexBuf); + */ + SendVoiceDataMsg(playerSlot, pToClient, aFinal, (int)FinalSize, 0); + } + framesEmitted++; + } + + if (framesEmitted > 0) + { + if (m_nosteamAvailableTime[playerSlot] < getTime()) + m_nosteamAvailableTime[playerSlot] = getTime(); + m_nosteamAvailableTime[playerSlot] += (double)framesEmitted * (480.0 / 24000.0); + } + } } diff --git a/extension.h b/extension.h index 32f7b9a..d5c46d6 100644 --- a/extension.h +++ b/extension.h @@ -34,6 +34,7 @@ #include #include "smsdk_ext.h" +#include "celt_header.h" #include "ringbuffer.h" /** @@ -139,6 +140,9 @@ public: bool OnBroadcastVoiceData(IClient *pClient, int nBytes, char *data); void ListenSocket(); + void PushPlayerVoiceData(int playerSlot, int nBytes, char *data); + void BroadcastVoiceDataCelt(IClient *pClient, int16_t *pPCM, int nSamples); + void TranscodeNoSteamToSteam(int playerSlot, int nBytes, char *data); private: int m_ListenSocket; @@ -161,16 +165,58 @@ private: OpusEncoder *m_OpusEncoder; - double m_AvailableTime; + // Torchlight transcode state (48000 Hz stereo -> 22050 Hz mono -> CELT) + OpusDecoder *m_TorchlightOpusDecoder; + int16_t m_torchMonoAccum[4096]; + int m_torchMonoAccumLen; + int m_torchResampleAccum; + // Player transcode state (24000 Hz mono -> 22050 Hz mono -> CELT) + OpusDecoder *m_PlayerOpusDecoder[SM_MAXPLAYERS + 1]; + int m_playerResampleAccum[SM_MAXPLAYERS + 1]; + + double m_AvailableTime; + double m_playerAvailableTime[SM_MAXPLAYERS + 1]; + + // NoSteam->Steam transcode state per player + CRingBuffer m_nosteamOpusPCMBuffer[SM_MAXPLAYERS + 1]; + int m_nosteamResampleAccum[SM_MAXPLAYERS + 1]; + OpusEncoder *m_nosteamOpusEncoder[SM_MAXPLAYERS + 1]; + + // CELT encoder (shared by both paths, same output format) + struct CEncoderSettings + { + int32_t SampleRate_Hz; + int32_t TargetBitRate_Kbps; + int32_t FrameSize; + int32_t PacketSize; + int32_t Complexity; + double FrameTime; + } m_CeltEncoderSettings; + + CELTMode *m_pCeltMode; + CELTEncoder *m_pCeltCodec; + + CELTMode *m_pCeltModePlayer; + CELTEncoder *m_pCeltCodecPlayer[SM_MAXPLAYERS + 1]; + + CELTDecoder *m_pCeltDecoder[SM_MAXPLAYERS + 1]; + + CRingBuffer m_playerVoiceBuffer[SM_MAXPLAYERS + 1]; t_SV_BroadcastVoiceData m_SV_BroadcastVoiceData; CDetour *m_VoiceDetour; + CDetour *m_ProcessVoiceDataDetour; + + uint16_t m_nosteamSeqNum[SM_MAXPLAYERS + 1]; + + double m_nosteamAvailableTime[SM_MAXPLAYERS + 1]; void HandleNetwork(); void OnDataReceived(CClient *pClient, int16_t *pData, size_t Samples); void HandleVoiceData(); - void BroadcastVoiceData(IClient *pClient, int nBytes, unsigned char *pData); + void HandlePlayerVoiceData(); + void HandleNoSteamVoiceData(); }; #endif // _INCLUDE_SOURCEMOD_EXTENSION_PROPER_H_ diff --git a/inetmessage.h b/inetmessage.h new file mode 100644 index 0000000..aaae7a0 --- /dev/null +++ b/inetmessage.h @@ -0,0 +1,195 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: INetMessage interface +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef INETMESSAGE_FRAEVEN_H +#define INETMESSAGE_FRAEVEN_H + +#include "smsdk_ext.h" +#include "bitbuf.h" +#include "inetchannelinfo.h" + +class INetMsgHandler; +class INetMessage; +class INetChannel; + +// typedef bool (INetMsgHandler::*PROCESSFUNCPTR)(INetMessage*); +// #define CASTPROCPTR( fn ) static_cast (fn) + +class INetMessage +{ +public: + virtual ~INetMessage() {}; + + // Use these to setup who can hear whose voice. + // Pass in client indices (which are their ent indices - 1). + + virtual void SetNetChannel(INetChannel * netchan) = 0; // netchannel this message is from/for + virtual void SetReliable( bool state ) = 0; // set to true if it's a reliable message + + virtual bool Process( void ) = 0; // calles the recently set handler to process this message + + virtual bool ReadFromBuffer( bf_read &buffer ) = 0; // returns true if parsing was OK + virtual bool WriteToBuffer( bf_write &buffer ) = 0; // returns true if writing was OK + + virtual bool IsReliable( void ) const = 0; // true, if message needs reliable handling + + virtual int GetType( void ) const = 0; // returns module specific header tag eg svc_serverinfo + virtual int GetGroup( void ) const = 0; // returns net message group of this message + virtual const char *GetName( void ) const = 0; // returns network message name, eg "svc_serverinfo" + virtual INetChannel *GetNetChannel( void ) const = 0; + virtual const char *ToString( void ) const = 0; // returns a human readable string about message content +}; + +class CNetMessage : public INetMessage +{ +public: + CNetMessage() { m_bReliable = true; + m_NetChannel = NULL; } + + virtual ~CNetMessage() {}; + + virtual int GetGroup() const { return INetChannelInfo::GENERIC; } + INetChannel *GetNetChannel() const { return m_NetChannel; } + + virtual void SetReliable( bool state) {m_bReliable = state;}; + virtual bool IsReliable() const { return m_bReliable; }; + virtual void SetNetChannel(INetChannel * netchan) { m_NetChannel = netchan; } + virtual bool Process() { return false; }; // no handler set + +protected: + bool m_bReliable; // true if message should be send reliable + INetChannel *m_NetChannel; // netchannel this message is from/for +}; + +#define svc_VoiceData 15 + +#define DECLARE_BASE_MESSAGE( msgtype ) \ + public: \ + bool ReadFromBuffer( bf_read &buffer ); \ + bool WriteToBuffer( bf_write &buffer ); \ + const char *ToString() const; \ + int GetType() const { return msgtype; } \ + const char *GetName() const { return #msgtype;}\ + +#define DECLARE_SVC_MESSAGE( name ) \ + DECLARE_BASE_MESSAGE( svc_##name ); \ + IServerMessageHandler *m_pMessageHandler;\ + bool Process() { return m_pMessageHandler->Process##name( this ); }\ + +class SVC_VoiceData : public CNetMessage +{ + DECLARE_SVC_MESSAGE( VoiceData ); + + int GetGroup() const { return INetChannelInfo::VOICE; } + + SVC_VoiceData() { m_bReliable = false; } + + public: + int m_nFromClient; // client who has spoken + bool m_bProximity; + int m_nLength; // data length in bits + uint64 m_xuid; // X360 player ID + + bf_read m_DataIn; + void *m_DataOut; +}; + +#define NETMSG_TYPE_BITS 6 + +bool SVC_VoiceData::WriteToBuffer( bf_write &buffer ) +{ + buffer.WriteUBitLong( GetType(), NETMSG_TYPE_BITS ); + buffer.WriteByte( m_nFromClient ); + buffer.WriteByte( m_bProximity ); + buffer.WriteWord( m_nLength ); + + return buffer.WriteBits( m_DataOut, m_nLength ); +} + +bool SVC_VoiceData::ReadFromBuffer( bf_read &buffer ) +{ + // VPROF( "SVC_VoiceData::ReadFromBuffer" ); + + m_nFromClient = buffer.ReadByte(); + m_bProximity = !!buffer.ReadByte(); + m_nLength = buffer.ReadWord(); + + // if ( IsX360() ) + // { + // m_xuid = buffer.ReadLongLong(); + // } + + m_DataIn = buffer; + return buffer.SeekRelative( m_nLength ); +} + +const char *SVC_VoiceData::ToString(void) const +{ + // Q_snprintf(s_text, sizeof(s_text), "%s: client %i, bytes %i", GetName(), m_nFromClient, Bits2Bytes(m_nLength) ); + // return s_text; + return "idc"; +} + +#define svc_VoiceInit 14 + +class SVC_VoiceInit : public CNetMessage +{ + DECLARE_SVC_MESSAGE( VoiceInit ); + + int GetGroup() const { return INetChannelInfo::SIGNON; } + + SVC_VoiceInit() : m_nSampleRate(0) + { + m_bReliable = true; + memset(m_szVoiceCodec, 0, sizeof(m_szVoiceCodec)); + } + + SVC_VoiceInit(const char *pCodec, int nSampleRate) : m_nSampleRate(nSampleRate) + { + m_bReliable = true; + Q_strncpy(m_szVoiceCodec, pCodec ? pCodec : "", sizeof(m_szVoiceCodec)); + } + +public: + char m_szVoiceCodec[MAX_PATH]; + int m_nSampleRate; +}; + +bool SVC_VoiceInit::WriteToBuffer(bf_write &buffer) +{ + buffer.WriteUBitLong(GetType(), NETMSG_TYPE_BITS); + buffer.WriteString(m_szVoiceCodec); + buffer.WriteShort(m_nSampleRate); + return !buffer.IsOverflowed(); +} + +bool SVC_VoiceInit::ReadFromBuffer(bf_read &buffer) +{ + buffer.ReadString(m_szVoiceCodec, sizeof(m_szVoiceCodec)); + m_nSampleRate = buffer.ReadShort(); + return !buffer.IsOverflowed(); +} + +const char *SVC_VoiceInit::ToString() const +{ + return "SVC_VoiceInit"; +} + +#define clc_VoiceData 10 + +//objdump -d /home/gameservers/css_dev/bin/engine_srv.so | grep -A 15 "_ZN11CGameClient16ProcessVoiceDataEP13CLC_VoiceData" +class CLC_VoiceData +{ +public: + uint8_t _pad[20]; // vtable + CNetMessage base fields + padding up to m_nLength (20 offset) + int m_nLength; + bf_read m_DataIn; + bf_write m_DataOut; + uint64 m_xuid; +}; + +#endif