Implemented using libopus for the Opus codec, same as is used in Discord.
This adds the following cvars:
- `voice_chat` On/Off, triggers self-deafen state on server via weaponprefs
- `voice_mode` Activity/PTT
- `voice_selfmute` On/Off, triggers self-mute state on server via weaponprefs
- `voice_inputamp` -30 to 30, scales input by value in decibels
- `voice_activationthreshold` -30 to 0, if any peak in a frame is higher, activates voice
- `voice_loopback` On/Off, plays back local transcoded voice
- `voice_proximity` On/Off, enables proximity effects for server
- `voice_distanceattenuation_distance` distance in fracunits to scale voice volume over
- `voice_distanceattenuation_factor` distance in logarithmic factor to scale voice volume by distance to. e.g. 0.5 for "half as loud" at or above max distance
- `voice_stereopanning_factor` at 1.0, player voices are panned to left or right speaker, scaling to no effect at 0.0
- `voice_concurrentattenuation_factor` the logarithmic factor to attenuate player voices with concurrent speakers
- `voice_concurrentattenuation_min` the minimum concurrent speakers before global concurrent speaker attenuation
- `voice_concurrentattenuation_max` the maximum concurrent speakers for full global concurrent speaker attenuation
- `voice_servermute` whether voice chat is enabled on this server. visible from MS via bitflag
- `voicevolume` local volume of all voice playback
A Voice Options menu is added with a subset of these options, and Server Options has server mute.
Allows the user to configure the mixing buffer size to reduce
latency at the cost of higher CPU usage, or vice versa.
This also raises the default buffer size from 1024 to 2048, to
address some underrun problems people have with the current buffer
size.
- cursongcredit behaves the same as before
- Always compose song credit string
- g_realsongcredit always stores the song credit for the
current music, even if no song credit is displayed on
the HUD
Master volume should control after-mixing gain; the idea is the mixed
output of sfx and music's amplitude should never exceed
`cv_mastervolume`. Setting each submixer's gain independently will
still allow the master mixer to exceed that preferred volume, which was
the main issue with the SDL_Mixer backend. So, instead we use a separate
gain control that is applied after everything is mixed.
- POSITION!! music and the standard course track is always visible.
- Alt Music is hidden behind the relevant SECRET_ALTMUSIC.
- Associated music requires you to beat the level to listen.
This basically came to me in a dream, who am I to look the horse in its mouth
- Press to start a shuffled sequence, losing your current position in the autosequence.
- Press again to disable, but keep your current track.
- Adjust horizontal offset of Stereo buttons slightly.
- More judiciously comment Sound Test functionality, to assist future maintainers.
- No need to call CV_RegisterVar
- Cvar definitions live in only one file, easier to locate
- Organized into sections -- netvars, cheats, etc.
- Use builder pattern to initialize cvars
- Still need to extern if you want to read the cvar value
(This commit does not compile. Sound test and tunes
command code needs to be ported after this.)
This is a big one. Here's the rundown:
The old music system was very direct, much of the time
just a proxy to the real sound API in i_sound.h.
You could change the music on command, but there wasn't
a consistent way to prevent some music from playing over
others. P_RestoreMusic is one example of needing to
address this problem. The jingles system was intended as
another solution. Furthermore, sound test (Stereo) has its
own needs.
I am removing all of that. Music handling in general is
now a very deliberate system, kind of similar to jingles.
In the new system, "tunes" are registered. The tune stores
info such as whether it should loop or fade out. Most of
the configuration is intended to be initialized only ONCE.
Tunes can be mapped to an actual music lump. They can be
remapped at any time too.
Tunes are also configured with a priority number. This
determines which tune is heard, if multiple are supposed
to be playing at a time. You can even tell a tune how long
it should play, so it's unnecessary to track this with
bespoke timers.
- Introduce comments to make flow understandable.
- Abstract the number of seconds in the fade out (previously handled across multiple places) into SOUNDTEST_FADEOUTSECONDS.
- Make all next/conclude song cases for autosequence and non-looping track handled in one place.
- Fixes the case where a non-looping track could stop the Sound Test even in autosequence mode.
- Shown on the menu
- soundtest.autosequence
- Plays all songs in sequence, skipping over the soundtest entry.
- Plays each looping song twice (and fades out if it's the last one in the musicdef's tracks)
- Plays non-looping songs once with no fade ever
- Disabled when S_SoundTestStop called
- Songs that end outside of autosequence will now stop the visible Playing.
- Use LSTitleHighString at the top of the menu for the music's title/Sound Test
- Only show Track for relevant entries
- Show cv_soundtest.value in hex for that Classic Sonic soundtest flavour
- Buttons have been implemented.
- They push down when you press an input.
- FUTURE WORK: Back doesn't get the opportunity to do so. Delay the exit of this menu?
- Certain ones have special properties.
- PLAY locks down when playing and not paused
- PAUSE locks down when playing and paused
- TRACK is a wheel/slidery thing
- BACK should get pressed when you're exiting (see previous FUTURE WORK)
- FUTURE WORK: The detection of these currently uses magic numbers.
- The Stereo itself is now drawn.
- FUTURE WORK: The screen's contents are still the testing visuals.
musicdef -volume <volume> changes the volume of the
currently playing song. The change persists through song
changes and is visible with devmode music.
musicdef -show prints all changed musicdef volumes.
The intention of this command is to allow editing music
volumes quickly in game, without having to quit, edit
music.pk3, and reopen the game.
- Integrates the maps with multiple tracks into the Next/Prev sequence, if true.
- For testing, currently active - but I may add features later that would be more fitting.
- Called on game start and file add
- Creates a seperate linked list sequence for map-related order
- All tracks without associated map in level order
- All tracks with maps in a cup in cup order
- All tracks with maps in Lost and Found
- Minimum viable implementation
- New horizontal menu
- FUTURE WORK: visuals are extremely basic
- Accessible from both Extras and in-game Pause if SECRET_SOUNDTEST is unlocked
- Rather than the Shadow-the-Hedgehog style free select of SRB2's Sound Test, it's a Best Of The Hacks And Fan Music Sega CD player.
- Back
- Exit menu
- Stop
- Stops Stereo music entirely
- Pause
- Pauses Stereo music without losing place in sequence
- FUTURE WORK: This should probably just pause the actual player ala minimised viewport
- Play
- Begins Stereo music on non-NULL musicdef entry
- Track
- For NULL soundtest entry:
- Switches between sfx
- For musicdefs with multiple tracks:
- Switches between them
- Prev and Next
- Changes musicdef entry
- FUTURE WORK: This is extremely naive and doesn't respect the following
- Cup order
- Unlocks
- Overrides all game-requested music changes when in Play or Pause mode
- This makes it an actual fun in-game feature as a menuification of the `tunes` command, not just a pure novelty.
- Add "author" and "originalcomposers" fields
- "author" is for remixes and original compositions, can be ommitted
- "originalcomposers" will not be visible mid-game, but will be visible in music test. Stores original sound team info
- Store all strings as Zone memory instead of static arrays, since not every field will be relevant for every track