102 Patches: Detours to the Rescue
C reference for DttR maintainers and modders.
Loading...
Searching...
No Matches
mss_wave.c
Go to the documentation of this file.
1#include "mss_private.h"
2
3#define DR_WAV_IMPLEMENTATION
4#define DR_WAV_NO_STDIO
5#define DR_WAV_NO_WCHAR
6#include "dr_wav.h"
7
8#include <limits.h>
9#include <string.h>
10
11uint16_t dttr_mss_wave_read_u16le(const uint8_t *p) {
12 return (uint16_t)p[0] | ((uint16_t)p[1] << 8);
13}
14
15uint32_t dttr_mss_wave_read_u32le(const uint8_t *p) {
16 return (uint32_t)p[0] | ((uint32_t)p[1] << 8) | ((uint32_t)p[2] << 16)
17 | ((uint32_t)p[3] << 24);
18}
19
20size_t dttr_mss_wave_riff_size(const void *file_image) {
21 const uint8_t *bytes = file_image;
22 if (!bytes || memcmp(bytes, "RIFF", 4) != 0 || memcmp(bytes + 8, "WAVE", 4) != 0) {
23 return 0;
24 }
25
26 return dttr_mss_wave_read_u32le(bytes + 4) + 8;
27}
28
29bool dttr_mss_wave_parse(const void *file_image, mss_wave_info *info) {
30 if (!file_image || !info) {
31 return false;
32 }
33
34 memset(info, 0, sizeof(*info));
35
36 const size_t total = dttr_mss_wave_riff_size(file_image);
37 if (total == 0) {
38 return false;
39 }
40
41 drwav wav = {0};
42 if (!drwav_init_memory(&wav, file_image, total, NULL)) {
43 return false;
44 }
45
46 const bool chunk_info_fits = wav.dataChunkDataPos <= SIZE_MAX
47 && wav.dataChunkDataSize <= SIZE_MAX;
48 if (!chunk_info_fits) {
49 drwav_uninit(&wav);
50 return false;
51 }
52
53 info->format_tag = wav.translatedFormatTag;
54 info->channels = wav.channels;
55 info->sample_rate = wav.sampleRate;
56 info->block_align = wav.fmt.blockAlign;
57 info->bits_per_sample = wav.bitsPerSample;
58 info->data_offset = (size_t)wav.dataChunkDataPos;
59 info->data_size = (size_t)wav.dataChunkDataSize;
60 info->frame_count = wav.totalPCMFrameCount;
61 info->has_fmt = true;
62 info->has_data = wav.dataChunkDataSize > 0;
63
64 drwav_uninit(&wav);
65 return true;
66}
67
69 if (!info || !info->has_fmt || info->sample_rate == 0
70 || info->sample_rate > INT_MAX) {
72 }
73
74 return (int)info->sample_rate;
75}
76
78 const void *file_image,
79 size_t size,
80 mss_wave_info *info,
81 float **frames_out
82) {
83 if (!file_image || size == 0 || !frames_out) {
84 return false;
85 }
86
87 unsigned int channels = 0;
88 unsigned int sample_rate = 0;
89 drwav_uint64 frame_count = 0;
90 float *frames = drwav_open_memory_and_read_pcm_frames_f32(
91 file_image,
92 size,
93 &channels,
94 &sample_rate,
95 &frame_count,
96 NULL
97 );
98 if (!frames || channels == 0 || sample_rate == 0 || frame_count == 0) {
99 drwav_free(frames, NULL);
100 return false;
101 }
102
103 if (info) {
104 info->channels = channels;
105 info->sample_rate = sample_rate;
106 info->frame_count = frame_count;
107 info->has_fmt = true;
108 info->has_data = true;
109 }
110
111 *frames_out = frames;
112 return true;
113}
114
115void dttr_mss_wave_free(void *ptr) {
116 drwav_free(ptr, NULL);
117}
const DWORD size
DTTR_Graphics_COM_DirectDrawSurface7 DWORD flags void NULL
#define DTTR_MSS_DEFAULT_RATE
Definition mss_private.h:29
void dttr_mss_wave_free(void *ptr)
Definition mss_wave.c:115
uint32_t dttr_mss_wave_read_u32le(const uint8_t *p)
Definition mss_wave.c:15
bool dttr_mss_wave_parse(const void *file_image, mss_wave_info *info)
Definition mss_wave.c:29
size_t dttr_mss_wave_riff_size(const void *file_image)
Definition mss_wave.c:20
bool dttr_mss_wave_decode_f32(const void *file_image, size_t size, mss_wave_info *info, float **frames_out)
Definition mss_wave.c:77
uint16_t dttr_mss_wave_read_u16le(const uint8_t *p)
Definition mss_wave.c:11
int dttr_mss_wave_rate(const mss_wave_info *info)
Definition mss_wave.c:68
uint64_t frame_count
Definition mss_private.h:45
uint16_t bits_per_sample
Definition mss_private.h:42
uint16_t format_tag
Definition mss_private.h:38
uint16_t channels
Definition mss_private.h:39
uint16_t block_align
Definition mss_private.h:41
uint32_t sample_rate
Definition mss_private.h:40
size_t data_size
Definition mss_private.h:44
size_t data_offset
Definition mss_private.h:43