From 5daea02ac693bcaa053fd099b0d238064ffcbdac Mon Sep 17 00:00:00 2001 From: Clownacy Date: Mon, 6 Apr 2020 19:44:45 +0100 Subject: [PATCH] Change the audio backend API Removes locking and unlocking: instead, samples are passed to Create. --- src/Backends/Audio.h | 5 +---- src/Backends/Audio/SDL2.cpp | 22 ++-------------------- src/Backends/Audio/SoftwareMixer.cpp | 16 +++++----------- src/Backends/Audio/SoftwareMixer.h | 3 +-- src/Backends/Audio/miniaudio.cpp | 22 ++-------------------- src/Organya.cpp | 13 +++++++++---- src/Sound.cpp | 14 ++++---------- 7 files changed, 24 insertions(+), 71 deletions(-) diff --git a/src/Backends/Audio.h b/src/Backends/Audio.h index 92a6ad41..e0db10b6 100644 --- a/src/Backends/Audio.h +++ b/src/Backends/Audio.h @@ -9,12 +9,9 @@ typedef struct AudioBackend_Sound AudioBackend_Sound; BOOL AudioBackend_Init(void); void AudioBackend_Deinit(void); -AudioBackend_Sound* AudioBackend_CreateSound(unsigned int frequency, size_t frames); +AudioBackend_Sound* AudioBackend_CreateSound(unsigned int frequency, const unsigned char *samples, size_t length); void AudioBackend_DestroySound(AudioBackend_Sound *sound); -unsigned char* AudioBackend_LockSound(AudioBackend_Sound *sound, size_t *size); -void AudioBackend_UnlockSound(AudioBackend_Sound *sound); - void AudioBackend_PlaySound(AudioBackend_Sound *sound, BOOL looping); void AudioBackend_StopSound(AudioBackend_Sound *sound); void AudioBackend_RewindSound(AudioBackend_Sound *sound); diff --git a/src/Backends/Audio/SDL2.cpp b/src/Backends/Audio/SDL2.cpp index 2f4b9745..02921756 100644 --- a/src/Backends/Audio/SDL2.cpp +++ b/src/Backends/Audio/SDL2.cpp @@ -108,11 +108,11 @@ void AudioBackend_Deinit(void) SDL_QuitSubSystem(SDL_INIT_AUDIO); } -AudioBackend_Sound* AudioBackend_CreateSound(unsigned int frequency, size_t frames) +AudioBackend_Sound* AudioBackend_CreateSound(unsigned int frequency, const unsigned char *samples, size_t length) { SDL_LockAudioDevice(device_id); - Mixer_Sound *sound = Mixer_CreateSound(frequency, frames); + Mixer_Sound *sound = Mixer_CreateSound(frequency, samples, length); SDL_UnlockAudioDevice(device_id); @@ -131,24 +131,6 @@ void AudioBackend_DestroySound(AudioBackend_Sound *sound) SDL_UnlockAudioDevice(device_id); } -unsigned char* AudioBackend_LockSound(AudioBackend_Sound *sound, size_t *size) -{ - if (sound == NULL) - return NULL; - - SDL_LockAudioDevice(device_id); - - return Mixer_LockSound((Mixer_Sound*)sound, size); -} - -void AudioBackend_UnlockSound(AudioBackend_Sound *sound) -{ - if (sound == NULL) - return; - - SDL_UnlockAudioDevice(device_id); -} - void AudioBackend_PlaySound(AudioBackend_Sound *sound, BOOL looping) { if (sound == NULL) diff --git a/src/Backends/Audio/SoftwareMixer.cpp b/src/Backends/Audio/SoftwareMixer.cpp index 133340c8..f15b7251 100644 --- a/src/Backends/Audio/SoftwareMixer.cpp +++ b/src/Backends/Audio/SoftwareMixer.cpp @@ -46,14 +46,14 @@ void Mixer_Init(unsigned long frequency) output_frequency = frequency; } -Mixer_Sound* Mixer_CreateSound(unsigned int frequency, size_t frames) +Mixer_Sound* Mixer_CreateSound(unsigned int frequency, const unsigned char *samples, size_t length) { Mixer_Sound *sound = (Mixer_Sound*)malloc(sizeof(Mixer_Sound)); if (sound == NULL) return NULL; - sound->samples = (unsigned char*)malloc(frames + 1); + sound->samples = (unsigned char*)malloc(length + 1); if (sound->samples == NULL) { @@ -61,7 +61,9 @@ Mixer_Sound* Mixer_CreateSound(unsigned int frequency, size_t frames) return NULL; } - sound->frames = frames; + memcpy(sound->samples, samples, length); + + sound->frames = length; sound->playing = false; sound->position = 0.0; @@ -89,14 +91,6 @@ void Mixer_DestroySound(Mixer_Sound *sound) } } -unsigned char* Mixer_LockSound(Mixer_Sound *sound, size_t *size) -{ - if (size != NULL) - *size = sound->frames; - - return sound->samples; -} - void Mixer_PlaySound(Mixer_Sound *sound, bool looping) { sound->playing = true; diff --git a/src/Backends/Audio/SoftwareMixer.h b/src/Backends/Audio/SoftwareMixer.h index da762fcf..3d393b33 100644 --- a/src/Backends/Audio/SoftwareMixer.h +++ b/src/Backends/Audio/SoftwareMixer.h @@ -5,9 +5,8 @@ typedef struct Mixer_Sound Mixer_Sound; void Mixer_Init(unsigned long frequency); -Mixer_Sound* Mixer_CreateSound(unsigned int frequency, size_t frames); +Mixer_Sound* Mixer_CreateSound(unsigned int frequency, const unsigned char *samples, size_t length); void Mixer_DestroySound(Mixer_Sound *sound); -unsigned char* Mixer_LockSound(Mixer_Sound *sound, size_t *size); void Mixer_PlaySound(Mixer_Sound *sound, bool looping); void Mixer_StopSound(Mixer_Sound *sound); void Mixer_RewindSound(Mixer_Sound *sound); diff --git a/src/Backends/Audio/miniaudio.cpp b/src/Backends/Audio/miniaudio.cpp index bd1257f9..ce2b8582 100644 --- a/src/Backends/Audio/miniaudio.cpp +++ b/src/Backends/Audio/miniaudio.cpp @@ -118,11 +118,11 @@ void AudioBackend_Deinit(void) ma_device_uninit(&device); } -AudioBackend_Sound* AudioBackend_CreateSound(unsigned int frequency, size_t frames) +AudioBackend_Sound* AudioBackend_CreateSound(unsigned int frequency, const unsigned char *samples, size_t length) { ma_mutex_lock(&mutex); - Mixer_Sound *sound = Mixer_CreateSound(frequency, frames); + Mixer_Sound *sound = Mixer_CreateSound(frequency, samples, length); ma_mutex_unlock(&mutex); @@ -141,24 +141,6 @@ void AudioBackend_DestroySound(AudioBackend_Sound *sound) ma_mutex_unlock(&mutex); } -unsigned char* AudioBackend_LockSound(AudioBackend_Sound *sound, size_t *size) -{ - if (sound == NULL) - return NULL; - - ma_mutex_lock(&mutex); - - return Mixer_LockSound((Mixer_Sound*)sound, size); -} - -void AudioBackend_UnlockSound(AudioBackend_Sound *sound) -{ - if (sound == NULL) - return; - - ma_mutex_unlock(&mutex); -} - void AudioBackend_PlaySound(AudioBackend_Sound *sound, BOOL looping) { if (sound == NULL) diff --git a/src/Organya.cpp b/src/Organya.cpp index 01e88e0e..7302cda1 100644 --- a/src/Organya.cpp +++ b/src/Organya.cpp @@ -145,13 +145,12 @@ BOOL MakeSoundObject8(signed char *wavep, signed char track, signed char pipi) else data_size = wave_size; - lpORGANBUFFER[track][j][k] = AudioBackend_CreateSound(22050, data_size); + wp = (unsigned char*)malloc(data_size); - if (lpORGANBUFFER[track][j][k] == NULL) + if (wp == NULL) return FALSE; // Get wave data - wp = AudioBackend_LockSound(lpORGANBUFFER[track][j][k], NULL); wp_sub = wp; wav_tp = 0; @@ -169,7 +168,13 @@ BOOL MakeSoundObject8(signed char *wavep, signed char track, signed char pipi) wp_sub++; } - AudioBackend_UnlockSound(lpORGANBUFFER[track][j][k]); + lpORGANBUFFER[track][j][k] = AudioBackend_CreateSound(22050, wp, data_size); + + free(wp); + + if (lpORGANBUFFER[track][j][k] == NULL) + return FALSE; + AudioBackend_RewindSound(lpORGANBUFFER[track][j][k]); } } diff --git a/src/Sound.cpp b/src/Sound.cpp index f503f899..1c00aba6 100644 --- a/src/Sound.cpp +++ b/src/Sound.cpp @@ -275,11 +275,6 @@ int MakePixToneObject(const PIXTONEPARAMETER *ptp, int ptp_num, int no) ++ptp_pointer; } - lpSECONDARYBUFFER[no] = AudioBackend_CreateSound(22050, sample_count); - - if (lpSECONDARYBUFFER[no] == NULL) - return -1; - pcm_buffer = mixed_pcm_buffer = NULL; pcm_buffer = (unsigned char*)malloc(sample_count); @@ -331,11 +326,7 @@ int MakePixToneObject(const PIXTONEPARAMETER *ptp, int ptp_num, int no) mixed_pcm_buffer[0] = mixed_pcm_buffer[0]; mixed_pcm_buffer[sample_count - 1] = mixed_pcm_buffer[sample_count - 1]; - unsigned char *buffer = AudioBackend_LockSound(lpSECONDARYBUFFER[no], NULL); - - memcpy(buffer, mixed_pcm_buffer, sample_count); - - AudioBackend_UnlockSound(lpSECONDARYBUFFER[no]); + lpSECONDARYBUFFER[no] = AudioBackend_CreateSound(22050, mixed_pcm_buffer, sample_count); if (pcm_buffer != NULL) free(pcm_buffer); @@ -343,5 +334,8 @@ int MakePixToneObject(const PIXTONEPARAMETER *ptp, int ptp_num, int no) if (mixed_pcm_buffer != NULL) free(mixed_pcm_buffer); + if (lpSECONDARYBUFFER[no] == NULL) + return -1; + return sample_count; }