Change the audio backend API

Removes locking and unlocking: instead, samples are passed to Create.
This commit is contained in:
Clownacy 2020-04-06 19:44:45 +01:00
parent 40d0cf14f1
commit 5daea02ac6
7 changed files with 24 additions and 71 deletions

View file

@ -9,12 +9,9 @@ typedef struct AudioBackend_Sound AudioBackend_Sound;
BOOL AudioBackend_Init(void); BOOL AudioBackend_Init(void);
void AudioBackend_Deinit(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); 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_PlaySound(AudioBackend_Sound *sound, BOOL looping);
void AudioBackend_StopSound(AudioBackend_Sound *sound); void AudioBackend_StopSound(AudioBackend_Sound *sound);
void AudioBackend_RewindSound(AudioBackend_Sound *sound); void AudioBackend_RewindSound(AudioBackend_Sound *sound);

View file

@ -108,11 +108,11 @@ void AudioBackend_Deinit(void)
SDL_QuitSubSystem(SDL_INIT_AUDIO); 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); SDL_LockAudioDevice(device_id);
Mixer_Sound *sound = Mixer_CreateSound(frequency, frames); Mixer_Sound *sound = Mixer_CreateSound(frequency, samples, length);
SDL_UnlockAudioDevice(device_id); SDL_UnlockAudioDevice(device_id);
@ -131,24 +131,6 @@ void AudioBackend_DestroySound(AudioBackend_Sound *sound)
SDL_UnlockAudioDevice(device_id); 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) void AudioBackend_PlaySound(AudioBackend_Sound *sound, BOOL looping)
{ {
if (sound == NULL) if (sound == NULL)

View file

@ -46,14 +46,14 @@ void Mixer_Init(unsigned long frequency)
output_frequency = 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)); Mixer_Sound *sound = (Mixer_Sound*)malloc(sizeof(Mixer_Sound));
if (sound == NULL) if (sound == NULL)
return NULL; return NULL;
sound->samples = (unsigned char*)malloc(frames + 1); sound->samples = (unsigned char*)malloc(length + 1);
if (sound->samples == NULL) if (sound->samples == NULL)
{ {
@ -61,7 +61,9 @@ Mixer_Sound* Mixer_CreateSound(unsigned int frequency, size_t frames)
return NULL; return NULL;
} }
sound->frames = frames; memcpy(sound->samples, samples, length);
sound->frames = length;
sound->playing = false; sound->playing = false;
sound->position = 0.0; 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) void Mixer_PlaySound(Mixer_Sound *sound, bool looping)
{ {
sound->playing = true; sound->playing = true;

View file

@ -5,9 +5,8 @@
typedef struct Mixer_Sound Mixer_Sound; typedef struct Mixer_Sound Mixer_Sound;
void Mixer_Init(unsigned long frequency); 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); 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_PlaySound(Mixer_Sound *sound, bool looping);
void Mixer_StopSound(Mixer_Sound *sound); void Mixer_StopSound(Mixer_Sound *sound);
void Mixer_RewindSound(Mixer_Sound *sound); void Mixer_RewindSound(Mixer_Sound *sound);

View file

@ -118,11 +118,11 @@ void AudioBackend_Deinit(void)
ma_device_uninit(&device); 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); ma_mutex_lock(&mutex);
Mixer_Sound *sound = Mixer_CreateSound(frequency, frames); Mixer_Sound *sound = Mixer_CreateSound(frequency, samples, length);
ma_mutex_unlock(&mutex); ma_mutex_unlock(&mutex);
@ -141,24 +141,6 @@ void AudioBackend_DestroySound(AudioBackend_Sound *sound)
ma_mutex_unlock(&mutex); 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) void AudioBackend_PlaySound(AudioBackend_Sound *sound, BOOL looping)
{ {
if (sound == NULL) if (sound == NULL)

View file

@ -145,13 +145,12 @@ BOOL MakeSoundObject8(signed char *wavep, signed char track, signed char pipi)
else else
data_size = wave_size; 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; return FALSE;
// Get wave data // Get wave data
wp = AudioBackend_LockSound(lpORGANBUFFER[track][j][k], NULL);
wp_sub = wp; wp_sub = wp;
wav_tp = 0; wav_tp = 0;
@ -169,7 +168,13 @@ BOOL MakeSoundObject8(signed char *wavep, signed char track, signed char pipi)
wp_sub++; 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]); AudioBackend_RewindSound(lpORGANBUFFER[track][j][k]);
} }
} }

View file

@ -275,11 +275,6 @@ int MakePixToneObject(const PIXTONEPARAMETER *ptp, int ptp_num, int no)
++ptp_pointer; ++ptp_pointer;
} }
lpSECONDARYBUFFER[no] = AudioBackend_CreateSound(22050, sample_count);
if (lpSECONDARYBUFFER[no] == NULL)
return -1;
pcm_buffer = mixed_pcm_buffer = NULL; pcm_buffer = mixed_pcm_buffer = NULL;
pcm_buffer = (unsigned char*)malloc(sample_count); 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[0] = mixed_pcm_buffer[0];
mixed_pcm_buffer[sample_count - 1] = mixed_pcm_buffer[sample_count - 1]; mixed_pcm_buffer[sample_count - 1] = mixed_pcm_buffer[sample_count - 1];
unsigned char *buffer = AudioBackend_LockSound(lpSECONDARYBUFFER[no], NULL); lpSECONDARYBUFFER[no] = AudioBackend_CreateSound(22050, mixed_pcm_buffer, sample_count);
memcpy(buffer, mixed_pcm_buffer, sample_count);
AudioBackend_UnlockSound(lpSECONDARYBUFFER[no]);
if (pcm_buffer != NULL) if (pcm_buffer != NULL)
free(pcm_buffer); free(pcm_buffer);
@ -343,5 +334,8 @@ int MakePixToneObject(const PIXTONEPARAMETER *ptp, int ptp_num, int no)
if (mixed_pcm_buffer != NULL) if (mixed_pcm_buffer != NULL)
free(mixed_pcm_buffer); free(mixed_pcm_buffer);
if (lpSECONDARYBUFFER[no] == NULL)
return -1;
return sample_count; return sample_count;
} }