mirror of
https://github.com/ZDoom/fluidsynth.git
synced 2025-01-21 00:41:12 +00:00
pulse driver: preallocate audio buffers
This commit is contained in:
parent
2f35afe79e
commit
2b1cc566a5
1 changed files with 38 additions and 31 deletions
|
@ -46,6 +46,10 @@ typedef struct {
|
||||||
int buffer_size;
|
int buffer_size;
|
||||||
fluid_thread_t *thread;
|
fluid_thread_t *thread;
|
||||||
int cont;
|
int cont;
|
||||||
|
|
||||||
|
float *left;
|
||||||
|
float *right;
|
||||||
|
float *buf;
|
||||||
} fluid_pulse_audio_driver_t;
|
} fluid_pulse_audio_driver_t;
|
||||||
|
|
||||||
|
|
||||||
|
@ -90,6 +94,9 @@ new_fluid_pulse_audio_driver2(fluid_settings_t* settings,
|
||||||
char *media_role = NULL;
|
char *media_role = NULL;
|
||||||
int realtime_prio = 0;
|
int realtime_prio = 0;
|
||||||
int err;
|
int err;
|
||||||
|
float *left = NULL,
|
||||||
|
*right = NULL,
|
||||||
|
*buf = NULL;
|
||||||
|
|
||||||
dev = FLUID_NEW(fluid_pulse_audio_driver_t);
|
dev = FLUID_NEW(fluid_pulse_audio_driver_t);
|
||||||
if (dev == NULL) {
|
if (dev == NULL) {
|
||||||
|
@ -156,6 +163,29 @@ new_fluid_pulse_audio_driver2(fluid_settings_t* settings,
|
||||||
|
|
||||||
FLUID_LOG(FLUID_INFO, "Using PulseAudio driver");
|
FLUID_LOG(FLUID_INFO, "Using PulseAudio driver");
|
||||||
|
|
||||||
|
if(func != NULL)
|
||||||
|
{
|
||||||
|
left = FLUID_ARRAY(float, period_size);
|
||||||
|
right = FLUID_ARRAY(float, period_size);
|
||||||
|
|
||||||
|
if (left == NULL || right == NULL)
|
||||||
|
{
|
||||||
|
FLUID_LOG(FLUID_ERR, "Out of memory.");
|
||||||
|
goto error_recovery;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buf = FLUID_ARRAY(float, period_size * 2);
|
||||||
|
if(buf == NULL)
|
||||||
|
{
|
||||||
|
FLUID_LOG(FLUID_ERR, "Out of memory.");
|
||||||
|
goto error_recovery;
|
||||||
|
}
|
||||||
|
|
||||||
|
dev->left = left;
|
||||||
|
dev->right = right;
|
||||||
|
dev->buf = buf;
|
||||||
|
|
||||||
/* Create the audio thread */
|
/* Create the audio thread */
|
||||||
dev->thread = new_fluid_thread ("pulse-audio", func ? fluid_pulse_audio_run2 : fluid_pulse_audio_run,
|
dev->thread = new_fluid_thread ("pulse-audio", func ? fluid_pulse_audio_run2 : fluid_pulse_audio_run,
|
||||||
dev, realtime_prio, FALSE);
|
dev, realtime_prio, FALSE);
|
||||||
|
@ -187,6 +217,10 @@ void delete_fluid_pulse_audio_driver(fluid_audio_driver_t* p)
|
||||||
if (dev->pa_handle)
|
if (dev->pa_handle)
|
||||||
pa_simple_free(dev->pa_handle);
|
pa_simple_free(dev->pa_handle);
|
||||||
|
|
||||||
|
FLUID_FREE(dev->left);
|
||||||
|
FLUID_FREE(dev->right);
|
||||||
|
FLUID_FREE(dev->buf);
|
||||||
|
|
||||||
FLUID_FREE(dev);
|
FLUID_FREE(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -195,21 +229,12 @@ static fluid_thread_return_t
|
||||||
fluid_pulse_audio_run(void* d)
|
fluid_pulse_audio_run(void* d)
|
||||||
{
|
{
|
||||||
fluid_pulse_audio_driver_t* dev = (fluid_pulse_audio_driver_t*) d;
|
fluid_pulse_audio_driver_t* dev = (fluid_pulse_audio_driver_t*) d;
|
||||||
float *buf;
|
float *buf = dev->buf;
|
||||||
int buffer_size;
|
int buffer_size;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
buffer_size = dev->buffer_size;
|
buffer_size = dev->buffer_size;
|
||||||
|
|
||||||
/* FIXME - Probably shouldn't alloc in run() */
|
|
||||||
buf = FLUID_ARRAY(float, buffer_size * 2);
|
|
||||||
|
|
||||||
if (buf == NULL)
|
|
||||||
{
|
|
||||||
FLUID_LOG(FLUID_ERR, "Out of memory.");
|
|
||||||
return FLUID_THREAD_RETURN_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (dev->cont)
|
while (dev->cont)
|
||||||
{
|
{
|
||||||
fluid_synth_write_float(dev->data, buffer_size, buf, 0, 2, buf, 1, 2);
|
fluid_synth_write_float(dev->data, buffer_size, buf, 0, 2, buf, 1, 2);
|
||||||
|
@ -222,8 +247,6 @@ fluid_pulse_audio_run(void* d)
|
||||||
}
|
}
|
||||||
} /* while (dev->cont) */
|
} /* while (dev->cont) */
|
||||||
|
|
||||||
FLUID_FREE(buf);
|
|
||||||
|
|
||||||
return FLUID_THREAD_RETURN_VALUE;
|
return FLUID_THREAD_RETURN_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,7 +255,9 @@ fluid_pulse_audio_run2(void* d)
|
||||||
{
|
{
|
||||||
fluid_pulse_audio_driver_t* dev = (fluid_pulse_audio_driver_t*) d;
|
fluid_pulse_audio_driver_t* dev = (fluid_pulse_audio_driver_t*) d;
|
||||||
fluid_synth_t *synth = (fluid_synth_t *)(dev->data);
|
fluid_synth_t *synth = (fluid_synth_t *)(dev->data);
|
||||||
float *left, *right, *buf;
|
float *left = dev->left,
|
||||||
|
*right = dev->right,
|
||||||
|
*buf = dev->buf;
|
||||||
float* handle[2];
|
float* handle[2];
|
||||||
int buffer_size;
|
int buffer_size;
|
||||||
int err;
|
int err;
|
||||||
|
@ -240,20 +265,6 @@ fluid_pulse_audio_run2(void* d)
|
||||||
|
|
||||||
buffer_size = dev->buffer_size;
|
buffer_size = dev->buffer_size;
|
||||||
|
|
||||||
/* FIXME - Probably shouldn't alloc in run() */
|
|
||||||
left = FLUID_ARRAY(float, buffer_size);
|
|
||||||
right = FLUID_ARRAY(float, buffer_size);
|
|
||||||
buf = FLUID_ARRAY(float, buffer_size * 2);
|
|
||||||
|
|
||||||
if (left == NULL || right == NULL || buf == NULL)
|
|
||||||
{
|
|
||||||
FLUID_FREE(left);
|
|
||||||
FLUID_FREE(right);
|
|
||||||
FLUID_FREE(buf);
|
|
||||||
FLUID_LOG(FLUID_ERR, "Out of memory.");
|
|
||||||
return FLUID_THREAD_RETURN_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
handle[0] = left;
|
handle[0] = left;
|
||||||
handle[1] = right;
|
handle[1] = right;
|
||||||
|
|
||||||
|
@ -276,10 +287,6 @@ fluid_pulse_audio_run2(void* d)
|
||||||
}
|
}
|
||||||
} /* while (dev->cont) */
|
} /* while (dev->cont) */
|
||||||
|
|
||||||
FLUID_FREE(left);
|
|
||||||
FLUID_FREE(right);
|
|
||||||
FLUID_FREE(buf);
|
|
||||||
|
|
||||||
return FLUID_THREAD_RETURN_VALUE;
|
return FLUID_THREAD_RETURN_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue