102 Patches: Detours to the Rescue
C reference for DttR maintainers and modders.
Loading...
Searching...
No Matches
mss_track.c
Go to the documentation of this file.
1#include "mss_private.h"
2
3#include <SDL3/SDL.h>
4
5#define STEREO_BYTE_MAX 128.0f
6#define MIN_FREQUENCY_RATIO 0.01f
7#define MAX_FREQUENCY_RATIO 100.0f
8
9float dttr_mss_track_gain(int volume, float master_gain, float headroom) {
10 if (volume <= 0) {
11 return 0.0f;
12 }
13
14 const float gain = master_gain * headroom;
15 if (volume >= DTTR_MSS_DEFAULT_VOLUME) {
16 return gain;
17 }
18
19 return gain * ((float)volume / DTTR_MSS_MAX_VOLUME);
20}
21
22void dttr_mss_track_apply_pan(MIX_Track *track, int pan) {
23 if (!track) {
24 return;
25 }
26
27 int left = 128;
28 int right = 128;
29 dttr_mss_pan_to_stereo_bytes(pan, &left, &right);
30 MIX_StereoGains gains = {
31 (float)left / STEREO_BYTE_MAX,
32 (float)right / STEREO_BYTE_MAX,
33 };
34
35 MIX_SetTrackStereo(track, &gains);
36}
37
38void dttr_mss_track_play(MIX_Track *track, int sdl_loops) {
39 if (!track) {
40 return;
41 }
42
43 SDL_PropertiesID props = SDL_CreateProperties();
44 if (!props) {
45 MIX_PlayTrack(track, 0);
46 return;
47 }
48
49 SDL_SetNumberProperty(props, MIX_PROP_PLAY_LOOPS_NUMBER, sdl_loops);
50 MIX_PlayTrack(track, props);
51 SDL_DestroyProperties(props);
52}
53
54float dttr_mss_track_frequency_ratio(int rate, int reference_rate) {
55 if (rate <= 0 || reference_rate <= 0) {
56 return 0.0f;
57 }
58
59 float ratio = (float)rate / (float)reference_rate;
60 if (ratio < MIN_FREQUENCY_RATIO) {
62 }
63
64 if (ratio > MAX_FREQUENCY_RATIO) {
66 }
67
68 return ratio;
69}
70
71int dttr_mss_track_status(MIX_Track *track, int previous_status) {
72 const int stopped_status = previous_status == DTTR_MSS_STATUS_STOPPED
75 if (!track) {
76 return stopped_status;
77 }
78
79 if (MIX_TrackPlaying(track) || MIX_TrackPaused(track)) {
81 }
82
83 return stopped_status;
84}
DTTR_Graphics_COM_Direct3DDevice7 DWORD block DTTR_Graphics_COM_Direct3DDevice7 DWORD block DTTR_Graphics_COM_Direct3DDevice7 void void void void DWORD f DTTR_Graphics_COM_Direct3DDevice7 DWORD idx float
static float master_gain
Definition mss_core.c:12
#define DTTR_MSS_STATUS_PLAYING
Definition mss_private.h:16
static void dttr_mss_pan_to_stereo_bytes(int pan, int *left_out, int *right_out)
Definition mss_private.h:77
#define DTTR_MSS_STATUS_STOPPED
Definition mss_private.h:17
#define DTTR_MSS_DEFAULT_VOLUME
Definition mss_private.h:25
#define DTTR_MSS_STATUS_DONE
Definition mss_private.h:15
#define DTTR_MSS_MAX_VOLUME
Definition mss_private.h:33
float dttr_mss_track_frequency_ratio(int rate, int reference_rate)
Definition mss_track.c:54
#define MIN_FREQUENCY_RATIO
Definition mss_track.c:6
void dttr_mss_track_apply_pan(MIX_Track *track, int pan)
Definition mss_track.c:22
#define STEREO_BYTE_MAX
Definition mss_track.c:5
void dttr_mss_track_play(MIX_Track *track, int sdl_loops)
Definition mss_track.c:38
#define MAX_FREQUENCY_RATIO
Definition mss_track.c:7
float dttr_mss_track_gain(int volume, float master_gain, float headroom)
Definition mss_track.c:9
int dttr_mss_track_status(MIX_Track *track, int previous_status)
Definition mss_track.c:71