Skip to content

Commit 659a498

Browse files
committed
Resync
1 parent 87a5857 commit 659a498

6 files changed

Lines changed: 171 additions & 95 deletions

File tree

audio/audio_mixer.c

Lines changed: 91 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ struct audio_mixer_sound
117117

118118
struct audio_mixer_voice
119119
{
120-
union
120+
struct
121121
{
122122
struct
123123
{
@@ -183,13 +183,14 @@ struct audio_mixer_voice
183183
unsigned type;
184184
float volume;
185185
bool repeat;
186-
187186
};
188187

189188
/* TODO/FIXME - static globals */
190189
static struct audio_mixer_voice s_voices[AUDIO_MIXER_MAX_VOICES] = {0};
191190
static unsigned s_rate = 0;
192191

192+
static void audio_mixer_release(audio_mixer_voice_t* voice);
193+
193194
#ifdef HAVE_RWAV
194195
static bool wav_to_float(const rwav_t* wav, float** pcm, size_t samples_out)
195196
{
@@ -319,7 +320,7 @@ void audio_mixer_done(void)
319320
unsigned i;
320321

321322
for (i = 0; i < AUDIO_MIXER_MAX_VOICES; i++)
322-
s_voices[i].type = AUDIO_MIXER_TYPE_NONE;
323+
audio_mixer_release(&s_voices[i]);
323324
}
324325

325326
audio_mixer_sound_t* audio_mixer_load_wav(void *buffer, int32_t size,
@@ -562,14 +563,6 @@ static bool audio_mixer_play_ogg(
562563
goto error;
563564
}
564565

565-
/* "system" menu sounds may reuse the same voice without freeing anything first, so do that here if needed */
566-
if (voice->types.ogg.stream)
567-
stb_vorbis_close(voice->types.ogg.stream);
568-
if (voice->types.ogg.resampler && voice->types.ogg.resampler_data)
569-
voice->types.ogg.resampler->free(voice->types.ogg.resampler_data);
570-
if (voice->types.ogg.buffer)
571-
memalign_free(voice->types.ogg.buffer);
572-
573566
voice->types.ogg.resampler = resamp;
574567
voice->types.ogg.resampler_data = resampler_data;
575568
voice->types.ogg.buffer = (float*)ogg_buffer;
@@ -585,6 +578,17 @@ static bool audio_mixer_play_ogg(
585578
stb_vorbis_close(stb_vorbis);
586579
return false;
587580
}
581+
582+
static void audio_mixer_release_ogg(audio_mixer_voice_t* voice)
583+
{
584+
if (voice->types.ogg.stream)
585+
stb_vorbis_close(voice->types.ogg.stream);
586+
if (voice->types.ogg.resampler && voice->types.ogg.resampler_data)
587+
voice->types.ogg.resampler->free(voice->types.ogg.resampler_data);
588+
if (voice->types.ogg.buffer)
589+
memalign_free(voice->types.ogg.buffer);
590+
}
591+
588592
#endif
589593

590594
#ifdef HAVE_IBXM
@@ -642,12 +646,6 @@ static bool audio_mixer_play_mod(
642646
goto error;
643647
}
644648

645-
/* FIXME: stopping and then starting a mod stream will crash here in dispose_replay (ASAN says struct replay is misaligned?) */
646-
if (voice->types.mod.stream)
647-
dispose_replay(voice->types.mod.stream);
648-
if (voice->types.mod.buffer)
649-
memalign_free(voice->types.mod.buffer);
650-
651649
voice->types.mod.buffer = (int*)mod_buffer;
652650
voice->types.mod.buf_samples = buf_samples;
653651
voice->types.mod.stream = replay;
@@ -664,6 +662,14 @@ static bool audio_mixer_play_mod(
664662
return false;
665663

666664
}
665+
666+
static void audio_mixer_release_mod(audio_mixer_voice_t* voice)
667+
{
668+
if (voice->types.mod.stream)
669+
dispose_replay(voice->types.mod.stream);
670+
if (voice->types.mod.buffer)
671+
memalign_free(voice->types.mod.buffer);
672+
}
667673
#endif
668674

669675
#ifdef HAVE_DR_FLAC
@@ -711,13 +717,6 @@ static bool audio_mixer_play_flac(
711717
goto error;
712718
}
713719

714-
if (voice->types.flac.stream)
715-
drflac_close(voice->types.flac.stream);
716-
if (voice->types.flac.resampler && voice->types.flac.resampler_data)
717-
voice->types.flac.resampler->free(voice->types.flac.resampler_data);
718-
if (voice->types.flac.buffer)
719-
memalign_free(voice->types.flac.buffer);
720-
721720
voice->types.flac.resampler = resamp;
722721
voice->types.flac.resampler_data = resampler_data;
723722
voice->types.flac.buffer = (float*)flac_buffer;
@@ -733,6 +732,16 @@ static bool audio_mixer_play_flac(
733732
drflac_close(dr_flac);
734733
return false;
735734
}
735+
736+
static void audio_mixer_release_flac(audio_mixer_voice_t* voice)
737+
{
738+
if (voice->types.flac.stream)
739+
drflac_close(voice->types.flac.stream);
740+
if (voice->types.flac.resampler && voice->types.flac.resampler_data)
741+
voice->types.flac.resampler->free(voice->types.flac.resampler_data);
742+
if (voice->types.flac.buffer)
743+
memalign_free(voice->types.flac.buffer);
744+
}
736745
#endif
737746

738747
#ifdef HAVE_DR_MP3
@@ -751,12 +760,6 @@ static bool audio_mixer_play_mp3(
751760
const retro_resampler_t* resamp = NULL;
752761
bool res;
753762

754-
if (voice->types.mp3.stream.pData)
755-
{
756-
drmp3_uninit(&voice->types.mp3.stream);
757-
memset(&voice->types.mp3.stream, 0, sizeof(voice->types.mp3.stream));
758-
}
759-
760763
res = drmp3_init_memory(&voice->types.mp3.stream, (const unsigned char*)sound->types.mp3.data, sound->types.mp3.size, NULL);
761764

762765
if (!res)
@@ -789,12 +792,6 @@ static bool audio_mixer_play_mp3(
789792
goto error;
790793
}
791794

792-
/* "system" menu sounds may reuse the same voice without freeing anything first, so do that here if needed */
793-
if (voice->types.mp3.resampler && voice->types.mp3.resampler_data)
794-
voice->types.mp3.resampler->free(voice->types.mp3.resampler_data);
795-
if (voice->types.mp3.buffer)
796-
memalign_free(voice->types.mp3.buffer);
797-
798795
voice->types.mp3.resampler = resamp;
799796
voice->types.mp3.resampler_data = resampler_data;
800797
voice->types.mp3.buffer = (float*)mp3_buffer;
@@ -809,6 +806,17 @@ static bool audio_mixer_play_mp3(
809806
drmp3_uninit(&voice->types.mp3.stream);
810807
return false;
811808
}
809+
810+
static void audio_mixer_release_mp3(audio_mixer_voice_t* voice)
811+
{
812+
if (voice->types.mp3.resampler && voice->types.mp3.resampler_data)
813+
voice->types.mp3.resampler->free(voice->types.mp3.resampler_data);
814+
if (voice->types.mp3.buffer)
815+
memalign_free(voice->types.mp3.buffer);
816+
if (voice->types.mp3.stream.pData)
817+
drmp3_uninit(&voice->types.mp3.stream);
818+
}
819+
812820
#endif
813821

814822
audio_mixer_voice_t* audio_mixer_play(audio_mixer_sound_t* sound,
@@ -829,6 +837,9 @@ audio_mixer_voice_t* audio_mixer_play(audio_mixer_sound_t* sound,
829837
if (voice->type != AUDIO_MIXER_TYPE_NONE)
830838
continue;
831839

840+
/* claim the voice, also helps with cleanup on error */
841+
voice->type = sound->type;
842+
832843
switch (sound->type)
833844
{
834845
case AUDIO_MIXER_TYPE_WAV:
@@ -866,18 +877,55 @@ audio_mixer_voice_t* audio_mixer_play(audio_mixer_sound_t* sound,
866877

867878
if (res)
868879
{
869-
voice->type = sound->type;
870880
voice->repeat = repeat;
871881
voice->volume = volume;
872882
voice->sound = sound;
873883
voice->stop_cb = stop_cb;
874884
}
875885
else
886+
{
887+
audio_mixer_release(voice);
876888
voice = NULL;
889+
}
877890

878891
return voice;
879892
}
880893

894+
static void audio_mixer_release(audio_mixer_voice_t* voice)
895+
{
896+
if (!voice)
897+
return;
898+
899+
switch (voice->type)
900+
{
901+
#ifdef HAVE_STB_VORBIS
902+
case AUDIO_MIXER_TYPE_OGG:
903+
audio_mixer_release_ogg(voice);
904+
break;
905+
#endif
906+
#ifdef HAVE_IBXM
907+
case AUDIO_MIXER_TYPE_MOD:
908+
audio_mixer_release_mod(voice);
909+
break;
910+
#endif
911+
#ifdef HAVE_DR_FLAC
912+
case AUDIO_MIXER_TYPE_FLAC:
913+
audio_mixer_release_flac(voice);
914+
break;
915+
#endif
916+
#ifdef HAVE_DR_MP3
917+
case AUDIO_MIXER_TYPE_MP3:
918+
audio_mixer_release_mp3(voice);
919+
break;
920+
#endif
921+
default:
922+
break;
923+
}
924+
925+
memset(&voice->types, 0, sizeof(voice->types));
926+
voice->type = AUDIO_MIXER_TYPE_NONE;
927+
}
928+
881929
void audio_mixer_stop(audio_mixer_voice_t* voice)
882930
{
883931
audio_mixer_stop_cb_t stop_cb = NULL;
@@ -888,7 +936,7 @@ void audio_mixer_stop(audio_mixer_voice_t* voice)
888936
stop_cb = voice->stop_cb;
889937
sound = voice->sound;
890938

891-
voice->type = AUDIO_MIXER_TYPE_NONE;
939+
audio_mixer_release(voice);
892940

893941
if (stop_cb)
894942
stop_cb(sound, AUDIO_MIXER_SOUND_STOPPED);
@@ -928,7 +976,7 @@ static void audio_mixer_mix_wav(float* buffer, size_t num_frames,
928976
if (voice->stop_cb)
929977
voice->stop_cb(voice->sound, AUDIO_MIXER_SOUND_FINISHED);
930978

931-
voice->type = AUDIO_MIXER_TYPE_NONE;
979+
audio_mixer_release(voice);
932980
}
933981
else
934982
{
@@ -974,7 +1022,7 @@ static void audio_mixer_mix_ogg(float* buffer, size_t num_frames,
9741022
if (voice->stop_cb)
9751023
voice->stop_cb(voice->sound, AUDIO_MIXER_SOUND_FINISHED);
9761024

977-
voice->type = AUDIO_MIXER_TYPE_NONE;
1025+
audio_mixer_release(voice);
9781026
goto cleanup;
9791027
}
9801028

@@ -1052,7 +1100,7 @@ static void audio_mixer_mix_mod(float* buffer, size_t num_frames,
10521100
if (voice->stop_cb)
10531101
voice->stop_cb(voice->sound, AUDIO_MIXER_SOUND_FINISHED);
10541102

1055-
voice->type = AUDIO_MIXER_TYPE_NONE;
1103+
audio_mixer_release(voice);
10561104
return;
10571105
}
10581106

@@ -1116,7 +1164,7 @@ static void audio_mixer_mix_flac(float* buffer, size_t num_frames,
11161164
if (voice->stop_cb)
11171165
voice->stop_cb(voice->sound, AUDIO_MIXER_SOUND_FINISHED);
11181166

1119-
voice->type = AUDIO_MIXER_TYPE_NONE;
1167+
audio_mixer_release(voice);
11201168
return;
11211169
}
11221170

@@ -1187,7 +1235,7 @@ static void audio_mixer_mix_mp3(float* buffer, size_t num_frames,
11871235
if (voice->stop_cb)
11881236
voice->stop_cb(voice->sound, AUDIO_MIXER_SOUND_FINISHED);
11891237

1190-
voice->type = AUDIO_MIXER_TYPE_NONE;
1238+
audio_mixer_release(voice);
11911239
return;
11921240
}
11931241

features/features_cpu.c

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@
4646
#if defined(_XBOX360)
4747
#include <PPCIntrinsics.h>
4848
#elif !defined(__MACH__) && (defined(__POWERPC__) || defined(__powerpc__) || defined(__ppc__) || defined(__PPC64__) || defined(__powerpc64__))
49-
#ifndef _PPU_INTRINSICS_H
50-
#include <ppu_intrinsics.h>
49+
#ifndef _PPU_INTRINSICS_H
50+
#include <ppu_intrinsics.h>
5151
#endif
5252
#elif defined(_POSIX_MONOTONIC_CLOCK) || defined(ANDROID) || defined(__QNX__) || defined(DJGPP)
5353
/* POSIX_MONOTONIC_CLOCK is not being defined in Android headers despite support being present. */
@@ -871,6 +871,35 @@ void cpu_features_get_model_name(char *name, int len)
871871
size_t len_size = len;
872872
sysctlbyname("machdep.cpu.brand_string", name, &len_size, NULL, 0);
873873
}
874+
#elif defined(__linux__)
875+
if (!name)
876+
return;
877+
{
878+
char *model_name, line[128];
879+
RFILE *fp = filestream_open("/proc/cpuinfo",
880+
RETRO_VFS_FILE_ACCESS_READ,
881+
RETRO_VFS_FILE_ACCESS_HINT_NONE);
882+
883+
if (!fp)
884+
return;
885+
886+
while (filestream_gets(fp, line, sizeof(line)))
887+
{
888+
if (strncmp(line, "model name", 10))
889+
continue;
890+
891+
if ((model_name = strstr(line + 10, ": ")))
892+
{
893+
model_name += 2;
894+
strncpy(name, model_name, len);
895+
name[len - 1] = '\0';
896+
}
897+
898+
break;
899+
}
900+
901+
filestream_close(fp);
902+
}
874903
#else
875904
if (!name)
876905
return;

include/array/rhmap.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -159,16 +159,17 @@ RHMAP__UNUSED static uint32_t rhmap_hash_string(const char* str)
159159

160160
struct rhmap__hdr { size_t len, maxlen; uint32_t *keys; char** key_strs; };
161161
#define RHMAP__HDR(b) (((struct rhmap__hdr *)&(b)[-1])-1)
162-
#define RHMAP__GROW(b, n) (*(void**)(&(b)) = rhmap__grow(RHMAP__HDR(b), (void*)(b), sizeof(*(b)), (size_t)(n)))
162+
#define RHMAP__GROW(b, n) (*(void**)(&(b)) = rhmap__grow((void*)(b), sizeof(*(b)), (size_t)(n)))
163163
#define RHMAP__FIT1(b) ((b) && RHMAP_LEN(b) * 2 <= RHMAP_MAX(b) ? 0 : RHMAP__GROW(b, 0))
164164

165-
RHMAP__UNUSED static void* rhmap__grow(struct rhmap__hdr *old_hdr, void* old_ptr, size_t elem_size, size_t reserve)
165+
RHMAP__UNUSED static void* rhmap__grow(void* old_ptr, size_t elem_size, size_t reserve)
166166
{
167+
struct rhmap__hdr *old_hdr = (old_ptr ? ((struct rhmap__hdr *)((char*)old_ptr-elem_size))-1 : NULL);
167168
struct rhmap__hdr *new_hdr;
168169
char *new_vals;
169170
size_t new_max = (old_ptr ? old_hdr->maxlen * 2 + 1 : 15);
170-
while (new_max && new_max / 2 <= reserve)
171-
if (!(new_max = new_max * 2 + 1))
171+
for (; new_max / 2 <= reserve; new_max = new_max * 2 + 1)
172+
if (new_max == (size_t)-1)
172173
return old_ptr; /* overflow */
173174

174175
new_hdr = (struct rhmap__hdr *)malloc(sizeof(struct rhmap__hdr) + (new_max + 2) * elem_size);
@@ -246,7 +247,7 @@ RHMAP__UNUSED static ptrdiff_t rhmap__idx(struct rhmap__hdr* hdr, uint32_t key,
246247
hdr->key_strs[i] = NULL;
247248
while ((key = hdr->keys[i = (i + 1) & hdr->maxlen]) != 0)
248249
{
249-
if ((key = (uint32_t)rhmap__idx(hdr, key, str, 1, 0)) == i) continue;
250+
if ((key = (uint32_t)rhmap__idx(hdr, key, hdr->key_strs[i], 1, 0)) == i) continue;
250251
hdr->len--;
251252
hdr->keys[i] = 0;
252253
free(hdr->key_strs[i]);

include/libretro.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ enum retro_language
287287
RETRO_LANGUAGE_SWEDISH = 25,
288288
RETRO_LANGUAGE_UKRAINIAN = 26,
289289
RETRO_LANGUAGE_CZECH = 27,
290+
RETRO_LANGUAGE_VALENCIAN = 28,
290291
RETRO_LANGUAGE_LAST,
291292

292293
/* Ensure sizeof(enum) == sizeof(int) */

0 commit comments

Comments
 (0)