Skip to content

Commit ef8eb61

Browse files
committed
Resync
1 parent a9ec0c1 commit ef8eb61

16 files changed

Lines changed: 554 additions & 433 deletions

audio/audio_mix.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,8 @@ void audio_mix_free_chunk(audio_chunk_t *chunk)
114114
free(chunk);
115115
}
116116

117-
audio_chunk_t* audio_mix_load_wav_file(const char *path, int sample_rate)
117+
audio_chunk_t* audio_mix_load_wav_file(const char *path, int sample_rate,
118+
const char *resampler_ident, enum resampler_quality quality)
118119
{
119120
#ifdef HAVE_RWAV
120121
int sample_size;
@@ -233,8 +234,8 @@ audio_chunk_t* audio_mix_load_wav_file(const char *path, int sample_rate)
233234

234235
retro_resampler_realloc(&chunk->resampler_data,
235236
&chunk->resampler,
236-
NULL,
237-
RESAMPLER_QUALITY_DONTCARE,
237+
resampler_ident,
238+
quality,
238239
chunk->ratio);
239240

240241
if (chunk->resampler && chunk->resampler_data)

audio/audio_mixer.c

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -267,15 +267,16 @@ static bool wav_to_float(const rwav_t* wav, float** pcm, size_t samples_out)
267267
}
268268

269269
static bool one_shot_resample(const float* in, size_t samples_in,
270-
unsigned rate, float** out, size_t* samples_out)
270+
unsigned rate, const char *resampler_ident, enum resampler_quality quality,
271+
float** out, size_t* samples_out)
271272
{
272273
struct resampler_data info;
273274
void* data = NULL;
274275
const retro_resampler_t* resampler = NULL;
275276
float ratio = (double)s_rate / (double)rate;
276277

277-
if (!retro_resampler_realloc(&data, &resampler, NULL,
278-
RESAMPLER_QUALITY_DONTCARE, ratio))
278+
if (!retro_resampler_realloc(&data, &resampler,
279+
resampler_ident, quality, ratio))
279280
return false;
280281

281282
/*
@@ -323,7 +324,8 @@ void audio_mixer_done(void)
323324
s_voices[i].type = AUDIO_MIXER_TYPE_NONE;
324325
}
325326

326-
audio_mixer_sound_t* audio_mixer_load_wav(void *buffer, int32_t size)
327+
audio_mixer_sound_t* audio_mixer_load_wav(void *buffer, int32_t size,
328+
const char *resampler_ident, enum resampler_quality quality)
327329
{
328330
#ifdef HAVE_RWAV
329331
/* WAV data */
@@ -353,8 +355,9 @@ audio_mixer_sound_t* audio_mixer_load_wav(void *buffer, int32_t size)
353355
{
354356
float* resampled = NULL;
355357

356-
if (!one_shot_resample(pcm, samples,
357-
wav.samplerate, &resampled, &samples))
358+
if (!one_shot_resample(pcm, samples, wav.samplerate,
359+
resampler_ident, quality,
360+
&resampled, &samples))
358361
return NULL;
359362

360363
memalign_free((void*)pcm);
@@ -514,6 +517,8 @@ static bool audio_mixer_play_ogg(
514517
audio_mixer_sound_t* sound,
515518
audio_mixer_voice_t* voice,
516519
bool repeat, float volume,
520+
const char *resampler_ident,
521+
enum resampler_quality quality,
517522
audio_mixer_stop_cb_t stop_cb)
518523
{
519524
stb_vorbis_info info;
@@ -537,7 +542,7 @@ static bool audio_mixer_play_ogg(
537542
ratio = (double)s_rate / (double)info.sample_rate;
538543

539544
if (!retro_resampler_realloc(&resampler_data,
540-
&resamp, NULL, RESAMPLER_QUALITY_DONTCARE,
545+
&resamp, resampler_ident, quality,
541546
ratio))
542547
goto error;
543548
}
@@ -662,6 +667,8 @@ static bool audio_mixer_play_flac(
662667
audio_mixer_sound_t* sound,
663668
audio_mixer_voice_t* voice,
664669
bool repeat, float volume,
670+
const char *resampler_ident,
671+
enum resampler_quality quality,
665672
audio_mixer_stop_cb_t stop_cb)
666673
{
667674
float ratio = 1.0f;
@@ -678,7 +685,7 @@ static bool audio_mixer_play_flac(
678685
ratio = (double)s_rate / (double)(dr_flac->sampleRate);
679686

680687
if (!retro_resampler_realloc(&resampler_data,
681-
&resamp, NULL, RESAMPLER_QUALITY_DONTCARE,
688+
&resamp, resampler_ident, quality,
682689
ratio))
683690
goto error;
684691
}
@@ -723,6 +730,8 @@ static bool audio_mixer_play_mp3(
723730
audio_mixer_sound_t* sound,
724731
audio_mixer_voice_t* voice,
725732
bool repeat, float volume,
733+
const char *resampler_ident,
734+
enum resampler_quality quality,
726735
audio_mixer_stop_cb_t stop_cb)
727736
{
728737
float ratio = 1.0f;
@@ -748,7 +757,7 @@ static bool audio_mixer_play_mp3(
748757
ratio = (double)s_rate / (double)(voice->types.mp3.stream.sampleRate);
749758

750759
if (!retro_resampler_realloc(&resampler_data,
751-
&resamp, NULL, RESAMPLER_QUALITY_DONTCARE,
760+
&resamp, resampler_ident, quality,
752761
ratio))
753762
goto error;
754763
}
@@ -786,8 +795,11 @@ static bool audio_mixer_play_mp3(
786795
}
787796
#endif
788797

789-
audio_mixer_voice_t* audio_mixer_play(audio_mixer_sound_t* sound, bool repeat,
790-
float volume, audio_mixer_stop_cb_t stop_cb)
798+
audio_mixer_voice_t* audio_mixer_play(audio_mixer_sound_t* sound,
799+
bool repeat, float volume,
800+
const char *resampler_ident,
801+
enum resampler_quality quality,
802+
audio_mixer_stop_cb_t stop_cb)
791803
{
792804
unsigned i;
793805
bool res = false;
@@ -808,7 +820,8 @@ audio_mixer_voice_t* audio_mixer_play(audio_mixer_sound_t* sound, bool repeat,
808820
break;
809821
case AUDIO_MIXER_TYPE_OGG:
810822
#ifdef HAVE_STB_VORBIS
811-
res = audio_mixer_play_ogg(sound, voice, repeat, volume, stop_cb);
823+
res = audio_mixer_play_ogg(sound, voice, repeat, volume,
824+
resampler_ident, quality, stop_cb);
812825
#endif
813826
break;
814827
case AUDIO_MIXER_TYPE_MOD:
@@ -818,12 +831,14 @@ audio_mixer_voice_t* audio_mixer_play(audio_mixer_sound_t* sound, bool repeat,
818831
break;
819832
case AUDIO_MIXER_TYPE_FLAC:
820833
#ifdef HAVE_DR_FLAC
821-
res = audio_mixer_play_flac(sound, voice, repeat, volume, stop_cb);
834+
res = audio_mixer_play_flac(sound, voice, repeat, volume,
835+
resampler_ident, quality, stop_cb);
822836
#endif
823837
break;
824838
case AUDIO_MIXER_TYPE_MP3:
825839
#ifdef HAVE_DR_MP3
826-
res = audio_mixer_play_mp3(sound, voice, repeat, volume, stop_cb);
840+
res = audio_mixer_play_mp3(sound, voice, repeat, volume,
841+
resampler_ident, quality, stop_cb);
827842
#endif
828843
break;
829844
case AUDIO_MIXER_TYPE_NONE:

audio/conversion/float_to_s16.c

Lines changed: 71 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Copyright (C) 2010-2020 The RetroArch team
1+
/* Copyright (C) 2010-2021 The RetroArch team
22
*
33
* ---------------------------------------------------------------------------------------
44
* The following license statement only applies to this file (float_to_s16.c).
@@ -28,37 +28,75 @@
2828
#include <altivec.h>
2929
#endif
3030

31-
#if (defined(__ARM_NEON__) && !defined(DONT_WANT_ARM_ASM_OPTIMIZATIONS)) || defined(HAVE_NEON)
32-
#ifndef HAVE_ARM_NEON_ASM_OPTIMIZATIONS
33-
#define HAVE_ARM_NEON_ASM_OPTIMIZATIONS
34-
#endif
35-
#endif
36-
3731
#include <features/features_cpu.h>
3832
#include <audio/conversion/float_to_s16.h>
3933

40-
#if defined(HAVE_ARM_NEON_ASM_OPTIMIZATIONS)
34+
#if (defined(__ARM_NEON__) || defined(HAVE_NEON))
4135
static bool float_to_s16_neon_enabled = false;
42-
void convert_float_s16_asm(int16_t *out, const float *in, size_t samples);
36+
#ifdef HAVE_ARM_NEON_ASM_OPTIMIZATIONS
37+
void convert_float_s16_asm(int16_t *out,
38+
const float *in, size_t samples);
39+
#else
40+
#include <arm_neon.h>
4341
#endif
4442

45-
/**
46-
* convert_float_to_s16:
47-
* @out : output buffer
48-
* @in : input buffer
49-
* @samples : size of samples to be converted
50-
*
51-
* Converts floating point
52-
* to signed integer 16-bit.
53-
*
54-
* C implementation callback function.
55-
**/
5643
void convert_float_to_s16(int16_t *out,
5744
const float *in, size_t samples)
5845
{
59-
size_t i = 0;
46+
size_t i = 0;
47+
if (float_to_s16_neon_enabled)
48+
{
49+
float gf = (1<<15);
50+
float32x4_t vgf = {gf, gf, gf, gf};
51+
while (samples >= 8)
52+
{
53+
#ifdef HAVE_ARM_NEON_ASM_OPTIMIZATIONS
54+
size_t aligned_samples = samples & ~7;
55+
if (aligned_samples)
56+
convert_float_s16_asm(out, in, aligned_samples);
57+
58+
out += aligned_samples;
59+
in += aligned_samples;
60+
samples -= aligned_samples;
61+
i = 0;
62+
#else
63+
int16x4x2_t oreg;
64+
int32x4x2_t creg;
65+
float32x4x2_t inreg = vld2q_f32(in);
66+
creg.val[0] = vcvtq_s32_f32(vmulq_f32(inreg.val[0], vgf));
67+
creg.val[1] = vcvtq_s32_f32(vmulq_f32(inreg.val[1], vgf));
68+
oreg.val[0] = vqmovn_s32(creg.val[0]);
69+
oreg.val[1] = vqmovn_s32(creg.val[1]);
70+
vst2_s16(out, oreg);
71+
in += 8;
72+
out += 8;
73+
samples -= 8;
74+
#endif
75+
}
76+
}
77+
78+
for (; i < samples; i++)
79+
{
80+
int32_t val = (int32_t)(in[i] * 0x8000);
81+
out[i] = (val > 0x7FFF) ? 0x7FFF :
82+
(val < -0x8000 ? -0x8000 : (int16_t)val);
83+
}
84+
}
85+
86+
void convert_float_to_s16_init_simd(void)
87+
{
88+
unsigned cpu = cpu_features_get();
89+
90+
if (cpu & RETRO_SIMD_NEON)
91+
float_to_s16_neon_enabled = true;
92+
}
93+
#else
94+
void convert_float_to_s16(int16_t *out,
95+
const float *in, size_t samples)
96+
{
97+
size_t i = 0;
6098
#if defined(__SSE2__)
61-
__m128 factor = _mm_set1_ps((float)0x8000);
99+
__m128 factor = _mm_set1_ps((float)0x8000);
62100

63101
for (i = 0; i + 8 <= samples; i += 8, in += 8, out += 8)
64102
{
@@ -73,10 +111,10 @@ void convert_float_to_s16(int16_t *out,
73111
_mm_storeu_si128((__m128i *)out, packed);
74112
}
75113

76-
samples = samples - i;
77-
i = 0;
114+
samples = samples - i;
115+
i = 0;
78116
#elif defined(__ALTIVEC__)
79-
int samples_in = samples;
117+
int samples_in = samples;
80118

81119
/* Unaligned loads/store is a bit expensive,
82120
* so we optimize for the good path (very likely). */
@@ -92,25 +130,12 @@ void convert_float_to_s16(int16_t *out,
92130
vec_st(vec_packs(result0, result1), 0, out);
93131
}
94132

95-
samples_in -= i;
133+
samples_in -= i;
96134
}
97135

98-
samples = samples_in;
99-
i = 0;
100-
#elif defined(HAVE_ARM_NEON_ASM_OPTIMIZATIONS)
101-
if (float_to_s16_neon_enabled)
102-
{
103-
size_t aligned_samples = samples & ~7;
104-
if (aligned_samples)
105-
convert_float_s16_asm(out, in, aligned_samples);
106-
107-
out = out + aligned_samples;
108-
in = in + aligned_samples;
109-
samples = samples - aligned_samples;
110-
i = 0;
111-
}
136+
samples = samples_in;
137+
i = 0;
112138
#elif defined(_MIPS_ARCH_ALLEGREX)
113-
114139
#ifdef DEBUG
115140
/* Make sure the buffers are 16 byte aligned, this should be
116141
* the default behaviour of malloc in the PSPSDK.
@@ -138,29 +163,16 @@ void convert_float_to_s16(int16_t *out,
138163
".set pop \n"
139164
:: "r"(in + i), "r"(out + i));
140165
}
141-
142166
#endif
143167

144168
for (; i < samples; i++)
145169
{
146-
int32_t val = (int32_t)(in[i] * 0x8000);
147-
out[i] = (val > 0x7FFF) ? 0x7FFF :
148-
(val < -0x8000 ? -0x8000 : (int16_t)val);
170+
int32_t val = (int32_t)(in[i] * 0x8000);
171+
out[i] = (val > 0x7FFF)
172+
? 0x7FFF
173+
: (val < -0x8000 ? -0x8000 : (int16_t)val);
149174
}
150175
}
151176

152-
/**
153-
* convert_float_to_s16_init_simd:
154-
*
155-
* Sets up function pointers for conversion
156-
* functions based on CPU features.
157-
**/
158-
void convert_float_to_s16_init_simd(void)
159-
{
160-
#if defined(HAVE_ARM_NEON_ASM_OPTIMIZATIONS)
161-
unsigned cpu = cpu_features_get();
162-
163-
if (cpu & RETRO_SIMD_NEON)
164-
float_to_s16_neon_enabled = true;
177+
void convert_float_to_s16_init_simd(void) { }
165178
#endif
166-
}

audio/conversion/float_to_s16_neon.S

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2020
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2121
*/
22-
#if defined(__ARM_NEON__) && !defined(DONT_WANT_ARM_ASM_OPTIMIZATIONS)
22+
#if defined(__ARM_NEON__) && defined(HAVE_ARM_NEON_ASM_OPTIMIZATIONS)
2323

2424
#ifndef __MACH__
2525
.arm

audio/conversion/float_to_s16_neon.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2020
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2121
*/
22-
#if defined(__ARM_NEON__) && !defined(DONT_WANT_ARM_ASM_OPTIMIZATIONS)
22+
#if defined(__ARM_NEON__) && defined(HAVE_ARM_NEON_ASM_OPTIMIZATIONS)
2323

2424
#if defined(__thumb__)
2525
#define DECL_ARMMODE(x) " .align 2\n" " .global " x "\n" " .thumb\n" " .thumb_func\n" " .type " x ", %function\n" x ":\n"

0 commit comments

Comments
 (0)